邪念波 发表于 2020-11-21 10:41:51

c语言,学校作业,写了一半发现写不下去了

题目描述
某班级期末考试有三门课程;语文、数学和英语。班级共有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++)
                {
                        我就写到这

jackz007 发表于 2020-11-21 12:49:10

本帖最后由 jackz007 于 2020-11-21 13:08 编辑

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

#include <stdio.h>

int main(void)
{
      int d = {0} , e = {0} , i , j , m                                          ;
      scanf("%d" , & m)                                                                        ;
      for(i = 0 ; i < m ; i ++) scanf("%d%d%d" , & d , & d , & d)            ;
      for(i = 0 ; i < m ; i ++) for(j = 0 ; j < 3; j ++) if(d) e[(d - 1) / 10] ++ ;
      for(i = 0 ; i < 3 ; i ++) {
                printf("%d" , e)                                                             ;
                for(j = 1 ; j < 10 ; j ++) printf(",%d" , e)                                 ;
                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 行究竟是什么?

邪念波 发表于 2020-11-22 10:02:06

jackz007 发表于 2020-11-21 12:49
你的样例没看懂,一共 3 们功课,应该输出 3 行分档表啊,为什么是 4 行,多出来的一行是什么?
...

第四行是三门课平均分的分档

jackz007 发表于 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 = {0} , e = {0} , i , j , k , m, s                                 ;
      scanf("%d" , & m)                                                                        ;
      for(i = 0 ; i < m ; i ++) scanf("%d%d%d" , & d , & d , & d)            ;
      for(i = 0 ; i < m ; i ++) for(j = 0 ; j < 3; j ++) if(d) e[(d - 1) / 10] ++ ;
      for(i = 0 ; i < m ; i ++) {
                for(j = k = s = 0 ; j < 3 ; j ++) {
                        if(d) {
                              s += d                                                       ;
                              k ++                                                               ;
                        }
                }
                e ++                                                                ;
      }
      for(i = 0 ; i < 4 ; i ++) {
                printf("%d" , e)                                                             ;
                for(j = 1 ; j < 10 ; j ++) printf(",%d" , e)                                 ;
                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 = {0} , e = {0} , i , j , k , m, s                                 ;
      scanf("%d" , & m)                                                                        ;
      for(i = 0 ; i < m ; i ++) scanf("%d%d%d" , & d , & d , & d)            ;
      for(i = 0 ; i < m ; i ++) for(j = 0 ; j < 3; j ++) if(d) e[(d - 1) / 10] ++ ;
      for(i = 0 ; i < m ; i ++) {
                for(j = k = s = 0 ; j < 3 ; j ++) {
                        if(d) {
                              s += d                                                       ;
                              k ++                                                               ;
                        }
                }
                e[(s / k - 1) / 10] ++                                                          ; // 这一行不同
      }
      for(i = 0 ; i < 4 ; i ++) {
                printf("%d" , e)                                                             ;
                for(j = 1 ; j < 10 ; j ++) printf(",%d" , e)                                 ;
                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>
页: [1]
查看完整版本: c语言,学校作业,写了一半发现写不下去了