
案例要求模拟开发一个学生成绩管理系统,此系统具有以下功能:
这些功能之间的逻辑关系如下图所示:

学生成绩管理系统
分析案例需求可知,该系统首先会向用户展现一个菜单选择界面,用户可以根据菜单界面的提示,选择不同的功能进入子界面,因此可以针对每一个功能定义一个函数,通过函数调用实现相应功能。由系统需求可知,该系统主要有6大功能,因此需要定义6个函数。
void add(struct student stu[])
{
    int i, id = 0; //i作为循环变量,id用来保存新学号
    char quit;  //保存是否退出的选择
    do
    {
        printf("学号:");
        scanf("%d", &id);
        for (i = 0; i < n; i++)
        {
             if (id == stu[i].id)
            {
                printf("此学号存在!\n");
                 return;
            }
        }
        
       stu[i].id = id;
       printf("姓名:");
       scanf("%s", &stu[i].name);
       printf("计算机基础成绩:");
       scanf("%d", &stu[i].chinese);
       printf("数据结构成绩:");
       scanf("%d", &stu[i].math);
       stu[i].sum = stu[i].chinese + stu[i].math;
       n++;  //记录条数加1
       printf("是否继续添加?(Y/N)");
       scanf("\t%c", &quit);
    } while (quit != 'N');
}
void show(struct student stu[], int i)
{
    printf("%-10d", stu[i].id);
    printf("%-10s", stu[i].name);
    printf("%-10d", stu[i].chinese);
    printf("%-10d", stu[i].math);
    printf("%-10d\n", stu[i].sum);
}
void modify(struct student stu[])
{
    char name[8], ch;
    int i;
    printf("修改学生的记录。\n");
    printf("请输入学生的姓名:");
    scanf("%s", &name);
    for (i = 0; i < n; i++)
    {
        if (strcmp(name, stu[i].name) == 0)
        {
             getchar();
             printf("找到该生的记录,如下所示:\n");
             HH;  //显示记录的标题
             show(stu, i);
             printf("是否修改?(Y/N)\n");
            scanf("%c", &ch);
            if (ch == 'Y' || ch == 'y')
            {
                 getchar();
                 printf("姓名:");
                 scanf("%s", &stu[i].name);
                 printf("计算机基础成绩:");
                 scanf("%d", &stu[i].chinese);
                 printf("数据结构成绩:");
                 scanf("%d", &stu[i].math);
                 stu[i].sum = stu[i].chinese + stu[i].math;
                 printf("修改完毕。\n");
            }
            return;
        }
    }
    printf("没有找到该生的记录。\n");
}
void del(struct student stu[])
{
    int id, i;
    char ch;
    printf("删除学生的记录。\n");
    printf("请输入学号:");
    scanf("%d", &id);
    for (i = 0; i < n; i++)
    {
        if (id == stu[i].id)
        {
            getchar();
            printf("找到该生的记录,如下所示:\n");
            HH;  //显示记录的标题
            show(stu, i);   //显示数组stu中的第i条记录
            printf("是否删除?(Y/N)\n");
            scanf("%c", &ch);
            
            if (ch == 'Y' || ch == 'y')
            {
                 for (; i < n; i++)
                     // 被删除记录后面的记录均前移一位
                     stu[i] = stu[i + 1];
                     n--;   //记录总条数减1
                     printf("删除成功!");
            }
            return;
        }
    }
    printf("没有找到该生的记录!\n");
}
void search(struct student stu[])
{
    char name[8];
    int i;
    printf("查找学生的记录。\n");
    printf("请输入学生的姓名:");
    scanf("%s", &name);
    for (i = 0; i < n; i++)
    {
        if (strcmp(name, stu[i].name) == 0)
        {
             printf("找到该生的记录,如下所示:\n");
             HH;  //显示记录的标题
             show(stu, i); //显示数组stu中的第i条记录
            return;
        }
    }
    printf("没有找到该生的记录。\n");
}
void sort(struct student stu[])
{
    int i, j;
    struct student t;
    printf("按总成绩进行排序,");
    
    for (i = 0; i < n - 1; i++)
    {
        for (j = i + 1; j < n; j++)
        {
            if (stu[i].sum < stu[j].sum)
            {
                 t = stu[i];
                 stu[i] = stu[j];
                 stu[j] = t;
            }
        }
    }
    printf("排序结果如下:\n");
    showAll(stu); //显示排序后的所有记录
}
由于该系统需要定义6个函数,而且还涉及变量,代码较多,因此可以分文件实现该系统,将函数声明与定义在头文件student.h中实现,函数实现在student.c文件中完成,函数调用在main.c文件中执行。
struct student
{
    int  id;               // 学号
    char name[8];  //姓名
    int chinese;     //计算机基础成绩
    int math;         //数据结构成绩
    int sum;          //总分
};