C语言—高校学生成绩管理系统

简介

        基于C语言的高校学生成绩管理系统,实现录入学生信息、打印学生信息、保存学生信息、读取学生信息、统计学生人数、查找学生信息、修改删除学生信息的基本功能。代码实现部分将给出实现各个功能的代码步骤解析,完整代码会在文章末尾给出。

代码实现:

        基于以上功能,给出用户界面:

//用户界面
void Welcome()
{
    printf("************************\n");
    printf("*欢迎使用学生成绩管理系统*\n");
    printf("************************\n");
    printf("*      请选择功能       *\n");
    printf("************************\n");
    printf("*     1.录入信息        *\n");
    printf("*     2.打印信息        *\n");
    printf("*     3.保存信息        *\n");
    printf("*     4.读取信息        *\n");
    printf("*     5.统计人数        *\n");
    printf("*     6.查找信息        *\n");
    printf("*     7.修改信息        *\n");
    printf("*     8.删除信息        *\n");
    printf("*     0.退出系统        *\n");
    printf("************************\n");
}

1.录入信息

       关于录入信息的实现,首先需要创建一个包含学生信息链表,包括但不限于学生的学号,姓名,年龄和成绩。我们把定义好的结构体重命名为'Stu',表示学生信息,代码如下:

//定义学生
typedef struct _Stu
{
    char name[20];//姓名
    int age;      //年龄
    char num[20]; //学号
    float score;  //成绩
}Stu;

 要建立链表,首先我们需要定义一个头节点,使初始头节点为空,代码是实现如下:

//定义节点
typedef struct _Node
{
    Stu s1;             //学生
    struct _Node*pNext; //指向下一个节点
}Node;
//定义头节点
Node *g_pHead = NULL;

定义录入信息函数'Input()',创建新节点,将创建的新节点利用头插法插入我们所建立的链表之中,并输入我们需要输入的信息,代码如下:

//录入信息
void Input()
{
    //创建节点
    Node* pNewNode = (Node*)malloc(sizeof(Node));
    pNewNode->pNext = NULL;
    //插入节点(头插法)
    if(g_pHead == NULL)
    {
        g_pHead = pNewNode;
    }
    else
    {
        pNewNode->pNext = g_pHead;
        g_pHead = pNewNode;
    }
    printf("请输入学生姓名:\n");
    scanf("%s",pNewNode->s1.name);

    printf("请输入学生年龄:\n");
    scanf("%d",&pNewNode->s1.age);

    printf("请输入学生学号:\n");
    scanf("%s",pNewNode->s1.num);

    printf("请输入学生成绩:\n");
    scanf("%f",&pNewNode->s1.score);

    printf("录入成功!\n");
}

2.打印信息

        要打印我们在录入的信息,需要我们遍历所创建链表,并将链表中的信息通过'printf()'函数打印出来,代码实现如下:

//打印信息
void Output()
{
    printf("************************\n");
    printf("*欢迎使用学生成绩管理系统*\n");
    printf("************************\n");
    printf("* 学号 * 姓名 * 年龄 * 成绩 *\n");
    printf("************************\n");

    //遍历链表
    Node*p = g_pHead;
    while (p != NULL)
    {
        printf("* %s * %s * %d * %f *\n",p->s1.num,p->s1.name,p->s1.age,p->s1.score);

        p = p->pNext;
    }
}

3.保存信息

        对于保存信息,涉及到文件操作,首先我们新建一个txt文件,用于储存我们先前输入的信息,命名为'stuin.txt'。其次,要想将链表中的信息写入到txt文件中,我们需要遍历链表,读取链表中的所有学生信息,将其写入txt文件并保存。代码实现如下:

//保存信息
void Save()
{
    //打开文件
    FILE* fp = fopen("stuin.txt","w");

    if(fp == NULL)
    {
        printf("打开文件失败!\n");
        return;
    }

    //遍历链表
    Node*p = g_pHead;
    while (p != NULL)
    {
        fwrite(&p->s1,1,sizeof(Stu),fp);
        p = p->pNext;
    }
    //关闭文件
    fclose(fp);
    printf("文件数据保存成功!\n");
}

4.读取信息

        要读取我们之前保存在txt文件中的信息,首先需要打开文件,如果文件空,则输出文件打开失败,其次,要读取文件中的信息,我们需要创建一个新的节点,并利用头插法将新节点插入链表。代码实现如下:

//读取信息
void Read()
{
    //打开文件
    FILE* fp = fopen("stuin.txt","r");

    if(fp == NULL)
    {
        printf("打开文件失败!\n");
        return;
    }
    //读取文件
    while(!feof(fp))
    {
        //创建节点
        Node*pNewNode = (Node*)malloc(sizeof(Node));
        fread(&pNewNode->s1,1,sizeof(Stu),fp);
        pNewNode->pNext = NULL;

         //插入节点(头插法)
        if(g_pHead == NULL)
        {
            g_pHead = pNewNode;
        }
        else
        {
            pNewNode->pNext = g_pHead;
            g_pHead = pNewNode;
        }
    }
    //关闭文件
    fclose(fp);
    printf("数据读取成功!!\n");
}

5.统计人数

        同上,要统计学生人数,我们同样需要遍历链表。首先定义一个整数nCount,表示学生人数,赋值为0。其次,利用while循环,如果链表不是空链表,则使nCount自加1,将值返回给nCount,最后打印输出。代码如下:

//统计人数
int ConStu()
{
    int nCount = 0;
    //遍历链表
    Node*p = g_pHead;
    while (p != NULL)
    {
        nCount++;
        p = p->pNext;
    }
    return nCount;
    printf("一共有%d个学生\n",nCount);
}

6.查找信息

        关于查找信息,我们规定学生学号唯一,并以此作为我们进行信息查找的依据。首先我们定义一个学生学号数组,从键盘输入。其次遍历链表,利用strcmp函数将输入的学生学号与链表中的学生学号进行对比,若相同,则输出该学生的相关信息,若不同,则输出没有找到该学生的提示。代码实现如下:

//查找信息
Node* Search()
{
    char StuNum[20];
    printf("请输入学生学号:\n");
    scanf("%s",StuNum);

    //遍历链表
    Node*p = g_pHead;
    while (p != NULL)
    {
        if(0 == strcmp(p->s1.num,StuNum))
        {
            return p;
        }
        p = p->pNext;
    }
    //没有找到
    return NULL;
}

7.修改信息

        要修改学生信息,首先我们需要查找到我们需要修改的学生。具体可以参考第六步查找信息,不同的是,如果在查找到学生信息后,我们要对链表中的信息进行修改,具体代码如下:

//修改信息
void Modify()
{
    char StuNum[20];
    printf("请输入需要修改的学生的学号:\n");
    scanf("%s",StuNum);

    //遍历链表
    Node*p = g_pHead;
    while (p != NULL)
    {
        if(0 == strcmp(p->s1.num,StuNum))
        {
            printf("请输入修改信息:\n");
            scanf("%s %d %f",p->s1.name,&p->s1.age,&p->s1.score);
            printf("修改成功!\n");
            break;
        }
        p = p->pNext;
    }
    if (p == NULL)
    {
        printf("没有找到该学生信息!\n");
    }
}

8.删除信息

        要实现删除信息,我们首先也是要找到需要我们删除的学生,步骤同上两步相同。在查找到需要删除的学生信息后,我们判断其是否为链表中的头节点,如果是,则定义一个p1,将头节点中的信息赋值p1,并将其释放,也就是删除该节点信息。具体代码如下:

//删除信息
void Del()
{
    char StuNum[20];
    printf("请输入需要删除的学生的学号:\n");
    scanf("%s",StuNum);

    
    //判断是否为头节点
    Node* p1;
    if(g_pHead->s1.num == StuNum)
    {
        p1 = g_pHead;
        g_pHead = g_pHead->pNext;
        free(p1);
        return;
    }

    //不是头节点
    Node* p2 = g_pHead;
    Node* p = g_pHead;
    while(p->pNext != NULL)
    {
        if(p->pNext->s1.num == StuNum)
        {
            p2 = p->pNext;
            p->pNext = p->pNext->pNext;
            free(p2);
            return;
        }
        p = p->pNext;

        if(p->pNext == NULL)
        {
            break;
        }
    }
    if(p->pNext == NULL)
    {
        printf("没有找到该学生!\n");
    }
}

完整代码

Student.c

#include "Student.h"


int main()
{
    //设置while死循环,使程序不停运行
    while(1)
    {
        //调用函数Welcome
        Welcome();
        //等待键盘输入字符
        //getch 不需要按回车,输入即响应
        char ch = getchar();
        //判断输入字符
        switch (ch)
        {
            case '1':
                Input();
                    break;
            case '2':
                Output();
                    break;
            case '3':
                Save();
                    break;
            case '4':
                Read();
                    break;
            case '5':
                printf("一共有%d个学生\n",ConStu());
                    break;
            case '6':
            {
                Node* p = Search();
                if(p != NULL)
                {
                    printf("学号:%s\t姓名:%s\t年龄:%d\t成绩%f\n",
                    p->s1.num,p->s1.name,p->s1.age,p->s1.score);
                }
                else 
                {
                    printf("没有找到该学生!\n");
                }
                        break;
            }
            case '7':
                Modify();
                    break;
            case '8':
                Del();
                    break;
            case '0':
            printf("再见!!!!\n");
            return 0;
                    break;
        }
    }
    return 0;
}

//用户界面
void Welcome()
{
    printf("************************\n");
    printf("*欢迎使用学生成绩管理系统*\n");
    printf("************************\n");
    printf("*      请选择功能       *\n");
    printf("************************\n");
    printf("*     1.录入信息        *\n");
    printf("*     2.打印信息        *\n");
    printf("*     3.保存信息        *\n");
    printf("*     4.读取信息        *\n");
    printf("*     5.统计人数        *\n");
    printf("*     6.查找信息        *\n");
    printf("*     7.修改信息        *\n");
    printf("*     8.删除信息        *\n");
    printf("*     0.退出系统        *\n");
    printf("************************\n");
}

//录入信息
void Input()
{
    //创建节点
    Node* pNewNode = (Node*)malloc(sizeof(Node));
    pNewNode->pNext = NULL;
    //插入节点(头插法)
    if(g_pHead == NULL)
    {
        g_pHead = pNewNode;
    }
    else
    {
        pNewNode->pNext = g_pHead;
        g_pHead = pNewNode;
    }
    printf("请输入学生姓名:\n");
    scanf("%s",pNewNode->s1.name);

    printf("请输入学生年龄:\n");
    scanf("%d",&pNewNode->s1.age);

    printf("请输入学生学号:\n");
    scanf("%s",pNewNode->s1.num);

    printf("请输入学生成绩:\n");
    scanf("%f",&pNewNode->s1.score);

    printf("录入成功!\n");
}

//打印信息
void Output()
{
    printf("************************\n");
    printf("*欢迎使用学生成绩管理系统*\n");
    printf("************************\n");
    printf("* 学号 * 姓名 * 年龄 * 成绩 *\n");
    printf("************************\n");

    //遍历链表
    Node*p = g_pHead;
    while (p != NULL)
    {
        printf("* %s * %s * %d * %f *\n",p->s1.num,p->s1.name,p->s1.age,p->s1.score);

        p = p->pNext;
    }
}

//保存信息
void Save()
{
    //打开文件
    FILE* fp = fopen("stuin.txt","w");

    if(fp == NULL)
    {
        printf("打开文件失败!\n");
        return;
    }

    //遍历链表
    Node*p = g_pHead;
    while (p != NULL)
    {
        fwrite(&p->s1,1,sizeof(Stu),fp);
        p = p->pNext;
    }
    //关闭文件
    fclose(fp);
    printf("文件数据保存成功!\n");
}

//读取信息
void Read()
{
    //打开文件
    FILE* fp = fopen("stuin.txt","r");

    if(fp == NULL)
    {
        printf("打开文件失败!\n");
        return;
    }
    //读取文件
    while(!feof(fp))
    {
        //创建节点
        Node*pNewNode = (Node*)malloc(sizeof(Node));
        fread(&pNewNode->s1,1,sizeof(Stu),fp);
        pNewNode->pNext = NULL;

         //插入节点(头插法)
        if(g_pHead == NULL)
        {
            g_pHead = pNewNode;
        }
        else
        {
            pNewNode->pNext = g_pHead;
            g_pHead = pNewNode;
        }
    }
    //关闭文件
    fclose(fp);
    printf("数据读取成功!!\n");
}

//统计人数
int ConStu()
{
    int nCount = 0;
    //遍历链表
    Node*p = g_pHead;
    while (p != NULL)
    {
        nCount++;
        p = p->pNext;
    }
    return nCount;
    printf("一共有%d个学生\n",nCount);
}

//查找信息
Node* Search()
{
    char StuNum[20];
    printf("请输入学生学号:\n");
    scanf("%s",StuNum);

    //遍历链表
    Node*p = g_pHead;
    while (p != NULL)
    {
        if(0 == strcmp(p->s1.num,StuNum))
        {
            return p;
        }
        p = p->pNext;
    }
    //没有找到
    return NULL;
}

//修改信息
void Modify()
{
    char StuNum[20];
    printf("请输入需要修改的学生的学号:\n");
    scanf("%s",StuNum);

    //遍历链表
    Node*p = g_pHead;
    while (p != NULL)
    {
        if(0 == strcmp(p->s1.num,StuNum))
        {
            printf("请输入修改信息:\n");
            scanf("%s %d %f",p->s1.name,&p->s1.age,&p->s1.score);
            printf("修改成功!\n");
            break;
        }
        p = p->pNext;
    }
    if (p == NULL)
    {
        printf("没有找到该学生信息!\n");
    }
}

//删除信息
void Del()
{
    char StuNum[20];
    printf("请输入需要删除的学生的学号:\n");
    scanf("%s",StuNum);

    
    //判断是否为头节点
    Node* p1;
    if(g_pHead->s1.num == StuNum)
    {
        p1 = g_pHead;
        g_pHead = g_pHead->pNext;
        free(p1);
        return;
    }

    //不是头节点
    Node* p2 = g_pHead;
    Node* p = g_pHead;
    while(p->pNext != NULL)
    {
        if(p->pNext->s1.num == StuNum)
        {
            p2 = p->pNext;
            p->pNext = p->pNext->pNext;
            free(p2);
            return;
        }
        p = p->pNext;

        if(p->pNext == NULL)
        {
            break;
        }
    }
    if(p->pNext == NULL)
    {
        printf("没有找到该学生!\n");
    }
}

Student.h

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//定义学生
typedef struct _Stu
{
    char name[20];//姓名
    int age;      //年龄
    char num[20]; //学号
    float score;  //成绩
}Stu;

//定义节点
typedef struct _Node
{
    Stu s1;             //学生
    struct _Node*pNext; //指向下一个节点
}Node;
//定义头节点
Node *g_pHead = NULL;


//定义用户界面
void Welcome();
//定义录入信息
void Input();
//定义打印信息
void Output();
//定义保存信息
void Save();
//定义读取信息
void Read();
//定义统计人数
int ConStu();
//定义查找信息
Node* Search();
//定义修改信息
void Modify();
//定义删除信息
void Del();

总结

        总的来说,以上代码实现了一个简单的学生成绩管理系统,通过用户的输入实现对学生信息的录入、输出、保存、读取、统计、查找、修改和删除等操作。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值