C语言—学生管理系统—文件存储

 这是一个基于链表的简单学生成绩管理系统

       使用链表,将链表分为指针域和数据域,使用指针域动态内存分配指向数据将数据存入,之后将数据导入数据域存储数据,把数据域写为结构体以学生的id为基准表示学生的各项资料。系统实现了学生资料的存储(文件),修改,排序,拥有简单的异常处理,拥有一定的数据处理,同时建立一个稍微美化的界面和比较舒服的运行模式

      其中的账号和密码必须先注册,

      没有注册就不能登录,只有数据是保存的,必须点击退出才可以读数据到文件里面!!!

        可以自行改良系统,另外将注册数据再写到一个文件里面(类似程序中将学生数据存到一个文件里面),然后实现登录数据的保存,以及数据的实时保存等等......

以下为管理系统的简单的流程图

运行程序 

                     

注册

                     

登陆后

                     

录入学生资料然后查看资料

                    

查看文件 

                     

话不多说上程序,有基础+百度+仔细看你就懂了

#include <stdio.h>
#include <stdlib.h>
#include<windows.h>
#include<string.h>
#include<conio.h>
int num=0,j=0,skip=0,use,analy=0,analyAll=0;
char zhan[50][50];
char mima[50][50];
struct student
{
    char name[20];
    char id[20];
    int math;
    int english;
    int total;
    int order;
    int avar;
};
struct Node
{
    struct student data; ///数据域
    struct Node*next;    ///指针域
};
struct Node *creatList();                                       ///建表头
struct Node* creatNode(struct student data);                    ///建表身
void insertNodeByend(struct Node*list,struct student data);     ///尾插
void deleteNodeByAppoin(struct Node*list,char* id);             ///删除指定信息
void printList(struct Node*list);                                    ///打印
void printPoslist(struct Node*list,int n,int m);                ///打印指定目标
struct Node *find(struct Node*list,char*id);                     ///寻找指定位置
struct Node *Sort(struct Node *list);                           ///总分排序
void savefile(struct Node*list,char*filename);                  ///入文件
void readfile(struct Node*list,char*filename);                  ///读文件
void jiemian();                                                 ///界面
void keydown(struct Node*list);                                 ///键入信息
int login();                                                    ///登陆以及注册

///创建表
struct Node *creatList()
{
    struct Node*list=(struct Node*)malloc(sizeof(struct Node));
    list->next=NULL;
    return list;
};
struct Node *creatNode(struct student data)
{
    struct Node* newNode= (struct Node*)malloc(sizeof(struct Node));
    newNode->data=data;
    newNode->next=NULL;
    return newNode;
};
///插入表
void insertNodeByend(struct Node*list,struct student data)
{
    struct Node*newNode=creatNode(data);
    while(list->next!=NULL)
    {
        list=list->next;
    }
    list->next=newNode;
}
///删除表
void deleteNodeByAppoin(struct Node*list,char* id)
{
    use=0;
    struct Node*posNode=list->next;
    struct Node*posNodeFront=list;
    if(posNode==NULL)
    {
        printf("===无任何学生资料===\n");
        use=0;
        return;
    }
    else
    {
        while(strcmp(posNode->data.id,id))
        {
            posNodeFront=posNode;
            posNode=posNodeFront->next;
            if(posNode==NULL)
            {
                printf("\n没有找到相关信息,无法删除\n\n");
                use=1;
                return;
            }
        }
        posNodeFront->next=posNode->next;
        free(posNode);
        printf("以上信息已删除!\n");
    }
}
///打印表
void printList(struct Node*list)
{
    struct Node*pMove=list->next;
    printf("id\tname\tmath  english\ttotal\tavar\n");
    while(pMove)
    {
        analyAll++;
        printf("%s\t%s\t%d\t%d\t%d\t%d\n",
                pMove->data.id,
                pMove->data.name,
                pMove->data.math,
                pMove->data.english,
                pMove->data.total,
                pMove->data.avar);
        pMove=pMove->next;
    }
    printf("\n");
}
void printPoslist(struct Node*list,int n,int m)
{

    struct Node*pMove=list->next;
    printf("id\tname\tmath  english\ttotal\tavar\n");
    while(pMove)
    {
        if(pMove->data.avar>=n&&pMove->data.avar<=m)
            {
                analy++;
                printf("%s\t%s\t%d\t%d\t%d\t%d\n",
                    pMove->data.id,
                    pMove->data.name,
                    pMove->data.math,
                    pMove->data.english,
                    pMove->data.total,
                    pMove->data.avar);
            }
        pMove=pMove->next;
     }
    printf("\n");
}
///查找表
struct Node*find(struct Node*list,char*id)
{
    struct Node *pMove=list->next;
    while(pMove!=NULL&&strcmp(pMove->data.id,id))
    {
        pMove=pMove->next;
    }
    return pMove;
};
///排序
struct Node *Sort(struct Node *list)
{
    int i=1;
    struct Node *q, *s, *pre ,*p;
    p=list->next;
    q=p->next;
    p->next=NULL;
    while(q)
    {
        s=q;
        q=q->next;
        pre=list;
        p=list->next;
        while(p!=NULL && p->data.total > s->data.total)
        {
            pre=p;
            p=p->next;
        }
        s->next=p;
        pre->next=s;
    }
    return list;
}
///存表于文件
void savefile(struct Node*list,char*filename)
{
    FILE*fp=fopen("d:\\111.txt","w");
    struct Node*pMove=list->next;
    while(pMove)
    {
        fprintf(fp," %s    %5s      %3d     %3d      %3d     %3d\n",
                            pMove->data.id,
                            pMove->data.name,
                            pMove->data.math,
                            pMove->data.english,
                            pMove->data.total,
                            pMove->data.avar);
        pMove=pMove->next;
    }
    fclose(fp);
}
///读表于文件
void readfile(struct Node*list,char*filename)
{
    FILE*fp=fopen("d:\\111.txt","r");
    if(fp==NULL)
    {
        fp=fopen(filename,"a");
    }
    struct student info;
    while(fscanf(fp,"%s%s%d%d%d%d",
            info.id,info.name,
            &info.math,
            &info.english,
            &info.total,
            &info.avar)!=EOF)
    {
        insertNodeByend(list,info);
    }
    fclose(fp);
}
///界面
void jiemian()
{

    printf("==============学生管理系统============\n");
    printf("|     0.        退出系统             |\n");
    printf("--------------------------------------\n");
    printf("|     1.      录入学生资料           |\n");
    printf("--------------------------------------\n");
    printf("|     2.      修改学生资料           |\n");
    printf("--------------------------------------\n");
    printf("|     3.      查找学生资料           |\n");
    printf("--------------------------------------\n");
    printf("|     4.    查看所有学生资料         |\n");
    printf("--------------------------------------\n");
    printf("|     5.  查看某分数范围学生资料     |\n");
    printf("--------------------------------------\n");
    printf("|     6.      学生成绩分析           |\n");
    printf("--------------------------------------\n");
    printf("|     7.          编者               |\n");
    printf("======================================\n");
}
///键入
void keydown(struct Node*list)
{
    int aly;
    char choice,j,n;
    struct student info;
    //scanf("%d",&choice);
    choice=getch();
    system("cls");
    switch(choice)
    {
    case '0':
        skip=1;
        printf("正在退出.....");
        Sleep(500);
        system("cls");
        printf("文件数据自动保存.....");
        Sleep(800);
        system("cls");
        printf("退出成功!");
        break;
    case '1':
        printf("==请问您要输入几个学生的资料(输入0退出)==\n");
        while(scanf("%d",&n)){
        if(n<0)
            {printf("输入错误,请重新输入\n");
            continue;}
        else if(n==0){break;}

        system("cls");
        printf("=============录入学生资料=============\n\n");
        printf("==========请输入%d个学生资料==========\n\n学号 姓名 数学 英语\n",n);
        while(scanf("%s%s%d%d",info.id,info.name,&info.math,&info.english))
        {
            if(find(list,info.id)==NULL)
            {
                info.total=info.math+info.english;
                info.avar=info.total/2;
                insertNodeByend(list,info);
                if(!--n)
                    break;
            }
            else
            {
                printf("\n               <|TIP|>\n<该学生id已存在,输入有误,请重新输入>\n");
                continue;
            }
        }
        printf("=====<|录入成功|>=====\n");
        Sleep(500);
        break;
        }
        break;
    case '2':
        printf("=============修改学生资料=============\n");
        printf("请输入1,2,3\n1.删除学生记录\n2.修改学生记录\n3.退出\n");
        while(1)
        {
            j=getch();
            if(j!='1'&&j!='2'&&j!='3')
            {
                printf("输入错误,请重新输入\n");
                continue;
            }
            system("cls");
            if(j=='1')
            {
                printf("请输入学号\n");
                scanf("%s",info.id);
                deleteNodeByAppoin(list,info.id);
                system("pause");
                break;
            }
            else if(j=='2')
            {
                printf("请输入学号\n");
                scanf("%s",info.id);
                system("cls");
                printf("学号为 %s 的学生的资料为:\n",info.id);
                if(find(list,info.id)!=NULL)
                {
                        printf("学号    姓名     数学     英语     总分     平均分\n");
                        printf(" %s    %4s      %3d     %4d      %3d     %4d\n",
                                        find(list,info.id)->data.id,
                                        find(list,info.id)->data.name,
                                        find(list,info.id)->data.math,
                                        find(list,info.id)->data.english,
                                        find(list,info.id)->data.total,
                                        find(list,info.id)->data.avar);
                }
                deleteNodeByAppoin(list,info.id);
                if(use==0)
                    {
                        printf("\n请输入学生的新资料\n\n学号      姓名      数学     英语\n",n);
                        scanf("%s%s%d%d",info.id,info.name,&info.math,&info.english);
                        info.total=info.math+info.english;
                        info.avar=info.total/2;
                        insertNodeByend(list,info);
                        printf("\n");
                    }
                system("pause");
                break;
            }
            else if(j=='3')
            {
                break;
            }
            else
            {
                printf("输入无效,请重新输入\n");
                continue;
            }
        }
        break;
    case '3':
        printf("请输入学号\n");
        scanf("%s",info.id);
        system("cls");
            printf("================学号为%s的学生信息================\n",info.id);
        if(find(list,info.id)!=NULL)
        {
            printf("学号    姓名     数学     英语     总分     平均分\n");
            printf(" %s    %4s      %3d     %4d      %3d     %4d\n",
                        find(list,info.id)->data.id,
                        find(list,info.id)->data.name,
                        find(list,info.id)->data.math,
                        find(list,info.id)->data.english,
                        find(list,info.id)->data.total,
                        find(list,info.id)->data.avar);
        }
        else
            printf("\n       未找到该学生信息\n");
        printf("\n");
        system("pause");
        break;
    case '4':
        printf("=================学生资料=================\n");
        if(list->next==NULL)
        printf("==================无信息==================\n");
        else
        {
            Sort(list);
            printList(list);
        }
        system("pause");
        break;
    case '5':
        Sort(list);
        printf("=============查看指定分数学生资料=============\n");
        printf("请输入两个0~100以内的数表示平均数  a->b 的范围\n ");
        while(scanf("%d%d",&n,&j)){
        if(n<=100&&n>=0&&j<=100&&j>=0)
        {
            system("cls");
            printf("====平均分数段为%d~%d的学生资料====\n",n,j);
            printPoslist(list,n,j);
            break;
        }
        else
            {
                system("cls");
                printf("输入错误,请重新输入\n");
                continue;
            }
        }
        system("pause");
        break;
    case '6':
        printf("======================================\n");
        printPoslist(list,0,59);
        printf("以上 %d 位同学不及格!\n\n",analy);
        printf("======================================\n");
        aly=analy;
        analy=0;
        printPoslist(list,60,79);
        printf("以上 %d 位同学处于中上水准,还需努力\n\n",analy);
        printf("======================================\n");
        analy=0;
        printPoslist(list,80,100);
        printf("以上 %d 位同学考的不错,争取更进一步\n\n",analy);
        printf("======================================\n");
        system("pause");
        system("cls");
        printf("============================================\n");
        if(aly>analyAll/5)
        {
            printf("  总体而言有太多的同学不及格,需要整改!!!\n");
        }
        else if(aly<=analyAll/5&&aly>=analyAll/10)
        {
            printf("   总体而言要加强学生的学习效率,提高成绩\n");
        }
        else
        {
            printf("     总体而言成绩还不错,争取更进一步!\n");
        }
        printf("=============================================\n");
        system("pause");
        system("cls");
        break;
    case '7':
        printf("QAQ 制作者 3181905124 \n");
        system("pause");
        break;
    default:
        printf("输入无效\n");
        system("pause");
        break;
    }
}
///登陆以及不完整的注册
int login()
{
    int zhan_num=1;
    int p=1;
    char link;
    memset(zhan,0,sizeof(zhan[0]));
    memset(mima,0,sizeof(zhan[0]));
    printf(" |===  1.登陆  ===|\n");
    printf(" |===  2.注册  ===|\n");
    printf("|==请注册完再登陆==|");
    link=getch();
    system("cls");
    if(link=='1')
    {
        printf("|===  账号 : ===|");
        scanf("%s",zhan[0]);
        printf("\n");
        printf("|===  密码 : ===|");
        scanf("%s",mima[0]);
        system("cls");
        if(strcmp(zhan[0],zhan[1])==0&&strcmp(mima[0],mima[1])==0)
        {
            printf("登陆中.....");
            Sleep(800);
            system("cls");
            return 1;
        }
        else
        {
            printf("登陆中.....\n");
            Sleep(500);
            system("cls");
            printf("登录失败,密码或账号错误\n");
            Sleep(1000);
            system("cls");
            return 0;
        }
    }
    else if(link=='2')
    {
        printf("|===  新账号 : ===|");
        scanf("%s",zhan[1]);
        printf("|===  新密码 : ===|");
        scanf("%s",mima[1]);
        system("cls");
        printf("正在录入....\n");
        Sleep(800);
        printf("录入成功!");
        Sleep(500);
        system("cls");
        return 0;
    }
    else
    {
        printf("即将退出系统\n");
        Sleep(500);
        system("cls");
        printf("正在退出.....");
        Sleep(500);
        system("cls");
        printf("文件数据自动保存.....");
        Sleep(800);
        system("cls");
        printf("退出成功!");
        exit(1);
    }
}
int main()
{
    int logi;
    system("color 0");
    system("color 70");
    MessageBox(NULL,"欢迎进入学生管理系统","学生管理系统",0);
    struct Node*list=creatList();
    readfile(list,"d:\\111.txt");
    do
    {
        logi=0;
        login();
        logi=login();
        if(logi==0)
            continue;
        else
            break;
    }while(1);
    while(1)
    {
        if(skip==1)
            break;
        system("cls");
        jiemian();
        keydown(list);
    }
    savefile(list,"d:\\111.txt");
    return 0;
}

 

  • 12
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
以下是一个简单的C语言学生管理系统文件示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_STUDENT 100 // 定义最大学生数量 struct Student { char name[20]; // 学生姓名 int age; // 学生年龄 int score; // 学生成绩 }; struct Student students[MAX_STUDENT]; // 定义学生数组 int count = 0; // 学生数量 // 添加学生 void add_student() { if (count >= MAX_STUDENT) { printf("学生数量已满!\n"); return; } struct Student student; printf("请输入学生姓名:"); scanf("%s", student.name); printf("请输入学生年龄:"); scanf("%d", &student.age); printf("请输入学生成绩:"); scanf("%d", &student.score); students[count++] = student; printf("添加成功!\n"); } // 删除学生 void delete_student() { if (count == 0) { printf("没有学生可删除!\n"); return; } char name[20]; printf("请输入要删除的学生姓名:"); scanf("%s", name); int i, j; for (i = 0; i < count; i++) { if (strcmp(students[i].name, name) == 0) { for (j = i; j < count - 1; j++) { students[j] = students[j + 1]; } count--; printf("删除成功!\n"); return; } } printf("未找到该学生!\n"); } // 修改学生信息 void modify_student() { if (count == 0) { printf("没有学生可修改!\n"); return; } char name[20]; printf("请输入要修改的学生姓名:"); scanf("%s", name); int i, choice; for (i = 0; i < count; i++) { if (strcmp(students[i].name, name) == 0) { printf("请输入要修改的信息:\n"); printf("1.姓名 2.年龄 3.成绩\n"); scanf("%d", &choice); switch (choice) { case 1: printf("请输入新的姓名:"); scanf("%s", students[i].name); break; case 2: printf("请输入新的年龄:"); scanf("%d", &students[i].age); break; case 3: printf("请输入新的成绩:"); scanf("%d", &students[i].score); break; default: printf("输入错误!\n"); return; } printf("修改成功!\n"); return; } } printf("未找到该学生!\n"); } // 查询学生信息 void query_student() { if (count == 0) { printf("没有学生可查询!\n"); return; } char name[20]; printf("请输入要查询的学生姓名:"); scanf("%s", name); int i; for (i = 0; i < count; i++) { if (strcmp(students[i].name, name) == 0) { printf("姓名:%s 年龄:%d 成绩:%d\n", students[i].name, students[i].age, students[i].score); return; } } printf("未找到该学生!\n"); } // 显示所有学生信息 void display_students() { if (count == 0) { printf("没有学生信息!\n"); return; } printf("所有学生信息:\n"); int i; for (i = 0; i < count; i++) { printf("姓名:%s 年龄:%d 成绩:%d\n", students[i].name, students[i].age, students[i].score); } } int main() { while (1) { printf("1.添加学生 2.删除学生 3.修改学生信息 4.查询学生信息 5.显示所有学生信息 0.退出\n"); int choice; scanf("%d", &choice); switch (choice) { case 1: add_student(); break; case 2: delete_student(); break; case 3: modify_student(); break; case 4: query_student(); break; case 5: display_students(); break; case 0: printf("谢谢使用!\n"); exit(0); default: printf("输入错误!\n"); break; } } return 0; } ``` 该示例代码实现了以下功能: 1. 添加学生信息 2. 删除学生信息 3. 修改学生信息 4. 查询学生信息 5. 显示所有学生信息 学生信息存储在一个结构体数组中,可以根据学生姓名、年龄、成绩进行查询、修改和删除。用户可以通过菜单选择需要的操作,程序会执行相应的函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小灰灰_CYH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值