You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 21:00:03