c语言写学生成绩管理程序,修改代码

帮我修改void maxscore部分的代码,使其可以运行,按我原有的代码,其他部分正常运行,但无法显示最高分的同学信息,在运行的时候按“4”是没有反应的,我的所有代码如下:

#define N 1000
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct student
{
    char num[10];
    char name[10];//姓名 
    char sex[4];//性别 
    float score;//成绩 
};

int main()
{
    void menu();
    void inputstudent();
    void printstudent();
    void numfind();
    void maxscore();
    void addstu();
    void deletestu();
    void scoresort();
    char ch;
    while (1)
    {
        menu();
    char c=_getch();
    switch (c)
     {
    case '1': //输入学生成绩 
        inputstudent();
          break;   
    case '2':   //显示所有学生数据 
        printstudent();
        break; 
    case '3':   //按学号查找学生数据
        numfind();
        break; 
    case '4':   //查找最高分
        maxscore; 
        break;
    case '5':   //添加学生数据 
        addstu();
        break;
    case '6':   //按学号删除学生数据
        deletestu(); 
        break;  
    case '7':   //成绩排序
        scoresort(); 
        break;
    case '0':   //退出程序 
        system("cls");
        printf("Bye Bye!\n");
        exit(0);
        break;    
    default:
        printf("请重新输入\n");
        break;
     }    
    }
    return 0;
}

void menu()
{
    system("cls");
    printf("\n");
    printf("********************************\n");
    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("*       0.退出程序             *\n");
    printf("********************************\n");
    printf("*      请输入选项编号(0-7)    *\n");
    printf("********************************\n");
}

void inputstudent()
{
    FILE *fp;
    struct student stud;
    char str[80],ch = 'y';
    if ((fp=fopen("stud.rec","wb"))==NULL)
    {
        printf("无法创建文件!\n");
        exit(0);
    }
    while (ch=='y' || ch=='Y')
    {
        printf("输入学号:");gets(stud.num);
        printf("输入姓名:");gets(stud.name);
        printf("输入性别:");gets(stud.sex);
        printf("输入成绩:");scanf("%f",&stud.score);getchar();
        fwrite(&stud, sizeof(stud),1,fp);
        do
        {
            printf("继续输入(y/n)?");
            gets(str); ch=str[0];
         } 
         while(!(ch=='y'||ch=='n'||ch=='Y'||ch=='N'));
    }
    fclose(fp);
    printf("按任意键回到主菜单。。。。。。");getchar();
}

void printstudent()
{
    struct student stud;
    FILE *fp;
    if((fp=fopen("stud.rec","rb"))==NULL)
    {
        printf("无法打开文件stud.rec.\n");
        exit(0);
    }
    printf("\n\n%-10s%-10s%-10s%-10s%\n","学号","姓名","性别","成绩");
    while (fread(&stud,sizeof(stud),1,fp)==1) 
      printf("%-10s%-10s%-10s%-10.1f\n",stud.num,stud.name,stud.sex,stud.score);
    printf("\n");
    fclose(fp);
    printf("\n\n\n按任意键返回主菜单。。。。。。");getchar(); 
}

void numfind()
{
    struct student stud;
    FILE *fp;
    char x[2];
    int flag=0;
    printf("输入需要查找的学号:");gets(x);
    if((fp=fopen("stud.rec","rb"))==NULL)
    {
        printf("无法打开该文件stud.rec.\n");
        exit(0);
    }
    while (fread(&stud,sizeof(stud),1,fp)==1)
        if(strcmp(stud.num,x)==0)
        {
            flag=1;
            printf("\n\n%-10s%-10s%-10s%-10s%\n","学号","姓名","性别","成绩");
            printf("%-10s%-10s%-10s%-10.1f\n",stud.num,stud.name,stud.sex,stud.score);
            break; 
        }
    printf("\n");
    if(flag==0) printf("查无此学号!");
    fclose(fp);
    printf("\n\n\n按任意键返回主菜单。。。。。。");getchar(); 
} 

void maxscore()
{
    struct student stud,studt;
    FILE *fp;
    if((fp=fopen("stud.rec","rb"))==NULL)
    {
        printf("无法打开文件stud.rec.\n");
        exit(0);
    }
    studt.score=0;
    while(fread(&stud,sizeof(stud),1,fp)==1)
    {
    if(stud.score>studt.score) 
     {
       studt=stud;
     }
    printf("\n\n成绩最高分部分的学生数据:%d\n");
    printf("\n%-10s%-10s%-10s%-10s%\n","学号","姓名","性别","成绩");
    printf("%-10s%-10s%-10s%-10.1f\n",studt.num,studt.name,studt.sex,studt.score);
    }    
    fclose(fp);    
    printf("\n\n\n按任意键返回主菜单。。。。。。");getchar(); 
}

void addstu()
{
    FILE *fp;
    struct student stud;
    char str[80],ch = 'y';
    if ((fp=fopen("stud.rec","ab"))==NULL)
    {
        printf("无法创建文件!\n");
        exit(0);
    }
    while (ch=='y' || ch=='Y')
    {
        printf("输入学号:");gets(stud.num);
        printf("输入姓名:");gets(stud.name);
        printf("输入性别:");gets(stud.sex);
        printf("输入成绩:");scanf("%f",&stud.score);getchar();
        fwrite(&stud, sizeof(stud),1,fp);
        do
        {
            printf("继续输入(y/n)?");
            gets(str); ch=str[0];
         } 
         while(!(ch=='y'||ch=='n'||ch=='Y'||ch=='N'));
    }
    fclose(fp);
    printf("按任意键回到主菜单。。。。。。");getchar();
}

void deletestu()
{
    struct student stud[N],z;
    int k=0,y=0;
    char x[10];
    FILE *fp;
    printf("\n\n\n请输入要删除的学号:");
    gets(x);
    if((fp=fopen("stud.rec","rb"))==NULL)
    {
        printf("无法打开文件stud.rec.\n");
        exit(0);    
    }
    printf("\n\n%-10s%-10s%-10s%-10s%\n","学号","姓名","性别","成绩");
    while (fread(&stud[k],sizeof(stud[k]),1,fp)==1)
    {
        if(strcmp(stud[k].num,x)==0) {y=1;printf("%-10s%-10s%-10s%-10.1f\n",stud[k].num,stud[k].name,stud[k].sex,stud[k].score);}
        else k=k+1;
    }
        fclose(fp);
        
        if(y==0) printf("\n\n查无此学号!!");
        else
        {
            if ((fp=fopen("stud.rec","wb"))==NULL)
            {
                printf("无法创建文件!\n");
                exit(0);
            }
            for(y=0;y<k;y++)
                fwrite(&stud[y],sizeof(stud[y]),1,fp);
            fclose(fp);
        }
            printf("\n\n\n按任意键返回主菜单。。。。。。");getchar(); 
}
    
void scoresort()
{
        struct student stud[N],z;
        int k=0,x,y;
        FILE *fp;
        if ((fp=fopen("stud.rec","rb"))==NULL)
        {
            printf("无法打开文件stud.rec.\n");
            exit(0);
        }
        printf("\n\n%-10s%-10s%-10s%-10s%\n","学号","姓名","性别","成绩");
        while(fread(&stud[k],sizeof(stud[k]),1,fp)==1)
        {
            printf("%-10s%-10s%-10s%-10.1f\n",stud[k].num,stud[k].name,stud[k].sex,stud[k].score);
            k=k+1;
        }
        fclose(fp);
        
        for(x=0;x<k-1;x++)
           for(y=x+1;y<k;y++)
             if(stud[x].score<stud[y].score)
             {
                 z=stud[x];stud[x]=stud[y];stud[y]=z;
             }
             printf("\n\n%-10s%-10s%-10s%-10s%\n","学号","姓名","性别","成绩");
             for(x=0;x<k;x++)
             printf("%-10s%-10s%-10s%-10.1f\n",stud[x].num,stud[x].name,stud[x].sex,stud[x].score);
             printf("\n\n\n按任意键返回主菜单。。。。。。");getchar();

}

基于new bing部分指引作答:
要修改maxscore函数的代码以使其正常运行并显示最高分的学生信息,可以按照以下方式修改代码:

void maxscore()
{
    struct student stud, studt;
    FILE *fp;
    if ((fp = fopen("stud.rec", "rb")) == NULL)
    {
        printf("无法打开文件stud.rec.\n");
        exit(0);
    }
    studt.score = 0;
    while (fread(&stud, sizeof(stud), 1, fp) == 1)
    {
        if (stud.score > studt.score)
        {
            studt = stud;
        }
    }
    fclose(fp);

    printf("\n\n成绩最高分的学生数据:\n");
    printf("%-10s%-10s%-10s%-10s\n", "学号", "姓名", "性别", "成绩");
    printf("%-10s%-10s%-10s%-10.1f\n", studt.num, studt.name, studt.sex, studt.score);
    printf("\n\n按任意键返回主菜单。。。。。。");
    getchar();
}

这样修改后,maxscore函数将正确显示最高分的学生信息,并在按任意键后返回主菜单。

我试了下好像没什么问题,你可以重开一个文件,再复制进去

  • 这篇博客: maxScore-可获得的最大点数中的 代码演示 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • class Solution {
        public int maxScore(int[] cardPoints, int k) {
           int n=cardPoints.length;
           //记录所有卡牌的和
           int sum=0;
           //记录当前窗口中的值
           int Wnum=0;
           //保留窗口中的最小值
           int min=0;
           //求第一个窗口的值
            for (int i = 0; i < n - k; i++) {
                sum+=cardPoints[i];
            }
            Wnum=sum;
            min=sum;
            for(int i=n-k;i<n;i++)
            {
                sum+=cardPoints[i];
                Wnum-=cardPoints[i-n+k];
                Wnum+=cardPoints[i];
                if(Wnum < min)
                    min=Wnum;
            }
            return sum-min;
        }
    }
    

在maxscore函数中,需要将maxscore改为maxscore(),以调用该函数并执行其中的代码。此外,在输出成绩最高分部分的学生数据时,需要将printf语句放在while循环外面,以确保只输出一次。修改后的maxscore函数代码如下:


void maxscore()
{
    struct student stud,studt;
    FILE *fp;
    if((fp=fopen("stud.rec","rb"))==NULL)
    {
        printf("无法打开文件stud.rec.\n");
        exit(0);
    }
    studt.score=0;
    while(fread(&stud,sizeof(stud),1,fp)==1)
    {
        if(stud.score>studt.score) 
        {
            studt=stud;
        }
    }
    printf("\n\n成绩最高分部分的学生数据:\n");
    printf("\n%-10s%-10s%-10s%-10s%\n","学号","姓名","性别","成绩");
    printf("%-10s%-10s%-10s%-10.1f\n",studt.num,studt.name,studt.sex,studt.score);
    fclose(fp);    
    printf("\n\n\n按任意键返回主菜单。。。。。。");getchar(); 
}