鱼C论坛

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

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

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

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

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

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;
    }
}
最佳答案
2023-12-14 17:24:06
你的代码中存在一处逻辑错误,在查找两门以上(包括两门)成绩在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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-22 17:25:02 | 显示全部楼层
#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分,而不是分开检查。
想知道小甲鱼最近在做啥?请访问 -> 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,如果是,就输出这个学生的成绩。这样就能确保找到的是两门不同的成绩。

修正后的代码如下:
#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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 13:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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