【你还在烦恼你的实验报告吗?】C语言结课实验——学生成绩管理系统

第一次写博客~有什么问题大家多多见谅~欢迎找我探讨hhh

  • 学生成绩管理系统(C语言)
    • 系统功能模块构成
    • 数据结构说明
    • 自定义函数说明:
    • 数据读取:文件读取
    • 视频演示
    • 源代码在此!

学生成绩管理系统(C语言)

本系统通过多模块化设计进行开发,包含三个.c文件(main.c、function.c和extra.c)、一个function.h文件和一个student.txt文件。实现的功能有:对学生的学号自动分配,对学生数据的读取、插入、删除、查询、输出等,对学生成绩进行等级划分、名次排序等。

系统功能模块构成

数据结构说明

1、头文件:

#include 
#include 
#include 
#include 

2、数据结构:动态单链表
3、结构体:

typedef struct StuLink
{
    int xh;               //学生学号(由系统自动生成)
    char xm[20];          //学生姓名
    enum Sex_type xb;     //学生性别(枚举类型)
    int cj;               //学生成绩(0-100之间)
    char dj;              //学生等级
    int mc;               //学生名次
    struct StuLink *next; //单向链表next结点指向下一位学生
} StuLink;

4、枚举类型:

enum Sex_type{  boy = 0, girl = 1 };

5、全局变量:

int Max_xh = 0;                 //当前最大学号
int dj[6] = {0, 0, 0, 0, 0, 0}; //一维数组存储ABCDE各等级人数

自定义函数说明:

//功能:从数据文件中逐行读取学生信息生成学生链表,返回头指针。
StuLink *ReadFromFile(FILE *fp, StuLink *head);
//功能:先将学生链表按学号升序排序,再将学生链表中的数据逐行保存到数据文件。
void SaveToFile(FILE *fp, StuLink *head);
//功能:在链表尾插入一个新结点,返回头指针
StuLink *InsertNode(StuLink *head);
//修改链表中指定学号的结点(学号不能修改,成绩必须在[0,100]区间的整数)。
void EditNode(StuLink *head, int num);
//功能:删除链表中指定学号的结点,返回头指针。
StuLink *DeleteNode(StuLink *head, int num);
//功能:查询链表中指定学号的结点,并显示查询结果
void QueryNode(StuLink *head, int num);
//功能:查询链表中不及格的所有结点,并显示查询结果
void QueryLink(StuLink *head);
//功能:计算链表中每个结点的名次。
void RankLink(StuLink *head);
//功能:统计并返回各等级人数。
void AnalysisLink(StuLink *head);
//功能:按指定数据项的顺序对学生链表进行排序。
void SortLink(StuLink *head, int choose);
//功能:按指定数据项的顺序输出学生成绩表、各等级人数。
void OutputLink_1(StuLink *head, int choose);
//功能:分页显示全部学生的信息。
void OutputLink_2(StuLink *head, int num);
//功能:匹配等级
void dj_change(StuLink *p);
//功能:确定学号
void xh_define(StuLink *p, StuLink *head);
//功能:计算人数
int count(StuLink *head);
//功能:开始菜单
void start_menu();
//功能:显示二级菜单,返回头指针
StuLink *menu(int choose1, StuLink *head);
//功能:交换两个学生的顺序
void exchange(StuLink *p1, StuLink *p2);
//功能:单独显示10个学生信息
void OutputLink_only10(StuLink *head, int start);

数据读取:文件读取

文件:student.txt
测试数据:

1 aaa 0 98 A 4
2 bbb 0 42 E 13
3 ccc 1 98 A 4
5 eee 1 75 C 11
7 rrr 0 91 A 7
8 qqq 0 70 C 12
10 mmm 1 86 B 9
11 kkk 0 98 A 4
12 ttt 0 42 E 13
13 小红 1 100 A 1
14 dzh 0 100 A 1
15 小蓝 0 85 B 10
16 小薇 1 90 A 8
17 小黑 0 100 A 1

视频演示

c语言学生管理系统视频演示

源代码在此!

function.h

#ifndef _FUNCTION_H_
#define _FUNCTION_H_

#include 
#include 
#include 
#include 

enum Sex_type
{
    boy = 0,  // 男生:0
    girl = 1, //女生:1
};

typedef struct StuLink
{
    int xh;               //学生学号(由系统自动生成)
    char xm[20];          //学生姓名
    enum Sex_type xb;     //学生性别(枚举类型)
    int cj;               //学生成绩(0-100之间)
    char dj;              //学生等级
    int mc;               //学生名次
    struct StuLink *next; //单向链表next结点指向下一位学生
} StuLink;

//函数声明
//功能:从数据文件中逐行读取学生信息生成学生链表,返回头指针。
StuLink *ReadFromFile(FILE *fp, StuLink *head);
//功能:先将学生链表按学号升序排序,再将学生链表中的数据逐行保存到数据文件。
void SaveToFile(FILE *fp, StuLink *head);
//功能:在链表尾插入一个新结点,返回头指针
StuLink *InsertNode(StuLink *head);
//修改链表中指定学号的结点(学号不能修改,成绩必须在[0,100]区间的整数)。
void EditNode(StuLink *head, int num);
//功能:删除链表中指定学号的结点,返回头指针。
StuLink *DeleteNode(StuLink *head, int num);
//功能:查询链表中指定学号的结点,并显示查询结果
void QueryNode(StuLink *head, int num);
//功能:查询链表中不及格的所有结点,并显示查询结果
void QueryLink(StuLink *head);
//功能:计算链表中每个结点的名次。
void RankLink(StuLink *head);
//功能:统计并返回各等级人数。
void AnalysisLink(StuLink *head);
//功能:按指定数据项的顺序对学生链表进行排序。
void SortLink(StuLink *head, int choose);
//功能:按指定数据项的顺序输出学生成绩表、各等级人数。
void OutputLink_1(StuLink *head, int choose);
//功能:分页显示全部学生的信息。
void OutputLink_2(StuLink *head, int num);
//功能:匹配等级
void dj_change(StuLink *p);
//功能:确定学号
void xh_define(StuLink *p, StuLink *head);
//功能:计算人数
int count(StuLink *head);
//功能:开始菜单
void start_menu();
//功能:显示二级菜单,返回头指针
StuLink *menu(int choose1, StuLink *head);
//功能:交换两个学生的顺序
void exchange(StuLink *p1, StuLink *p2);
//功能:单独显示10个学生信息
void OutputLink_only10(StuLink *head, int start);

#endif

function.c

#include "function.h"

int Max_xh = 1;                 //当前最大学号
int dj[6] = {0, 0, 0, 0, 0, 0}; //一维数组存储ABCDE各等级人数

StuLink *ReadFromFile(FILE *fp, StuLink *head)
{
    StuLink *p1 = NULL, *p2 = NULL;
    char ch;
    int i = 0;
    if ((fp = fopen("student.txt", "r")) == NULL)
    {
        fp = fopen("student.txt", "w");
    } //判断是否正常打开文件并使指向文件
    head = NULL;
    ch = fgetc(fp);
    if (ch != EOF)
    {
        rewind(fp);
        while (!feof(fp))
        {
            if ((p2 = (StuLink *)malloc(sizeof(StuLink))) == NULL)
            {
                printf(" 不能成功分配储存块!\n");
                exit(0);
            } //动态分配空间
            fscanf(fp, "%d %s %d %d %c %d\n", &p2->xh, p2->xm, &p2->xb, &p2->cj, &p2->dj, &p2->mc);
            p2->next = NULL;
            if (head == NULL)
            {
                p1 = p2;
                head = p2;
            }
            else
            {
                p1->next = p2;
                p1 = p2;
            }
            if (p2->xh > i)
                i = p2->xh;
        }
        Max_xh = i + 1;
        AnalysisLink(head);
        RankLink(head);
    }
    if (fclose(fp))
    {
        printf("\n 无法正常关闭数据文件!\n");
        getchar();
        exit(0);
    }
    return head;
}

void SaveToFile(FILE *fp, StuLink *head)
{
    StuLink *p = head;
    SortLink(head, 1);
    if ((fp = fopen("student.txt", "w")) == NULL)
    {
        printf("\n 文件打开失败!\n");
        getchar();
        exit(0);
    }
    while (p != NULL)
    {
        fprintf(fp, "%d %s %d %d %c %d\n", p->xh, p->xm, p->xb, p->cj, p->dj, p->mc);
        p = p->next;
    }
    if (fclose(fp))
    {
        printf("\n 无法正常关闭数据文件!\n");
        getchar();
        exit(0);
    }
}

StuLink *InsertNode(StuLink *head)
{
    StuLink *new = NULL, *p = NULL;
    char xb[10];
    if ((new = (StuLink *)malloc(sizeof(StuLink))) == NULL)
    {
        printf("\n 内存分配失败!\n");
        getchar();
        exit(0);
    }
    printf("\n 请依次输入该生的姓名、性别、成绩:(0代表男生 1代表女生,各项以空格隔开)\n\n ");
    scanf("%s %d %d", new->xm, &new->xb, &new->cj);
    while (new->xb != 0 && new->xb != 1)
    {
        printf("\n 性别输入错误!请重新输入性别( 0 或 1 )!\n ");
        scanf("%d", &new->xb);
    }
    while (new->cj > 100 || new->cj < 0)
    {
        printf("\n 成绩输入错误!请重新输入成绩( 0 至 100)!\n ");
        scanf("%d", &new->cj);
    }
    dj_change(new);
    new->next = NULL;
    p = head;
    if (head == NULL)
    {
        head = new;
    }
    else
    {
        while (p->next != NULL)
            p = p->next;
        p->next = new;
    }
    xh_define(new, head);
    printf("\n 插入成功!\n");
    return head;
}
void EditNode(StuLink *head, int num)
{
    StuLink *p = head;
    int choose;
    while (p != NULL)
    {
        if (p->xh == num)
        {
            switch (p->xb)
            {
            case boy:
                printf("\n 该生的信息为:\n\n学号:%d  姓名:%s  性别:男  成绩:%d  等级:%c  名次:%d\n", p->xh, p->xm, p->cj, p->dj, p->mc);
                break;
            case girl:
                printf("\n 该生的信息为:\n\n学号:%d  姓名:%s  性别:女  成绩:%d  等级:%c  名次:%d\n", p->xh, p->xm, p->cj, p->dj, p->mc);
                break;
            }
            printf("\n 要修改的数据项是:\n");
            printf("\n   1)姓名   2)性别   3)成绩   4)返回\n");
        start:
            printf("\n 请输入:");
            scanf("%d", &choose);
            printf("\n 请修改:");
            if (choose == 1)
                scanf("%s", p->xm);
            else if (choose == 2)
            {
                printf("(0代表男生 1代表女生)  ");
                scanf("%d", &p->xb);
                while (p->xb != 0 && p->xb != 1)
                {
                    printf("\n 性别输入错误!请重新输入性别!(0代表男生 1代表女生)\n\n ");
                    scanf("%d", &p->xb);
                }
            }
            else if (choose == 3)
            {
                scanf("%d", &p->cj);
                while (p->cj > 100 || p->cj < 0)
                {
                    printf("\n 成绩输入错误!请重新输入成绩( 0 至 100 )!\n\n ");
                    scanf("%d", &p->cj);
                }
                dj_change(p);
                RankLink(head);
            }
            else if (choose == 4)
                return;
            else
            {
                printf("\n 输入错误!\n\n");
                goto start;
            }
            printf("\n 修改成功!\n");
            break;
        }
        p = p->next;
    }
    if (p == NULL)
    {
        printf("\n 无法查到该学号的信息!\n");
    }
}

StuLink *DeleteNode(StuLink *head, int num)
{
    StuLink *p1 = head, *p2 = NULL;
    while (p1->xh != num && p1 != NULL)
    {
        p2 = p1;
        p1 = p1->next;
    }
    if (p1->xh == num && p1 == head)
    {
        head = head->next;
        free(p1);
    }
    else if (p1->xh == num)
    {
        p2->next = p1->next;
        free(p1);
    }
    else
    {
        printf("\n 无法查到该学号的信息!\n");
        return head;
    }
    RankLink(head);
    printf("\n 删除成功!\n");
    getchar();
    return head;
}

void QueryNode(StuLink *head, int num)
{
    StuLink *p = head;
    if (head == NULL)
    {
        printf("\n 数据为空!\n");
        getchar();
        return;
    }
    else
    {
        while (p != NULL)
        {
            if (p->xh == num)
            {
                switch (p->xb)
                {
                case boy:
                    printf("\n 该生的信息为:\n\n 学号:%d  姓名:%s  性别:男  成绩:%d  等级:%c  名次:%d\n", p->xh, p->xm, p->cj, p->dj, p->mc);
                    break;
                case girl:
                    printf("\n 该生的信息为:\n\n 学号:%d  姓名:%s  性别:女  成绩:%d  等级:%c  名次:%d\n", p->xh, p->xm, p->cj, p->dj, p->mc);
                    break;
                }
                break;
            }
            p = p->next;
        }
        if (p == NULL)
        {
            printf("\n 无法查到该学号的信息!\n");
        }
        getchar();
    }
}
void QueryLink(StuLink *head)
{
    int i = 0;
    StuLink *p = head;
    if (head == NULL)
    {
        printf("\n 数据为空!\n");
        return;
    }
    else
    {
        while (p != NULL)
        {
            if (p->cj < 60)
            {
                i++;
                if (i == 1)
                    printf("\n\t学号\t 姓名 \t性别\t成绩\t等级\t名次\n");
                switch (p->xb)
                {
                case boy:
                    printf("\n\t%3d\t%6s\t  男\t%3d\t  %c\t%3d\n", p->xh, p->xm, p->cj, p->dj, p->mc);
                    break;
                case girl:
                    printf("\n\t%3d\t%6s\t  女\t%3d\t  %c\t%3d\n", p->xh, p->xm, p->cj, p->dj, p->mc);
                    break;
                }
            }
            p = p->next;
        }
        if (i == 0)
        {
            printf("\n 没有不及格人数!\n");
        }
        else
        {
            printf("\n 不及格人数:%d 人\n", i);
        }
    }
}

void RankLink(StuLink *head)
{
    StuLink *p1, *p2;
    int i = 1;
    if (head == NULL)
    {
        printf("\n 数据为空!\n");
        getchar();
        return;
    }
    if (head->next == NULL)
    {
        head->mc = 1;
        return;
    }
    for (p1 = head; p1 != NULL; p1 = p1->next)
    {
        for (p2 = head; p2 != NULL; p2 = p2->next)
        {
            if (p1->cj < p2->cj)
                i++;
        }
        p1->mc = i;
        i = 1;
    }
}

void AnalysisLink(StuLink *head)
{
    StuLink *p = head;
    int i;
    if (head == NULL)
    {
        printf("\n 数据为空!\n");
        getchar();
        return;
    }
    else
    {
        for (i = 1; i <= 5; i++)
            dj[i] = 0; //初始化等级数组
        while (p != NULL)
        {
            if (p->cj >= 90)
                dj[1]++;
            else if (p->cj < 90 && p->cj >= 80)
                dj[2]++;
            else if (p->cj < 80 && p->cj >= 70)
                dj[3]++;
            else if (p->cj < 70 && p->cj >= 60)
                dj[4]++;
            else if (p->cj < 60)
                dj[5]++;
            p = p->next;
        }
    }
}

void exchange(StuLink *p1, StuLink *p2)
{
    StuLink *temp;
    if ((temp = (StuLink *)malloc(sizeof(StuLink))) == NULL)
    {
        printf("\n 空间分配失败!\n");
        getchar();
        exit(0);
    }
    temp->xh = p1->xh;
    strcpy(temp->xm, p1->xm);
    temp->xb = p1->xb;
    temp->cj = p1->cj;
    temp->dj = p1->dj;
    temp->mc = p1->mc;

    p1->xh = p2->xh;
    strcpy(p1->xm, p2->xm);
    p1->xb = p2->xb;
    p1->cj = p2->cj;
    p1->dj = p2->dj;
    p1->mc = p2->mc;

    p2->xh = temp->xh;
    strcpy(p2->xm, temp->xm);
    p2->xb = temp->xb;
    p2->cj = temp->cj;
    p2->dj = temp->dj;
    p2->mc = temp->mc;

    free(temp);
}

void SortLink(StuLink *head, int choose)
{
    StuLink *p1 = head, *p2;
    StuLink *temp;
    if (p1 == NULL || p1->next == NULL)
        return;

    if (choose == 1) //按学号排序(升序)
    {
        for (p1 = head; p1->next != NULL; p1 = p1->next)
        {
            temp = p1;
            for (p2 = p1->next; p2 != NULL; p2 = p2->next)
            {
                if (temp->xh > p2->xh)
                    temp = p2;
            }
            exchange(temp, p1);
        }
    }
    else if (choose == 2) //按成绩排名(降序)
    {
        for (p1 = head; p1->next != NULL; p1 = p1->next)
        {
            temp = p1;
            for (p2 = p1->next; p2 != NULL; p2 = p2->next)
            {
                if (temp->cj < p2->cj)
                    temp = p2;
            }
            exchange(temp, p1);
        }
    }
    else
        printf("\n 输入错误!\n");
}

void OutputLink_1(StuLink *head, int choose)
{
    StuLink *p = NULL;
    if (choose == 1)
    {
        if (head != NULL)
        {
            SortLink(head, 1);
            printf("\n 学生成绩表如下:(按学号升序排序)\n");
            printf("\n\t学号\t 姓名 \t性别\t成绩\t等级\t名次\n");
            for (p = head; p != NULL; p = p->next)
            {
                switch (p->xb)
                {
                case boy:
                    printf("\n\t%3d\t%6s\t  男\t%3d\t  %c\t%3d\n", p->xh, p->xm, p->cj, p->dj, p->mc);
                    break;
                case girl:
                    printf("\n\t%3d\t%6s\t  女\t%3d\t  %c\t%3d\n", p->xh, p->xm, p->cj, p->dj, p->mc);
                    break;
                }
            }
            AnalysisLink(head);
            printf("\n 各等级人数:\n");
            printf("\n   A等级:%d 人\n   B等级:%d 人\n   C等级:%d 人\n   D等级:%d 人\n   E等级:%d 人\n", dj[1], dj[2], dj[3], dj[4], dj[5]);
        }
        else
        {
            printf("\n 数据为空!\n");
        }
    }
    else if (choose == 2)
    {
        if (head != NULL)
        {
            SortLink(head, 2);
            printf("\n 学生成绩表如下:(按学号升序排序)\n");
            printf("\n\t学号\t 姓名 \t性别\t成绩\t等级\t名次\n");
            for (p = head; p != NULL; p = p->next)
            {
                switch (p->xb)
                {
                case boy:
                    printf("\n\t%3d\t%6s\t  男\t%3d\t  %c\t%3d\n", p->xh, p->xm, p->cj, p->dj, p->mc);
                    break;
                case girl:
                    printf("\n\t%3d\t%6s\t  女\t%3d\t  %c\t%3d\n", p->xh, p->xm, p->cj, p->dj, p->mc);
                    break;
                }
            }
            AnalysisLink(head);
            printf("\n 各等级人数:\n");
            printf("\n   A等级:%d 人\n   B等级:%d 人\n   C等级:%d 人\n   D等级:%d 人\n   E等级:%d 人\n", dj[1], dj[2], dj[3], dj[4], dj[5]);
        }
        else
        {
            printf("\n 数据为空!\n");
        }
    }
    else
        printf("\n 输入错误!\n");
    getchar();
}

void OutputLink_2(StuLink *head, int num)
{
    int i = 1; //每十个数据中第一个数据的下标
    int choose;
    int page = 1;
    if (head == NULL)
    {
        printf("\n 数据为空!\n");
        getchar();
        return;
    }
    else
    {
        printf("\n 当前位置:第 %d 页 , 共 %d 页\n", page, (count(head) / 10) + 1);
        OutputLink_only10(head, 1);
        printf("\n\n       1)首页   2)上一页   3)下一页   4)尾页   0)返回\n");
    back:
        printf("\n 请对应操作输入序号:");
        scanf("%d", &choose);
        switch (choose)
        {
        case 1:
        {
            if (i == 1 || num == 10)
            {
                printf("\n 当前位置位于首页!\n");
            }
            else
            {
                system("cls");
                start_menu();
                printf("\n");
                page = 1;
                printf("\n 当前位置:第 %d 页\n", page);
                OutputLink_only10(head, 1);
                printf("\n\n       1)首页   2)上一页   3)下一页   4)尾页   0)返回\n");
                i = 1;
            }
            getchar();
            goto back;
        }
        case 2:
        {
            if (i == 1 || num == 10)
            {
                printf("\n 当前位置位于首页!\n");
                getchar();
                goto back;
            }
            else
            {
                system("cls");
                start_menu();
                printf("\n");
                page--;
                printf("\n 当前位置:第 %d 页\n", page);
                OutputLink_only10(head, i - 10);
                printf("\n\n       1)首页   2)上一页   3)下一页   4)尾页   0)返回\n");
                i = i - 10;
            }
            getchar();
            goto back;
        }
        case 3:
        {
            if (i == num / 10 * 10 + 1 || num == 10)
            {
                printf("\n 当前位置位于尾页!\n");
                getchar();
                goto back;
            }
            else
            {
                system("cls");
                start_menu();
                printf("\n");
                page++;
                printf("\n 当前位置:第 %d 页\n", page);
                OutputLink_only10(head, i + 10);
                printf("\n\n       1)首页   2)上一页   3)下一页   4)尾页   0)返回\n");
                i = i + 10;
            }
            getchar();
            goto back;
        }
        case 4:
        {
            if (i == num / 10 * 10 + 1 || num == 10)
            {
                printf("\n 当前位置位于尾页!\n");
            }
            else
            {
                system("cls");
                start_menu();
                printf("\n");
                page = num / 10;
                printf("\n 当前位置:第 %d 页\n", page);
                if (num % 10 == 0)
                    OutputLink_only10(head, (num / 10 - 1) * 10 + 1);
                else
                    OutputLink_only10(head, num / 10 * 10 + 1);
                printf("\n\n       1)首页   2)上一页   3)下一页   4)尾页   0)返回\n");
                i = num / 10 * 10 + 1;
            }
            getchar();
            goto back;
        }
        case 0:
            return;
        default:
        {
            printf("\n 输入错误!请重新输入!\n");
            getchar();
            goto back;
        }
        }
    }
}

extra.c

#include "function.h"

extern int Max_xh;
extern int dj[6];

void dj_change(StuLink *p)
{
    if (p->cj >= 90)
        p->dj = 'A';
    else if (p->cj < 90 && p->cj >= 80)
        p->dj = 'B';
    else if (p->cj < 80 && p->cj >= 70)
        p->dj = 'C';
    else if (p->cj < 70 && p->cj >= 60)
        p->dj = 'D';
    else if (p->cj < 60)
        p->dj = 'E';
}

void xh_define(StuLink *p, StuLink *head)
{
    p->xh = Max_xh;
    Max_xh++;
}

void OutputLink_only10(StuLink *head, int start)
{
    int i = 1;
    StuLink *p = head;
    while (p != NULL && i != start)
    {
        p = p->next;
        i++;
    }
    i = 1;
    printf("\n\t学号\t 姓名 \t性别\t成绩\t等级\t名次\n");
    for (p; (p != NULL) && (i <= 10); p = p->next, i++)
    {
        switch (p->xb)
        {
        case boy:
            printf("\n\t%3d\t%6s\t  男\t%3d\t  %c\t%3d\n", p->xh, p->xm, p->cj, p->dj, p->mc);
            break;
        case girl:
            printf("\n\t%3d\t%6s\t  女\t%3d\t  %c\t%3d\n", p->xh, p->xm, p->cj, p->dj, p->mc);
            break;
        }
    }
}

int count(StuLink *head)
{
    int num = 0;
    StuLink *p = head;
    while (p != NULL)
    {
        p = p->next;
        num++;
    }
    return num;
}

void start_menu()
{
    printf("\n\t**********欢迎来到学生管理系统**********\n\n");
    printf("\n\t\t    (1) 数据维护\n\n\t\t    (2) 数据查询\n\n\t\t    (3) 统计分析\n\n\t\t    (4) 报表输出\n\n\t\t    (0) 退出\n\n");
    printf("\n          请不要强制关闭本窗口导致数据保存出错!\n");
    printf("\n\t*****************************************\n\n");
}
StuLink *menu(int choose1, StuLink *head)
{
    int choose2, choose3, num, i; //choose2:二级菜单选择  choose3:三级菜单选择  num:学号  i:人数
    switch (choose1)
    {
    case 1:
    {
    start1:
        printf("\n   1)数据插入   2)数据修改   3)数据删除   0)返回\n");
        printf("\n 请对应操作输入序号:");
        scanf("%d", &choose2);
        switch (choose2)
        {
        case 1:
        {
            head = InsertNode(head);
            RankLink(head);
            getchar();
            break;
        }
        case 2:
        {
            printf("\n 请输入学号:");
            scanf("%d", &num);
            EditNode(head, num);
            getchar();
            break;
        }
        case 3:
        {
            printf("\n 请输入学号:");
            scanf("%d", &num);
            DeleteNode(head, num);
            break;
        }
        case 0:
            break;
        default:
        {
            printf("\n 输入错误!请重新输入!\n");
            goto start1;
        }
        }
        break;
    }
    case 2:
    {
    start2:
        printf("\n   1)学号查询   2)不及格学生查询   0)返回\n");
        printf("\n 请对应操作输入序号:");
        scanf("%d", &choose2);
        switch (choose2)
        {
        case 1:
        {
            printf("\n 请输入学号:");
            scanf("%d", &num);
            QueryNode(head, num);
            break;
        }
        case 2:
        {
            QueryLink(head);
            getchar();
            break;
        }
        case 0:
            break;
        default:
        {
            printf("\n 输入错误!请重新输入!\n");
            getchar();
            goto start2;
        }
        }
        break;
    }
    case 3:
    {
    start3:
        printf("\n   1)成绩名次计算   2)成绩频度分析   0)返回\n");
        printf("\n 请对应操作输入序号:");
        scanf("%d", &choose2);
        switch (choose2)
        {
        case 1:
        {
            RankLink(head);
            printf("\n 操作完成!\n");
            getchar();
            break;
        }
        case 2:
        {
            AnalysisLink(head);
            printf("\n 操作完成!\n");
            printf("\n 各等级人数:\n");
            printf("\n   A等级:%d 人\n   B等级:%d 人\n   C等级:%d 人\n   D等级:%d 人\n   E等级:%d 人\n", dj[1], dj[2], dj[3], dj[4], dj[5]);
            getchar();
            break;
        }
        case 0:
            break;
        default:
        {
            printf("\n 输入错误!请重新输入!\n");
            getchar();
            goto start3;
        }
        }
        break;
    }
    case 4:
    {
    start4:
        printf("\n   1)排序显示学生信息   2)分页显示学生信息   0)返回\n");
        printf("\n 请对应操作输入序号:");
        scanf("%d", &choose2);
        switch (choose2)
        {
        case 1:
        {
            printf("\n  1)按学号升序排序   2)按成绩降序排序\n");
            printf("\n 请对应操作输入序号:");
            scanf("%d", &choose3);
            OutputLink_1(head, choose3);
            break;
        }
        case 2:
        {
            OutputLink_2(head, count(head));
            break;
        }
        case 0:
            break;
        default:
        {
            printf("\n 输入错误!请重新输入!\n");
            goto start4;
        }
        }
        break;
    }
    default:
        break;
    }
    return head;
}

main.c

#include "function.c"
#include "extra.c"

int main(void)
{
    int choice1;          //一级选择
    FILE *fp;             //定义一个文件指针
    StuLink *head = NULL; //定义一个头指针

    head = ReadFromFile(fp, head); //读取学生信息
start:
    start_menu();
start1:
    printf("\n 请对应操作输入序号:");
    scanf("%d", &choice1);
    if (choice1 == 1 || choice1 == 2 || choice1 == 3 || choice1 == 4 || choice1 == 0)
        goto out; //满足条件 --> 移动到 out位置继续运行
    else          //不满足条件 --> 移动到 start位置继续运行
    {
        printf("\n 输入错误!请重新输入!\n");
        getchar();
        goto start1;
    }
out:
    switch (choice1)
    {
    case 0:
    {
        SaveToFile(fp, head);
        exit(0);
    }
    case 1:
    case 2:
    case 3:
    case 4:
    {
        head = menu(choice1, head);
        SaveToFile(fp, head);
        printf("\n 按任意键返回...");
        getchar();
        system("cls");
        goto start;
    }
    }
    return 0;
}

完!全部分享给大家!希望大家不要直接照搬,靠自己写出来的还是会比较有成就感的!努力搬砖!

觉得不错的给我点个赞,点个关注吧!

邮箱:[email protected](欢迎交流!)
b站:鸭脖来lo(主要是日常和自己一些小的视频作品,欢迎大家关注!)

你可能感兴趣的:(实验报告汇总)