马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
题目描述
一个班有n
个学生(n≤40
),每个学生有4门课,设计函数计算总平均分以及查找有两门以上(包括两门)成绩在85分以上的学生,并输出满足条件的学生。
输入描述
第一行输入一个整数n
,表示有n
个学生;
接下来n
行,每行4个整数,表示该同学的四门功课的成绩。
输出描述
第一行输出一个实数,表示n
个学生所有功课的平均分,保留到小数点后1位;
接下来若干行,表示有2门功课在85分以上的学生成绩,成绩之间用空格分开。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,a[40][4];
cin>>n;
double s=0;
int i,j,t;
int (*p)[4]=a;
for(i=0;i<n;i++)
{ cin>>a[i][0]>>a[i][1]>>a[i][2]>>a[i][3];
s+=a[i][0]+a[i][1]+a[i][2]+a[i][3];
}
printf("%.1lf\n",s/(4*n));
for(i=0;i<n;i++)
{
int f1=0,f2=0;
for(j=0;j<4;j++)
{
if(*(*(p+i)+j)>85) {f1=1;break;}
}
for(;j<4;j++)
{
if(*(*(p+i)+j)>85) {f2=1;break;}
}
if(f1&&f2) cout<<a[i][0]<<' '<<a[i][1]<<' '<<a[i][2]<<' '<<a[i][3]<<endl;
}
}
你的代码中存在一处逻辑错误,在查找两门以上(包括两门)成绩在85分以上的学生时,对第一门成绩在85分以上的判断和第二门成绩在85分以上的判断独立进行,这样会导致重复判断相同的成绩,所以你需要修复这个错误。
在你的代码中,你首先使用 for 循环遍历四门功课的成绩,一旦发现一门成绩大于85,就将f1设为1,并跳出循环。然后接着遍历剩下的成绩,一旦发现一门成绩大于85,就将f2设为1,并跳出循环。但这种情况可能会重复计算同一门成绩,并且不能确保找到的是两门不同的成绩。
解决这个问题的方法是在for循环中使用一个计数器count,每当发现一门成绩大于85时,count就加1,然后在for循环结束后,检查count是否大于等于2,如果是,就输出这个学生的成绩。这样就能确保找到的是两门不同的成绩。
修正后的代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,a[40][4];
cin>>n;
double s=0;
int i,j;
int (*p)[4]=a;
for(i=0;i<n;i++)
{
cin>>a[i][0]>>a[i][1]>>a[i][2]>>a[i][3];
s+=a[i][0]+a[i][1]+a[i][2]+a[i][3];
}
printf("%.1lf\n",s/(4*n));
for(i=0;i<n;i++)
{
int count=0;
for(j=0;j<4;j++)
{
if(*(*(p+i)+j)>85) count++;
}
if(count>=2) cout<<a[i][0]<<' '<<a[i][1]<<' '<<a[i][2]<<' '<<a[i][3]<<endl;
}
return 0;
}
|