学生成绩管理系统在实现对优秀人数以及不及格人数的统计时,发生错误了,应该怎么修改?以及如何写计算优秀率和不及格率的代码


#include
#include
#include
#include

typedef struct student {
    int numb,sum;
    char name[10];
    int score[3];
    double ave;

}STU;

void input(STU* p, int num);
void showAll(STU*, int);
int searchByNumb(STU *,int);
int searchByName(STU *,int);
void search(STU *, int);
void insert(STU *, int *,int);
void del(STU *, int *);
void update(STU *, int);
void sort(STU *, int);
void save_info(STU *,int);
void load_info(STU *,int *);
void backup();
void Statistics(STU *p,int num);

void main() {
    int num = 0, choice;
    STU stuArray[100];

    for (;;) {
        system("cls");
        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("                * 8.优秀人数及不及格人数统计\n");
        printf("                * 9.保存当前信息到文件        \n");
        printf("                * 10.从文件加载学生信息        \n");
        printf("                * 11.备份                    \n");
        printf("                * 0.退出系统                \n");
        printf("&-------------------------------------------------------------------&\n");
        printf("请选择要实现功能的相应序号 :");
        scanf("%d", &choice);

        if (choice == 0) break;
        switch (choice) {
        case 1: printf("输入人数:"); scanf("%d", &num); input(stuArray, num); break;
        case 2: showAll(stuArray,num); break;
        case 3: search(stuArray, num); break;
        case 4: insert(stuArray,&num,100); break;
        case 5: del(stuArray, &num); break;
        case 6: update(stuArray, num); break;
        case 7: sort(stuArray, num); break;
        case 8: Statistics(stuArray, num); break;
        case 9: save_info(stuArray, num); break;
        case 10: load_info(stuArray, &num); break;
        case 11: backup(); break;

        }
        printf("请按任意键继续.......\n");
        getch();

    }
    printf("感谢您的使用,再见!\n");
}
//1.输入学生信息 
void input(STU* p, int num) {
    int i;
    printf("请输入%d名学生信息\n", num);
    printf("学号\t姓名\t数学\t英语\t语文\n");
    for (i = 0; i < num; i++) {
        scanf("%d%s%d%d%d", &p[i].numb, p[i].name, &p[i].score[0], &p[i].score[1], &p[i].score[2]);
        p[i].ave = (p[i].score[0] + p[i].score[1] + p[i].score[2]) / 3.0;
    }
    printf("输入完成\n");
}
// 2.显示全部学生信息 
void showAll(STU* p, int num) {
    int i;
    system("cls");
    printf("目前共有%d名学生信息\n",num);
    printf("学号\t姓名\t数学\t英语\t语文\t平均分\n");
    for (i = 0; i < num; i++) {
        printf("%d\t%s\t%d\t%d\t%d\t%.2lf\t\n", p[i].numb, p[i].name, p[i].score[0], p[i].score[1], p[i].score[2], p[i].ave);

    }
    printf("输出完成\n");
    
}

int searchByNumb(STU *p,int num){
    int i,number;
    printf("请输入要查询学生的学号:");
    scanf("%d",&number);
    for(i = 0;i<num;i++)
    {
        if(p[i].numb==number)
        break;}
    return i;
    
    
}
int searchByName(STU* p, int num){
    int i;
    char name[10];

    printf("请输入要查询学生的姓名:");
    scanf("%s", name);
    
    for(i=0;i<num;i++)
        if(strcmp(p[i].name,name)==0)
            break;
     return i;
     
}
//3.查询学生信息 
void search(STU *p,int num){
    int choice,result=1;
    
    for(;;)
    {
        system("cls");
        printf("现在进入查询学生信息的填写\n"); 
        printf("按学号查询请按1,按姓名查询请按2:");
        scanf("%d",&choice);
        switch(choice)
        {
            case 1: result=searchByNumb(p,num);break;
            case 2: result=searchByName(p,num);break;
            
         } 
        if(result>=num)
         printf("查无此人\n");
        else{
             printf("找到了,该生信息如下: \n");
             printf("学号\t姓名\t数学\t英语\t语文\t平均分\n");
             printf("%d\t%s\t%d\t%d\t%d\t%.2f\n",p[result].numb,p[result].name,p[result].score[0],p[result].score[1],p[result].score[2],p[result].ave);

         }
         printf("继续查找请按1,退出请按0;");
         scanf("%d",&choice);
         if(choice==0) break;
         
          
    }
} 
//4.新增学生信息函数
void insert(STU *p,int *pnum,int maxLen)
{
    STU stu;
    int choice;
    
    for(;;)
    {
        if(*pnum>200){
            printf("人数已达上限,无法添加!\n");
            break;
            
        }
        else{
            system("pause");
            printf("现在进行新增学生信息填写\n");
            printf("学号\t姓名\t数学\t英语\t语文\n");
            scanf("%d%s%d%d%d",&stu.numb,&stu.name,&stu.score[0],&stu.score[1],&stu.score[2]);
            stu.ave=(stu.score[0]+stu.score[1]+stu.score[2])/3.0;
            
            p[*pnum]=stu;
            (*pnum)++;
            printf("成功添加!继续添加请按1,退出请按0;");
            scanf("%d",&choice);
            if(choice==0) break; 
        }
    }
    
}
//5.删除学生信息
 void del(STU *p,int *pnum){
     int result,i,choice;
     for(;;){
     system("cls");
     printf("现在进入删除学生信息的处理\n");
     
     result=searchByNumb(p,*pnum);
     if(result>=*pnum)
     printf("查无此人\n");
     else{
         printf("找到了,确定删除请按1,取消删除请按2;");
         scanf("%d",&choice);
         if(choice==1){
             //for语句的作用是,将第result后的每一个元素前移一个位置,p[result]被覆盖,即被删除 
             for(i=result;i<*pnum-1;i++)
                 p[i]=p[i+1];
             (*pnum)--;
             printf("成功删除,当前学生总人数是%d人\n",*pnum);
             
         } 
          
     }
      printf("继续删除请按1,退出请按0;");
     scanf("%d",&choice); 
     if(choice==0) break;
     
     }
 }
 
 //6.修改学生信息
 void update(STU *p,int num){
     STU stu;
     int result,choice,key_code;
         loop1:
         printf("请输入五位数密码:\n");
         scanf("%d",&key_code);
         if(key_code == 20230){
             if(result != -1){
            for(;;){
         system("pause"); 
         printf("现在进入修改学生信息的处理\n");
         result = searchByNumb(p,num);
         if(result >= num)
             printf("查无此人\n");
         else
         {
             printf("找到了,该生信息如下: \n");
             printf("学号\t姓名\t数学\t英语\t语文\t平均分\n");
             printf("%d\t%s\t%d\t%d\t%d\t%.2lf\n",p[result].numb,p[result].name,p[result].score[0],p[result].score[1],p[result].score[2],p[result].ave);

             printf("确定修改请按1,取消修改请按2;");
             scanf("%d",&choice);
             if(choice==1){
                 printf("现在进行修改学生信息的填写\n");
                printf("学号\t姓名\t数学\t英语\t语文\n");
                scanf("%d%s%d%d%d",&stu.numb,stu.name,&stu.score[0],&stu.score[1],&stu.score[2]);
                stu.ave=(stu.score[0]+stu.score[1]+stu.score[2])/3.0;
                p[result]=stu;
                printf("成功修改,修改后的信息如下\n");
                printf("学号\t姓名\t数学\t英语\t语文\t平均分\n") ;
            printf("%d\t%s\t%d\t%d\t%d\t%.2lf\n",p[result].numb,p[result].name,p[result].score[0],p[result].score[1],p[result].score[2],p[result].ave);

             }
         }
         printf("继续修改请按1,退出请按0;");
         scanf("%d",&choice);
         if(choice==0) break;
          
     }
 }
          }
     else{
         printf("密码错误,请重新输入:");
         goto loop1;
        }
         }
     
//7.排序 
 void sort(STU *p,int num){
     char style='a';
     int type=1,i,j,index;
     STU temp;
     
     system("cls");
     printf("现在进入对当前信息排序的处理\n");
     printf("按升序排列请按a,按降序排列请按d;");
     getchar();
     scanf("%c",&style);
     
     printf("按学号排序请按1,按平均分排序请按2;");
     scanf("%d",&type);
     
     if(style=='a'){
         if(type==1){
             for(i=0;i<num-1;i++){
                 if(p[index].numb>p[j].numb)
                 index=j;
                 temp=p[i];p[i]=p[index];p[index]=temp;
                 
             }
             
         }
         else if(type==2){
             for(i=0;i<num-1;i++){
                 index=i;
                 for(j=i+1;j<num;j++)
                     if(p[index].ave>p[j].ave)
                         index=j;
             temp=p[i];p[i]=p[index];p[index]=temp;
             }
             
         }
     }
    if(style=='d'){
         if(type==1){
             for(i=0;i<num-1;i++){
                 if(p[index].numb>p[j].numb)
                 index=j;
                 temp=p[i];p[i]=p[index];p[index]=temp;
                 
             }
             
         }
         else if(type==2){
             for(i=0;i<num-1;i++){
                 index=i;
                 for(j=i+1;j<num;j++)
                     if(p[index].ave>p[j].ave)
                         index=j;
             temp=p[i];p[i]=p[index];p[index]=temp;
             }
             
         }
     }
     printf("排序成功\n");
 }
 //8.优秀人数及不及格人数的计算 
 void Statistics(STU *p,int num){
    STU s[100],f[100];
    int i,x = -1,y = -1;
    system("cls");
    for(i = 0;i<num+1;i++){
        if(p[i].sum>=270){
            x++;
            s[x]=p[i];
        }
        if(p[i].sum<=180){
            y++;
            f[y] = p[i];
        }
    }
    printf("\n\n");
    printf("\t现在对优秀同学的名单进行公示\n");
    printf("\t\t学号\t\t姓名\n");
    if(x !=-1)
    for(i=0;i<x+1;i++)
    printf("\t\t%d\t\t%s\n",s[i].numb,s[i].name);
    printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n");
    printf("\t共有%d位学生成绩判定为优秀\n",x+1);
    printf("………………………………………………………………\n\n");
    printf("现在对不及格同学的名单进行公示\n");
    printf("\t\t学号\t\t姓名\n");
    if(y != -1);
    for(i =0;i<y+1;i++)
    printf("\t\t%d\t\t%s\n",f[i].numb,f[i].name);
    printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n");
    printf("共有%d位学生成绩判定为不及格\n",y+1);
    printf("查询成功!\n");
    getch(); 
    }
 

修改如下,供参考:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>

typedef struct student {
    int    numb,sum;
    char   name[10];
    int    score[3];
    double ave;
}STU;

void input(STU* p, int num);
void showAll(STU*, int);
int  searchByNumb(STU *,int);
int  searchByName(STU *,int);
void search(STU *, int);
void insert(STU *, int *,int);
void del(STU *, int *);
void update(STU *, int);
void sort(STU *, int);
//void save_info(STU *,int);
//void load_info(STU *,int *);
//void backup();
void Statistics(STU *p,int num);

void main() {
    int num = 0, choice;
    STU stuArray[100];

    for (;;) {
        system("cls");
        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("                * 8.优秀人数及不及格人数统计\n");
        printf("                * 9.保存当前信息到文件        \n");
        printf("                * 10.从文件加载学生信息        \n");
        printf("                * 11.备份                    \n");
        printf("                * 0.退出系统                \n");
        printf("&-------------------------------------------------------------------&\n");
        printf("请选择要实现功能的相应序号 :");
        scanf("%d", &choice);

        if (choice == 0) break;
        switch (choice) {
        case 1: printf("输入人数:"); scanf("%d", &num); input(stuArray, num); break;
        case 2: showAll(stuArray,num); break;
        case 3: search(stuArray, num); break;
        case 4: insert(stuArray,&num,100); break;
        case 5: del(stuArray, &num); break;
        case 6: update(stuArray, num); break;
        case 7: sort(stuArray, num); break;
        case 8: Statistics(stuArray, num); break;
        //case 9: save_info(stuArray, num); break;
        //case 10: load_info(stuArray, &num); break;
        //case 11: backup(); break;
        }
        printf("请按任意键继续.......\n");
        getch();

    }
    printf("感谢您的使用,再见!\n");
}
//1.输入学生信息 
void input(STU* p, int num) {
    int i;
    printf("请输入%d名学生信息\n", num);
    printf("学号\t姓名\t数学\t英语\t语文\n");
    for (i = 0; i < num; i++) {
        scanf("%d%s%d%d%d", &p[i].numb, p[i].name,
                            &p[i].score[0], &p[i].score[1], &p[i].score[2]);
        p[i].sum = p[i].score[0] + p[i].score[1] + p[i].score[2];           //修改
        p[i].ave = p[i].sum / 3.0;                                          //修改
    }
    printf("输入完成\n");
}
// 2.显示全部学生信息 
void showAll(STU* p, int num) {
    int i;
    system("cls");
    printf("目前共有%d名学生信息\n",num);
    printf("学号\t姓名\t数学\t英语\t语文\t平均分\n");
    for (i = 0; i < num; i++) {
        printf("%d\t%s\t%d\t%d\t%d\t%.2lf\t\n", p[i].numb, p[i].name,
                p[i].score[0], p[i].score[1], p[i].score[2], p[i].ave);
    }
    printf("输出完成\n");
}

int searchByNumb(STU *p,int num){
    int i,number;
    printf("请输入要查询学生的学号:");
    scanf("%d",&number);
    for(i = 0;i<num;i++)
    {
        if(p[i].numb==number)
            return  i;//break; 修改
    }
    return -1;        //修改
}
int searchByName(STU* p, int num){
    int i;
    char name[10];
    printf("请输入要查询学生的姓名:");
    scanf("%s", name);
    for(i=0;i<num;i++)
        if(strcmp(p[i].name,name)==0)
            return i;//break; 修改
    return -1;       //修改
}
//3.查询学生信息 
void search(STU *p,int num){
    int choice,result=1;
    for(;;)
    {
        system("cls");
        printf("现在进入查询学生信息的填写\n");
        do{                                       //修改
            printf("按学号查询请按1,按姓名查询请按2:");
            scanf("%d",&choice);
        }while(choice != 1 && choice != 2);       //修改
        switch(choice)
        {
            case 1: result=searchByNumb(p,num);break;
            case 2: result=searchByName(p,num);break;
        }
        if(result == -1)  //if(result>=num) 修改
            printf("查无此人\n");
        else{
            printf("找到了,该生信息如下: \n");
            printf("学号\t姓名\t数学\t英语\t语文\t平均分\n");
            printf("%d\t%s\t%d\t%d\t%d\t%.2f\n",p[result].numb,p[result].name,
                p[result].score[0],p[result].score[1],p[result].score[2],p[result].ave);
        }
        printf("继续查找请按1,退出请按0;");
        scanf("%d",&choice);
        if(choice==0) break;
    }
} 
//4.新增学生信息函数
void insert(STU *p,int *pnum,int maxLen)
{
    STU stu;
    int choice;
    
    for(;;)
    {
        if(*pnum > maxLen){  //if(*pnum>200)修改
            printf("人数已达上限,无法添加!\n");
            break;
        }
        else{
            system("pause");
            printf("现在进行新增学生信息填写\n");
            printf("学号\t姓名\t数学\t英语\t语文\n");
            scanf("%d%s%d%d%d",&stu.numb,stu.name,&stu.score[0],&stu.score[1],&stu.score[2]);
            //scanf("%d%s%d%d%d",&stu.numb,&stu.name,&stu.score[0],&stu.score[1],&stu.score[2]);修改
            stu.sum = stu.score[0]+stu.score[1]+stu.score[2];         //修改
            stu.ave= stu.sum/3.0;                                     //修改

            p[*pnum]=stu;
            (*pnum)++;
            printf("成功添加!继续添加请按1,退出请按0;");
            scanf("%d",&choice);
            if(choice==0) break; 
        }
    }
    
}
//5.删除学生信息
void del(STU *p,int *pnum){
     int result,i,choice;
     for(;;){
         system("cls");
         printf("现在进入删除学生信息的处理\n");
     
         result=searchByNumb(p,*pnum);
         if(result == -1)   //if(result>=*pnum) 修改
             printf("查无此人\n");
         else{
             printf("找到了,确定删除请按1,放弃删除请按2;");  //取消 修改
             scanf("%d",&choice);
             if(choice==1){
                  //for语句的作用是,将第result后的每一个元素前移一个位置,p[result]被覆盖,即被删除
                  for(i=result;i<*pnum-1;i++)
                      p[i]=p[i+1];
                  (*pnum)--;
                  printf("成功删除,当前学生总人数是%d人\n",*pnum);
             }
         }
         printf("继续删除请按1,退出请按0;");
         scanf("%d",&choice);
         if(choice==0) break;
     }
}
 
 //6.修改学生信息
void update(STU *p,int num){
     STU stu;
     int result,choice,key_code;
     loop1:
     printf("请输入五位数密码:\n");
     scanf("%d",&key_code);
     if(key_code == 20230){
                      //if(result != -1){ 修改
         for(;;){
             system("pause");
             printf("现在进入修改学生信息的处理\n");
             result = searchByNumb(p,num);
             if(result == -1)       //if(result >= num) 修改
                 printf("查无此人\n");
             else
             {
                 printf("找到了,该生信息如下: \n");
                 printf("学号\t姓名\t数学\t英语\t语文\t平均分\n");
                 printf("%d\t%s\t%d\t%d\t%d\t%.2lf\n",p[result].numb,p[result].name,
                    p[result].score[0],p[result].score[1],p[result].score[2],p[result].ave);

                 printf("确定修改请按1,取消修改请按2;");
                 scanf("%d",&choice);
                 if(choice==1){
                     printf("现在进行修改学生信息的填写\n");
                     printf("学号\t姓名\t数学\t英语\t语文\n");
                     scanf("%d%s%d%d%d",&stu.numb,stu.name,&stu.score[0],&stu.score[1],&stu.score[2]);
                     stu.sum = stu.score[0]+stu.score[1]+stu.score[2];   //修改
                     stu.ave = stu.sum/3.0;                              //修改
                     p[result]=stu;
                     printf("成功修改,修改后的信息如下\n");
                     printf("学号\t姓名\t数学\t英语\t语文\t平均分\n") ;
                     printf("%d\t%s\t%d\t%d\t%d\t%.2lf\n",p[result].numb,p[result].name,
                          p[result].score[0],p[result].score[1],p[result].score[2],p[result].ave);
                 }
             }
             printf("继续修改请按1,退出请按0;");
             scanf("%d",&choice);
             if(choice==0) break;
         }
                    //}    修改
     }
     else{
         printf("密码错误,请重新输入:");
         goto loop1;
     }
}
     
//7.排序 
 void sort(STU *p,int num){
     char style='a';
     int type=1,i,j,index;
     STU temp;

     system("cls");
     printf("现在进入对当前信息排序的处理\n");
     printf("按升序排列请按a,按降序排列请按d;");
     getchar();
     scanf("%c",&style);
     
     printf("按学号排序请按1,按平均分排序请按2;");
     scanf("%d",&type);

     if(style=='a'){
         if(type==1){
             for(i=0;i<num-1;i++){
                 if(p[index].numb>p[j].numb)
                 index=j;
                 temp=p[i];p[i]=p[index];p[index]=temp;
                 
             }

         }
         else if(type==2){
             for(i=0;i<num-1;i++){
                 index=i;
                 for(j=i+1;j<num;j++)
                     if(p[index].ave>p[j].ave)
                         index=j;
             temp=p[i];p[i]=p[index];p[index]=temp;
             }
             
         }
     }
    if(style=='d'){
         if(type==1){
             for(i=0;i<num-1;i++){
                 if(p[index].numb>p[j].numb)
                 index=j;
                 temp=p[i];p[i]=p[index];p[index]=temp;
                 
             }
             
         }
         else if(type==2){
             for(i=0;i<num-1;i++){
                 index=i;
                 for(j=i+1;j<num;j++)
                     if(p[index].ave>p[j].ave)
                         index=j;
             temp=p[i];p[i]=p[index];p[index]=temp;
             }
             
         }
     }
     printf("排序成功\n");
 }
 //8.优秀人数及不及格人数的计算
 void Statistics(STU *p,int num)   //修改
 {
    int i,x = 0,y = 0;
    system("cls");
    for(i = 0;i < num;i++){
        if(p[i].sum >= 270){
            if (x == 0){
                printf("\n\n");
                printf("\t现在对优秀同学的名单进行公示\n");
                printf("\t\t学号\t\t姓名\n");
            }
            printf("\t\t%d\t\t%s\n",p[i].numb,p[i].name);
            x++;
        }
    }
    printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
    printf("\t共有%d位学生成绩判定为优秀\n",x);
    printf("………………………………………………………………\n");

    for (i = 0; i < num; i++){
        if(p[i].sum < 180){
            if (y == 0){
                printf("\n\n");
                printf("\t现在对不及格同学的名单进行公示\n");
                printf("\t\t学号\t\t姓名\n");
            }
            printf("\t\t%d\t\t%s\n",p[i].numb,p[i].name);
            y++;
        }
    }
    printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
    printf("\t共有%d位学生成绩判定为不及格\n",y);
    printf("………………………………………………………………\n");

    getch();
 }

你在代码中没有定义“优秀人数”和“不及格人数”的具体标准,所以无法正确地计算出结果。加一下这段代码这样改一下试试:

void Statistics(STU* p, int num) {
    int i, excellent = 0, failed = 0;
    for (i = 0; i < num; i++) {
        if (p[i].ave >= 90) {
            excellent++;
        }
        else if (p[i].ave < 60) {
            failed++;
        }
    }
    printf("优秀人数:%d\n", excellent);
    printf("不及格人数:%d\n", failed);
}

如果以上回答对您有所帮助,点击一下采纳该答案~谢谢