Gingembre 2023-03-24 00:49 采纳率: 57.1%
浏览 92
已结题

请问这个学生成绩管理系统运行第二个功能时(显示学生信息时)为什么出错了?


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

typedef struct student {
    int numb;
    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 main() {
    int num = 0, choice;
    STU stuArray[100];

    for (;;) {
        system("cls");
        printf("\n--------------------------------------------------------------------------------------\n");
        printf("                    *学生信息管理系统*                                    \n");
        printf("\n---------------------------------------------------------------------------------------\n");
        printf("\n------------------------------------------系统功能菜单-----------------------------------\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("                * 0.退出系统                \n");
        printf("------------------------------------------------------------------------------------------\n");
        printf("请选择(1-10) :");
        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: save_info(stuArray, num); break;
        case 9: load_info(stuArray, &num); break;
        case 10: 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>100){
            printf("人数已达上限,无法添加!\n");
            break;
            
        }
        else{
            system("cls");
            printf("现在进行新增学生信息填写\n");
            printf("学号\t姓名\t数学\t英语\t语文\n");
            scanf("%ds%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==i){
             //
             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;
     for(;;)
     {
         system("cls");
         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("%ds%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;
          
     }
 } 
//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 save_info(STU *p,int num){    
    char filename[20];
    FILE *fp;
      int i;
      
      system("cls");
      printf("现在进入保存当前信息到文件的处理\n");
      printf("请输入文件名:");
      scanf("%s",filename);
      
      if((fp=fopen(filename,"w"))==NULL){
          printf("无法打开文件\n");
          return;
      }
      fprintf(fp,"目前共有%d名学生信息\n",num);
      fprintf(fp,"学号\t姓名\t数学\t英语\t语文\t平均分\n") ;
      for(i=0;i<num;i++)
      {
              fprintf(fp,"%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);

      }
      fclose(fp);
      printf("保存成功\n");
    
}

//9.从文件加载学生信息
  void load_info(STU *p,int *pnum){
      char filename[20],secondLine[50];
      FILE *fp;
      int i,num;
      
      system("cls");
      printf("现在进入从文件加载学生信息的处理\n");
      printf("请输入文件名:");
      scanf("%s",filename);
      
      if((fp=fopen(filename,"r"))==NULL){
          printf("无法打开文件\n");
          return ;
      }
      fscanf(fp,"目前共有%d名学生信息",&num);
      //过滤第二行信息("学号\t姓名\t数学\t英语\t语文\t平均分\n") ;
      for(i=0;i<6;i++)
          fscanf(fp,"%s",secondLine);
    for(i=0;i<num;i++){ 
          fscanf(fp,"%d%s%d%d%d%lf",&p[i].numb, p[i].name, &p[i].score[0], &p[i].score[1], &p[i].score[2], p[i].ave);
      }
     *pnum=num;
     fclose(fp);
     printf("加载成功\n");
  } 
//10.备份
  void backup(){
      FILE *in,*out;
      char infile[20],outfile[20],ch;
      printf("请输入源文件的文件名:");
    scanf("%s",infile);
    printf("请输入备份文件的文件名:");
      scanf("%s",outfile);
      if((in=fopen(infile,"r"))==NULL)
      {
          printf("无法打开该文件\n");
          return ;
          
      }
      if((out=fopen(outfile,"w"))==NULL)
      {
          printf("无法打开该文件\n");
          return ;
          
      }
      ch=fgetc(in);
      while(ch!=EOF){
          fputc(ch,out);
          ch=fgetc(in);
          
      }
      printf("备份成功\n");
      fclose(in);
      fclose(out);
  } 
  

求指点一下,以及还可以增加什么功能

  • 写回答

4条回答 默认 最新

  • IT_service_mesh 2023-03-24 01:03
    关注

    参考GPT和自己的思路:

    关于学生成绩管理系统运行第二个功能时出错的问题,可能是因为在显示全部学生信息时,打印平均分的语句中,指针变量和数组名不应该加取地址符号"&"。

    应该修改成如下的形式:

    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);

    另外,关于增加什么功能,可以考虑增加以下几个:

    1. 平均分统计功能:可以统计出整个班级的平均数、最高分、最低分等信息。
    2. 成绩分析功能:可以对学生的成绩进行分析,如成绩分布情况、不及格学生名单等。
    3. 数据可视化功能:可以将成绩数据以图表的形式展示,更直观地反映学生的成绩情况。
    4. 权限管理功能:可以对不同的用户授予不同的操作权限,保障信息安全。
    5. 学生信息导入导出功能:可以将学生信息导出为Excel或CSV格式,方便进行进一步的处理和分析。同时也可以导入其他格式的学生信息数据。
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 4月1日
  • 已采纳回答 3月24日
  • 创建了问题 3月24日

悬赏问题

  • ¥15 基于FOC驱动器,如何实现卡丁车下坡无阻力的遛坡的效果
  • ¥15 IAR程序莫名变量多重定义
  • ¥15 (标签-UDP|关键词-client)
  • ¥15 关于库卡officelite无法与虚拟机通讯的问题
  • ¥100 已有python代码,要求做成可执行程序,程序设计内容不多
  • ¥15 目标检测项目无法读取视频
  • ¥15 GEO datasets中基因芯片数据仅仅提供了normalized signal如何进行差异分析
  • ¥100 求采集电商背景音乐的方法
  • ¥15 数学建模竞赛求指导帮助
  • ¥15 STM32控制MAX7219问题求解答