精华内容
下载资源
问答
  • 学生信息包括:学号,姓名,年龄,性别,出生年月,地址,电话,E-mail等。... 2)学生信息录入功能; 3)学生信息浏览功能; 4)查询、排序功能:按学号查询、按姓名查询; 5)学生信息的删除与修改。
  • 录入学生信息学号,姓名,三门成绩)。 //2.计算每个学生3门成绩的平均值。 //3.按照平均值对学生进行升序排序。 //4.输出排好序的学生信息。 #include<stdio.h> #define N 20 struct student{ int id; ...

    //对学生的成绩管理。
    //1.录入学生信息(学号,姓名,三门成绩)。
    //2.计算每个学生3门成绩的平均值。
    //3.按照平均值对学生进行升序排序。
    //4.输出排好序的学生信息。
    #include<stdio.h>
    #define N 20
    struct student{
        int id;
        char name[20];
        int score[3];
        double aver;
    };
    void Input(struct student st[],int n){                //从键盘录入n个学生信息 
        int i,j;
        for(i=0;i<n;i++){
            printf("请输入第%d个学生的信息:",i+1);
            scanf("%d",&st[i].id);
            scanf("%s",&st[i].name);
            for(j=0;j<3;j++){
                scanf("%d",&st[i].score[j]);            
            }
        }
    }
    void Aver(struct student st[],int n){                //计算该n个学生的平均成绩 
        int i,j;
        for(i=0;i<n;i++){
            int s=0;
            printf("%d号学生的平均成绩为:",st[i].id);
            for(j=0;j<3;j++){                            //同一个学生的3个成绩 
                s=s+st[i].score[j];                        
            }
            st[i].aver=s/3.0;                            //3.0是为了不丢失数据精度 
            printf("%.2lf",st[i].aver);
            printf("\n");
        }
    }
    /*简单交换法排序
     根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置
     换交排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动 
     不稳定 
     */
    void Sort(struct student st[],int n){
        int i,j,x;
        struct student t;
        for(i=0;i<n-1;i++){                                //n个数进行n-1轮比较  
            for(j=i+1;j<n;j++){                            //下标为i的数与i后面的每一个数都需比较一次,从st[i]到st[n-1],用j作下标来移动 
                if(st[j].aver<st[i].aver){                //如果后面有比st[i]小的数,则与st[i]交换 
                    t=st[i];
                    st[i]=st[j];
                    st[j]=t;
                }
            }
            
        }

    void Output(struct student st[],int n){                //输出学生信息 
        int i,j;
        for(i=0;i<n;i++){
            printf("%-4d",st[i].id);
            printf("%s",st[i].name);
            for(j=0;j<3;j++){
                printf("%4d",st[i].score[j]);
            }
            printf("\t");
            printf("%.2lf",st[i].aver);
            printf("\n");
        }
    }
    int main(){
        int m;
        struct student st[N];
        printf("请输入学生人数:");
        scanf("%d",&m);
        printf("请输入所有学生的信息:\n");
        Input(st,m);
        printf("\n");
        printf("学生的平均成绩为:\n");
        Aver(st,m);
        printf("\n");
        Sort(st,m);
        printf("输出按平均成绩排序后学生的信息:\n");
        printf("id  name      s1  s2  s3        aver\n");    //打印表头 
        Output(st,m);
        printf("\n");

     

    控制台打印信息如图:

    展开全文
  • 首先是对整体函数所需要的功能进行子函数的分类,让信息的输入,处理,输出,都可以进行模块化的设计.(需要全局代码的可直接下拉至文章末尾.)********************************************************************...

    首先是对整体函数所需要的功能进行子函数的分类,让信息的输入,处理,输出,都可以进行模块化的设计.(需要全局代码的可直接下拉至文章末尾.)

    ******************************************************************************

    文 件 名  : main.c

    版 本 号  : 初稿

    作    者  : 飘小叶

    生成日期  : 2020年7月14日

    最近修改  :

    功能描述  : 学生信息管理系统

    函数列表  :

    *      1.                Add_Information添加学生信息

    *      2.                Change_Information修改学生信息

    *      3.                Delete_Information删除学生信息

    *      4.                Head学生信息管理系统字符图标

    *      5.                Init学生信息管理系统初始化字符图标

    *      6.                isLogin判断是否登录成功

    *      7.                Students_Information学生信息

    *      8.                Login登录系统

    *      9.                main主函数

    *      10.              MainMenu主菜单界面

    *      11.              MenuSelect菜单选择

    *      12.              Quit退出程序或重新进入主菜单

    *      13.              Search_Information查询学生信息

    *      14.              Show_Information显示所有学生信息

    *      15.              Sort_Information对学生信息进行排序

    *      16.              StuManage学生信息管理系统 管理端字符图标

    *      17.              Swap交换两个学生信息

    *      18.              ReadData读取D:\\下的飘小叶_2220193789.txt文件

    *      19.              SaveData将链表中的数据存储在D:\\下的飘小叶_2220193789.txt文件

    **设置头文件,宏定义账号:飘小叶,密码2220193789,设置枚举类型,结构体类型,文件操作时所需要的结点,以及各类的子函数声明。**

    **在这里需要对枚举类型多说几句,大家可能对于枚举类型比较陌生,枚举类型enum,它所发挥的作用其实和#define相同,但是在进行多次宏定义的时候#define就会显得比较冗杂,于是便引入了枚举类型,例如:**

    enum Day

    {

    Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday

    };

    此时这个Day就是一种新的数据类型,而我的代码中出现的typedef enum Menu{...}MENU,这个其实就是给枚举型起了一个别名(外号).

    ```c

    修改历史  :

    1.日    期  : 2020年7月14日

    作    者  : 飘小叶

    修改内容  : 创建文件

    ******************************************************************************/

    #include

    #include

    #include

    #define MANAGER_NAME "飘小叶"                      //账号

    #define MANAGER_PASSWORD "2220193789"  //密码

    typedef enum Menu

    {

    Exit,Lessons,Show,Add,Sort,Change,Delete,Search

    }MENU;

    typedef struct Student //类型首字母大写以和变量区分

    {

    int iIndex[50];                          //学号

    char cName[50];                        //姓名

    int iOlder[50];                        //年龄

    char cSex[5]; //性别

    char cDatebirth[20];          //出生年月

    char cAddress[50];                        //地址

    int iPhone[20];                          //电话

    char cMailbox[30];                        //邮箱(E-mail)

    struct Student  *pNext;

    }STU,*PSTU;

    PSTU pHead = NULL;//学生信息头结点

    PSTU pNew = NULL;//待添加学生信息

    size_t iCount = 0;//学生总数

    char UserName[10];                //用户名(账号)

    char UserWord[10];              //密码

    void Init();                              //学生信息初始化

    void MainMenu();                    //主菜单界面

    void StuManage(); //管理系统 管理端 字符图标

    void Head();//管理系统字符图标

    void Login();//登入系统

    int isLogin();//判断是否登入成功

    int MenuSelect();                    //菜单选择

    void ReadData();//读取数据

    void SaveData();//保存数据

    void Quit();//退出程序或重新进入主菜单

    void Students_Information();

    void Show_Information();

    void Add_Information();

    void Sort_Information();

    void Change_Information();

    void Delete_Information();

    void Search_Information();

    void Swap(PSTU stu1,PSTU stu2);

    ```

    **设置主菜单界面,用Switch将其连接起来,首要原因就是Switch相比于近似作用的If来说的话,他的执行效率更高,并且在面向整个菜单界面的时候,分支化操作会使整个界面看起来更加的简洁,易懂。读到这里可能会用到后面几个函数的作用,Head()它就是个表头,起到美化界面的作用,Quit()就如整个注释里面写的那样,他就是一个退出并返回的作用,其次System("cls")冻屏函数,可以让屏幕停止在功能区所在的地方,便于下一步的操作和观察。**

    ```c

    /*****************************************************************************

    函 数 名  : MainMenu

    功能描述  : 主菜单界面

    输入参数  : 无

    输出参数  : 无

    返 回 值  : void

    调用函数  :

    被调函数  :

    修改历史      :

    1.日    期  : 2020年7月4日

    作    者  : 飘小叶

    修改内容  : 新生成函数

    *****************************************************************************/

    void MainMenu()

    {

    if (isLogin())

    {

    //登录成功

    switch (MenuSelect())//菜单选择

    {

    case Exit://退出程序

    system("cls");

    Head();    //管理系统字符图标

    Quit();//退出或返回主菜单

    break;

    case Lessons://学生信息

    system("cls");

    Students_Information();

    Quit();

    break;

    case Show://显示所有学生信息

    system("cls");

    Show_Information();

    Quit();

    break;

    case Add://添加学生信息

    system("cls");

    Add_Information();

    Quit();

    break;

    case Sort://对学生信息进行排序

    system("cls");

    Sort_Information();

    Show_Information();

    Quit();

    break;

    case Change://修改学生信息

    system("cls");

    Change_Information();

    Quit();

    break;

    case Delete://删除学生信息

    system("cls");

    Delete_Information();

    Quit();

    break;

    case Search://查询学生信息

    system("cls");

    Search_Information();

    Quit();

    break;

    }

    }

    }

    ```

    **Init(),就如同他的名字一样,他的作用就是初始化数据,首次登入的话需要将节点置空,初始化整个链表的数据,StuManage()和上面提到过的Head()是类似的作用,也是为了美化界面,而Login()就使用了前面提到过的宏定义账号密码的认定。**

    ```c

    /*****************************************************************************

    函 数 名  : Init

    功能描述  : 学生信息管理系统初始化字符图标

    输入参数  : 无

    输出参数  : 无

    返 回 值  : void

    调用函数  :

    被调函数  :

    修改历史      :

    1.日    期  : 2020年7月14日

    作    者  : 飘小叶

    修改内容  : 新生成函数

    *****************************************************************************/

    void Init()

    {

    /****************初始化数据****************/

    pHead = (PSTU)malloc(sizeof(STU));

    pHead->pNext = NULL;

    SetConsoleTitle("学生信息管理系统(管理员)");

    ReadData();

    /****************载入界面*****************/

    printf("欢迎使用本系统!\n");

    int i;

    printf("\n\n\n\n\n\n\n\n\t\t\t\t\t");

    char heihei[] = { "即将进入****大学学生信息管理系统..." };

    for (i = 0; i < strlen(heihei); i++)

    {

    printf("%c", heihei[i]);

    Sleep(10);

    }

    system("cls");

    StuManage();

    system("cls");

    Login();

    }

    ```

    **Head()和StuManage()的图像化操作,由几个简单的输出流语句构成。**

    ```c

    //学生信息管理系统字符图标

    void Head()

    {

    printf("\n");

    printf("\t\t\t\t\t╭ ? % ╮                  ╭ ```╮  \n");

    printf("\t\t\t\t\t(@^o^@) 学生信息管理系统 (⌒:⌒)\n");

    printf("\t\t\t\t\t(~):(~)                  (~)v(~) \n");

    printf("\n\n\n");

    }

    //学生信息管理系统 管理端字符图标

    void StuManage()

    {

    printf("\n");

    printf("\t\t\t\t\t╭ ? % ╮                          ╭ ```╮  \n");

    printf("\t\t\t\t\t(@^o^@) 学生信息管理系统  管理端(⌒:⌒)\n");

    printf("\t\t\t\t\t(~):(~)                          (~)v(~) \n");

    printf("\n\n\n");

    }

    ```

    **登入系统函数,UserName和UseWord是刚开始进行的宏定义,其内的Sleep函数以毫秒为单位,将该函数的进程滞留一段时间进行演示,登陆成功的话,初始化才算是全部完成。

    这里再和大家说一下Sleep()函数,Sleep()函数包含在#include里面,,它的功能就是将当前函数的功能挂起一段时间,其单位是毫秒,例如:Sleep(1000),就是让程序挂起来1000ms,也就是1s.

    具有类似功能的还有usleep(),其单位是微秒,delay(),他的单位是微秒,但是它的作用是让当前程序的执行暂停一段时间.**

    ```c

    /*****************************************************************************

    函 数 名  : Login

    功能描述  : 登录系统

    输入参数  : 无

    输出参数  : 无

    返 回 值  : void

    调用函数  :

    被调函数  :

    修改历史      :

    1.日    期  : 2020年7月14日

    作    者  : 飘小叶

    修改内容  : 新生成函数

    *****************************************************************************/

    void Login()

    {

    StuManage();

    char xing[] = { "* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * " };

    for (int i = 0; i

    {

    printf("%c", xing[i]);

    Sleep(10);  //让该函数滞留10ms

    }

    printf("\n\n\t\t\t\t\t\t请输入您的账号密码:\n\n\n\n\t\t\t\t\t\t账号:");

    gets(UserName);                                      //账号 飘小叶

    printf("\n\n\t\t\t\t\t\t密码:");

    gets(UserWord);//密码 2220193789

    }

    /*****************************************************************************

    函 数 名  : isLogin

    功能描述  : 判断是否登录成功

    输入参数  : 无

    输出参数  : 无

    返 回 值  : int

    调用函数  :

    被调函数  :

    修改历史      :

    1.日    期  : 2020年7月14日

    作    者  : 飘小叶

    修改内容  : 新生成函数

    *****************************************************************************/

    int isLogin()

    {

    int times = 0;//密码输入次数

    while (!(strcmp(UserName, MANAGER_NAME) == 0 && strcmp(UserWord, MANAGER_PASSWORD) == 0))

    {

    times++;//密码输入错误 times++

    if (times > 3)

    {

    printf("\n\n\n\n\t\t\t\t账号或密码输入错误累计达到%d次,系统将于3秒后关闭", times);

    Sleep(1000);    //让该函数滞留1s(1000ms)

    system("cls");

    char shutdown[] = { "系统将于%d秒后关闭..." };

    for (int i = 0; i < 3; i++)

    {

    printf(shutdown, 3 - i);

    Sleep(1000);

    system("cls");

    }

    exit(0);

    }

    printf("\n\n\n\n\t\t\t\t账号或密码输入错误,你还有%d次登录机会,按任意键重新登录...", 4 - times);

    getch();

    system("cls");

    Login();

    }

    return 1;

    }

    ```

    **菜单选择界面,直观的让用户选出自己想要的功能,其内的c-‘0’是字符类型转整型的一种方法,用另一种说法来说的话,这个界面就是MainMenu的直观显示,二者的功能可以划=。

    这里还需要提的是大家可能不太熟悉的getche()

    getche()

    头文件:#include 或 #include

    该函数用于读取控制台输入的字符,并将输入的字符立即显示在控制台.

    参数:该函数没有参数.

    返回值:该函数从控制台读取字符,并在控制台显示读取的字符ASCII码值**

    #include

    void main()

    {

    char ch = getche();        /*读取字符*/

    char ch2 = getche();    /*读取字符*/

    printf("You put char is %c\n",ch);

    printf("You put char is %c\n",ch2);

    system("pause");

    return;

    }

    如果用户输入as,则输出结果为:

    as

    You put char is a

    You put char is s

    例子运行后输入字符as就会出现这个结果。由于 getche()为阻塞形式运行,

    所以在用户没有输入第二个字符的时候会继续等待,直到输入第二个才继续往后面运行,

    再次输出用户 输入的字符。与getch()和getchar()对比发现,getche()带回显但是不需要按回车键,

    基本介于getch()与getchar()函数功能之间,类似于功能进化过渡形式。

    ```c

    /*****************************************************************************

    函 数 名  : MenuSelect

    功能描述  : 菜单选择

    输入参数  : 无

    输出参数  : 无

    返 回 值  : int

    调用函数  :

    被调函数  :

    修改历史      :

    1.日    期  : 2020年7月14日

    作    者  : 飘小叶

    修改内容  : 新生成函数

    *****************************************************************************/

    int MenuSelect()

    {

    char c;

    do

    {

    system("cls");

    Head();

    printf("\t\t\t\t  ╭═════════════════════════════════○●○●═══╮\n");

    printf("\t\t\t\t  │              学生信息管理系统              │\n");

    printf("\t\t\t\t  ╰═══○●○●═════════════════════════════════╯\n");

    printf("\t\t\t\t  ┌───────────────────────────────────────────-┐\n");

    printf("\t\t\t\t  │                                            │\n");

    printf("\t\t\t\t  │ 1. 学生信息                    2. 显示信息 │\n");

    printf("\t\t\t\t  │                                            │\n");

    printf("\t\t\t\t  │ 3. 信息录入                    4. 信息排名 │\n");

    printf("\t\t\t\t  │                                            │\n");

    printf("\t\t\t\t  │ 5. 修改信息                    6. 删除信息 │\n");

    printf("\t\t\t\t  │                                            │\n");

    printf("\t\t\t\t  │ 7. 查询数据                    0. 退出程序 │\n");

    printf("\t\t\t\t  │                                            │\n");

    printf("\t\t\t\t  └────────────────────────────────────────────┘\n");

    printf("\t\t\t\t\t\t  请您选择(0-7):");

    c = getche();

    } while (c < '0' || c > '7');

    return c - '0';

    }

    ```

    **头插法读取和保存文件信息

    这里着重讲一下头插法

    ReadData():读文件操作rb,首先考虑容错性将空文件的情况写进循环里面,

    pNew->pNext = pHead->pNext;

    pHead->pNext = pNew;

    pNew = NULL;

    这三行代码采用的是建立单链表的头插法,因为使用的头插法,因此新开辟的内存空间需要插入 头指针所指向的下一个地址,

    也就是新开辟的 new 需要插入 上一个 New 和 Head 之间。 第一个结点创建之后,Head->Next 的地址是 第一个 New 的地址。

    而我们申请到新的一块存储区域后,需要将 New->Next 指向 上一个结点的首地址, 而新创建new 的地址则赋给 pHead->pNext。

    因此也就是 pHead -> pNext = pHead -> pNext 。

    这样便将第一个结点的地址赋给了新创建地址的 Next 所指向的地址。后两个结点就连接起来。

    接下来再将头结点的 Next 所指向的地址赋为 新创建 New 的地址。 pHead->pNext = pNew ,这样就将头结点与新创建的结点连接了起来。

    此时最后一个结点,也就是第一次创建的结点的数据域为0,指针域为 NULL。**

    ```c

    /*****************************************************************************

    函 数 名  : ReadData

    功能描述  : 读取文件信息

    输入参数  : 无

    输出参数  : 无

    返 回 值  : void

    调用函数  :

    被调函数  :

    修改历史:

    1.日期      : 2020年7月14日

    作者      :  飘小叶

    修改内容  : 新生成函数

    *****************************************************************************/

    void ReadData()

    {

    FILE* fRead = fopen("D:\\飘小叶_2220193789.txt", "rb");

    if (fRead == NULL)

    {

    SaveData();//文件不存在就创建文件

    return;

    }

    rewind(fRead);//将文件内部指针移回文件开头

    while (1)

    {

    pNew = (PSTU)malloc(sizeof(STU));//申请一块内存

    fread(pNew, sizeof(STU), 1, fRead);//1 表示读取一个STU字节大小单元

    if (feof(fRead)) break;//文件末尾退出

    //头插法插入数据

    pNew->pNext = pHead->pNext;

    pHead->pNext = pNew;

    pNew = NULL;

    iCount++;

    }

    Sort_Information();

    fclose(fRead);

    }

    ```

    **SaveData():写文件操作wb,依然是和读文件操作相似的结构,

    首先新建指针域pCurrent指向第一个节点

    链表可等价于pCurrent

    在这里可以引用库函数fwrite()

    fwrite(pCurrent, sizeof(STU), 1, fWrite);

    即取链表的所有数据(长度为stu),从第一位开始依次写入文件内.**

    ```c

    /*****************************************************************************

    函 数 名  : SaveData

    功能描述  : 写入文件信息

    输入参数  : 无

    输出参数  : 无

    返 回 值  : void

    调用函数  :

    被调函数  :

    修改历史      :

    1.日期  : 2020年7月14日

    作者  : 飘小叶

    修改内容  : 新生成函数

    *****************************************************************************/

    void SaveData()

    {

    FILE* fWrite = fopen("D:\\飘小叶_2220193789.txt", "wb");

    if (fWrite == NULL)

    {

    system("cls");

    printf("保存失败...\n");

    Quit();

    }

    PSTU pCurrent = pHead;//指向第一个节点 如果链表为 NULL

    //pCurrent为 NULL

    while (pCurrent->pNext != NULL)//遍历所有学生信息

    {

    fwrite(pCurrent->pNext, sizeof(STU), 1, fWrite);

    pCurrent = pCurrent->pNext;//指向下一个节点

    }

    pCurrent = NULL;

    fclose(fWrite);

    }

    ```

    **同样的Students_Information的图形化界面**

    ```c

    /*****************************************************************************

    函 数 名  : Students_Information

    功能描述  : 课程信息

    输入参数  : 无

    输出参数  : 无

    返 回 值  : void

    调用函数  :

    被调函数  :

    修改历史      :

    1.日    期  : 2020年7月14日

    作    者  : 飘小叶

    修改内容  : 新生成函数

    *****************************************************************************/

    void Students_Information()

    {

    Head();

    printf("\t\t\t╔════════════╦════════════╦════════════╦════════════╦════════════╗\n");

    printf("\t\t\t║  学号  ║  姓名  ║  年龄  ║  性别  ║  出生年月  ║║地址 ║║电话 ║║邮箱 ║\n");

    printf("\t\t\t╚════════════╝════════════╝════════════╝════════════╝════════════╝\n");

    }

    ```

    **退出及进入主程序子函数,_exit(0)作为子函数内部退出程序的一种方法与进行主函数退出return 0发挥着近似的作用。**

    ```c

    /*****************************************************************************

    函 数 名  : Quit

    功能描述  : 退出程序或重新进入主菜单

    输入参数  : 无

    输出参数  : 无

    返 回 值  : void

    调用函数  :

    被调函数  :

    修改历史      :

    1.日    期  : 2020年7月14日

    作    者  : 飘小叶

    修改内容  : 新生成函数

    *****************************************************************************/

    void Quit()

    {

    char ch;

    printf("\n\t ");

    for (int i = 0; i < 50; i++)

    {

    printf("* ");

    Sleep(10);

    }

    printf("\n\n\t\t\t\t要返回登录界面按任意键\t\t退出并保存数据请按Esc键\n");

    ch = getch();

    if (ch == 0x1b)//esc键按下

    {

    SaveData();

    _exit(0);

    }

    //重新进入主菜单

    MainMenu();

    }

    ```

    **通过保存的链表进行遍历来显示所有学生的信息,先以结构体类型来设置新的结点来指向头结点,顺序遍历输出学生信息。**

    ```c

    /*****************************************************************************

    函 数 名  : Show_Information

    功能描述  : 显示所有学生信息

    输入参数  : 无

    输出参数  : 无

    返 回 值  : void

    调用函数  :

    被调函数  :

    修改历史      :

    1.日    期  : 2020年7月14日

    作    者  : 飘小叶

    修改内容  : 新生成函数

    *****************************************************************************/

    void Show_Information()

    {

    Head();

    PSTU pCurrent = pHead->pNext;//指向第一个节点 如果链表为 NULL pCurrent为 NULL

    int index = 1;

    printf("\t\t\t**********************本名单共有 %d 名学生*********************\n\n\n", iCount);

    printf("\t\t\t ║序号 ║    ║    学号  ║      姓名  ║  年龄  ║    性别  ║      出生年月    ║║  地址    ║║  电话    ║║      邮箱    ║\n");

    while (pCurrent != NULL)//遍历输出所有学生

    {

    printf("\t\t\t %d\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t%s\n", index, pCurrent->iIndex, pCurrent->cName, pCurrent->iOlder,pCurrent->cSex,pCurrent->cDatebirth

    , pCurrent->cAddress, pCurrent->iPhone, pCurrent->cMailbox);

    pCurrent = pCurrent->pNext;//指向下一个节点

    index++;//下标加加

    }

    pCurrent = NULL;

    printf("\n\n\n");

    }

    ```

    **因为该学生结构体数组内部的参数都是数组,所以在输入的时候就不需要再使用取地址符,并且

    只需要初始化头结点,并不需要设置新的结点去接收他。**

    ```c

    /*****************************************************************************

    函 数 名  : Add_Information

    功能描述  : 添加学生信息

    输入参数  : 无

    输出参数  : 无

    返 回 值  : void

    调用函数  :

    被调函数  :

    修改历史      :

    1.日    期  : 2020年7月14日

    作    者  : 飘小叶

    修改内容  : 新生成函数

    *****************************************************************************/

    void Add_Information()

    {

    for (int in = 1; in <= 3; in++)

    {

    Sleep(100);

    printf(".");

    }

    system("CLS");

    Head();

    /************添加学生信息***********/

    pNew = (PSTU)malloc(sizeof(STU));

    printf("\t\t\t\t\t\t添加学生信息:\n\n\n\n\t\t\t\t\t\t学号:");

    scanf("%s", pNew->iIndex);

    printf("\n\t\t\t\t\t\t姓名:");

    scanf("%s", pNew->cName);

    printf("\n\t\t\t\t\t\t年龄:");

    scanf("%s",pNew->iOlder);

    printf("\n\t\t\t\t\t\t性别:");

    scanf("%s",pNew->cSex);

    printf("\n\t\t\t\t\t\t出生年月:");

    scanf("%s", pNew->cDatebirth);

    printf("\n\t\t\t\t\t\t地址:");

    scanf("%s",pNew->cAddress);

    printf("\n\t\t\t\t\t\t电话:");

    scanf("%s",pNew->iPhone);

    printf("\n\t\t\t\t\t\t邮箱(E-mail):");

    scanf("%s",pNew->cMailbox);

    pNew->pNext = pHead->pNext;

    pHead->pNext = pNew;

    pNew = NULL;

    iCount++;

    }

    ```

    **设置两个新结点进行接收数据并充当中转站,用冒泡法将以学号为排序标准的学生信息进行排序。**

    ```c

    /*****************************************************************************

    函 数 名  : Sort_Information

    功能描述  : 对学生信息进行排序

    输入参数  : 无

    输出参数  : 无

    返 回 值  : void

    调用函数  :

    被调函数  :

    修改历史      :

    1.日    期  : 2020年7月14日

    作    者  : 飘小叶

    修改内容  : 新生成函数

    *****************************************************************************/

    void Sort_Information()

    {

    if (iCount < 2)//一个学生不需要排序

    {

    return;

    }

    //从大到小排序 冒泡排序(利用学号进行排序)

    PSTU pCurrent,pTemp;

    STU Temp;

    for (pCurrent = pHead->pNext; pCurrent != NULL; pCurrent = pCurrent->pNext)

    {

    for (pTemp = pCurrent->pNext; pTemp != NULL; pTemp = pTemp->pNext)

    {

    if (pCurrent->iIndex < pTemp->iIndex)

    {

    Swap(&Temp, pCurrent);

    Swap(pCurrent, pTemp);

    Swap(pTemp, &Temp);

    }

    }

    }

    }

    ```

    **修改学生信息子函数,利用输入的学号进行字符串strcmp的匹配布尔值来筛选出正确的学生信息。**

    ```c

    /*****************************************************************************

    函 数 名  : Change_Information

    功能描述  : 修改学生信息

    输入参数  : 无

    输出参数  : 无

    返 回 值  : void

    调用函数  :

    被调函数  :

    修改历史      :

    1.日    期  : 2020年7月14日

    作    者  : 飘小叶

    修改内容  : 新生成函数

    *****************************************************************************/

    void Change_Information()

    {

    Head();

    char ID[10];

    char operate;

    printf("\t\t\t\t\t\t修改学生信息:\n\n\n");

    printf("\t\t\t\t\t\t请输入学生学号:");

    scanf("%s", ID);

    //遍历学生信息

    PSTU pCurrent = pHead;  //指向头结点

    while (pCurrent-> pNext != NULL)//遍历所有学生

    {

    if (strcmp(pCurrent->pNext ->iIndex, ID) == 0)

    {

    printf("\n\n\n\t\t\t\t\t要修改的学生信息...\n\n");

    printf("\n\n\t\t\t\t\t学号\t姓名\t年龄\t性别\t出生年月\t地址\t电话\t邮箱(E-mail)\n\n");

    printf("\t\t\t\t\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t\t%s\n", pCurrent->pNext->iIndex,

    pCurrent->pNext->cName, pCurrent->pNext->iOlder

    , pCurrent->pNext->cSex, pCurrent->pNext->cDatebirth,pCurrent->pNext->cAddress,pCurrent->pNext->iPhone,pCurrent->pNext->cMailbox);

    printf("\n\n\n\t\t\t\t\t是否修改该学生信息(y/Enter):");

    operate = getch();

    if (operate == 'y' || operate == 'Y' || operate == 13)//13是回车键Enter的ASCII值

    {

    printf("\n\n\t\t\t\t\t重新输入学生信息:\n\n\t\t\t\t\t\t学号:");  //默认只可修改数据(可选项)

    scanf("%s", pCurrent->pNext->iIndex);

    printf("\n\t\t\t\t\t\t姓名:");

    scanf("%s", pCurrent->pNext->cName);

    printf("\n\t\t\t\t\t\t年龄:");

    scanf("%s", &pCurrent->pNext->iOlder);

    printf("\n\t\t\t\t\t\t性别:");

    scanf("%s", &pCurrent->pNext->cSex);

    printf("\n\t\t\t\t\t\t出生年月:");

    scanf("%s", &pCurrent->pNext->cDatebirth);

    printf("\n\t\t\t\t\t\t地址:");

    scanf("%s",&pNew->pNext->cAddress);

    printf("\n\t\t\t\t\t\t电话:");

    scanf("%s",&pNew->pNext->iPhone);

    printf("\n\t\t\t\t\t\t邮箱(E-mail):");

    scanf("%s",&pNew->pNext->cMailbox);

    printf("\n\n\n\t\t\t\t\t修改成功...\n\n");

    pCurrent = NULL;

    return;

    }

    else {

    printf("\n\n\n\t\t\t\t\t修改失败...\n\n");

    return;

    }

    return;

    }

    pCurrent = pCurrent->pNext;//指向下一个节点

    }

    pCurrent = NULL;

    printf("\n\n\n\n\t\t\t\t\t  没有找到要查询的学生信息......\n\n");

    }

    ```

    **删除学生信息的过程,匹配方式同样是根据字符串strcmp的匹配布尔值来做的,删除的时候直接利用循环结构遍历整个链表来删除元素。**

    ```c

    /*****************************************************************************

    函 数 名  : Delete_Information

    功能描述  : 删除学生信息

    输入参数  : 无

    输出参数  : 无

    返 回 值  : void

    调用函数  :

    被调函数  :

    修改历史      :

    1.日    期  : 2020年7月14日

    作    者  : 飘小叶

    修改内容  : 新生成函数

    *****************************************************************************/

    void Delete_Information()

    {

    Head();

    char ID[10];

    char operate;

    printf("\t\t\t\t\t\t删除学生信息:\n\n\n");

    printf("\t\t\t\t\t\t请输入学生学号:");

    scanf("%s", ID);

    //遍历学生信息

    PSTU pCurrent = pHead;//指向头结点

    while (pCurrent->pNext != NULL)//遍历输出所有学生

    {

    if (strcmp(pCurrent->pNext->iIndex, ID) == 0)

    {

    //信息库里面有要删除的学生信息

    printf("\n\n\n\t\t\t\t\t要删除的学生信息...\n\n");

    printf("\n\n\t\t\t\t\t学号\t姓名\t年龄\t性别\t出生年月\t地址\t电话\t邮箱(E-mail)\n\n");

    printf("\t\t\t\t\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t \t%s\n",pCurrent->pNext->iIndex,

    pCurrent->pNext->cName, pCurrent->pNext->iOlder, pCurrent->pNext->cSex

    , pCurrent->pNext->cDatebirth,pCurrent->pNext->cAddress,pCurrent->pNext->iPhone,pCurrent->pNext->cMailbox);

    printf("\n\n\n\t\t\t\t\t是否删除该学生信息(y/Enter):");

    operate = getch();

    if (operate == 'y' || operate == 'Y' || operate == 13)//13是回车键Enter的ASCII值

    {

    //删除学生信息

    PSTU pTemp = pCurrent->pNext;//定义PSTU指针 pTemp 指向要删除的节点

    pCurrent->pNext = pTemp->pNext;

    free(pTemp);

    iCount--;

    printf("\n\n\n\t\t\t\t\t删除成功...\n\n");

    return;

    }

    else{

    printf("\n\n\n\t\t\t\t\t删除失败...\n\n");

    return;

    }

    }

    pCurrent = pCurrent->pNext;//指向下一个节点

    }

    printf("\n\n\n\n\t\t\t\t\t  没有找到要删除的学生信息......\n\n");

    }

    ```

    **查询和删除的不同就是它是先遍历链表,在遍历链表的过程中进行匹配,而后输出学生信息.**

    ```c

    /*****************************************************************************

    函 数 名  : Search_Information

    功能描述  : 查询学生信息

    输入参数  : 无

    输出参数  : 无

    返 回 值  : void

    调用函数  :

    被调函数  :

    修改历史      :

    1.日    期  : 2020年7月14日

    作    者  : 飘小叶

    修改内容  : 新生成函数

    *****************************************************************************/

    void Search_Information()

    {

    Head();

    char ID[10];

    printf("\t\t\t\t\t\t查询学生信息:\n\n\n");

    printf("\t\t\t\t\t\t请输入学生学号:");

    scanf("%s", ID);

    //遍历学生信息

    PSTU pCurrent = pHead->pNext;//指向第一个节点 如果链表为 NULL pCurrent为 NULL

    while (pCurrent != NULL)//遍历所有学生

    {

    if (strcmp(pCurrent->iIndex, ID) == 0)

    {

    printf("\n\n\n\t\t\t\t\t要查询的学生信息...\n\n");

    printf("\n\n\t\t\t\t\t学号\t姓名\t年龄\t性别\t出生年月\t地址\t电话\t邮箱(E-mail)\n\n");

    printf("\t\t\t\t\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t\t%s\n", pCurrent->iIndex,

    pCurrent->cName, pCurrent->iOlder

    , pCurrent->cSex, pCurrent->cDatebirth,pCurrent->cAddress,pCurrent->iPhone,pCurrent->cMailbox);

    return;

    }

    pCurrent = pCurrent->pNext;//指向下一个节点

    }

    pCurrent = NULL;

    printf("\n\n\n\n\t\t\t\t\t  没有找到要查询的学生信息......\n\n");

    }

    ```

    **交换两个学生信息。**

    ```c

    /*****************************************************************************

    函 数 名  : Swap

    功能描述  : 交换两个学生信息(即插入功能)

    输入参数  : PSTU stu1

    PSTU stu2

    输出参数  : 无

    返 回 值  : void

    调用函数  :

    被调函数  :

    修改历史      :

    1.日    期  : 2020年7月14日

    作    者  : 飘小叶

    修改内容  : 新生成函数

    *****************************************************************************/

    void Swap(PSTU stu1, PSTU stu2)

    {

    strcpy(stu1->cName, stu2->cName);

    strcpy(stu1->iIndex, stu2->iIndex);

    strcpy(stu1->iOlder,stu2->iOlder);

    strcpy(stu1->cSex,stu2->cSex);

    strcpy(stu1->cDatebirth,stu2->cDatebirth);

    strcpy(stu1->cAddress,stu2->cAddress);

    strcpy(stu1->iPhone,stu2->iPhone);

    strcpy(stu1->cMailbox,stu2->cMailbox);

    }

    ```

    全局代码

    ```c

    /******************************************************************************

    ******************************************************************************

    文 件 名  : main.c

    版 本 号  : 初稿

    作    者  : 飘小叶

    生成日期  : 2020年7月14日

    最近修改  :

    功能描述  : 学生信息管理系统

    函数列表  :

    *

    *      1.                Add_Information添加学生信息

    *      2.                Change_Information修改学生信息

    *      3.                Delete_Information删除学生信息

    *      4.                Head学生信息管理系统字符图标

    *      5.                Init学生信息管理系统初始化字符图标

    *      6.                isLogin判断是否登录成功

    *      7.                Students_Information学生信息

    *      8.                Login登录系统

    *      9.                main主函数

    *      10.              MainMenu主菜单界面

    *      11.              MenuSelect菜单选择

    *      12.              Quit退出程序或重新进入主菜单

    *      13.              Search_Information查询学生信息

    *      14.              Show_Information显示所有学生信息

    *      15.              Sort_Information对学生信息进行排序

    *      16.              StuManage学生信息管理系统 管理端字符图标

    *      17.              Swap交换两个学生信息

    *      18.              ReadData读取D:\\下的飘小叶_2220193789.txt文件

    *      19.              SaveData将链表中的数据存储在D:\\下的飘小叶_2220193789.txt文件

    *

    修改历史  :

    1.日    期  : 2020年7月14日

    作    者  : 飘小叶

    修改内容  : 创建文件

    ******************************************************************************/

    #include

    #include

    #include

    #define MANAGER_NAME "飘小叶"                      //账号

    #define MANAGER_PASSWORD "2220193789"  //密码

    typedef enum Menu

    {

    Exit,Lessons,Show,Add,Sort,Change,Delete,Search

    }MENU;

    typedef struct Student //类型首字母大写以和变量区分

    {

    int iIndex[50];                          //学号

    char cName[50];                        //姓名

    int iOlder[50];                        //年龄

    char cSex[5]; //性别

    char cDatebirth[20];          //出生年月

    char cAddress[50];                        //地址

    int iPhone[20];                          //电话

    char cMailbox[30];                        //邮箱(E-mail)

    struct Student  *pNext;

    }STU,*PSTU;

    PSTU pHead = NULL;//学生信息头结点

    PSTU pNew = NULL;//待添加学生信息

    size_t iCount = 0;//学生总数

    char UserName[10];                //用户名(账号)

    char UserWord[10];              //密码

    void Init();                              //学生信息初始化

    void MainMenu();                    //主菜单界面

    void StuManage(); //管理系统 管理端 字符图标

    void Head();//管理系统字符图标

    void Login();//登入系统

    int isLogin();//判断是否登入成功

    int MenuSelect();                    //菜单选择

    void ReadData();//读取数据

    void SaveData();//保存数据

    void Quit();//退出程序或重新进入主菜单

    void Students_Information();

    void Show_Information();

    void Add_Information();

    void Sort_Information();

    void Change_Information();

    void Delete_Information();

    void Search_Information();

    void Swap(PSTU stu1,PSTU stu2);

    int main()

    {

    Init();

    MainMenu();

    return 0;

    }

    /*****************************************************************************

    函 数 名  : MainMenu

    功能描述  : 主菜单界面

    输入参数  : 无

    输出参数  : 无

    返 回 值  : void

    调用函数  :

    被调函数  :

    修改历史      :

    1.日    期  : 2020年7月4日

    作    者  : 飘小叶

    修改内容  : 新生成函数

    *****************************************************************************/

    void MainMenu()

    {

    if (isLogin())

    {

    //登录成功

    switch (MenuSelect())//菜单选择

    {

    case Exit://退出程序

    system("cls");

    Head();    //管理系统字符图标

    Quit();//退出或返回主菜单

    break;

    case Lessons://学生信息

    system("cls");

    Students_Information();

    Quit();

    break;

    case Show://显示所有学生信息

    system("cls");

    Show_Information();

    Quit();

    break;

    case Add://添加学生信息

    system("cls");

    Add_Information();

    Quit();

    break;

    case Sort://对学生信息进行排序

    system("cls");

    Sort_Information();

    Show_Information();

    Quit();

    break;

    case Change://修改学生信息

    system("cls");

    Change_Information();

    Quit();

    break;

    case Delete://删除学生信息

    system("cls");

    Delete_Information();

    Quit();

    break;

    case Search://查询学生信息

    system("cls");

    Search_Information();

    Quit();

    break;

    }

    }

    }

    /*****************************************************************************

    函 数 名  : Init

    功能描述  : 学生信息管理系统初始化字符图标

    输入参数  : 无

    输出参数  : 无

    返 回 值  : void

    调用函数  :

    被调函数  :

    修改历史      :

    1.日    期  : 2020年7月14日

    作    者  : 飘小叶

    修改内容  : 新生成函数

    *****************************************************************************/

    void Init()

    {

    /****************初始化数据****************/

    pHead = (PSTU)malloc(sizeof(STU));

    pHead->pNext = NULL;

    SetConsoleTitle("学生信息管理系统(管理员)");

    ReadData();

    /****************载入界面*****************/

    printf("欢迎使用本系统!\n");

    int i;

    printf("\n\n\n\n\n\n\n\n\t\t\t\t\t");

    char heihei[] = { "即将进入****大学学生信息管理系统..." };

    for (i = 0; i < strlen(heihei); i++)

    {

    printf("%c", heihei[i]);

    Sleep(10);

    }

    system("cls");

    StuManage();

    system("cls");

    Login();

    }

    //学生信息管理系统字符图标

    void Head()

    {

    printf("\n");

    printf("\t\t\t\t\t╭ ? % ╮                  ╭ ```╮  \n");

    printf("\t\t\t\t\t(@^o^@) 学生信息管理系统 (⌒:⌒)\n");

    printf("\t\t\t\t\t(~):(~)                  (~)v(~) \n");

    printf("\n\n\n");

    }

    //学生信息管理系统 管理端字符图标

    void StuManage()

    {

    printf("\n");

    printf("\t\t\t\t\t╭ ? % ╮                          ╭ ```╮  \n");

    printf("\t\t\t\t\t(@^o^@) 学生信息管理系统  管理端(⌒:⌒)\n");

    printf("\t\t\t\t\t(~):(~)                          (~)v(~) \n");

    printf("\n\n\n");

    }

    /*****************************************************************************

    函 数 名  : Login

    功能描述  : 登录系统

    输入参数  : 无

    输出参数  : 无

    返 回 值  : void

    调用函数  :

    被调函数  :

    修改历史      :

    1.日    期  : 2020年7月14日

    作    者  : 飘小叶

    修改内容  : 新生成函数

    *****************************************************************************/

    void Login()

    {

    StuManage();

    char xing[] = { "* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * " };

    for (int i = 0; i

    {

    printf("%c", xing[i]);

    Sleep(10);

    }

    printf("\n\n\t\t\t\t\t\t请输入您的账号密码:\n\n\n\n\t\t\t\t\t\t账号:");

    gets(UserName);                                      //账号 飘小叶

    printf("\n\n\t\t\t\t\t\t密码:");

    gets(UserWord);//密码 2220193789

    }

    /*****************************************************************************

    函 数 名  : isLogin

    功能描述  : 判断是否登录成功

    输入参数  : 无

    输出参数  : 无

    返 回 值  : int

    调用函数  :

    被调函数  :

    修改历史      :

    1.日    期  : 2020年7月14日

    作    者  : 飘小叶

    修改内容  : 新生成函数

    *****************************************************************************/

    int isLogin()

    {

    int times = 0;//密码输入次数

    while (!(strcmp(UserName, MANAGER_NAME) == 0 && strcmp(UserWord, MANAGER_PASSWORD) == 0))

    {

    times++;//密码输入错误 times++

    if (times > 3)

    {

    printf("\n\n\n\n\t\t\t\t账号或密码输入错误累计达到%d次,系统将于3秒后关闭", times);

    Sleep(1000);

    system("cls");

    char shutdown[] = { "系统将于%d秒后关闭..." };

    for (int i = 0; i < 3; i++)

    {

    printf(shutdown, 3 - i);

    Sleep(1000);

    system("cls");

    }

    exit(0);

    }

    printf("\n\n\n\n\t\t\t\t账号或密码输入错误,你还有%d次登录机会,按任意键重新登录...", 4 - times);

    getch();

    system("cls");

    Login();

    }

    return 1;

    }

    /*****************************************************************************

    函 数 名  : MenuSelect

    功能描述  : 菜单选择

    输入参数  : 无

    输出参数  : 无

    返 回 值  : int

    调用函数  :

    被调函数  :

    修改历史      :

    1.日    期  : 2020年7月14日

    作    者  : 飘小叶

    修改内容  : 新生成函数

    *****************************************************************************/

    int MenuSelect()

    {

    char c;

    do

    {

    system("cls");

    Head();

    printf("\t\t\t\t  ╭═════════════════════════════════○●○●═══╮\n");

    printf("\t\t\t\t  │              学生信息管理系统              │\n");

    printf("\t\t\t\t  ╰═══○●○●═════════════════════════════════╯\n");

    printf("\t\t\t\t  ┌───────────────────────────────────────────-┐\n");

    printf("\t\t\t\t  │                                            │\n");

    printf("\t\t\t\t  │ 1. 学生信息                    2. 显示信息 │\n");

    printf("\t\t\t\t  │                                            │\n");

    printf("\t\t\t\t  │ 3. 信息录入                    4. 信息排名 │\n");

    printf("\t\t\t\t  │                                            │\n");

    printf("\t\t\t\t  │ 5. 修改信息                    6. 删除信息 │\n");

    printf("\t\t\t\t  │                                            │\n");

    printf("\t\t\t\t  │ 7. 查询数据                    0. 退出程序 │\n");

    printf("\t\t\t\t  │                                            │\n");

    printf("\t\t\t\t  └────────────────────────────────────────────┘\n");

    printf("\t\t\t\t\t\t  请您选择(0-7):");

    c = getche();

    } while (c < '0' || c > '7');

    return c - '0';

    }

    /*****************************************************************************

    函 数 名  : ReadData

    功能描述  : 读取文件信息

    输入参数  : 无

    输出参数  : 无

    返 回 值  : void

    调用函数  :

    被调函数  :

    修改历史:

    1.日期      : 2020年7月14日

    作者      :  飘小叶

    修改内容  : 新生成函数

    *****************************************************************************/

    void ReadData()

    {

    FILE* fRead = fopen("D:\\stuInformation.txt", "rb");

    if (fRead == NULL)

    {

    SaveData();//文件不存在就创建文件

    return;

    }

    rewind(fRead);//将文件内部指针移回文件开头

    while (1)

    {

    pNew = (PSTU)malloc(sizeof(STU));//申请一块内存

    fread(pNew, sizeof(STU), 1, fRead);//1 表示读取一个STU字节大小单元

    if (feof(fRead)) break;//文件末尾退出

    //头插法插入数据

    pNew->pNext = pHead->pNext;

    pHead->pNext = pNew;

    pNew = NULL;

    iCount++;

    }

    Sort_Information();

    fclose(fRead);

    }

    /*****************************************************************************

    函 数 名  : SaveData

    功能描述  : 写入文件信息

    输入参数  : 无

    输出参数  : 无

    返 回 值  : void

    调用函数  :

    被调函数  :

    修改历史      :

    1.日期  : 2020年7月14日

    作者  : 飘小叶

    修改内容  : 新生成函数

    *****************************************************************************/

    void SaveData()

    {

    FILE* fWrite = fopen("D:\\飘小叶_2220193789.txt", "wb");

    if (fWrite == NULL)

    {

    system("cls");

    printf("保存失败...\n");

    Quit();

    }

    PSTU pCurrent = pHead;//指向第一个节点 如果链表为 NULL

    //pCurrent为 NULL

    while (pCurrent->pNext != NULL)//遍历所有学生信息

    {

    fwrite(pCurrent->pNext, sizeof(STU), 1, fWrite);

    pCurrent = pCurrent->pNext;//指向下一个节点

    }

    pCurrent = NULL;

    fclose(fWrite);

    }

    /*****************************************************************************

    函 数 名  : Students_Information

    功能描述  : 课程信息

    输入参数  : 无

    输出参数  : 无

    返 回 值  : void

    调用函数  :

    被调函数  :

    修改历史      :

    1.日    期  : 2020年7月14日

    作    者  : 飘小叶

    修改内容  : 新生成函数

    *****************************************************************************/

    void Students_Information()

    {

    Head();

    printf("\t\t\t╔════════════╦════════════╦════════════╦════════════╦════════════╗\n");

    printf("\t\t\t║  学号  ║  姓名  ║  年龄  ║  性别  ║  出生年月  ║║地址 ║║电话 ║║邮箱 ║\n");

    printf("\t\t\t╚════════════╝════════════╝════════════╝════════════╝════════════╝\n");

    }

    /*****************************************************************************

    函 数 名  : Quit

    功能描述  : 退出程序或重新进入主菜单

    输入参数  : 无

    输出参数  : 无

    返 回 值  : void

    调用函数  :

    被调函数  :

    修改历史      :

    1.日    期  : 2020年7月14日

    作    者  : 飘小叶

    修改内容  : 新生成函数

    *****************************************************************************/

    void Quit()

    {

    char ch;

    printf("\n\t ");

    for (int i = 0; i < 50; i++)

    {

    printf("* ");

    Sleep(10);

    }

    printf("\n\n\t\t\t\t要返回登录界面按任意键\t\t退出并保存数据请按Esc键\n");

    ch = getch();

    if (ch == 0x1b)//esc键按下

    {

    SaveData();

    _exit(0);

    }

    //重新进入主菜单

    MainMenu();

    }

    /*****************************************************************************

    函 数 名  : Show_Information

    功能描述  : 显示所有学生信息

    输入参数  : 无

    输出参数  : 无

    返 回 值  : void

    调用函数  :

    被调函数  :

    修改历史      :

    1.日    期  : 2020年7月14日

    作    者  : 飘小叶

    修改内容  : 新生成函数

    *****************************************************************************/

    void Show_Information()

    {

    Head();

    PSTU pCurrent = pHead->pNext;//指向第一个节点 如果链表为 NULL pCurrent为 NULL

    int index = 1;

    printf("\t\t\t**********************本名单共有 %d 名学生*********************\n\n\n", iCount);

    printf("\t\t\t ║序号 ║    ║    学号  ║      姓名  ║  年龄  ║    性别  ║      出生年月    ║║  地址    ║║  电话    ║║      邮箱    ║\n");

    while (pCurrent != NULL)//遍历输出所有学生

    {

    printf("\t\t\t %d\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t%s\n", index, pCurrent->iIndex, pCurrent->cName, pCurrent->iOlder,pCurrent->cSex,pCurrent->cDatebirth

    , pCurrent->cAddress, pCurrent->iPhone, pCurrent->cMailbox);

    pCurrent = pCurrent->pNext;//指向下一个节点

    index++;//下标加加

    }

    pCurrent = NULL;

    printf("\n\n\n");

    }

    /*****************************************************************************

    函 数 名  : Add_Information

    功能描述  : 添加学生信息

    输入参数  : 无

    输出参数  : 无

    返 回 值  : void

    调用函数  :

    被调函数  :

    修改历史      :

    1.日    期  : 2020年7月14日

    作    者  : 飘小叶

    修改内容  : 新生成函数

    *****************************************************************************/

    void Add_Information()

    {

    for (int in = 1; in <= 3; in++)

    {

    Sleep(100);

    printf(".");

    }

    system("CLS");

    Head();

    /************添加学生信息***********/

    pNew = (PSTU)malloc(sizeof(STU));

    printf("\t\t\t\t\t\t添加学生信息:\n\n\n\n\t\t\t\t\t\t学号:");

    scanf("%s", pNew->iIndex);

    printf("\n\t\t\t\t\t\t姓名:");

    scanf("%s", pNew->cName);

    printf("\n\t\t\t\t\t\t年龄:");

    scanf("%s",pNew->iOlder);

    printf("\n\t\t\t\t\t\t性别:");

    scanf("%s",pNew->cSex);

    printf("\n\t\t\t\t\t\t出生年月:");

    scanf("%s", pNew->cDatebirth);

    printf("\n\t\t\t\t\t\t地址:");

    scanf("%s",pNew->cAddress);

    printf("\n\t\t\t\t\t\t电话:");

    scanf("%s",pNew->iPhone);

    printf("\n\t\t\t\t\t\t邮箱(E-mail):");

    scanf("%s",pNew->cMailbox);

    pNew->pNext = pHead->pNext;

    pHead->pNext = pNew;

    pNew = NULL;

    iCount++;

    }

    /*****************************************************************************

    函 数 名  : Sort_Information

    功能描述  : 对学生信息进行排序

    输入参数  : 无

    输出参数  : 无

    返 回 值  : void

    调用函数  :

    被调函数  :

    修改历史      :

    1.日    期  : 2020年7月14日

    作    者  : 飘小叶

    修改内容  : 新生成函数

    *****************************************************************************/

    void Sort_Information()

    {

    if (iCount < 2)//一个学生不需要排序

    {

    return;

    }

    //从大到小排序 冒泡排序(利用学号进行排序)

    PSTU pCurrent,pTemp;

    STU Temp;

    for (pCurrent = pHead->pNext; pCurrent != NULL; pCurrent = pCurrent->pNext)

    {

    for (pTemp = pCurrent->pNext; pTemp != NULL; pTemp = pTemp->pNext)

    {

    if (pCurrent->iIndex < pTemp->iIndex)

    {

    Swap(&Temp, pCurrent);

    Swap(pCurrent, pTemp);

    Swap(pTemp, &Temp);

    }

    }

    }

    }

    /*****************************************************************************

    函 数 名  : Change_Information

    功能描述  : 修改学生信息

    输入参数  : 无

    输出参数  : 无

    返 回 值  : void

    调用函数  :

    被调函数  :

    修改历史      :

    1.日    期  : 2020年7月14日

    作    者  : 飘小叶

    修改内容  : 新生成函数

    *****************************************************************************/

    void Change_Information()

    {

    Head();

    char ID[10];

    char operate;

    printf("\t\t\t\t\t\t修改学生信息:\n\n\n");

    printf("\t\t\t\t\t\t请输入学生学号:");

    scanf("%s", ID);

    //遍历学生信息

    PSTU pCurrent = pHead;  //指向头结点

    while (pCurrent-> pNext != NULL)//遍历所有学生

    {

    if (strcmp(pCurrent->pNext ->iIndex, ID) == 0)

    {

    printf("\n\n\n\t\t\t\t\t要修改的学生信息...\n\n");

    printf("\n\n\t\t\t\t\t学号\t姓名\t年龄\t性别\t出生年月\t地址\t电话\t邮箱(E-mail)\n\n");

    printf("\t\t\t\t\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t\t%s\n", pCurrent->pNext->iIndex,

    pCurrent->pNext->cName, pCurrent->pNext->iOlder

    , pCurrent->pNext->cSex, pCurrent->pNext->cDatebirth,pCurrent->pNext->cAddress,pCurrent->pNext->iPhone,pCurrent->pNext->cMailbox);

    printf("\n\n\n\t\t\t\t\t是否修改该学生信息(y/Enter):");

    operate = getch();

    if (operate == 'y' || operate == 'Y' || operate == 13)//13是回车键Enter的ASCII值

    {

    printf("\n\n\t\t\t\t\t重新输入学生信息:\n\n\t\t\t\t\t\t学号:");  //默认只可修改数据(可选项)

    scanf("%s", pCurrent->pNext->iIndex);

    printf("\n\t\t\t\t\t\t姓名:");

    scanf("%s", pCurrent->pNext->cName);

    printf("\n\t\t\t\t\t\t年龄:");

    scanf("%s", &pCurrent->pNext->iOlder);

    printf("\n\t\t\t\t\t\t性别:");

    scanf("%s", &pCurrent->pNext->cSex);

    printf("\n\t\t\t\t\t\t出生年月:");

    scanf("%s", &pCurrent->pNext->cDatebirth);

    printf("\n\t\t\t\t\t\t地址:");

    scanf("%s",&pNew->pNext->cAddress);

    printf("\n\t\t\t\t\t\t电话:");

    scanf("%s",&pNew->pNext->iPhone);

    printf("\n\t\t\t\t\t\t邮箱(E-mail):");

    scanf("%s",&pNew->pNext->cMailbox);

    printf("\n\n\n\t\t\t\t\t修改成功...\n\n");

    pCurrent = NULL;

    return;

    }

    else {

    printf("\n\n\n\t\t\t\t\t修改失败...\n\n");

    return;

    }

    return;

    }

    pCurrent = pCurrent->pNext;//指向下一个节点

    }

    pCurrent = NULL;

    printf("\n\n\n\n\t\t\t\t\t  没有找到要查询的学生信息......\n\n");

    }

    /*****************************************************************************

    函 数 名  : Delete_Information

    功能描述  : 删除学生信息

    输入参数  : 无

    输出参数  : 无

    返 回 值  : void

    调用函数  :

    被调函数  :

    修改历史      :

    1.日    期  : 2020年7月14日

    作    者  : 飘小叶

    修改内容  : 新生成函数

    *****************************************************************************/

    void Delete_Information()

    {

    Head();

    char ID[10];

    char operate;

    printf("\t\t\t\t\t\t删除学生信息:\n\n\n");

    printf("\t\t\t\t\t\t请输入学生学号:");

    scanf("%s", ID);

    //遍历学生信息

    PSTU pCurrent = pHead;//指向头结点

    while (pCurrent->pNext != NULL)//遍历输出所有学生

    {

    if (strcmp(pCurrent->pNext->iIndex, ID) == 0)

    {

    //信息库里面有要删除的学生信息

    printf("\n\n\n\t\t\t\t\t要删除的学生信息...\n\n");

    printf("\n\n\t\t\t\t\t学号\t姓名\t年龄\t性别\t出生年月\t地址\t电话\t邮箱(E-mail)\n\n");

    printf("\t\t\t\t\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t \t%s\n",pCurrent->pNext->iIndex,

    pCurrent->pNext->cName, pCurrent->pNext->iOlder, pCurrent->pNext->cSex

    , pCurrent->pNext->cDatebirth,pCurrent->pNext->cAddress,pCurrent->pNext->iPhone,pCurrent->pNext->cMailbox);

    printf("\n\n\n\t\t\t\t\t是否删除该学生信息(y/Enter):");

    operate = getch();

    if (operate == 'y' || operate == 'Y' || operate == 13)//13是回车键Enter的ASCII值

    {

    //删除学生信息

    PSTU pTemp = pCurrent->pNext;//定义PSTU指针 pTemp 指向要删除的节点

    pCurrent->pNext = pTemp->pNext;

    free(pTemp);

    iCount--;

    printf("\n\n\n\t\t\t\t\t删除成功...\n\n");

    return;

    }

    else{

    printf("\n\n\n\t\t\t\t\t删除失败...\n\n");

    return;

    }

    }

    pCurrent = pCurrent->pNext;//指向下一个节点

    }

    printf("\n\n\n\n\t\t\t\t\t  没有找到要删除的学生信息......\n\n");

    }

    /*****************************************************************************

    函 数 名  : Search_Information

    功能描述  : 查询学生信息

    输入参数  : 无

    输出参数  : 无

    返 回 值  : void

    调用函数  :

    被调函数  :

    修改历史      :

    1.日    期  : 2020年7月14日

    作    者  : 飘小叶

    修改内容  : 新生成函数

    *****************************************************************************/

    void Search_Information()

    {

    Head();

    char ID[10];

    printf("\t\t\t\t\t\t查询学生信息:\n\n\n");

    printf("\t\t\t\t\t\t请输入学生学号:");

    scanf("%s", ID);

    //遍历学生信息

    PSTU pCurrent = pHead->pNext;//指向第一个节点 如果链表为 NULL pCurrent为 NULL

    while (pCurrent != NULL)//遍历所有学生

    {

    if (strcmp(pCurrent->iIndex, ID) == 0)

    {

    printf("\n\n\n\t\t\t\t\t要查询的学生信息...\n\n");

    printf("\n\n\t\t\t\t\t学号\t姓名\t年龄\t性别\t出生年月\t地址\t电话\t邮箱(E-mail)\n\n");

    printf("\t\t\t\t\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t\t%s\n", pCurrent->iIndex,

    pCurrent->cName, pCurrent->iOlder

    , pCurrent->cSex, pCurrent->cDatebirth,pCurrent->cAddress,pCurrent->iPhone,pCurrent->cMailbox);

    return;

    }

    pCurrent = pCurrent->pNext;//指向下一个节点

    }

    pCurrent = NULL;

    printf("\n\n\n\n\t\t\t\t\t  没有找到要查询的学生信息......\n\n");

    }

    /*****************************************************************************

    函 数 名  : Swap

    功能描述  : 交换两个学生信息(即插入功能)

    输入参数  : PSTU stu1

    PSTU stu2

    输出参数  : 无

    返 回 值  : void

    调用函数  :

    被调函数  :

    修改历史      :

    1.日    期  : 2020年7月14日

    作    者  : 飘小叶

    修改内容  : 新生成函数

    *****************************************************************************/

    void Swap(PSTU stu1, PSTU stu2)

    {

    strcpy(stu1->cName, stu2->cName);

    strcpy(stu1->iIndex, stu2->iIndex);

    strcpy(stu1->iOlder,stu2->iOlder);

    strcpy(stu1->cSex,stu2->cSex);

    strcpy(stu1->cDatebirth,stu2->cDatebirth);

    strcpy(stu1->cAddress,stu2->cAddress);

    strcpy(stu1->iPhone,stu2->iPhone);

    strcpy(stu1->cMailbox,stu2->cMailbox);

    }

    ```

    展开全文
  • <p><img src=...
  • 请输入您要录入学生个人通迅数目:");  scanf("%d", &n);  ListCreate(L, n);   getchar();  printf("\n请任意键返回主菜单\n");  getchar();...
  • 学生信息管理系统,包括学生基本的个人信息,比如学号、姓名、性别、年龄等信息,针对这些信息,利用...4)查询、排序功能,查询又分为:按学号查询、按姓名查询;5)学生信息的删除功能;6)学生信息的修改功能;7)学...

    3fc87713ba36e36b8de722c0ff041994.png

    f5a59dc19143dea0f485fecbe875ec2c.png

    学生信息管理系统,包括学生基本的个人信息,比如学号、姓名、性别、年龄等信息,针对这些信息,利用自定义的各个功能成员函数来实现,具体的学生信息管理系统的所需要的功能需求如下:
    1)系统以菜单方式工作,菜单是自定义的一个menu函数;
    2) 增加学生信息并提供录入功能;
    3)学生信息显示、浏览功能;
    4)查询、排序功能,查询又分为:按学号查询、按姓名查询;
    5)学生信息的删除功能;
    6)学生信息的修改功能;
    7)学生信息的保存功能;
    8)学生信息的刷新功能,刷新依靠于按照学号的重新排序,在录入信息和增加信息后,对所有的信息进行刷新;9)帮助菜单功能,让不熟悉的人很快能够了解该程序的使用方法

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    //宏定义变量
    #define N 1024
    #define MAXSIZE 32
    #define WIDESIZE 65
    typedef struct Student
    {
    /*学生基本信息*/
    int code;	//学号
    char name[MAXSIZE];	//姓名,采用字符数组
    int age;	//年龄
    char sex[MAXSIZE];	//性别
    /*学生成绩信息*/
    int math;	//数学成绩
    int chinese;	//语文成绩
    int english;	//英语成绩
    struct Student *next;	//指向下一个学生的指针
    }Student;
    /*
    *创建学生链表
    */
    Student * createList()
    {
    //申请一个Student【学生结构体】大小的控件
    Student * studentList = (Student*)malloc(sizeof(Student));
    return studentList;
    }
    /*
    *创建学生节点
    */
    Student * createNode()
    {
    Student * newStu = (Student*)malloc(sizeof(Student));
    printf("学号:");
    scanf("%d",&newStu->code);
    printf("姓名:");
    scanf("%s",newStu->name);
    printf("年龄:");
    scanf("%d",&newStu->age);
    printf("性别:");
    scanf("%s",newStu->sex);
    printf("数学:");
    scanf("%d",&newStu->math);
    printf("语文:");
    scanf("%d",&newStu->chinese);
    printf("英语:");
    scanf("%d",&newStu->english);
    newStu->next=NULL;
    return newStu;
    }
    //显示学生信息
    void showMsg(Student *stu)
    {
    printf("%dt%st%dt%st%dt%dt%dtn",stu->code,stu->name,stu->age,stu->sex,
    stu->math,stu->chinese,stu->english);
    }
    /*
    *添加学生信息
    */
    Student * insertStudent(Student * head)
    {
    int i,count;
    printf("请输入录入的学生人数n");
    scanf("%d",&count);
    //获得学生链表的头节点
    Student *tail= head;
    //初始批量录入学生信息
    if(head)
    {
    for(i = 0;i<count;i++)
    {
    printf("==============输入第%d个学生信息==============》n",i+1);
    Student * newNode = createNode();
    tail->next = newNode;//tail永远指向最后一位学生,即尾节点
    tail = tail->next;
    }
    }else{
    //批量添加学生信息
    while(tail)
    {
    tail = tail->next;
    }
    for(i = 0;i<count;i++)
    {
    printf("==============输入第%d个学生信息==============》n",i+1);
    Student * newNode = createNode();//创建存储学生信息的节点
    tail->next = newNode;//添加学生
    tail = tail->next;//尾节点后移
    }
    }
    return head;//返回头节点
    }
    /*
    *删除学生信息
    */
    void deleteStudent(Student *studentList)
    {
    printf("请输入学号:");
    int ditCode;
    scanf("%d",&ditCode);
    //获取链表头节点
    Student *preStudent = studentList;
    //获取链表第一个节点
    Student *afterStudent = studentList->next;
    if(afterStudent)//链表不是空
    {
    while(afterStudent)
    {
    if(afterStudent->code==ditCode)//学号相等,则说明已找到要删除的学生
    {
    preStudent->next=afterStudent->next;//进行删除操作
    free(afterStudent);//释放节点控件
    break;
    }else
    {//学生编号不相等,则继续向后移动,进行遍历
    preStudent = afterStudent;
    afterStudent = afterStudent->next;
    }
    }
    }else
    {
    printf("没有这名学生的信息!");
    }
    }
    /*
    *根据学号修改学生信息
    */
    //1.修改姓名
    void changeName(Student *stu)
    {
    char newName[MAXSIZE];
    printf("请输入新的名字:");
    scanf("%s",newName);
    strcpy(stu->name,newName);
    showMsg(stu);
    }
    //2.修改年龄
    void changeAge(Student *stu)
    {
    int newAge;
    printf("请输入新的年龄:");
    scanf("%d",&newAge);
    stu->age=newAge;
    showMsg(stu);
    }
    //3.修改数学成绩
    void changeMathScore(Student *stu)
    {
    int newSocre;
    printf("请输入新的数学成绩:");
    scanf("%d",&newSocre);
    stu->math=newSocre;
    showMsg(stu);
    }
    //4.修改语文成绩
    void changeChineseScore(Student *stu)
    {
    int newSocre;
    printf("请输入新的语文成绩:");
    scanf("%d",&newSocre);
    stu->chinese=newSocre;
    showMsg(stu);
    }
    //5.修改英语成绩
    void changeEnglishScore(Student *stu)
    {
    int newSocre;
    printf("请输入新的英语成绩:");
    scanf("%d",&newSocre);
    stu->chinese=newSocre;
    showMsg(stu);
    }
    /*
    *
    *1、采用多分支选择结构,实现学生信息的修改
    *2、编辑学生信息输入对应的编号,进行对应的修改,例:1,则进行姓名修改
    */
    void editStudent(Student *studentList)
    {
    printf("请输入学号:");
    int ditCode;
    scanf("%d",&ditCode);
    Student *ditStu = studentList->next;
    if(ditStu!=NULL)
    {
    while(ditStu!=NULL)
    {
    if(ditStu->code==ditCode)
    {
    printf("请输入修改信息编号:n1.姓名n2.年龄n3.数学n4.语文n5.英语n");
    int number;
    scanf("%d",&number);
    switch(number)
    {
    case 1: changeName(ditStu);
    break;
    case 2: changeAge(ditStu);
    break;
    case 3: changeMathScore(ditStu);
    break;
    case 4: changeChineseScore(ditStu);
    break;
    case 5: changeEnglishScore(ditStu);
    break;
    default:
    printf("输入内容无效!");
    }
    }
    ditStu = ditStu->next;
    }
    }else{
    printf("抱歉,你还未录入学生信息,请先录入学生信息!n");
    }
    }
    //根据学生编号查找学生信息
    void findStudent(Student *studentList)
    {
    printf("请输入学号:");
    int code;
    scanf("%d",&code);
    //指向第一个学生节点
    Student *ditStu = studentList->next;
    //如果学生链表不为空,则进行查询
    if(ditStu!=NULL)
    {
    while(ditStu!=NULL)
    {
    if(ditStu->code!=code)	//学生学号不相等,则继续下一个比对查找
    {
    ditStu=ditStu->next;
    }else{//找到后则进行学生信息的输出
    showMsg(ditStu);
    break;
    }
    }
    }else{
    printf("没有这名学生的信息!");
    }
    }
    /*
    *显示学生列表
    */
    void showStudent(Student * studentList)
    {
    Student *temp = studentList->next;
    printf("学号t姓名t年龄t性别t数学t语文t英语n");
    //如果学生链表不为空,则进行输出
    while(temp != NULL){
    showMsg(temp);
    temp=temp->next;
    }
    printf("n");
    }
    /*
    *保存学生信息到文件中
    */
    void saveStudent(Student *studentList)
    {
    //创建文件指针
    FILE *fp = NULL;
    //存放在D【C盘需要事先创建文件夹】盘根目录下,自动【有就不创建。否则创建文件】
    创建studentMsg.txt
    //fp = fopen("D:studentMsg.txt","a+");
    fp = fopen("C:UsersSherryHanDesktop学习文件politicalstudentMsg.txt","a+");
    //“a+”采用追加的形式保存到文件中
    Student *stu = studentList->next;	//指针指向第一个学生
    char title[N] = "学号t姓名t年龄t性别t数学t语文t英语n";
    //将标题【学生属性列】写入文件中
    fprintf(fp,"%s",title);
    //遍历学生链表,并将学生信息写入文件,直到最后一个学生的下一个节点为空
    while(stu!=NULL)
    {
    fprintf(fp,"%dt%st%dt%st%dt%dt%dn",stu->code,stu->name,stu->age,stu->sex
    ,stu->math,stu->chinese,stu->english);
    stu=stu->next;
    }
    fclose(fp);
    }
    void showHelp()
    {
    printf("1、此系统可以对学生信息进行管理。n");
    printf("2、输入对应功能项的编号即可进行不同功能的系统操作。n");
    }
    /*
    *显示菜单
    */
    void showMenu()
    {
    int i;
    printf("------------------------");
    printf("t欢迎使用学生管理系统t");
    printf("------------------------n");
    printf("t");
    for(i=0;i<WIDESIZE;i++)
    {
    printf("*");
    }
    printf("n");
    printf("t*t0.系统帮助及说明t**");
    printf("t1.刷新学生信息tt*n");
    printf("t*t2.查询学生信息tt");
    printf("**t3.修改学生信息tt*n");
    printf("t*t4.增加学生信息tt**");
    printf("t5.按学号删除信息t*n");
    printf("t*t6.显示所有学生信息t**");
    printf("t7.保存当前信息tt*n");
    printf("t*t8.退出学生管理系统t**");
    for(i=0;i<4;i++)
    {
    printf("t");
    }
    printf("*n");
    printf("t");
    for(i=0;i<WIDESIZE;i++)
    {
    printf("*");
    }
    printf("n");
    printf("------------------------");
    printf("t2017级软件工程开发t");
    printf("------------------------n");
    printf("请按所需输入菜单编号:");
    }
    /*
    *
    *采用带头结点的链表来存储学生信息
    *
    */
    int main(int argc, char const *argv[])
    {
    int choice;
    Student * studentList =  createList();
    do
    {
    showMenu();
    scanf("%d",&choice);
    switch(choice)
    {
    case 0: showHelp();
    break;
    case 1: printf("刷新完成!n");
    break;
    case 2: findStudent(studentList);
    break;
    case 3: editStudent(studentList);
    break;
    case 4: insertStudent(studentList);
    break;
    case 5: deleteStudent(studentList);
    break;
    case 6: showStudent(studentList);
    break;
    case 7: saveStudent(studentList);
    break;
    default:
    exit(1);
    }
    }while(1);
    return 0;
    }

    fde7609d60f609d8c52cc5769ecc066e.png

    a08f2b7231181784011fd76ecf0cf457.png
    展开全文
  • 学生信息录入功能(学生信息用文件保存)——输入 学生信息浏览功能——输入 查询、排序功能——算法 按学号查询 按姓名查询 学生信息的删除与修改(可选项) 学籍管理|、学生公寓管理、学生违纪管理、维修管理、...
  • 题目:显示学生名次表 ;具体要求: 1.输入1是数据录入并输出(包括姓名、学号、成绩) ; 2.输入2是排序后的数据输出(包括姓名、学号、...输入3是可以按学号查找某学生,并输出其成绩,选择修改或不改成绩(选做)
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;
    ;                                题目:显示学生名次表
    ;具体要求:  1.输入1是数据录入并输出(包括姓名、学号、成绩)
    ;		     2.输入2是排序后的数据输出(包括姓名、学号、成绩、名次)
    ;			 3.输入3是可以按学号查找某学生,并输出其成绩,选择修改或不改成绩(选做)
    ;
    ;子程序及功能介绍:
    ;            1.inputinformation子程序:学生信息的录入,与displaydatas子程序连用,输出学生基本信息。
    ;			 2.outputinformation子程序:对学生信息按照score进行排序,与displayrank子程序连用,输出
    ;						                排序后的学生信息并显示排名ranking。
    ;            3.displaydatas子程序:显示学生基本信息:name,number,score。
    ;		     4.displayrank子程序:显示学生排名:name,number,score,ranking。
    ;  			 5.findinformation子程序:按学号查找某学生,并输出其成绩,可选择修改或不改成绩。
    ;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    include 一套工具.mac
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;
    ;结构体class,用于存放学生信息
    	class struc
    		names db 20 dup (?)
    		number db 20 dup (?)
    		score dw ?
    	class ends
    ;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;定义数据段
    data segment
    	mem class <>
    	x dw $
    	y dw ?
    	z dw ?    ;存放学生人数
    	member class 50 dup(<>)
    	show1 db "============================================================",13,10
    		  db "Options:",13,10
    		  db "1.Input student informations(name,number,score)",13,10
    		  db "2.Output student informations(name,number,score,ranking)",13,10
    		  db "3.Find student informations(number)",13,10
    		  db "============================================================",13,10,"$"
    	
    	details1 db "name(eg:MasterShi):$"
    	details2 db "number(eg:201407014212):$"
    	details3 db "score(0-100):$"
    	details4 db "name            number          score",13,10,"$"
    	details5 db "name            number          score  ranking",13,10,"$"
    	
    	noinformation db "not information!",13,10,"$"
    	information db "score:$"
    	modification db "amend it?(y\n)$"
    	nobody db "nobody!",13,10,"$"
    	
    	blank db "       $"
    	blank1 db "      $"
    	blank2 db "        $"
    	
    	error1 db "Input error,please input again:$"
    	scoreerror db "The score must be 0~100..$"
    	nameerror db "name must be A~Z or a~z..$"
    	numbererror db "number must made by 0~9..$"
    	
    	temp1 db 20 dup (?)
    	temp2 db 20 dup (?)
    	count dw ?
    	result dw ?
    	wc dw ?
    	ranks db ?
    	
    data ends
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;定义堆栈段
    stack segment
    
    stack ends
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;定义附加段
    extra segment
    	
    extra ends
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;代码段
    code segment
    assume cs:code,ds:data,ss:stack,es:extra
    start:
    	mov ax,data
    	mov ds,ax   ;加载数据段
    	;mov ax,extra
    	mov es,ax   ;加载附加段
    	mov ax,stack
    	mov ss,ax   ;加载堆栈段
    	
    	lea ax,mem
    	sub x,ax
    
    set0:
    	oustring show1
    set1:
    	input       ;输入选项
    	cmp al,1bh
    	jz exit     ;esc键退出
    	cmp al,31h
    	jz option1
    	cmp al,32h
    	jz option2
    	cmp al,33h
    	jz option3
    	jmp error   ;输入的不是1-3
    
    option1:
    	call inputinformation
    	ld
    	jmp set0
    option2:
    	call outputinformation
    	ld
    	jmp set0
    option3:
    	call findinformation
    	ld
    	jmp set0
    error:
    	ld
    	oustring error1
    	jmp set1
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;;;;;;;;;;;;;;inputinformation子程序:数据录入并输出;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    inputinformation proc
    	ld
    out0:   ;name
    	mov si,0
    	oustring details1
    set11:
    	input 
    	cmp al,13            ;输入的字符是回车
    	jz out1
    	cmp al,7ah
    	jg errorname         ;输入的字符大于'z'
    	cmp al,61h
    	jge circulationname  ;输入的字符在'a'~'z'之间
    	cmp al,5ah
    	jg errorname         ;输入的字符在'Z'~'a'之间
    	cmp al,41h
    	jge circulationname  ;输入的字符在'A'~'Z'之间
    	jmp errorname            ;输入的是其他字符
    	
    out1:    ;number
    	ld
    	mov si,0
    	oustring details2
    set2:
    	input
    	cmp al,13
    	jz out2  ;输入回车跳到out2
    	cmp al,30h
    	jl errornumber
    	cmp al,39h
    	jg errornumber
    	;输入的字符在0-9之间
    	mov bx,y
    	mov member[bx].number[si],al
    	inc si
    	jmp set2
    	
    out2:    ;score
    	ld
    	mov si,0
    	mov bx,0
    	oustring details3
    set3:
    	input
    	cmp al,13
    	jz out3  ;输入回车跳到out3
    	cmp al,30h
    	jl errorscore
    	cmp al,39h
    	jg errorscore
    	;输入的字符在0-9之间
    	sub al,30h
    	cbw 
    	xchg ax,bx
    	mov cl,10
    	imul cl
    	add bx,ax
    	jmp set3
    
    out3:
    	cmp bx,100
    	jg errorscore
    	mov ax,bx
    	mov bx,y
    	mov member[bx].score,ax
    	
    	mov ax,x
    	add y,ax
    	inc z
    	call displaydatas
    	ret
    	
    circulationname:
    	mov bx,y
    	mov member[bx].names[si],al  ;把录入的姓名的字母存入member.name中
    	inc si
    	jmp set11
    
    errorname:
    	ld
    	oustring nameerror
    	ld 
    cc1:
    	dec si
    	cmp si,0
    	jl out0
    	mov bx,y
    	mov member[bx].names[si],0
    	jmp cc1
    	
    errornumber:
    	ld
    	oustring numbererror
    	ld
    cc2:
    	dec si
    	cmp si,0
    	jl out1
    	mov bx,y
    	mov member[bx].number[si],0
    	jmp cc2
    	
    errorscore:
    	ld
    	oustring scoreerror
    	ld
    	mov bx,y
    	mov member[bx].score,0
    	jmp out2
    	
    inputinformation endp
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;;;;;;;;;;;;;;;;outputinformation子程序:排序后的数据输出;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    outputinformation proc
    	ld
    	cmp z,0
    	jz nobodys
    	;比较思路,外层循环控制比较次数,内层循环控制被比较的元素
    	mov cx,z  ;人数,行数,也是控制被比较次数的关键数
    	dec cx    ;n个人比较n-1次
    	mov wc,cx  ;外循环
    ccompare:
    	mov cx,wc
    	mov result,cx ;内循环
    	mov bx,0
    compare:
    	mov ax,member[bx].score
    	add bx,x
    	cmp ax,member[bx].score    ;两个score比较
    	jl exchange                ;如果前面比后面小,交换
    	dec result
    	cmp result,0
    	jg compare
    	dec wc
    	cmp wc,0
    	jg ccompare
    	jmp out5
    exchange:
    	mov dx,member[bx].score
    	sub bx,x
    	mov member[bx].score,dx        ;把后面大的数给前面
    	add bx,x
    	mov member[bx].score,ax        ;把前面小的数给后面
    	;names
    	lea si,member[bx].names
    	lea di,temp1
    	mov cx,20
    	rep movsb                ;把后面的串送给temp1
    	
    	sub bx,x
    	lea si,member[bx].names
    	lea di,temp2
    	mov cx,20
    	rep movsb                ;把前面的串送给temp2
    	
    	lea si,temp1
    	lea di,member[bx].names
    	mov cx,20
    	rep movsb                ;把temp1送给前面的串
    	
    	add bx,x
    	lea si,temp2
    	lea di,member[bx].names
    	mov cx,20
    	rep movsb                ;把temp2送给后面的串
    	;number
    	lea si,member[bx].number
    	lea di,temp1
    	mov cx,20
    	rep movsb                ;把后面的串送给temp1
    	
    	sub bx,x
    	lea si,member[bx].number
    	lea di,temp2
    	mov cx,20
    	rep movsb                ;把前面的串送给temp2
    	
    	lea si,temp1
    	lea di,member[bx].number
    	mov cx,20
    	rep movsb                ;把temp1送给前面的串
    	
    	add bx,x
    	lea si,temp2
    	lea di,member[bx].number
    	mov cx,20
    	rep movsb                ;把temp2送给后面的串
    	
    	dec result
    	cmp result,0
    	jg compare
    	dec wc
    	cmp wc,0
    	jg ccompare
    	jmp out5
    nobodys:
    	oustring nobody
    	ret
    out5:
    	call displayrank
    	ret
    outputinformation endp
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    displaydatas proc
    	ld
    	oustring details4
    	mov cx,z        ;行数
    	mov count,cx
    	mov bx,0
    ccc:
    	mov member[bx].names[16],'$'
    	oustring member[bx].names       ;bx单元中的names显示完毕
    	
    	mov member[bx].number[16],'$'
    	oustring member[bx].number      ;bx单元中的number显示完毕
    	
    	cmp member[bx].score,10
    	jge abten
    	mov dx,member[bx].score
    	add dl,30h
    	output dl
    	jmp ddd
    abten:
    	cmp member[bx].score,100
    	je hundred
    	mov ax,member[bx].score
    	mov cl,10
    	idiv cl
    	mov cl,ah
    	add al,30h
    	output al
    	add cl,30h
    	output cl
    	jmp ddd
    	
    hundred:
    	mov ax,member[bx].score
    	mov cl,100
    	idiv cl
    	mov cl,ah
    	add al,30h
    	output al
    	mov al,cl
    	cbw
    	mov cl,10
    	idiv cl
    	mov cl,ah
    	add al,30h
    	output al
    	add cl,30h
    	output cl
    	
    ddd:
    	ld
    	add bx,x
    	dec count
    	cmp count,0
    	jg ccc
    	ret
    displaydatas endp
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    displayrank proc
    	ld
    	oustring details5
    	mov cx,z        ;行数
    	mov count,cx
    	mov bx,0
    ccc:
    	mov member[bx].names[16],'$'
    	oustring member[bx].names       ;bx单元中的names显示完毕
    	
    	mov member[bx].number[16],'$'
    	oustring member[bx].number      ;bx单元中的number显示完毕
    	
    	cmp member[bx].score,10
    	jge abten
    	mov dx,member[bx].score
    	add dl,30h
    	output dl
    	jmp ddd
    abten:
    	cmp member[bx].score,100
    	je hundred
    	mov ax,member[bx].score
    	mov cl,10
    	idiv cl
    	mov cl,ah
    	add al,30h
    	output al
    	add cl,30h
    	output cl
    	jmp ddd
    	
    hundred:
    	mov ax,member[bx].score
    	mov cl,100
    	idiv cl
    	mov cl,ah
    	add al,30h
    	output al
    	mov al,cl
    	cbw
    	mov cl,10
    	idiv cl
    	mov cl,ah
    	add al,30h
    	output al
    	add cl,30h
    	output cl
    	
    ddd:   ;score显示完毕,准备显示ranking
    	inc ranks
    	cmp member[bx].score,100
    	jz bbb1
    	cmp member[bx].score,10
    	jl bbb2
    	oustring blank
    	jmp xxx
    bbb1:
    	oustring blank1
    	jmp xxx
    bbb2:
    	oustring blank2
    xxx:
    	mov dl,ranks
    	add dl,30h
    	output dl
    	ld
    	add bx,x
    	dec count
    	cmp count,0
    	jg ccc
    	mov ranks,0
    	ret
    displayrank endp
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;;;;;;;;;;;;;;;;;;;findinformation子程序:按学号查找某学生;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    findinformation proc
    out1:    ;number
    	ld
    	cmp z,0
    	jz nobodys
    	mov si,0
    	mov cx,20
    set3:
    	mov temp1[si],0
    	inc si
    	loop set3
    	mov si,0
    	oustring details2
    set2:
    	input
    	cmp al,13  ;输入回车跳到out2
    	jz out2
    	cmp al,30h
    	jl errornumber
    	cmp al,39h
    	jg errornumber
    	;输入的字符在0-9之间,则存入temp1中
    	mov temp1[si],al
    	inc si
    	jmp set2
    	
    out2:
    	mov cx,z
    	mov count,cx   ;学生人数
    	mov bx,0
    	mov cx,17
    rets:
    	lea si,member[bx].number
    	lea di,temp1
    	repz cmpsb
    	cmp cx,0
    	jz haveinformation
    	dec count
    	cmp count,0
    	jz out3
    	add bx,x
    	mov cx,17
    	jmp rets
    out3:
    	ld
    	oustring noinformation
    	ld
    	ret
    haveinformation:
    	mov result,bx   ;先将bx存起来
    	ld
    	oustring information
    	cmp member[bx].score,10
    	jge abten
    	mov dx,member[bx].score
    	add dl,30h
    	output dl
    	jmp ddd
    abten:
    	cmp member[bx].score,100
    	je hundred
    	mov ax,member[bx].score
    	mov cl,10
    	idiv cl
    	mov cl,ah
    	add al,30h
    	output al
    	add cl,30h
    	output cl
    	jmp ddd
    	
    hundred:
    	mov ax,member[bx].score
    	mov cl,100
    	idiv cl
    	mov cl,ah
    	add al,30h
    	output al
    	mov al,cl
    	cbw
    	mov cl,10
    	idiv cl
    	mov cl,ah
    	add al,30h
    	output al
    	add cl,30h
    	output cl
    
    ddd:
    	ld
    	oustring modification
    ret2:
    	input
    	cmp al,'y'
    	jz yes1
    	cmp al,'Y'
    	jz yes1
    	cmp al,'n'
    	jz no1
    	cmp al,'N'
    	jz no1
    	ld
    	oustring error1
    	jmp ret2
    
    yes1:
    	ld
    	oustring details3
    	mov si,0
    	mov bx,0
    set4:
    	input
    	cmp al,13
    	jz out4  ;输入回车跳到out4
    	cmp al,30h
    	jl errorscore
    	cmp al,39h
    	jg errorscore
    	;输入的字符在0-9之间
    	sub al,30h
    	cbw 
    	xchg ax,bx
    	mov cl,10
    	imul cl
    	add bx,ax
    	jmp set4
    
    out4:
    	cmp bx,100
    	jg errorscore
    	mov ax,bx
    	mov bx,result
    	mov member[bx].score,ax
    	call displaydatas
    	ret
    
    nobodys:
    	oustring nobody
    	ret
    
    errorscore:
    	ld
    	oustring scoreerror
    	ld
    	mov bx,y
    	mov member[bx].score,0
    	jmp yes1
    	
    	
    no1:
    	call displaydatas
    	ret
    
    errornumber:
    	ld
    	oustring numbererror
    	ld
    cc2:
    	dec si
    	cmp si,0
    	jl out1
    	mov temp1[si],0
    	jmp cc2
    
    findinformation endp
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    exit:
    	mov ah,4ch
    	int 21h     
    code ends
    end start
    

    运行结果如下:

    1.边界判断


    2.录入学生信息



    3.按照成绩进行排序


    4.按学号查找并修改指定学生成绩(并且名次发生变化,按2可以看到)


    展开全文
  • 学生管理系统 (:只录入每个学生学号、课程编号、课程名称、学分、平时成绩、实验成绩、卷面成绩共7个数据. 综合成绩、学分由程序根据条件自动运算。 (2)查询功能:分为学生基本情况查询和成绩查询两种 A:...
  • (1)建立学生信息数据,包括学号、姓名、性别、三科成绩、出生时间、年龄(必须计算得到)。 (2)使用继承的方法构造至少3个类,(即学生类——虚基类,本科生和研究生类——派生类)使用相应的对象放置10个学生...
  • 数据排序录入及查询

    千次阅读 2017-06-21 20:27:42
    学生信息学号、姓名和成绩3个数据,请如下要求编程处理某教学班(例如30人)学生的数据。 ① 定义表示学生的信息结构体类型; ② 用结构体数组处理一个班学生信息的,结构体数组数据从键盘录入; ③ 将...
  • 学生信息包括:学号,姓名,年龄,性别,出生年月...(2) 学生信息录入功能(学生信息用文件保存); (3) 学生信息浏览功能; (4) 查询、排序功能:按学号、姓名等进行排序和查询; (5) 学生信息的删除与修改。
  • 要求设计的管理系统能够实现以下功能:1.每一条记录包括一个学生的学号、姓名、3个成绩(平时...成绩信息的删除:按学号进行删除某学生的成绩6.排序功能:按学生总成绩进行排序1.首先,列出所需要的头文件以及声明...
  • 一个学生信息包括姓名、班级、学号(班内序号)、成绩。试编写程序实现以下功能: (1)能录入学生成绩(十进制形式);提示:输入形如:tom 301 16 95回车,每名学生用一行;选择一个特殊符表示输入结束 (2)...
  • 学生信息(学号,姓名,三门功课,平均成绩)进行录入,输出,查看不及格学生,计算平均分,按学号排序,按平均分排序等功能,并存入文件中。 菜单: 1.查看全部学生成绩信息 2.查看挂科学生信息 3.按学号排序4.按...
  • 学生信息管理系统.rar

    2020-07-12 11:02:33
    学生信息包括:学号,姓名,年龄,性别,出生年月,地址,...2、学生信息录入功能(学生信息用文件保存) 3、学生信息浏览功能 4、学生信息查询功能 按学号查询 按姓名查询 5、学生信息的删除与修改 6、运用冒泡排序
  • 基于python的学生信息管理系统

    千次阅读 多人点赞 2020-11-25 20:39:44
    学生管理系统主要包括录入学生信息、查找学生信息、删除学生信息、修改学生信息排序学生信息、统计学生总数、显示学生信息,这几项功能。其中录入学生的信息包括学号、姓名、英语成绩、python成绩、数学成绩、总...
  • 学生信息录入功能(学生信息用文件保存)---输入 学生信息浏览功能——输出 查询、排序功能——算法 按学号查询 按姓名查询 学生信息的删除与修改(可选项) (2)功能要求,界面简单明了;有一定的容错能力,比如...
  • 学生信息系统

    2011-12-01 21:32:04
    输入一个班级的学生基本信息(包括学号,姓名,各科成绩),对考试成绩进行管理(假设为英语、...(4)能够按学号排序。 (5)能按学号查找,删除学生信息。 (6)将成绩数据存入文件。 (7)将成绩数据从文件读出。
  • 学生信息管理系统

    2012-01-09 13:13:41
    题目2 学生信息管理系统设计 学生信息包括:学号,姓名...学生信息录入功能(学生信息用文件保存)——输入 学生信息浏览功能——输出 查询、排序功能——算法 按学号查询 按姓名查询 学生信息的删除与修改(可选项)
  • (1). 学生信息录入:添加学生信息到指定文件中 (6). 学生信息浏览:文件中学生的信息按学号关键字排序后输出到屏幕 (7). 查询:按学号查询、按姓名查询 (8). 修改:修改指定学生的信息 (9). 删除:删除指定学生 ...
  • 学生信息管理系统 c

    2011-12-19 14:24:07
    学生信息包括:学号,姓名,年龄,性别,出生年月,地址,电话,E-mail...学生信息录入功能(学生信息用文件保存)---输入 学生信息浏览功能---输出 查询、排序功能---算法 按学号查询 按姓名查询 学生信息的删除与修改
  • 学生信息包括:学号,姓名,年龄,性别,出生年月,地址,电话,E-mail,入学成绩等。...学生信息录入功能(学生信息用文件保存) 学生信息浏览功能 按入学成绩排序功能 按学号查询 按姓名查询 学生信息的删除与修改
  • 学生信息管理系统设计 学生信息包括:学号,姓名,年龄,性别,出生年月,地址,电话,... 学生信息录入功能(学生信息用文件保存)---输入 学生信息浏览功能---输出 查询、排序功能---算法 按学号查询 按姓名查询
  • 学生信息包括:学号,姓名,年龄,性别,出生年月,地址,电话,E-mail...学生信息录入功能(学生信息用文件保存)---输入 学生信息浏览功能---输出 查询、排序功能---算法 按学号查询 按姓名查询 学生信息的删除与修改
  • 学生信息管理系统.txt

    2019-12-03 23:39:42
    学生信息管理系统是一个信息化管理软件,可以进行学生学号、姓名、课程、成绩等学生信息录入,信息的查看,信息的删除,信息的修改,可根据需要对学生的数据进行排序,它能方便老师、学生查询信息。整体上实现了...
  • c++学生信息管理系统

    2010-10-21 14:41:57
    学生信息包括:学号,姓名,年龄,性别,出生年月,地址,...学生信息录入功能(学生信息用文件保存)---输入 学生信息浏览功能---输出 查询、排序功能---算法 按学号查询 按姓名查询 学生信息的删除与修改(可选项)
  • 【论述题】(10.0分)【其它】多线程练习 任务描述: 编写10个线程,第一个线程从1加到10,第二个线程从11加到20,......,第十个线程... 2、学生对象的排序规则为:按学号从小到大排序,每个学生的学号必须唯一; 3、定义方法...

空空如也

空空如也

1 2 3 4 5 ... 14
收藏数 270
精华内容 108
关键字:

学生信息录入按学号排序