C语言实现-学生信息管理系统

2023-05-16

通过C语言实现一个学生信息管理系统,要求如下:
(1)用户采用自己账号和密码登录系统;
(2)学生信息和账号密码通过文件的形式存储;
(3)学生的信息有增删查改功能;
(4)特别的,在增删查改后的学生信息可以一键保存到文件中;
(5)学生信息显示可以按文件读取出来的顺序显示也可以和按分数高低排序显示;
(6)对修改和新增信息进行限制:成绩0-100,学号为11位,性别为male或female,年龄为0-200岁。
代码如下:

#pragma warning(disable:4996)
#include <stdio.h>  
#include <string.h>  
#include <stdlib.h>  
#include <windows.h>   

typedef struct Student
{
    char name[100]; //姓名  
    char num[100];  //学号  
    char sex[10];//性别 (w代表女生m代表男生)  
    int age;//年龄  
    int score;//成绩  
}stu;
typedef struct LNode
{
    stu data;
    struct LNode* next;
}LinkList;
typedef struct Login
{
    char username[100];
    char password[100];
}lg;
typedef struct Node
{
    lg data;
    struct Node* link;
}List;

char nam[100];//名字  
char nu[100];//学号  
char s[10];//性别  
int ag;//年龄  
int sc;//成绩

void login()//登录界面
{
    List* head = (List*)malloc(sizeof(List));
    head->link = NULL;
    List* p;
    FILE* FP;
    char un[100];
    char pw[100];
    FP = fopen("usernameandpassword.txt", "rb"); //以只读方式打开当前目录下的.txt  
    if (FP == NULL)
    {
        printf("无法打开文件\n");
        exit(0); //终止程序  
    }
    while (!feof(FP))
    {
        fscanf(FP, "%s %s", un, pw);
        List* p = (List*)malloc(sizeof(List));
        strcpy(p->data.username, un);//把后者的内容拷贝到前者中  
        strcpy(p->data.password, pw);//把后者的内容拷贝到前者中  
        List* q = NULL;
        q = head;
        p->link = q->link;
        q->link = p;
        p = p->link;
    }
    fclose(FP);    //关闭文件
    /*
    // 显示当前存有的用户名和密码,如果忘记了可以将这部分显示
    List* q = head->link;
    if (q == NULL)
    {
        printf("还没有学生信息,请增加学生信息\n");
        return;
    }
    while (q)
    {
        system("color c0");
        printf(" 用户名:%s   密码:%s\n", q->data.username, q->data.password);
        q = q->link;
    }
    */
    char usn[100];
    char psw[100];
    while (1) {
        system("color b1");
        printf("````````````````````````````````````````````````````````````````````````````````");
        printf("\n");
        printf("\n");
        printf("\n");
        printf("  ***********************  欢迎登录学生信息管理平台 *************************  \n");
        printf("\n");
        printf("\n");
        printf("\n");
        printf("````````````````````````````````````````````````````````````````````````````````\n");
        printf("账号:");
        scanf("%s", usn);
        printf("密码:");
        scanf("%s", psw);
        List* temp = head->link;
        int key = 0;
        while (temp)
        {
            if ((strcmp(temp->data.username, usn) == 0) && (strcmp(temp->data.password, psw) == 0)) {
                key = 1;
            }
            temp = temp->link;
        }
        if (key == 1)
        {
            printf("登陆成功!\n");
            break;
        }
        else {
            printf("账号或密码错误!\n");
        }
    }
}

void menu()//功能菜单  
{
    system("color e3");
    printf("    |________________________________________________|\n");
    printf("    |                                                |\n");
    printf("    |                学生信息管理系统                |\n");
    printf("    |                                                |\n");
    printf("    |               0、退出系统                      |\n");
    printf("    |               1、增加学生信息                  |\n");
    printf("    |               2、删除学生信息                  |\n");
    printf("    |               3、修改学生信息                  |\n");
    printf("    |               4、查找学生的信息                |\n");
    printf("    |               5、按照学生成绩排序              |\n");
    printf("    |               6、浏览全部学生信息              |\n");
    printf("    |               7、保存学生信息到文件            |\n");
    printf("    |                                                |\n");
    printf("    |________________________________________________|\n");
    return;
}

void InitList(LinkList*& L)//初始化链表  
{
    L = (LinkList*)malloc(sizeof(LinkList));
    L->next = NULL;
}

void ListInsert(LinkList*& L, LinkList* p)//插入新的节点  
{
    LinkList* q = NULL;
    q = L;
    p->next = q->next;
    q->next = p;
}

void addstu(LinkList*& L)//增加新的学生  
{
    system("color f2");
    printf("请输入学生的信息():\n");
    printf("示例:学号:20191002100  姓名:xiaoming  性别:male   年龄:18   分数:98\n");
    LinkList* q = L->next;
    LinkList* p;
    InitList(p);
    while (1) {
        printf("学号(11位):");
        scanf("%s", nu);
        while (q != NULL)
        {
            if (strcmp(q->data.num, nu) == 0)//判断是否存在  
            {
                printf("该生已存在\n");
                break;
            }
            q = q->next;
        }
        if (strlen(nu) == 11 && q == NULL)
        {
            strcpy(p->data.num, nu);
            break;
        }
        else
            printf("学号不是11位或者学号已存在!");
    }
    while(1){
        printf("姓名(0-100位):");
        scanf("%s", nam);
        if (strlen(nam) > 0 && strlen(nam) <= 100) {
            strcpy(p->data.name, nam);
            break;
        }
        else
            printf("名字长度大于0小于100!!!");
        
    }
    while (1) {
        printf("性别:(male/female)");
        scanf(" %s", s);
        if (strcmp(s, "male") == 0 || strcmp(s, "female") == 0) {
            strcpy(p->data.sex, s);
            break;
        }
        else
            printf("性别为male或者female!!!");
        
    }
    while (1) {
        printf("年龄(大于0,小于200):");
        scanf("%d", &ag);
        if (ag <= 200 && ag>=0) {
            p->data.age = ag;
            break;
        }
        else
            printf("岁数要大于0小于100!!!");
    }
    while (1) {
        printf("总成绩:");
        scanf("%d", &sc);
        if (sc <= 100 && sc>=0) {
            p->data.score = sc;
            break;
        }
        else
            printf("分数要大于0小于100!!!");
        
    }
    ListInsert(L, p);
    
}

void deletestu(LinkList* L)//删除学生  
{
    system("color f4");
    printf("请输入您要删除的学生的学号:");
    scanf("%s", nu);
    //判断  
    LinkList* p, * pre;
    if (L->next == NULL)
    {
        printf("还没有学生信息,请增加学生信息\n");
        return;
    }
    pre = L;
    p = pre->next;
    int judge = 0;
    while (p)
    {
        if (strcmp(p->data.num, nu) == 0)
        {
            judge = 1;
            pre->next = p->next;
            free(p);
            printf("删除学生成功\n");
            break;
        }
        pre = p;
        p = p->next;
    }
    if (judge == 0)
        printf("该生不存在\n");
}

void findstu(LinkList* L)//按学号或者姓名查找学生并输出该生信息  
{
    int flag;
    system("color b1");
    printf("1.按学号查询:\n");
    printf("2.按姓名查询:\n");
    printf("请输入查询方式:");
    scanf("%d", &flag);
    if (flag == 1) {
        printf("请输入该生学号:");
        scanf("%s", nu);
        //判断  
        LinkList* q = L->next;
        while (q != NULL)
        {
            if (strcmp(q->data.num, nu) == 0)
            {
                printf("姓名:%s\n", q->data.name);
                printf("学号:%s\n", q->data.num);
                printf("性别:%s\n", q->data.sex);
                printf("年龄:%d\n", q->data.age);
                printf("总成绩:%d\n", q->data.score);
                break;
            }
            q = q->next;
        }
        if (q == NULL)
            printf("该生不存在\n");
    }
    else {
        printf("请输入该生姓名:");
        scanf("%s", nam);
        LinkList* q = L->next;
        while (q != NULL)
        {
            if (strcmp(q->data.name, nam) == 0)
            {
                printf("姓名:%s\n", q->data.name);
                printf("学号:%s\n", q->data.num);
                printf("性别:%s\n", q->data.sex);
                printf("年龄:%d\n", q->data.age);
                printf("总成绩:%d\n", q->data.score);
                break;
            }
            q = q->next;
        }
        if (q == NULL)
            printf("该生不存在\n");
    }
}

void display(LinkList*& L)//浏览全部学生信息  
{
    LinkList* q = L->next;
    if (q == NULL)
    {
        printf("还没有学生信息,请增加学生信息\n");
        return;
    }
    while (q)
    {
        system("color c0");
        printf(" 学号:%s 名字:%s 年龄:%d 性别:%s  总成绩:%d \n", q->data.num, q->data.name, q->data.age, q->data.sex,
            q->data.score);
        q = q->next;
    }
}

void paixu(LinkList* L)//按成绩排序排序 并输出排序后的结果  
{
    system("color f9");
    LinkList* q, * p, * r = L->next;
    //判断  
    if (r == NULL)
    {
        printf("还没有学生信息,请增加学生信息\n");
        return;
    }
    while (r) //两层循环完成排序  
    {
        p = r;
        q = r->next;
        LinkList* tmp;//用于排序时暂存节点  
        InitList(tmp);
        while (q)
        {
            if (q->data.score > p->data.score)
            {
                /*先复制q结点信息到tmp*/
                strcpy(tmp->data.num, q->data.num);
                strcpy(tmp->data.name, q->data.name);
                strcpy(tmp->data.sex, q->data.sex);
                tmp->data.age = q->data.age;
                tmp->data.score = q->data.score;
                /*再复制p结点信息到q*/
                strcpy(q->data.num, p->data.num);
                strcpy(q->data.name, p->data.name);
                strcpy(q->data.sex, p->data.sex);
                q->data.age = p->data.age;
                q->data.score = p->data.score;
                /*最后复制exchange结点信息到p*/
                strcpy(p->data.num, tmp->data.num);
                strcpy(p->data.name, tmp->data.name);
                strcpy(p->data.sex, tmp->data.sex);
                p->data.age = tmp->data.age;
                p->data.score = tmp->data.score;
            }
            q = q->next;
        }
        r = r->next;
    }

    printf("排序后的学生信息是:\n");
    display(L);
}

void saveStuDentFile(LinkList*& L)//保存学生信息到文件  
{
    FILE* fp;
    LinkList* p = L->next;
    if ((fp = fopen("student.txt", "w")) == NULL)// 以可写的方式打开当前目录下的.txt  
    {
        printf("不能打开此文件,请按任意键退出\n");
        exit(1);
    }
    while (p)
    {
        fprintf(fp, "%s  %s  %s  %d  %d  \n", p->data.num, p->data.name, p->data.sex, p->data.age, p->data.score);
        p = p->next;
        printf("保存成功\n");
    }
    fclose(fp);
}

void readStuDentput(LinkList*& L) //运行前把文件内容读取到电脑内存  
{
    FILE* fp;
    fp = fopen("student.txt", "rb"); //以只读方式打开当前目录下的.txt  
    if (fp == NULL)
    {
        printf("不存在打开文件\n");
        exit(0);                   //终止程序  
    }
    int i = 0;
    while (!feof(fp))
    {
        char nu[100];//学号  
        char nam[100];//名字 
        char s[10];//性别  
        int ag;//年龄  
        int sc;//成绩  
        fscanf(fp, " %s %s %s %d %d", nu, nam, &s, &ag, &sc);
        i++;
    }
    fclose(fp);
    FILE* FP;
    FP = fopen("student.txt", "rb"); //以只读方式打开当前目录下的.txt  
    if (FP == NULL)
    {
        printf("无法打开文件\n");
        exit(0); //终止程序  
    }
    int b = i - 1;
    int j = 1;
    while (!feof(FP))
    {
        fscanf(FP, "%s %s %s %d %d", nu, nam, s, &ag, &sc);
        LinkList* n = (LinkList*)malloc(sizeof(LinkList));
        strcpy(n->data.num, nu);//把后者的内容拷贝到前者中  
        strcpy(n->data.name, nam);//把后者的内容拷贝到前者中  
        strcpy(n->data.sex, s);
        n->data.age = ag;
        n->data.score = sc;
        ListInsert(L, n);//插入新的节点  
        n = n->next;
        if (j == b)
            break;
        j++;
    }
    fclose(FP);    //关闭文件  
}

void changestu(LinkList* L)//改变学生信息  
{
    display(L);
    int judge = 1;
    system("color e4");
    printf("请输入您要修改学生的学号:\n");
    scanf("%s", nu);
    LinkList* q = L->next;
    while (q != NULL)
    {
        if (strcmp(q->data.num, nu) == 0)
        {
            judge = 1;
            printf("请输入您要修改的信息选项:1.姓名 2. 总成绩  3.年龄  4.性别  \n");
            int n;
            scanf("%d", &n);
            switch (n)
            {
            case 1:
                while (1) {
                    printf("请输入您要修改的名字:");
                    scanf("%s", nam);
                    if (strlen(nam) > 0 && strlen(nam) <= 100) {
                        printf("修改的名字为:%s\n", nam);
                        strcpy(q->data.name, nam);
                        printf("修改名字成功!\n");
                        break;
                    }
                    else
                        printf("名字长度应该大于0小于100!!!");
                }
                break;
            case 2:
                while (1) {
                    printf("请输入您要修改的总成绩");
                    scanf("%d", &sc);
                    if (sc >= 0 && sc <= 100) {
                        printf("修改的总成绩为:%d\n", sc);
                        q->data.score = sc;
                        printf("修改总成绩成功!\n");
                    }
                    else
                        printf("分数应该大于0小于100!!!");
                }
                break;
            case 3:
                while (1) {
                    printf("请输入您要修改的年龄:");
                    scanf("%d", &ag);
                    if (ag > 0 && ag <= 200) {
                        printf("修改的年龄为:%d\n", ag);
                        q->data.age = ag;
                        printf("修改年龄成功!\n");
                        break;
                    }
                    else
                        printf("年龄应该大于0小于200!!!");
                }
                break;
            case 4:
                while (1) {
                    printf("请输入您要修改的性别:");
                    scanf("%d", s);
                    if (strcmp(s, "male") == 0 || (strcmp(s, "female") == 0)) {
                        printf("修改的性别为:%s\n", s);
                        strcpy(q->data.sex, s);
                        printf("修改性别成功!\n");
                        break;
                    }
                    else
                        printf("性别为male或者female!!!");
                }
                break;
            default:
                printf("请输入正确的选项\n");
                break;
            }
        }
        q = q->next;
    }
    if (judge == 0)
    {
        printf("该生不存在\n");
    }
}

int main()
{
    while (1) {
        system("cls");//清屏
        login();//登录界面
        Sleep(3000);//延缓3秒  
        LinkList* L;
        InitList(L);
        readStuDentput(L);//运行前把文件内容读取到电脑  
        int a;
        int choose;
        while (1)
        {
            printf("请输入您要选择的功能键:\n");
            menu();//功能菜单  
            scanf("%d", &choose);
            switch (choose)
            {
            case 0://退出  
                printf("谢谢使用!欢迎下次光临");
                break;
            case 1://增加学生信息  
                addstu(L);//增加新的学生  
                break;
            case 2://删除所有学生信息  
                deletestu(L);//删除学生  
                break;
            case 3://改变个学生的信息  
                changestu(L);//改变学生信息  
                break;
            case 4://查找某个学生的信息  
                findstu(L);//按学号查找学生并输出该生信息  
                break;
            case 5:// 对学生成绩进行排序  
                paixu(L);
                break;
            case 6://输出所有学生的信息  
                display(L);
                break;
            case 7://保存学生信息到文件  
                saveStuDentFile(L);
                break;
            default:
                printf("请输入正确的选择\n");
                break;
            }
            if (choose == 0)
                break;
        }
    }
}

最后需要把以下两个txt文件和上面的cpp文件放在同一个目录下。
student.txt
usernameandpassword.txt
下载地址
参考博客:https://blog.csdn.net/qq_40679299/article/details/80727872

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言实现-学生信息管理系统 的相关文章

  • IntelliJ IDEA插件之Background Image Plus +

    IntelliJ IDEA插件之Background Image Plus 43 下载地址安装插件概述 下载地址 下载地址 安装插件 安装方式 概述 IDEA 背景修改插件
  • IntelliJ IDEA插件之Free MyBatis plugin

    IntelliJ IDEA插件之Free MyBatis plugin 下载地址安装插件概述 下载地址 下载地址 安装插件 安装方式 概述 mapper接口与对应xml文件对应
  • MySQL Workbench 8.0 CE 汉化包下载

    MySQL Workbench 8 0 CE 汉化包下载 下载地址 xff1a 汉化文件下载 下载提示 xff1a 下载过程进度文件页面右键另存为即可保存文件到本地 1 把下载好的文件后放到此目录下替换此文件 C Program Files
  • IntelliJ IDEA插件之CodeGlance

    IntelliJ IDEA插件之CodeGlance 下载插件安装插件概述 下载插件 下载地址 安装插件 安装方式 概述 将类似于Sublime中的代码的微型地图嵌入到编辑器窗格中 使用您自定义的颜色对亮色和深色主题进行语法突出显示
  • IDEA Easy Code使用记录

    下载安装 xff08 忽略 xff09 设置 设置在idea的 Other Settings里面 分4个选项 Type Mapper 类型映射 xff08 数据字段和java包装器映射 xff09 Template Setting 模板设置
  • windows 10 安装MySQL5.7.25(支持多个MySQL实例)

    windows 10 安装MySQL5 7 25 下载安装包解压到对应路径 创建my ini 配置文件 xff0c 内容如下 span class token punctuation span mysql span class token
  • MySQL explain学习(MySQL版本5.7.25)

    MySQL explain学习 xff08 MySQL版本5 7 25 xff09 idselect typetablepartitionstype xff08 重要 xff09 possible keyskeykey lenrefrows
  • JAVA服务器端接入微信APP支付记录

    微信开发文档地址 xff1a https pay weixin qq com wiki doc api app app php chapter 61 8 1 业务流程图如下 xff1a 商户系统和微信支付系统主要交互说明 xff1a 步骤1
  • 小程序插入激励视频广告教程

    小程序插入激励视频广告教程 相关链接 xff1a 小程序插入banner广告小程序插入插屏广告 今天登陆小程序的后台 xff0c 收到了官方通知 xff0c 小程序激励式视频广告组件日前已上线 xff0c 也就是说可以在小程序中插入激励视频
  • Latex公式中符号上下分别加横线的写法

    下划线 xff1a underline p 效果 xff1a p underline p p 上划线 xff1a overline p 效果 xff1a
  • Error: Unable to find a match

    Error Unable to find a match 当服务器安装软件包出现 xff1a Error Unable to find a match 错误 要么是软件名称写错 xff0c 要么是根本没有这个软件包 缺少系统或者软件repo
  • 网易云音乐缓存文件

    1 Ubuntu版的网易云音乐已经懒得加密了吗 名字里甚至都已经带了md5码的加密方法 ls cache netease cloud music CachedSongs 567602 128 55881971d77b3ec1a5a134e2
  • win10远程连接ubuntu18.04 xrdp+xfce4+fcitx+terminal

    第 1 步 下载脚本 要下载脚本 xff0c 您有多种选择 您可以从终端发出以下命令 wget https www c nergy be downloads xRDP xrdp installer 1 3 zip 您也可以简单地使用浏览器并
  • MySQL增加字段SQL语句

    使用ALTER TABLE向MySQL数据库的表中添加字段 xff0c 向buildBaseInfo中添加字段 ALTER TABLE table name ADD COLUMN column name VARCHAR 100 DEFAUL
  • 搭建PyQt环境(Vs Code)

    1 安装Python 在win10的应用商店中直接搜索Python xff0c 下载并安装 在python官网下载安装也一样 xff0c 但是可能会缺少Python Launcher或者没有添加进系统环境变量 xff0c 造成不必要的麻烦
  • Error: Invalid or corrupt jarfile jar

    遇到的问题 xff1a IDEA打包可执行jar包 xff0c 报错Error Invalid or corrupt jarfile jar 检索问题 xff0c 看到各种千奇百怪的方法 xff0c 比如 xff1a 修改文件后使用jar命
  • 移动VMware虚拟机

    参考连接 xff1a 将VMware虚拟机移到其它磁盘 xff08 C盘 gt D盘 xff09 追梦赤子心刘大哥的博客 CSDN博客 vmware 虚拟机迁移硬盘 操作成功 xff01
  • Linux下常用防火墙命令

    CentOS7 的防火墙配置跟以前版本有很大区别 xff0c CentOS7这个版本的防火墙默认使用的是firewall xff0c 这里有个参考地址 xff1a https www cnblogs com sucretan2010 p 1
  • ubuntu Server上安装桌面环境

    详情请移步至原创主页https www linuxidc com Linux 2018 12 156031 htm 写的不错 而且自己操作过
  • STM32裸机开发(3) — 使用汇编点亮LED灯

    STM32裸机开发 xff08 3 xff09 使用汇编点亮LED灯 一 启动流程 对于STM32F103从flash的启动流程如下 xff1a 首先设置栈 xff1a CPU会从0x08000000读取值 xff0c 用来设置SP 不使用

随机推荐