c语言写的程序,只要人数超过2个就出大问题,一直循环输出

这个程序可以编译,但是很不对劲,好几个选项都重复循环,人数只要超过两个人就开始无限循环


#include<stdio.h>
struct score{
    double chinese;
    double math;
    double eng;
    double total;
    double average;
}; 
struct std{
    int num;
    char name[20];
    struct score cj;
};

void printfscore(int n,struct std s[]);
int Searchid(int xh,int n,struct std s[]);
void totalscore(int y,struct std s[]);
void mmave(int y,struct std s[]/*,struct score*/,double *MAX,double *MIN);

void printfscore(int n,struct std s[]/*,struct score*/)
{    int i;

    for(i=0;i<n;i++){
        printf("chinese:%.2lf math:%.2lf eng:%.2lf\n",s[i].cj.chinese,s[i].cj.math,s[i].cj.eng);
    }
    printf("显示结束"); 

}

int Searchid(int xh,int n,struct std s[]/*,struct score*/)
{

    int i;
    for (i=0;i<n;i++)
    {
        if (xh==s[i].num)
        {
            printf("num:%d\n",s[i].num);
            printf("name:%s\n",s[i].name);
            printf("chinese:%.2lf math:%.2lf eng:%.2lf\n",s[i].cj.chinese,s[i].cj.math,s[i].cj.eng);

        }
        return 1;
    }
    return 0;    
}

void totalscore(int j,struct std s[]/*,struct score*/)
{    int i;
    for(i=0;i<j;j++){
        s[i].cj.total=s[i].cj.chinese+s[i].cj.math+s[i].cj.eng;
        printf("第%d个学生的总成绩如下%lf:\n",i+1,s[i].cj.total);
    }
}
void mmave(int j,struct std s[]/*,struct score*/,double *MAX,double *MIN)
{    int i;
    double max=0;
    double min=0;
    MAX=&max;
    MIN=&min;
    for(i=0;i<j;j++){
        s[i].cj.average=(s[i].cj.chinese+s[i].cj.math+s[i].cj.eng)/3;
        printf("第%d个学生的总成绩如下%lf:\n",i+1,s[i].cj.average);
    }
    for(i=0;i<j;i++){
        if(s[i].cj.average>=*MAX){
            //*MAX=s[i].cj.average;
            max=s[i].cj.average;
        }
        if(s[i].cj.average<=*MIN){
            //*MIN=s[i].cj.average;
            min=s[i].cj.average;
        }
        
    }
 
}

int main(){
    struct std s[20];
    int i=0;
    int choice;
    int n,j,xh;
    int num_students = 0; // 记录学生数量
    double MAX,MIN;
 
    printf("**************************************\n");
    printf("***********    欢迎进入    ***********\n");
    printf("*******某某小学学生信息管理系统*******\n");
    printf("|------------------------------------|\n");
    printf("|          1.录入学生信息            |\n");
    printf("|          2.显示学生信息            |\n");
    printf("|          3.查询学生信息            |\n");
    printf("|          4.显示总成绩              |\n");
    printf("|          5.显示平均分              |\n");
    printf("|          6.显示成绩最大最小值      |\n");
    printf("|          7.退出信息系统            |\n");
    printf("**************************************\n");
 
    do {
        printf("请输入您的选择:");
        scanf("%d",&choice);
 
        switch (choice) {
            case 1://录入学生信息 
                printf("请输入学生的总人数(不能超过2000人):");
                scanf("%d",&n);
 
                for (i=0;i<n;i++) {
                    printf("请输入第%d个学生的学号、姓名、语文、数学和英语成绩:", i+1);
                    scanf("%d%s%lf",&s[i].num,s[i].name,&s[i].cj.chinese,&s[i].cj.math,&s[i].cj.eng);
                }
 
                num_students=n; // 更新学生数量
                printf("学生信息已成功添加!\n");
                break;
 
            case 2://显示学生信息 
                if (num_students==0) {
                    printf("没有学生信息可以显示,请选择1录入信息\n");
                    break;
                }
                 printf("请输入您想查询多少人:\n");
                 scanf("%d",&j);
                printf("学生信息如下:\n");
                for (i=0;i<j;i++) {
                    printf("学号:%d,姓名:%s,成绩:%.2lf\n",s[i].num,s[i].name,s[i].cj.chinese,s[i].cj.math,s[i].cj.eng);
                }
                break;
 
            case 3:
                // 查询学生信息
                printf("请输入您想查找的学生的学号:\n");
                scanf("%d",&xh);
                if(Searchid(xh,n,s)==1)
                printf("找到了!");
                else
                printf("没有找到该信息,请重新输入"); 
                break;
            case 4:
                //显示总成绩 
                printf("请输入您想查询多少人:\n");
                 scanf("%d",&j);
                 totalscore(j,s);
                 break; 
            case 5:
                //显示平均分
                printf("请输入您想查询多少人:\n");
                 scanf("%d",&j);
                 for(i=0;i<j;i++)
                {    
                     printf("第%d个人的平均分是%lf",i+1,s[i].cj.average);
                }
                 break;
            case 6:
                // 显示平均分最大最小及对应的人 
                /*if (num_students==0) {
                    printf("没有成绩信息可以显示,请选择1录入信息\n");
                    break;
                }
                printf("以下是成绩信息:\n");
                printfscore(n,s);*/
                mmave(j,s/*,struct score*/,&MAX,&MIN);
                printf("%s的平均分最大值是:%.2lf\n",s[i].name,MAX);
                printf("%s的平均分最小值是:%.2lf\n",s[i].name,MIN);
                break;
            case 7:
                printf("感谢使用学生信息管理系统!\n");
                break;
 
            default:
                printf("无效的选择,请重新输入\n");
                break;
        }
 
    } while (choice!=7);
 
    return 0;
}

发现几处错误


int Searchid(int xh,int n,struct std s[])
{
    int i;
    for (i=0;i<n;i++)
    {
        if (xh==s[i].num)
        {
            printf("num:%d\n",s[i].num);
            printf("name:%s\n",s[i].name);
            printf("chinese:%.2lf math:%.2lf eng:%.2lf\n",s[i].cj.chinese,s[i].cj.math,s[i].cj.eng);
            return 1;
        }
    }
    return 0;    
}

img

img

img


它会自己执行两次无效选择,我不知道为什么

【以下回答由 GPT 生成】

问题回答:

1. 目标和功能

该程序的目标是处理学生的成绩信息,并提供一些功能,如打印所有学生成绩,查找学生信息等。具体的功能包括: - printfscore函数:打印所有学生成绩 - Searchid函数:根据学生的学号查找并打印学生的信息 - totalscore函数:根据学生的学号计算并打印学生的总成绩 - mmave函数:根据学生的学号计算并打印学生成绩的最高分和最低分

2. 函数功能和使用方法

  • printfscore函数:打印所有学生成绩

    • 参数:int n表示学生的数量,struct std s[]表示学生结构体数组
    • 功能:遍历学生结构体数组,依次打印每个学生的语文、数学和英语成绩
    • 使用方法:调用函数printfscore(n, s),其中n为学生数量,s为学生结构体数组
  • Searchid函数:根据学生的学号查找并打印学生的信息

    • 参数:int xh表示要查找的学生学号,int n表示学生的数量,struct std s[]表示学生结构体数组
    • 功能:在学生结构体数组中根据学号查找对应学生,并打印该学生的学号、姓名和成绩
    • 使用方法:调用函数Searchid(xh, n, s),其中xh为要查找的学生学号,n为学生数量,s为学生结构体数组
  • totalscore函数:根据学生的学号计算并打印学生的总成绩

    • 参数:int y表示要计算总成绩的学生学号,struct std s[]表示学生结构体数组
    • 功能:在学生结构体数组中根据学号查找对应学生,并计算该学生的总成绩,并打印该学生的学号、姓名和总成绩
    • 使用方法:调用函数totalscore(y, s),其中y为要计算总成绩的学生学号,s为学生结构体数组
  • mmave函数:根据学生的学号计算并打印学生成绩的最高分和最低分

    • 参数:int y表示要计算最高分和最低分的学生学号,struct std s[]表示学生结构体数组,double *MAXdouble *MIN为用于保存最高分和最低分的指针变量
    • 功能:在学生结构体数组中根据学号查找对应学生,并计算该学生的成绩的最高分和最低分,并通过指针变量返回最高分和最低分的值
    • 使用方法:调用函数mmave(y, s, &MAX, &MIN),其中y为要计算最高分和最低分的学生学号,s为学生结构体数组,MAXMIN为用于保存最高分和最低分的指针变量

3. 程序期望行为和问题检查

根据程序的描述,我们可以期望在输入人数大于两个时,能够正确地执行各个功能函数,并按照预期的方式输出结果,不会发生无限循环的问题。然而,根据提供的代码,无法直接判断问题的具体原因。可能的问题包括: - 循环中的遍历不完整导致无限循环 - 函数调用的参数或返回值的使用存在错误 - 数据结构的定义和使用存在问题 - 其他潜在的算法逻辑错误

为了进一步分析问题和解决问题,我们需要查看完整的代码实现和提供更多的上下文信息。由于提供的代码不完整,无法直接判断问题的根本原因。希望能够提供完整的代码和更多的问题描述,以便更准确地给出解决方案。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^