鱼C论坛

 找回密码
 立即注册
查看: 1196|回复: 3

[已解决]c语言,学校作业,写了一半发现写不下去了

[复制链接]
发表于 2020-11-21 10:41:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目描述
某班级期末考试有三门课程;语文、数学和英语。班级共有n名学生。

请统计并输出各科分数分档和总平均分档表。

分档以10分为一档,0分不统计。及(0-10]、(10-20]、...、(90-100]共十档。



输入
首先是班级人数n(n<100)

然后n行,每行3个整数,表示语文、数学和英语的成绩。(没有0分)

输出
依次输出语文、数学、英语和总平均分档表。

每行一个分档表,依次是(0-10]、(10-20]、...、(90-100]的人数

样例输入
6
89 73 32
30 35 89
18 69 57
55 44 82
2 16 75
29 31 23
样例输出
1,1,2,0,0,1,0,0,1,0
0,1,0,2,1,0,1,1,0,0
0,0,1,1,0,1,0,1,2,0
0,0,1,1,1,1,2,0,0,0




#include <stdio.h>

int main()
{
        int n,i,j,sum1,sum2,sum3,sum4,jun1,jun2,jun3,jun4,yu,shu,ying;
        sum4=0;
        sun1=0;
        sum2=0;
        sum3=0;
        scanf("%d",&n);
        for(i=0;i<n;i++)
        {
                scanf("%d%d%d\n",&yu,&shu,&ying);
                sum1=sum1+yu;
                sum2=sum2+shu;
                sum3=sum3+ying;
                sum4=sum1+sum2+sum3+sum4;
                jun4=sum/3;
                for(j=0;j<i;j++)
                {
                        我就写到这
最佳答案
2020-11-22 13:27:09
本帖最后由 jackz007 于 2020-11-22 13:57 编辑
邪念波 发表于 2020-11-22 10:02
第四行是三门课平均分的分档


        与样例一模一样的答案来了
#include <stdio.h>

int main(void)
{
        int d[50][3] = {0} , e[4][10] = {0} , i , j , k , m  , s                                   ;
        scanf("%d" , & m)                                                                          ;
        for(i = 0 ; i < m ; i ++) scanf("%d%d%d" , & d[i][0] , & d[i][1] , & d[i][2])              ;
        for(i = 0 ; i < m ; i ++) for(j = 0 ; j < 3; j ++) if(d[i][j]) e[j][(d[i][j] - 1) / 10] ++ ;
        for(i = 0 ; i < m ; i ++) {
                for(j = k = s = 0 ; j < 3 ; j ++) {
                        if(d[i][j]) {
                                s += d[i][j]                                                       ;
                                k ++                                                               ;
                        }
                }
                e[3][s / k / 10] ++                                                                ;
        }
        for(i = 0 ; i < 4 ; i ++) {
                printf("%d" , e[i][0])                                                             ;
                for(j = 1 ; j < 10 ; j ++) printf(",%d" , e[i][j])                                 ;
                printf("\n")                                                                       ;
        }
}
        编译、运行实况:
D:\0002.Exercise\C>g++ -o x x.c

D:\0002.Exercise\C>x
6
89 73 32
30 35 89
18 69 57
55 44 82
2 16 75
29 31 23
1,1,2,0,0,1,0,0,1,0
0,1,0,2,1,0,1,1,0,0
0,0,1,1,0,1,0,1,2,0
0,0,1,1,1,1,2,0,0,0

D:\0002.Exercise\C>
        但是,这个代码统计的结果是存在问题的,比如,平均 90 分本应该被纳入 (80 , 90] 分数段,却被错误地纳入 (90 , 100] 分数段;如果平均分恰好是 100 分的话将无法纳入统计,因为下标是 10,数组下标已经越界了。本例中,有一个平均成绩 60 分,按规则,显然应该被归入 (50 , 60] 分数段,而在样例中,却被错误地归入 (60 , 70] 分数段,从而导致样例平均分的统计结果出现错误。
        所以,真正正确的代码和样例应该是下面这个样子:
#include <stdio.h>

int main(void)
{
        int d[50][3] = {0} , e[4][10] = {0} , i , j , k , m  , s                                   ;
        scanf("%d" , & m)                                                                          ;
        for(i = 0 ; i < m ; i ++) scanf("%d%d%d" , & d[i][0] , & d[i][1] , & d[i][2])              ;
        for(i = 0 ; i < m ; i ++) for(j = 0 ; j < 3; j ++) if(d[i][j]) e[j][(d[i][j] - 1) / 10] ++ ;
        for(i = 0 ; i < m ; i ++) {
                for(j = k = s = 0 ; j < 3 ; j ++) {
                        if(d[i][j]) {
                                s += d[i][j]                                                       ;
                                k ++                                                               ;
                        }
                }
                e[3][(s / k - 1) / 10] ++                                                          ; // 这一行不同
        }
        for(i = 0 ; i < 4 ; i ++) {
                printf("%d" , e[i][0])                                                             ;
                for(j = 1 ; j < 10 ; j ++) printf(",%d" , e[i][j])                                 ;
                printf("\n")                                                                       ;
        }
}
        编译、运行实况
D:\0002.Exercise\C>g++ -o x x.c

D:\0002.Exercise\C>x
6
89 73 32
30 35 89
18 69 57
55 44 82
2 16 75
29 31 23
1,1,2,0,0,1,0,0,1,0
0,1,0,2,1,0,1,1,0,0
0,0,1,1,0,1,0,1,2,0
0,0,1,1,1,2,1,0,0,0

D:\0002.Exercise\C>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-21 12:49:10 | 显示全部楼层
本帖最后由 jackz007 于 2020-11-21 13:08 编辑

         你的样例没看懂,一共 3 们功课,应该输出 3 行分档表啊,为什么是 4 行,多出来的一行是什么?
#include <stdio.h>

int main(void)
{
        int d[50][3] = {0} , e[3][10] = {0} , i , j , m                                            ;
        scanf("%d" , & m)                                                                          ;
        for(i = 0 ; i < m ; i ++) scanf("%d%d%d" , & d[i][0] , & d[i][1] , & d[i][2])              ;
        for(i = 0 ; i < m ; i ++) for(j = 0 ; j < 3; j ++) if(d[i][j]) e[j][(d[i][j] - 1) / 10] ++ ;
        for(i = 0 ; i < 3 ; i ++) {
                printf("%d" , e[i][0])                                                             ;
                for(j = 1 ; j < 10 ; j ++) printf(",%d" , e[i][j])                                 ;
                printf("\n")                                                                       ;
        } 
}
编译、运行实况
D:\00.Excise\C>g++ -o x x.c

D:\00.Excise\C>x
6
89 73 32
30 35 89
18 69 57
55 44 82
2 16 75
29 31 23
1,1,2,0,0,1,0,0,1,0
0,1,0,2,1,0,1,1,0,0
0,0,1,1,0,1,0,1,2,0

D:\00.Excise\C>
        样例输出的第 4 行究竟是什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-11-22 10:02:06 | 显示全部楼层
jackz007 发表于 2020-11-21 12:49
你的样例没看懂,一共 3 们功课,应该输出 3 行分档表啊,为什么是 4 行,多出来的一行是什么?
...

第四行是三门课平均分的分档
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-22 13:27:09 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2020-11-22 13:57 编辑
邪念波 发表于 2020-11-22 10:02
第四行是三门课平均分的分档


        与样例一模一样的答案来了
#include <stdio.h>

int main(void)
{
        int d[50][3] = {0} , e[4][10] = {0} , i , j , k , m  , s                                   ;
        scanf("%d" , & m)                                                                          ;
        for(i = 0 ; i < m ; i ++) scanf("%d%d%d" , & d[i][0] , & d[i][1] , & d[i][2])              ;
        for(i = 0 ; i < m ; i ++) for(j = 0 ; j < 3; j ++) if(d[i][j]) e[j][(d[i][j] - 1) / 10] ++ ;
        for(i = 0 ; i < m ; i ++) {
                for(j = k = s = 0 ; j < 3 ; j ++) {
                        if(d[i][j]) {
                                s += d[i][j]                                                       ;
                                k ++                                                               ;
                        }
                }
                e[3][s / k / 10] ++                                                                ;
        }
        for(i = 0 ; i < 4 ; i ++) {
                printf("%d" , e[i][0])                                                             ;
                for(j = 1 ; j < 10 ; j ++) printf(",%d" , e[i][j])                                 ;
                printf("\n")                                                                       ;
        }
}
        编译、运行实况:
D:\0002.Exercise\C>g++ -o x x.c

D:\0002.Exercise\C>x
6
89 73 32
30 35 89
18 69 57
55 44 82
2 16 75
29 31 23
1,1,2,0,0,1,0,0,1,0
0,1,0,2,1,0,1,1,0,0
0,0,1,1,0,1,0,1,2,0
0,0,1,1,1,1,2,0,0,0

D:\0002.Exercise\C>
        但是,这个代码统计的结果是存在问题的,比如,平均 90 分本应该被纳入 (80 , 90] 分数段,却被错误地纳入 (90 , 100] 分数段;如果平均分恰好是 100 分的话将无法纳入统计,因为下标是 10,数组下标已经越界了。本例中,有一个平均成绩 60 分,按规则,显然应该被归入 (50 , 60] 分数段,而在样例中,却被错误地归入 (60 , 70] 分数段,从而导致样例平均分的统计结果出现错误。
        所以,真正正确的代码和样例应该是下面这个样子:
#include <stdio.h>

int main(void)
{
        int d[50][3] = {0} , e[4][10] = {0} , i , j , k , m  , s                                   ;
        scanf("%d" , & m)                                                                          ;
        for(i = 0 ; i < m ; i ++) scanf("%d%d%d" , & d[i][0] , & d[i][1] , & d[i][2])              ;
        for(i = 0 ; i < m ; i ++) for(j = 0 ; j < 3; j ++) if(d[i][j]) e[j][(d[i][j] - 1) / 10] ++ ;
        for(i = 0 ; i < m ; i ++) {
                for(j = k = s = 0 ; j < 3 ; j ++) {
                        if(d[i][j]) {
                                s += d[i][j]                                                       ;
                                k ++                                                               ;
                        }
                }
                e[3][(s / k - 1) / 10] ++                                                          ; // 这一行不同
        }
        for(i = 0 ; i < 4 ; i ++) {
                printf("%d" , e[i][0])                                                             ;
                for(j = 1 ; j < 10 ; j ++) printf(",%d" , e[i][j])                                 ;
                printf("\n")                                                                       ;
        }
}
        编译、运行实况
D:\0002.Exercise\C>g++ -o x x.c

D:\0002.Exercise\C>x
6
89 73 32
30 35 89
18 69 57
55 44 82
2 16 75
29 31 23
1,1,2,0,0,1,0,0,1,0
0,1,0,2,1,0,1,1,0,0
0,0,1,1,0,1,0,1,2,0
0,0,1,1,1,2,1,0,0,0

D:\0002.Exercise\C>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 13:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表