小组合作做了一个简陋的学生信息管理系统,修改学生信息的部分一直有问题,麻烦大神帮我看一下到底有什么问题,我真找不出来。

#include
#include
#include
#include
#include
#define N 10000
typedef struct student
{
char ID[20]; // 学号
char name[20]; // 姓名
char sex; // 性别
double score[3]; // 三科成绩
double total; // 总分
double avg; // 平均分
}STUDENT;
void memu(void);
void load(STUDENT stu[],int *nptr); // 将学生信息加载到数组stu中
void save(STUDENT stu[],int n); // 将学生信息保存在磁盘中
void add(STUDENT stu[],int *nptr); // 添加学生信息
void output(STUDENT stu[],int n); // 输出所有学生信息
void InputRecord(STUDENT stu[],int i);// 添加第n+1个学生的信息
void PrintRecord(STUDENT *sptr); // 输出指针sptr所指记录的内容
void edit(STUDENT stu[],int n); // 修改学生信息
void statis(STUDENT stu[], int n);
void del(STUDENT stu[],int *nPtr); // 删除学生信息
int main()
{
int select;
int n;
STUDENT stu[N];

load(stu,&n);
while(1)
{
    memu();
    scanf("%d",&select);

    switch(select)
    {
    case 1:    // 录入学生成绩
     add(stu,&n);
        break;
    case 2:    // 显示学生信息
    output(stu, n);
        break;
    case 3:    // 修改学生信息
     edit(stu,n);
    break;
    case 4:               // 删除学生信息
     del(stu,&n);
        break;
    case 5:               // 查找学生信息
        break;
    case 6:
        statis(stu, n);    // 统计个科目最高分
        break;
    case 7:                // 按总分顺序排序
        break;
    case 0:                // 退出系统
        break;
    default:
        printf("你输入的有误,请重新输入");
        break;

    }
}

}
void memu(void)
{
system("cls");
printf(" 欢迎使用高校学生管理系统 ");
printf("\t\t 菜单 \n");
printf("\t\t1.录入学生的成绩\n");
printf("\t\t2.显示学生信息\n");
printf("\t\t3.修改学生信息\n");
printf("\t\t4.删除学生信息\n");
printf("\t\t5.查找学生信息\n");
printf("\t\t6.统计各科目最高分、平均分和不及格人数\n");
printf("\t\t7.按总分排序\n");
printf("\t\t0.退出系统\n");
}

//将学生信息加载到数组stu中
void load(STUDENT stu[],int *nptr)
{
FILE *fp; //定义文件指针
int i;

if((fp=fopen("D:\\student.txt","r"))==NULL)
{
    *nptr=0;
    return ;
}

for(i=0; fread(&stu[i],sizeof(STUDENT),1,fp)!=0; i++)
{
*nptr=i; //*nptr记录文件中当前学生数量
}
fclose(fp); //关闭文件
}
//将学生信息保存在磁盘中
void save(STUDENT stu[],int n)
{
FILE *fp; //定义文件指针

if((fp=fopen("D:\\student.txt","w"))==NULL)  //
{
    printf("打开文件失败\n");
    exit(0);
}
fwrite(stu,n*sizeof(stu[0]),1,fp);
fclose(fp);    //关闭文件

}
//添加学生信息
void add(STUDENT stu[],int *nptr)
{
int i=0;
char sel = 'Y';

while(sel=='Y')
{
    InputRecord(stu,(*nptr)++);  //添加第n+1个学生的信息
    printf("if you want stop ? yes(Y) or no(N)\n");
    scanf(" %c",&sel);
}
save(stu,*nptr);

}
//输入一个学生信息,存到score[i]中
void InputRecord(STUDENT stu[],int i)
{
int j;

//输入学号,并验证合法性
printf("输入第%d个学生的信息\n",i+1);

printf("输入学生学号(学号小于9位数字组成)\n");
scanf("%s",&stu[i].ID);

printf("请输入学生姓名\n");
scanf("%s",stu[i].name);

printf("请输入学生性别(f或m f代表女性 m代表男性)\n");
scanf(" %c",&stu[i].sex);

//输入五门课成绩并累加
printf("输入三门课成绩(0~100)\n");
stu[i].total=0;

for(j=0;j<3;j++)
{
    scanf("%lf",&stu[i].score[j]);
    stu[i].total+=stu[i].score[j];
}

//计算总成绩
stu[i].avg=stu[i].total/3;

}
//输出所有学生信息
void output(STUDENT stu[],int n)
{
int i;

//打印表头
printf("%8s%8s%4s%8s%8s%8s%8s%8s%8s%8s\n","ID","NAME","SEX",
       "SCORE1","SCORE2","SCORE3","SCORE4","SCORE5","total","avg");

//打印所有记录
for(i=0;i<n;i++)
{
    PrintRecord(&stu[i]);
}

system("pause");

}

//输出指针sptr所指记录的内容
void PrintRecord(STUDENT *sptr)
{
int i;
printf("%8s%8s%4c",sptr->ID,sptr->name,sptr->sex);

for(i=0;i<3;i++)
{
    printf("%8.2f",sptr->score[i]);
}

printf("%8.2f%8.2f",sptr->total,sptr->avg);
printf("\n");

}

void edit(STUDENT stu[],int n)

{

int i,index;

char sel;

char str[20];

printf("输入学号");

scanf("%s",str);

index=FindByNum(stu,n,str);

if(index<0)

{

   printf("该学生信息不存在\n"); //信息不存在的情况

   return;

}

printf("请输入需更改的项目\n1.姓名\n2.性别\n3.科目成绩\n4.总成绩\n5.平均成绩/n(输入序号即可)\n");

int a; //菜单栏

scanf("%d",&a);

switch(a)

{

case 1:

 printf("修改前的姓名如下:\n");   //修改姓名

       PrintRecord(&stu[index]);

       printf("请输入修改后的姓名:\n");

       scanf("%s",stu[index].name);

case 2:

printf("修改前的性别如下:\n"); //修改性别

       PrintRecord(&stu[index]);

       printf("请输入修改后的性别:\n");

       scanf("%s",stu[index].sex);

case 3:

   printf("修改前的科目成绩如下:\n");    //修改科目成绩

       PrintRecord(&stu[index]);

       printf("请输入修改后的科目成绩:\n");

       scanf("%s",stu[index].score);

case 4:

    printf("修改前的总成绩如下:\n");   //修改总成绩

       PrintRecord(&stu[index]);

       printf("请输入修改后的总成绩:\n");

       scanf("%s",stu[index].total);

case 5:

printf("修改前的平均成绩如下:\n"); //修改平均成绩

       PrintRecord(&stu[index]);

       printf("请输入修改后的平均成绩:\n");

       scanf("%s",stu[index].avg);

}

 save(stu,n);

}

int FindByNum(STUDENT stu[],int n,char *str)
{
int i;
for(i=0;i<n;i++)
if(strcmp( stu[i].ID,str)==0)
return i;
return -1;

}

void statis(STUDENT stu[], int n)
{
int i, fail;//“stu[]”为学生 “score[]”为成绩 “n”为人数 max为最高分数 fail 为不及格人数 sum为50人总分
double score[3], max, sum, avg;//“avg”为平均分
avg = 0;
max = 0;
fail = 0;
sum = 0;
for(i = 0; i < n; i++)
{
sum += stu[i].score[0];
avg = sum/n;
if(max < stu[i].score[0])
max = stu[i].score[0];
if(stu[i].score[0] < 60)
fail++;
}

printf("C语言最高分=%.2f\n",max);
printf("C语言不及格人数=%d\n",fail);
printf("C语言平均分=%.2f\n",avg);

fail = 0;
sum = 0;
max = 0;

for(i = 0; i < n; i++)
{
    sum += stu[i].score[1];
    avg = sum/n;
    if(max < stu[i].score[1])
        max = stu[i].score[1];
    if(stu[i].score[1] < 60)
        fail++;
}
printf("英语最高分=%.2f\n",max);
printf("英语不及格人数=%d\n",fail);
printf("英语平均分=%.2f\n",avg);
fail = 0;
sum = 0;
max = 0;

for(i = 0; i < n; i++)
{
    sum += stu[i].score[2];
    avg = sum/n;
    if(max < stu[i].score[2])
        max = stu[i].score[2];
    if(stu[i].score[2] < 60)
        fail++;
}
printf("数学最高分=%.2f\n",max);
printf("数学不及格人数=%d\n",fail);
printf("数学平均分=%.2f\n",avg);
system("pause");
fail = 0;
sum = 0;
max = 0;

}
// 删除学生信息
void del(STUDENT stu[],int *nPtr)
{
int i,index;
char str[20];
printf("请你输入学号");
scanf("%s",str);
index = FindByNum(stu,*nPtr,str);

if(index<0)
{
    printf("\n 亲,不好意思,你所选的学生信息不存在\n");
    system("pause");
    return ;
}
for (i = index; i < *nPtr-1;i++)
   stu[i] = stu[i+1];

   (*nPtr)--;

   printf("\n  恭喜恭喜 删除成功  \n");
   system("pause");
   save(stu,*nPtr);  // 保存到文件中

}

1个回答

edit()函数里 switch 语句那边,每个case之后没有对应的break,也就是你没有跳出
case 1:

    printf("修改前的姓名如下:\n");   //修改姓名

    PrintRecord(&stu[index]);

    printf("请输入修改后的姓名:\n");

    scanf("%s", stu[index].name);
    //printf("%s", stu[index].name);
    break;
    像这样每个case后面添加一个break;就可以
    在最后添加   default:  break;

    还有两个比较严重的问题
    1. 同样的信息可以输入多次, 至少你选择一个变量是唯一对应一个学生信息的例如学号,  再添加之前应该检查该用户是否已经存在
    2.通过键盘输入选择功能的时候,你应该让其他键无效
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问