鱼C论坛

 找回密码
 立即注册
查看: 663|回复: 2

[已解决]为什么有些数据的结果错误

[复制链接]
发表于 2023-11-22 17:24:50 | 显示全部楼层 |阅读模式

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

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

x
题目描述
一个班有n
个学生(n≤40
),每个学生有4门课,设计函数计算总平均分以及查找有两门以上(包括两门)成绩在85分以上的学生,并输出满足条件的学生。

输入描述
第一行输入一个整数n
,表示有n
个学生;
接下来n
行,每行4个整数,表示该同学的四门功课的成绩。

输出描述
第一行输出一个实数,表示n
个学生所有功课的平均分,保留到小数点后1位;
接下来若干行,表示有2门功课在85分以上的学生成绩,成绩之间用空格分开。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main()
  4. {
  5.     int n,a[40][4];
  6.     cin>>n;
  7.     double s=0;
  8.     int i,j,t;
  9.     int (*p)[4]=a;
  10.     for(i=0;i<n;i++)
  11.     {   cin>>a[i][0]>>a[i][1]>>a[i][2]>>a[i][3];
  12.              s+=a[i][0]+a[i][1]+a[i][2]+a[i][3];
  13.     }
  14.     printf("%.1lf\n",s/(4*n));
  15.     for(i=0;i<n;i++)
  16.     {
  17.         int f1=0,f2=0;
  18.         for(j=0;j<4;j++)
  19.         {
  20.             if(*(*(p+i)+j)>85) {f1=1;break;}
  21.         }
  22.         for(;j<4;j++)
  23.         {
  24.             if(*(*(p+i)+j)>85) {f2=1;break;}
  25.         }
  26.         if(f1&&f2) cout<<a[i][0]<<' '<<a[i][1]<<' '<<a[i][2]<<' '<<a[i][3]<<endl;
  27.     }
  28. }
复制代码
最佳答案
2023-12-14 17:24:06
你的代码中存在一处逻辑错误,在查找两门以上(包括两门)成绩在85分以上的学生时,对第一门成绩在85分以上的判断和第二门成绩在85分以上的判断独立进行,这样会导致重复判断相同的成绩,所以你需要修复这个错误。

在你的代码中,你首先使用 for 循环遍历四门功课的成绩,一旦发现一门成绩大于85,就将f1设为1,并跳出循环。然后接着遍历剩下的成绩,一旦发现一门成绩大于85,就将f2设为1,并跳出循环。但这种情况可能会重复计算同一门成绩,并且不能确保找到的是两门不同的成绩。

解决这个问题的方法是在for循环中使用一个计数器count,每当发现一门成绩大于85时,count就加1,然后在for循环结束后,检查count是否大于等于2,如果是,就输出这个学生的成绩。这样就能确保找到的是两门不同的成绩。

修正后的代码如下:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main()
  4. {
  5.     int n,a[40][4];
  6.     cin>>n;
  7.     double s=0;
  8.     int i,j;
  9.     int (*p)[4]=a;
  10.     for(i=0;i<n;i++)
  11.     {   
  12.         cin>>a[i][0]>>a[i][1]>>a[i][2]>>a[i][3];
  13.         s+=a[i][0]+a[i][1]+a[i][2]+a[i][3];
  14.     }
  15.     printf("%.1lf\n",s/(4*n));
  16.     for(i=0;i<n;i++)
  17.     {
  18.         int count=0;
  19.         for(j=0;j<4;j++)
  20.         {
  21.             if(*(*(p+i)+j)>85) count++;
  22.         }
  23.         if(count>=2) cout<<a[i][0]<<' '<<a[i][1]<<' '<<a[i][2]<<' '<<a[i][3]<<endl;
  24.     }
  25.     return 0;
  26. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-22 17:25:02 | 显示全部楼层
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main()
  4. {
  5.     int n,a[40][4];
  6.     cin>>n;
  7.     double s=0;
  8.     int i,j,t;
  9.     int (*p)[4]=a;
  10.     for(i=0;i<n;i++)
  11.     {
  12.         cin>>a[ i][0]>>a[ i][1]>>a[ i][2]>>a[ i][3];
  13.         s+=a[ i][0]+a[ i][1]+a[ i][2]+a[ i][3];
  14.     }
  15.     printf("%.1lf\n",s/(4*n));
  16.     for(i=0;i<n;i++)
  17.     {
  18.         int f1=0,f2=0;
  19.         for(j=0;j<4;j++)
  20.         {
  21.             if(*(*(p+i)+j)>85) {f1=1;break;}
  22.         }
  23.         for(;j<4;j++)
  24.         {
  25.             if(*(*(p+i)+j)>85) {f2=1;break;}
  26.         }
  27.         if(f1&&f2) cout<<a[ i][0]<<' '<<a[ i][1]<<' '<<a[ i][2]<<' '<<a[ i][3]<<endl;
  28.     }
  29. }
复制代码

这段代码存在两个问题。首先,对于每个学生,平均分的计算方式错误。其次,查找有两门以上成绩在85分以上的学生的逻辑有误。在第一个循环中,应该计算每个学生的总分,而不是累加所有学生的成绩。在第二个循环中,应该同时检查是否有两门成绩大于85分,而不是分开检查。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-14 17:24:06 | 显示全部楼层    本楼为最佳答案   
你的代码中存在一处逻辑错误,在查找两门以上(包括两门)成绩在85分以上的学生时,对第一门成绩在85分以上的判断和第二门成绩在85分以上的判断独立进行,这样会导致重复判断相同的成绩,所以你需要修复这个错误。

在你的代码中,你首先使用 for 循环遍历四门功课的成绩,一旦发现一门成绩大于85,就将f1设为1,并跳出循环。然后接着遍历剩下的成绩,一旦发现一门成绩大于85,就将f2设为1,并跳出循环。但这种情况可能会重复计算同一门成绩,并且不能确保找到的是两门不同的成绩。

解决这个问题的方法是在for循环中使用一个计数器count,每当发现一门成绩大于85时,count就加1,然后在for循环结束后,检查count是否大于等于2,如果是,就输出这个学生的成绩。这样就能确保找到的是两门不同的成绩。

修正后的代码如下:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main()
  4. {
  5.     int n,a[40][4];
  6.     cin>>n;
  7.     double s=0;
  8.     int i,j;
  9.     int (*p)[4]=a;
  10.     for(i=0;i<n;i++)
  11.     {   
  12.         cin>>a[i][0]>>a[i][1]>>a[i][2]>>a[i][3];
  13.         s+=a[i][0]+a[i][1]+a[i][2]+a[i][3];
  14.     }
  15.     printf("%.1lf\n",s/(4*n));
  16.     for(i=0;i<n;i++)
  17.     {
  18.         int count=0;
  19.         for(j=0;j<4;j++)
  20.         {
  21.             if(*(*(p+i)+j)>85) count++;
  22.         }
  23.         if(count>=2) cout<<a[i][0]<<' '<<a[i][1]<<' '<<a[i][2]<<' '<<a[i][3]<<endl;
  24.     }
  25.     return 0;
  26. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-11 19:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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