鱼C论坛

 找回密码
 立即注册
查看: 1323|回复: 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
第四行是三门课平均分的分档


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

  2. int main(void)
  3. {
  4.         int d[50][3] = {0} , e[4][10] = {0} , i , j , k , m  , s                                   ;
  5.         scanf("%d" , & m)                                                                          ;
  6.         for(i = 0 ; i < m ; i ++) scanf("%d%d%d" , & d[i][0] , & d[i][1] , & d[i][2])              ;
  7.         for(i = 0 ; i < m ; i ++) for(j = 0 ; j < 3; j ++) if(d[i][j]) e[j][(d[i][j] - 1) / 10] ++ ;
  8.         for(i = 0 ; i < m ; i ++) {
  9.                 for(j = k = s = 0 ; j < 3 ; j ++) {
  10.                         if(d[i][j]) {
  11.                                 s += d[i][j]                                                       ;
  12.                                 k ++                                                               ;
  13.                         }
  14.                 }
  15.                 e[3][s / k / 10] ++                                                                ;
  16.         }
  17.         for(i = 0 ; i < 4 ; i ++) {
  18.                 printf("%d" , e[i][0])                                                             ;
  19.                 for(j = 1 ; j < 10 ; j ++) printf(",%d" , e[i][j])                                 ;
  20.                 printf("\n")                                                                       ;
  21.         }
  22. }
复制代码

        编译、运行实况:
  1. D:\0002.Exercise\C>g++ -o x x.c

  2. D:\0002.Exercise\C>x
  3. 6
  4. 89 73 32
  5. 30 35 89
  6. 18 69 57
  7. 55 44 82
  8. 2 16 75
  9. 29 31 23
  10. 1,1,2,0,0,1,0,0,1,0
  11. 0,1,0,2,1,0,1,1,0,0
  12. 0,0,1,1,0,1,0,1,2,0
  13. 0,0,1,1,1,1,2,0,0,0

  14. D:\0002.Exercise\C>
复制代码

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

  2. int main(void)
  3. {
  4.         int d[50][3] = {0} , e[4][10] = {0} , i , j , k , m  , s                                   ;
  5.         scanf("%d" , & m)                                                                          ;
  6.         for(i = 0 ; i < m ; i ++) scanf("%d%d%d" , & d[i][0] , & d[i][1] , & d[i][2])              ;
  7.         for(i = 0 ; i < m ; i ++) for(j = 0 ; j < 3; j ++) if(d[i][j]) e[j][(d[i][j] - 1) / 10] ++ ;
  8.         for(i = 0 ; i < m ; i ++) {
  9.                 for(j = k = s = 0 ; j < 3 ; j ++) {
  10.                         if(d[i][j]) {
  11.                                 s += d[i][j]                                                       ;
  12.                                 k ++                                                               ;
  13.                         }
  14.                 }
  15.                 e[3][(s / k - 1) / 10] ++                                                          ; // 这一行不同
  16.         }
  17.         for(i = 0 ; i < 4 ; i ++) {
  18.                 printf("%d" , e[i][0])                                                             ;
  19.                 for(j = 1 ; j < 10 ; j ++) printf(",%d" , e[i][j])                                 ;
  20.                 printf("\n")                                                                       ;
  21.         }
  22. }
复制代码

        编译、运行实况
  1. D:\0002.Exercise\C>g++ -o x x.c

  2. D:\0002.Exercise\C>x
  3. 6
  4. 89 73 32
  5. 30 35 89
  6. 18 69 57
  7. 55 44 82
  8. 2 16 75
  9. 29 31 23
  10. 1,1,2,0,0,1,0,0,1,0
  11. 0,1,0,2,1,0,1,1,0,0
  12. 0,0,1,1,0,1,0,1,2,0
  13. 0,0,1,1,1,2,1,0,0,0

  14. D:\0002.Exercise\C>
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         int d[50][3] = {0} , e[3][10] = {0} , i , j , m                                            ;
  5.         scanf("%d" , & m)                                                                          ;
  6.         for(i = 0 ; i < m ; i ++) scanf("%d%d%d" , & d[i][0] , & d[i][1] , & d[i][2])              ;
  7.         for(i = 0 ; i < m ; i ++) for(j = 0 ; j < 3; j ++) if(d[i][j]) e[j][(d[i][j] - 1) / 10] ++ ;
  8.         for(i = 0 ; i < 3 ; i ++) {
  9.                 printf("%d" , e[i][0])                                                             ;
  10.                 for(j = 1 ; j < 10 ; j ++) printf(",%d" , e[i][j])                                 ;
  11.                 printf("\n")                                                                       ;
  12.         }
  13. }
复制代码

编译、运行实况
  1. D:\00.Excise\C>g++ -o x x.c

  2. D:\00.Excise\C>x
  3. 6
  4. 89 73 32
  5. 30 35 89
  6. 18 69 57
  7. 55 44 82
  8. 2 16 75
  9. 29 31 23
  10. 1,1,2,0,0,1,0,0,1,0
  11. 0,1,0,2,1,0,1,1,0,0
  12. 0,0,1,1,0,1,0,1,2,0

  13. D:\00.Excise\C>
复制代码

        样例输出的第 4 行究竟是什么?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

第四行是三门课平均分的分档
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

  2. int main(void)
  3. {
  4.         int d[50][3] = {0} , e[4][10] = {0} , i , j , k , m  , s                                   ;
  5.         scanf("%d" , & m)                                                                          ;
  6.         for(i = 0 ; i < m ; i ++) scanf("%d%d%d" , & d[i][0] , & d[i][1] , & d[i][2])              ;
  7.         for(i = 0 ; i < m ; i ++) for(j = 0 ; j < 3; j ++) if(d[i][j]) e[j][(d[i][j] - 1) / 10] ++ ;
  8.         for(i = 0 ; i < m ; i ++) {
  9.                 for(j = k = s = 0 ; j < 3 ; j ++) {
  10.                         if(d[i][j]) {
  11.                                 s += d[i][j]                                                       ;
  12.                                 k ++                                                               ;
  13.                         }
  14.                 }
  15.                 e[3][s / k / 10] ++                                                                ;
  16.         }
  17.         for(i = 0 ; i < 4 ; i ++) {
  18.                 printf("%d" , e[i][0])                                                             ;
  19.                 for(j = 1 ; j < 10 ; j ++) printf(",%d" , e[i][j])                                 ;
  20.                 printf("\n")                                                                       ;
  21.         }
  22. }
复制代码

        编译、运行实况:
  1. D:\0002.Exercise\C>g++ -o x x.c

  2. D:\0002.Exercise\C>x
  3. 6
  4. 89 73 32
  5. 30 35 89
  6. 18 69 57
  7. 55 44 82
  8. 2 16 75
  9. 29 31 23
  10. 1,1,2,0,0,1,0,0,1,0
  11. 0,1,0,2,1,0,1,1,0,0
  12. 0,0,1,1,0,1,0,1,2,0
  13. 0,0,1,1,1,1,2,0,0,0

  14. D:\0002.Exercise\C>
复制代码

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

  2. int main(void)
  3. {
  4.         int d[50][3] = {0} , e[4][10] = {0} , i , j , k , m  , s                                   ;
  5.         scanf("%d" , & m)                                                                          ;
  6.         for(i = 0 ; i < m ; i ++) scanf("%d%d%d" , & d[i][0] , & d[i][1] , & d[i][2])              ;
  7.         for(i = 0 ; i < m ; i ++) for(j = 0 ; j < 3; j ++) if(d[i][j]) e[j][(d[i][j] - 1) / 10] ++ ;
  8.         for(i = 0 ; i < m ; i ++) {
  9.                 for(j = k = s = 0 ; j < 3 ; j ++) {
  10.                         if(d[i][j]) {
  11.                                 s += d[i][j]                                                       ;
  12.                                 k ++                                                               ;
  13.                         }
  14.                 }
  15.                 e[3][(s / k - 1) / 10] ++                                                          ; // 这一行不同
  16.         }
  17.         for(i = 0 ; i < 4 ; i ++) {
  18.                 printf("%d" , e[i][0])                                                             ;
  19.                 for(j = 1 ; j < 10 ; j ++) printf(",%d" , e[i][j])                                 ;
  20.                 printf("\n")                                                                       ;
  21.         }
  22. }
复制代码

        编译、运行实况
  1. D:\0002.Exercise\C>g++ -o x x.c

  2. D:\0002.Exercise\C>x
  3. 6
  4. 89 73 32
  5. 30 35 89
  6. 18 69 57
  7. 55 44 82
  8. 2 16 75
  9. 29 31 23
  10. 1,1,2,0,0,1,0,0,1,0
  11. 0,1,0,2,1,0,1,1,0,0
  12. 0,0,1,1,0,1,0,1,2,0
  13. 0,0,1,1,1,2,1,0,0,0

  14. D:\0002.Exercise\C>
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-9 08:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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