根据C语言小型成绩管理系统画一个流程图

这是一个专家打的C语言小型成绩管理系统代码,有点长,希望大家能帮我画一下整个代码的流程图,最好是能稍微讲解一下,嗯……问答好像不能发代码,只有照片了。希望哪位朋友能帮帮忙!谢谢🙏

img



#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NMBSCORE 3
const char* kcname[NMBSCORE] = { "语文","数学","英语" };
typedef struct _stNode
{
    int num;        //学号
    char name[20];  //姓名 
    char sex;       //性别
    int age;        //年龄
    int cls;        //班级(1-3)
    int score[NMBSCORE]; //成绩
    struct _stNode* next;
}StNode;
//保存的文件
const char* filename1 = "class1.txt";
const char* filename2 = "class2.txt";
const char* filename3 = "class3.txt";
//学生信息保存
void Save(StNode* head)
{
    StNode* node;
    FILE* fp1, * fp2, * fp3;
    FILE* fp;
    int i;
    //system("cls");
    fp1 = fopen(filename1, "w");
    fp2 = fopen(filename2, "w");
    fp3 = fopen(filename3, "w");
    node = head;
    while (node)
    {
        if (node->cls == 1)
            fp = fp1;
        else if (node->cls == 2)
            fp = fp2;
        else
            fp = fp3;
        fprintf(fp, "%d%20s %c%4d%4d", node->num, node->name, node->sex, node->age, node->cls);
        for (i = 0; i < NMBSCORE; i++)
            fprintf(fp, "%4d", node->score[i]);
        fprintf(fp, "\n");
        node = node->next;
    }
    fclose(fp1);
    fclose(fp2);
    fclose(fp3);
    printf("文件保存成功!\n");
    //system("pause");
}
//添加学生信息
StNode* Input(StNode* head)
{
    StNode* p, * node;
    int i;
    system("cls");
    node = (StNode*)malloc(sizeof(StNode));
    //录入信息
    printf("请输入学号:");
    scanf("%d", &node->num);
    printf("请输入姓名:");
    scanf("%s", node->name);
    printf("请输入性别:");
    scanf(" %c", &node->sex);
    printf("请输入年龄:");
    scanf(" %d", &node->age);
    printf("请输入班级(1-3):");
    scanf("%d", &node->cls);
    for (i = 0; i < NMBSCORE; i++)
    {
        printf("请输入%s成绩:", kcname[i]);
        scanf("%d", &node->score[i]);
    }
    node->next = 0;
    if (head == 0)
    {
        head = node;
        //
    }
    else
    {
        p = head;
        while (p->next)
            p = p->next;
        //新建节点
        p->next = node;
    }
    Save(head);
    system("pause");
    return head;
}
//显示单个学生信息
void showSingle(StNode* p)
{
    int j;
    printf("%10s  %20s  %4s  %4s  %4s", "学号", "姓名", "性别", "年龄", "班级");
    for (j = 0; j < NMBSCORE; j++)
        printf("  %4s", kcname[j]);
    printf("\n");
    printf("%10d  ", p->num);
    printf("%20s  ", p->name);
    printf("%4c  ", p->sex);
    printf("%4d  ", p->age);
    printf("%4d", p->cls);
    for (j = 0; j < NMBSCORE; j++)
        printf("  %4d ", p->score[j]);
    printf("\n");
}
//显示所有学生信息
void showAll(StNode* head, int flag)
{
    StNode* p;
    int j;
    if (flag == 1)
        system("cls");
    p = head;
    printf("%10s  %20s  %4s  %4s  %4s", "学号", "姓名", "性别", "年龄", "班级");
    for (j = 0; j < NMBSCORE; j++)
        printf("  %4s", kcname[j]);
    printf("\n");
    while (p)
    {
        printf("%10d  ", p->num);
        printf("%20s  ", p->name);
        printf("%4c  ", p->sex);
        printf("%4d  ", p->age);
        printf("%4d", p->cls);
        for (j = 0; j < NMBSCORE; j++)
            printf("  %4d", p->score[j]);
        printf("\n");
        p = p->next;
    }
    system("pause");
}
//查询信息
void Find(StNode* head)
{
    int opt;
    StNode* p = head;
    int id;
    char name[20] = { 0 };
    system("cls");
    printf("1.按学号查询\n");
    printf("2.按姓名查询\n");
    scanf("%d", &opt);
    switch (opt)
    {
    case 1:
        printf("请输入学号:");
        scanf("%d", &id);
        while (p)
        {
            if (p->num == id)
            {
                showSingle(p);
                break;
            }
            p = p->next;
        }
        if (p == 0)
            printf("查无此人\n");
        break;
    case 2:
        printf("请输入姓名:");
        scanf("%s", name);
        while (p)
        {
            if (strcmp(p->name, name) == 0)
            {
                showSingle(p);
                break;
            }
            p = p->next;
        }
        if (p == 0)
            printf("查无此人\n");
        break;
    }
    system("pause");
}
//插入学生信息
void Insert(StNode* head)
{
    StNode* node = 0;
    StNode* pnew = 0;
    int id, i;
    system("cls");
    //输入新学生的信息
    pnew = (StNode*)malloc(sizeof(StNode));
    //录入信息
    printf("录入新学生的信息\n");
    printf("请输入学号:");
    scanf("%d", &pnew->num);
    printf("请输入姓名:");
    scanf("%s", pnew->name);
    printf("请输入性别:");
    scanf(" %c", &pnew->sex);
    printf("请输入年龄:");
    scanf(" %d", &pnew->age);
    printf("请输入班级:");
    scanf("%d", &pnew->cls);
    for (i = 0; i < NMBSCORE; i++)
    {
        printf("请输入%s成绩:", kcname[i]);
        scanf("%d", &pnew->score[i]);
    }
    pnew->next = 0;
    //插入
    printf("请输入需要插入位置(某个学号的后面):");
    scanf("%d", &id);
    node = head;
    while (node)
    {
        if (node->num == id)
            break;
        else
            node = node->next;
    }
    if (node == 0)
    {
        printf("未找到该学号,插入失败\n");
        delete pnew;
        pnew = 0;
    }
    else
    {
        pnew->next = node->next;
        node->next = pnew;
        printf("插入成功!\n");
        Save(head); //插入后保存文件
    }
    system("pause");
}
//删除学生信息
void DeleteInfo(StNode* head)
{
    StNode* node, * pre;
    int id, i = 0;
    system("cls");
    printf("请输入需要删除信息的学生学号:");
    scanf("%d", &id);
    if (head->num == id)
    {
        showSingle(head);
        node = head->next;
        free(head);
        head = node;
        printf("该学生信息已经删除\n");
        Save(head);
        system("cls");
        return;
    }
    else
    {
        pre = head;
        node = head->next;
        while (node)
        {
            if (node->num == id)
            {
                pre->next = node->next;
                showSingle(node);
                free(node);
                node = 0;
                printf("该学生信息已经删除\n");
                Save(head);
                system("pause");
                return;
            }
            else
            {
                pre = node;
                node = node->next;
            }
        }
        printf("查无此人\n");
        system("pause");
    }
}
//成绩计算
void Caculate(StNode* head)
{
    StNode* p = head;
    double t;
    int i;
    while (p)
    {
        t = 0;
        for (i = 0; i < NMBSCORE; i++)
            t += p->score[i];
        printf("学号:%10d\t 姓名:%20s 总分:%6d\t 平均分:%.2f\n", p->num, p->name, (int)t, (t / NMBSCORE));
        p = p->next;
    }
}
//总分降序排序
StNode* Sort(StNode* head)
{
    StNode* min_pre = NULL;
    StNode* min = head;
    StNode* tmp = head;
    StNode* new_list = NULL;
    StNode* tail_sort = NULL;
    char name[20] = { 0 };
    int i = 0;
    int s1, s2;
    system("cls");
    if (NULL == head)    //若链表为空则不用排序
    {
        return NULL;
    }
    if (NULL == head->next)  //若链表中只有一个数,则不用比较
    {
        printf("min is head\n");
        return head;
    }
    while (head)
    {
        min = head;
        tmp = head;
        while (tmp->next)
        {
            //根据总分降序排序
            s1 = 0;
            s2 = 0;
            for (i = 0; i < NMBSCORE; i++)
            {
                s1 += min->score[i];
                s2 += tmp->next->score[i];
            }
            if (s1 < s2) //降序
            {
                min = tmp->next;
                min_pre = tmp;
            }
            tmp = tmp->next;
        }
        if (min == head)
        {
            head = head->next;
        }
        else
        {
            min_pre->next = min->next;
            min->next = NULL;
        }
        if (NULL == new_list)    //按照尾插将最小的数组成新的链表
        {
            tail_sort = min;
            new_list = tail_sort;
        }
        else
        {
            tail_sort->next = min;
            tail_sort = min;
        }
    }
    return new_list;
}
int main()
{
    StNode* head = 0;
    int opt = 0;
    int bgo = 1;
    while (bgo)
    {
        system("cls");
        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");
        scanf("%d", &opt);
        switch (opt)
        {
        case 0:
            bgo = 0;
            break;
        case 1:
            head = Input(head);
            break;
        case 2:
            showAll(head, 1);
            break;
        case 3:
            Find(head);
            break;
        case 4:
            Insert(head);
            break;
        case 5:
            DeleteInfo(head);
            break;
        case 6:
            Caculate(head);
            break;
        case 7:
            head = Sort(head);
            showAll(head, 0);
            break;
        }
    }
    return 0;
}


提问有代码块功能的,简单系统流程图可以画,要非常详细的就算了