为什么有些数据的结果错误
题目描述一个班有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;
cin>>n;
double s=0;
int i,j,t;
int (*p)=a;
for(i=0;i<n;i++)
{ cin>>a>>a>>a>>a;
s+=a+a+a+a;
}
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<<' '<<a<<' '<<a<<' '<<a<<endl;
}
} #include<bits/stdc++.h>
using namespace std;
int main()
{
int n,a;
cin>>n;
double s=0;
int i,j,t;
int (*p)=a;
for(i=0;i<n;i++)
{
cin>>a[ i]>>a[ i]>>a[ i]>>a[ i];
s+=a[ i]+a[ i]+a[ i]+a[ i];
}
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]<<' '<<a[ i]<<' '<<a[ i]<<' '<<a[ i]<<endl;
}
}
这段代码存在两个问题。首先,对于每个学生,平均分的计算方式错误。其次,查找有两门以上成绩在85分以上的学生的逻辑有误。在第一个循环中,应该计算每个学生的总分,而不是累加所有学生的成绩。在第二个循环中,应该同时检查是否有两门成绩大于85分,而不是分开检查。 你的代码中存在一处逻辑错误,在查找两门以上(包括两门)成绩在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;
cin>>n;
double s=0;
int i,j;
int (*p)=a;
for(i=0;i<n;i++)
{
cin>>a>>a>>a>>a;
s+=a+a+a+a;
}
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<<' '<<a<<' '<<a<<' '<<a<<endl;
}
return 0;
}
页:
[1]