C语言主菜单新增可更新学生测验成绩的子菜单实现问题
C语言学生成绩管理程序更新功能实现方案
核心修改点
- 新增单条学生记录展示函数,解决查询到对应学生后只能展示全量数据的问题
- 主菜单新增「更新学生成绩」选项,嵌套子菜单实现单科/全科成绩修改
- 修改完成后自动触发保存逻辑,同步更新本地存储文件
- 修复原有保存函数丢失最后一条记录的潜在bug
分步实现代码
1. 新增函数声明
在原有函数声明块新增以下内容:
void display_single(int p); void update(char n[31]);
2. 实现单条记录展示函数
// 展示指定下标的学生记录 void display_single(int p){ float av = average(q1[p], q2[p], q3[p]); system("cls"); printf("查询到的学生信息如下:\n"); printf("No.\tStudent\tQuiz1\tQuiz2\tQuiz3\tAverage\tRemarks\n"); printf("%d.)\t%s\t%d\t%d\t%d\t%6.2f\t%s\n",p+1,name[p],q1[p],q2[p],q3[p],av, av>=75.0 ? "Passed":"Failed"); }
3. 调整主菜单及main函数逻辑
修改menu()函数的菜单打印部分,新增更新选项,调整退出选项编号:
int menu(){ int op; system("cls"); printf("Menu\n"); printf("1.) Add Student record\n"); printf("2.) Insert Student record\n"); printf("3.) Delete Student record\n"); printf("4.) Display\n"); printf("5.) Update student score\n"); // 新增更新选项 printf("6.) Exit\n"); // 原退出选项调整为6 printf("Select(1-6): "); scanf("%d",&op); return(op); }
对应修改main函数的switch分支,新增更新逻辑分支:
int main(){ char nm[31]; int qz1,qz2,qz3,m; initialize(); retrieve(); while(1){ m=menu(); switch(m){ case 1 : system("cls");printf("Insert Mode\n"); printf("Input Name: ");scanf("%s",nm); printf("Input Quiz1: ");scanf("%d",&qz1); printf("Input Quiz2: ");scanf("%d",&qz2); printf("Input Quiz3: ");scanf("%d",&qz3); add(nm,qz1,qz2,qz3);break; case 2 : system("cls");printf("Insert Mode\n"); printf("Input Name: ");scanf("%s",nm);ins(nm);break; case 3 : system("cls");printf("Delete Mode\n"); printf("Input Name: ");scanf("%s",nm);del(nm);break; case 4 : display();break; // 新增更新分支 case 5 : system("cls");printf("Update Mode\n"); printf("Input the name of the student to update: ");scanf("%s",nm); update(nm);break; case 6 : save();printf("File Saved.\n");system("pause");exit(0); // 退出分支调整为case6 default: printf("Please select an option between 1-6 only\n");system("pause"); } } return 0; }
4. 实现更新功能及嵌套子菜单
void update(char n[31]){ int p, op, new_score; if (isempty()){ printf("Array is empty.\n"); system("pause"); return; } p = search(n); if (p == -1){ printf("Not found.\n"); system("pause"); return; } // 先展示查询到的单条记录 display_single(p); // 嵌套子菜单 printf("\nUpdate Submenu:\n"); printf("1. Update Quiz1\n"); printf("2. Update Quiz2\n"); printf("3. Update Quiz3\n"); printf("4. Update all quizzes\n"); printf("Select option: "); scanf("%d", &op); switch(op){ case 1: printf("Input new Quiz1 score: "); scanf("%d", &new_score); q1[p] = new_score; break; case 2: printf("Input new Quiz2 score: "); scanf("%d", &new_score); q2[p] = new_score; break; case 3: printf("Input new Quiz3 score: "); scanf("%d", &new_score); q3[p] = new_score; break; case 4: printf("Input new Quiz1 score: "); scanf("%d", &q1[p]); printf("Input new Quiz2 score: "); scanf("%d", &q2[p]); printf("Input new Quiz3 score: "); scanf("%d", &q3[p]); break; default: printf("Invalid option, no changes made.\n"); system("pause"); return; } // 修改完成后自动保存到本地文件 save(); printf("Score updated successfully, file has been synced.\n"); // 展示修改后的结果 display_single(p); system("pause"); }
5. 修复原有save函数bug
原有save函数循环条件为i<last,会丢失最后一条学生记录,修改为:
void save(){ FILE *fp; int i; fp = fopen("Update.dbf","w+"); if (fp==NULL){ printf("Error - File Not Found.\n"); system("pause"); } else{ for (i=0;i<=last;i++) // 把i<last改成i<=last fprintf(fp,"%s\t%d\t%d\t%d\n",name[i],q1[i],q2[i],q3[i]); } fclose(fp); }
功能验证
编译运行后即可在主菜单看到新增的更新选项,输入学生姓名查询成功后会弹出子菜单选择要修改的成绩,修改完成后自动同步到Update.dbf文件。
内容的提问来源于stack exchange,提问作者Jazzy Jeffie
相关产品推荐
相关产品推荐

