首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >源码 | 学生信息管理系统(C语言 单链表实现)

源码 | 学生信息管理系统(C语言 单链表实现)

作者头像
C语言中文社区
发布于 2022-05-31 01:23:45
发布于 2022-05-31 01:23:45
1.6K00
代码可运行
举报
文章被收录于专栏:C语言中文社区C语言中文社区
运行总次数:0
代码可运行

运行效果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
D:\wangc\CLionProjects\test1212\cmake-build-debug\test1212.exe

                                                【学生管理系统2.0】
                ★————————————————————————————————————————★

                           | 1. 信息录入                2. 成绩录入             3. 信息查询  |

                           | 4. 成绩查询                5. 删除信息             6. 信息追加  |

                           | 7. 更改分数                8. 查看排名             9. 成绩分段  |

                           | 10.保存文件                11.文件输出             12.文件导入  |

                ★————————————————按0并回车退出——————————————————★
请输入执行数字:1
*****************************************************信息录入***********************************************************
依次键入学号、姓名、性别、宿舍号码、电话号码,用一个【空格】隔开各数据,每一条输入完成后按回车键进行下一条输入。
                                             【退出请输入'0'并回车】

样例:
541913460230 张三 男 1717 66666
在此输入:
1001 张三丰 男 521 888888
1001 张三丰 男 521 888888

1002 李四 男 522 555555
1002 李四 男 522 555555


0
0
请输入执行数字:3
请在此输入:1002
1002
输入了错误的第一次选择数字!重新输入:
3
3
输入了错误的第一次选择数字!重新输入:
0
0
输入了错误的第一次选择数字!重新输入:
1
1
通过学号(输入1),姓名(输入2):1
1

输入学号(输入0并回车结束):1001
1001
学号:1001 姓名:张三丰 性别:男 宿舍号码:521 电话号码:888888

输入学号(输入0并回车结束):

源码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<stdlib.h>
#define LEN sizeof(struct student)
struct student
{
    char num[20];//学号
    char name[20];//姓名
    char sex[20];//性别
    char room[20];//宿舍号码
    char tel[20];//电话号码

    char CHN[20];//语文
    char MATH[20];//数学
    char ENG[20];//英语
    char PE[20];//体育
    char PRO[20];//专业
    char average_score[20];//平均分

    struct student *next;
};
int n;//节点数

struct student *creat();//信息录入
void score(struct student *head);//成绩录入
void findinformation(struct student *head);//信息查询
void findscore(struct student *head);//成绩查询
struct student *del(struct student *head);//信息删除
struct student *insert(struct student *head);//信息插入
void update(struct student *head);//修改分数
void Oscore(struct student*head);//排序输出
void swap(struct student*p1,struct student*p2);//交换数据
void fenduan(struct student*head);//分段输出
int checknum(char ch[]);//检查纯数字的数据里是否混入了非数字的非法输入
int transformint(char ch[]);//纯数字整数(字符串转向int类型)
void save(struct student *head); //文件存储
void export1();//文件输出
struct student *import();//文件导入
int checkscore(char ch[]);//检查分数是否为0-99的纯数字
int IncludeChinese(char *str); //检查性名、性别是否包含汉字
int main()
{
    //微信关注公众号:C语言中文社区,免费领取更多
    struct student *head=NULL;
    char choose[20];
    menu://设置主菜单的点
    printf("\n");
    printf("\t\t\t\t\t\t【学生管理系统2.0】\t\t\t\t\t\n");
    printf("\t\t★————————————————————————————————————————★\n\n");
    printf("\t\t\t   | 1. 信息录入\t\t2. 成绩录入\t\t3. 信息查询  |\n\n");
    printf("\t\t\t   | 4. 成绩查询\t\t5. 删除信息\t\t6. 信息追加  |\n\n");
    printf("\t\t\t   | 7. 更改分数\t\t8. 查看排名\t\t9. 成绩分段  |\n\n");
    printf("\t\t\t   | 10.保存文件\t\t11.文件输出\t\t12.文件导入  |\n\n");
    printf("\t\t★————————————————按0并回车退出——————————————————★\n");
    printf("请输入执行数字:");
    while(scanf("%s",choose)&&checknum(choose)==0)//检查到不是纯数字 让用户重新输入
    {
        printf("输入无效,重新输入:");
    }
    switch(transformint(choose))
    {
        case 1:
            head=creat();
            break;
        case 2:
            score(head);
            break;
        case 3:
            findinformation(head);
            break;
        case 4:
            findscore(head);
            break;
        case 5:
            head=del(head);
            break;
        case 6:
            head=insert(head);
            break;
        case 7:
            update(head);
            break;
        case 8:
            Oscore(head);
            break;
        case 9:
            fenduan(head);
            break;
        case 10:
            save(head);
            break;
        case 11:
            export1();
            break;
        case 12:
            head=import();
            break;
    }
    if(transformint(choose)<0||transformint(choose)>12)//输入了不在执行数字范围内的数字返回主菜单的点
    {
        system("cls");//清理屏幕和缓冲区
        fflush(stdin);
        goto menu;
    }
    if(transformint(choose)!=0)//输入不是0,继续回到主菜单
    {
        goto menu;
    }
    system("cls");//结束时清理屏幕和缓冲区,打印下方的校徽
    fflush(stdin);
    printf("\n感谢使用!\n");
    printf("\n                                                     *\n");
    printf("                                                *  ***  ****\n");
    printf("                                              *** **** ****\n");
    printf("                                             **** **** **** ****\n");
    printf("                                             **** **** **** ****\n");
    printf("                                             **** **** **** ****\n");
    printf("                                             **** **** **** ****\n");
    printf("                                             **** **** **** ****\n");
    printf("                                              **** ******* ****\n");
    printf("                                                *************\n");
    printf("                                                    *****\n");
    system("pause");
    return 0;
}

struct student *creat()//录入信息,创建链表
{
    system("cls");
    fflush(stdin);
    printf("*****************************************************信息录入***********************************************************\n");
    printf("依次键入学号、姓名、性别、宿舍号码、电话号码,用一个【空格】隔开各数据,每一条输入完成后按回车键进行下一条输入。         \n");
    printf("                                             【退出请输入'0'并回车】                                                     \n");
    printf("样例:\n541913460230 张三 男 1717 66666\n在此输入:\n");
    n=0;
    struct student *head,*p1,*p2;
    head = NULL;
    p1=p2=(struct student*)malloc(LEN);

    while(scanf("%s",p1->num)&&checknum(p1->num)==0)
    {
        printf("输入错误的学号,重新输入:\n");
    }
    if(transformint(p1->num)==0)//输入了0退出函数调用,传回去表头指针head给主函数的head
    {
        system("cls");
        fflush(stdin);
        return(head);
    }
    while(scanf("%s",p1->name)&&IncludeChinese(p1->name)==0)//这几行while(scanf)都是具有容错的输入,整个程序中都存在输入容错!!!
    {
        printf("输入错误的名字,重新输入:\n");
    }
    while(scanf("%s",p1->sex)&&IncludeChinese(p1->sex)==0)
    {
        printf("输入错误的性别,重新输入:\n");
    }
    while(scanf("%s",p1->room)&&checknum(p1->room)==0)
    {
        printf("输入错误的宿舍号码,重新输入:\n");
    }
    while(scanf("%s",p1->tel)&&checknum(p1->tel)==0)
    {
        printf("输入错误的手机号码,重新输入:\n");
    }
    printf("\n");
    while(transformint(p1->num)!=0)//输入每个节点的学号不是0的时候开始循环。
    {
        n+=1;//节点+1
        if(n==1)    //PS:此处为建立链表常规过程(参考了谭浩强C程序设计第九章链表,红皮那本)
        {
            head=p1;//第一个节点 表头指向上面开辟的第一个节点 p1 p2 head都指向此处此时
        }else
        {
            p2->next=p1;//后面的节点,p2的next指向p1将两个节点连接到一起
            p2=p1;//p2再跟p1
        }
        p1=(struct student*)malloc(LEN);//p1指向开辟的新节点
        while(scanf("%s",p1->num)&&checknum(p1->num)==0)
        {
            printf("输入错误的学号,重新输入:\n");
        }
        if(transformint(p1->num)==0)
        {
            break;
        }
        while(scanf("%s",p1->name)&&IncludeChinese(p1->name)==0)
        {
            printf("输入错误的名字,重新输入:\n");
        }
        while(scanf("%s",p1->sex)&&IncludeChinese(p1->sex)==0)
        {
            printf("输入错误的性别,重新输入:\n");
        }
        while(scanf("%s",p1->room)&&checknum(p1->room)==0)
        {
            printf("输入错误的宿舍号码,重新输入:\n");
        }
        while(scanf("%s",p1->tel)&&checknum(p1->tel)==0)
        {
            printf("输入错误的手机号码,重新输入:\n");
        }
        printf("\n\n");
    }
    p2->next=NULL;//最后p1开辟的新节点丢弃了,让p2的next指向空,形成表尾结束链表。 录入结束
    system("cls");
    fflush(stdin);
    return(head);
}

void score(struct student *head)//拿到链表,录入成绩
{
    system("cls");
    fflush(stdin);
    printf("*****************************************************成绩录入***********************************************************\n");
    printf("依次键入语文、数学、英语、体育、专业成绩,用一个空格隔开各数据,每一条输入完成后按回车键进行下一条输入。\n");
    printf("                                              【录完分数后自动退出】                                                      \n");
    printf("例如:\n10 20 30 40 50\n在此输入:\n");

    int Aver;//平均分
    struct student *p;
    for(p=head;p!=NULL;p=p->next)//遍历链表
    {
        printf("\n现在录入%s(%s)的成绩\n",p->name,p->num);
        while(scanf("%s",p->CHN)&&checkscore(p->CHN)==0)
        {
            printf("输入错误的语文分数,重新输入:\n");
        }
        while(scanf("%s",p->MATH)&&checkscore(p->MATH)==0)
        {
            printf("输入错误的数学分数,重新输入:\n");
        }
        while(scanf("%s",p->ENG)&&checkscore(p->ENG)==0)
        {
            printf("输入错误的英语分数,重新输入:\n");
        }
        while(scanf("%s",p->PE)&&checkscore(p->PE)==0)
        {
            printf("输入错误的体育分数,重新输入:\n");
        }
        while(scanf("%s",p->PRO)&&checkscore(p->PRO)==0)
        {
            printf("输入错误的专业分数,重新输入:\n");
        }
        Aver=(transformint(p->CHN)+transformint(p->MATH)+transformint(p->ENG)+transformint(p->PE)+transformint(p->PRO))/5;
        itoa(Aver,p->average_score,10);//Aver十进制形式转化为字符串存储在链表的average_score平均分里
        printf("%s的成绩录入完了\n",p->name);
    }
    system("cls");
    fflush(stdin);
}

void findinformation(struct student *head)//学生信息查询
{
    system("cls");
    fflush(stdin);
    char choose1[20],choose2[20];//两个选择的地方,choose1选择学号/姓名 or 宿舍号 ,choose2在选择了学号/姓名时选择 学号 or 姓名
    char num[20]={'1'};//用户即将输入的学号
    char name[20];//用户即将输入的姓名
    char room[20]={'1'};//用户即将输入的宿舍号
    struct student *p;
    p=head;
    int flag=0;
    printf("*****************************************************信息查询***********************************************************\n");
    printf("\n选择查找方式,学号/姓名查找(输入1),宿舍号(输入2)\n请在此输入:");
    choosestation1://第一次选择的点
    fflush(stdin);
    while(scanf("%s",choose1)&&checknum(choose1)==0)
    {
        printf("输入无效,重新输入:\n");
    }
    if(transformint(choose1)==1)
    {
        printf("通过学号(输入1),姓名(输入2):");
        choosestation2://第二次选择的点
        fflush(stdin);
        while(scanf("%s",choose2)&&checknum(choose2)==0)
        {
            printf("输入无效,重新输入:\n");
        }
        if(transformint(choose2)==1)
        {
            while(transformint(num)!=0)
            {
                printf("\n输入学号(输入0并回车结束):");
                while(scanf("%s",num)&&checknum(num)==0)
                {
                    printf("输入错误的学号,重新输入:\n");
                }
                for(p=head;p!=NULL;p=p->next)
                {
                    if(transformint(p->num)==transformint(num))
                    {
                        printf("学号:%s 姓名:%s 性别:%s 宿舍号码:%s 电话号码:%s\n",p->num,p->name,p->sex,p->room,p->tel);
                        flag=1;
                        break;
                    }
                }
                if(flag==0&&transformint(num)!=0)
                {
                    printf("未找到此学生信息\n");
                }
            }
        }else if(transformint(choose2)==2)
        {
            while(name[0]!='#')
            {
                printf("\n输入姓名(输入#并回车结束):");
                scanf("%s",name);
                for(p=head;p!=NULL;p=p->next)//遍历链表
                {
                    if(strcmp(p->name,name)==0)//比较两字符串
                    {
                        printf("学号:%s 姓名:%s 性别:%s 宿舍号码:%s 电话号码:%s\n",p->num,p->name,p->sex,p->room,p->tel);
                        flag=1;
                        break;
                    }
                }
                if(flag==0&&name[0]!='#')
                {
                    printf("未找到此学生信息!\n");
                }
            }
        }else
        {
            printf("输入了错误的第二次选择数字!重新输入:\n");
            goto choosestation2;//返回上面第二次选择的点
        }
    }else if(transformint(choose1)==2)
    {
        while(transformint(room)!=0)
        {
            printf("\n输入宿舍号(输入0并回车结束):");
            while(scanf("%s",room)&&checknum(room)==0)
            {
                printf("输入错误的宿舍号码,重新输入:\n");
            }
            for(p=head;p!=NULL;p=p->next)
            {
                if(p->room==room)
                {
                    printf("学号:%s 姓名:%s 性别:%s 宿舍号码:%s 电话号码:%s\n",p->num,p->name,p->sex,p->room,p->tel);
                    flag=1;
                    break;
                }
            }
            if(flag==0&&transformint(room)!=0)
            {
                printf("未找到此学生信息!\n");
            }
        }
    }else
    {
        printf("输入了错误的第一次选择数字!重新输入:\n");
        goto choosestation1;//返回最上面第一次选择的点
    }
    system("cls");
    fflush(stdin);
}

void findscore(struct student *head)//成绩查询
{
    system("cls");
    fflush(stdin);
    char num[20]={'1'};//初始化用户即将输入的学号
    struct student *p;
    int flag=0;//学号是否找到的标志,1找到0没找到
    p=head;
    printf("*****************************************************成绩查询***********************************************************\n");
    printf("因为有重名的可能,暂时只能通过学号进行查询。请输入学号并回车进行查询!\n");
    printf("                                               【退出请输入'0'并回车】                                                    \n");
    while(transformint(num)!=0)
    {
        printf("\n输入学号:");
        while(scanf("%s",num)&&checknum(num)==0)
        {
            printf("输入错误的学号,重新输入:\n");
        }
        for(p=head;p!=NULL;p=p->next)
        {
            if(transformint(p->num)==transformint(num))
            {
                printf("学号:%s 姓名:%s 语文:%s 数学:%s 英语:%s 体育:%s 专业:%s \n",p->num,p->name,p->CHN,p->MATH,p->ENG,p->PE,p->PRO);
                flag=1;
                break;
            }
        }
        if(flag==0)
        {
            printf("学号未找到!\n");
        }
    }
    system("cls");
    fflush(stdin);
}

struct student *del(struct student *head)//删除信息函数
{
    system("cls");
    fflush(stdin);
    char num[20]={'1'};//用户即将输入的学号
    struct student *p1,*p2;
    printf("*****************************************************信息删除***********************************************************\n");
    if(head == NULL)
    {
        system("cls");
        fflush(stdin);
        return(head);
    }
    printf("\n***************************************输入学号进行删除学生信息(输入0结束)**********************************************\n");
    do{
        printf("\n请输入学号:");
        while(scanf("%s",num)&&checknum(num)==0)
        {
            printf("输入错误的学号,重新输入:\n");
        }
        if(transformint(num)==0)
        {
            break;
        }
        p1=p2=head;
        while(transformint(num)!=transformint(p1->num)&&p1->next!=NULL)
        {
            p2=p1;
            p1=p1->next;
        }
        if(transformint(num)==transformint(p1->num))//找到数字
        {
            if(p1==head)//如果是要删开头的节点,直接改变表头指向第二个节点,让第二个节点成为新的表头,原来的头用free释放掉
            {
                head=p1->next;
                free(p1);
            }else//如果删后面的节点,要把p2连到p1所在节点后面的一个节点,将p1所在节点free释放掉
            {
                p2->next=p1->next;
                free(p1);
            }
            printf("已删除学号为%s的信息",num);
            n=n-1;
        }else
        {
            printf("没有找到学号为%s的学生\n",num);
        }
    }while(transformint(num)!=0);
    system("cls");
    fflush(stdin);
    return(head);
}

struct student *insert(struct student *head)//插入信息函数
{
    system("cls");
    fflush(stdin);
    printf("*****************************************************信息追加***********************************************************\n");
    printf("                                            【加入一组信息后自动退出】                                                  \n");
    printf("请按照 学号 姓名 性别 宿舍号码 电话号码 语文 数学 英语 体育 专业 顺序输入\n");
    printf("样例:\n542013460658 李四 男 1206 10086 10 20 30 40 50\n");
    int Aver;
    struct student *stud=(struct student*)malloc(LEN);//开辟一个单元,这一块存我们追加的信息,后面的操作把这一块连接到链表的表头
    stud->next=NULL;
    stud->next=head;
    head=stud;
    while(scanf("%s",stud->num)&&checknum(stud->num)==0)
    {
        printf("输入错误的学号,重新输入:\n");
    }
    while(scanf("%s",stud->name)&&IncludeChinese(stud->name)==0)
    {
        printf("输入错误的名字,重新输入:\n");
    }
    while(scanf("%s",stud->sex)&&IncludeChinese(stud->sex)==0)
    {
        printf("输入错误的性别,重新输入:\n");
    }
    while(scanf("%s",stud->room)&&checknum(stud->room)==0)
    {
        printf("输入错误的宿舍号码,重新输入:\n");
    }
    while(scanf("%s",stud->tel)&&checknum(stud->tel)==0)
    {
        printf("输入错误的电话号码,重新输入:\n");
    }
    while(scanf("%s",stud->CHN)&&checkscore(stud->CHN)==0)
    {
        printf("输入错误的语文分数,重新输入:\n");
    }
    while(scanf("%s",stud->MATH)&&checkscore(stud->MATH)==0)
    {
        printf("输入错误的数学分数,重新输入:\n");
    }
    while(scanf("%s",stud->ENG)&&checkscore(stud->ENG)==0)
    {
        printf("输入错误的英语分数,重新输入:\n");
    }
    while(scanf("%s",stud->PE)&&checkscore(stud->PE)==0)
    {
        printf("输入错误的体育分数,重新输入:\n");
    }
    while(scanf("%s",stud->PRO)&&checkscore(stud->PRO)==0)
    {
        printf("输入错误的专业分数,重新输入:\n");
    }
    Aver=(transformint(stud->CHN)+transformint(stud->MATH)+transformint(stud->ENG)+transformint(stud->PE)+transformint(stud->PRO))/5;//计算平均分
    itoa(Aver,stud->average_score,10);
    n=n+1; //节点+1
    system("cls");
    fflush(stdin);
    return(head);
}

void update(struct student *head)//修改分数
{
    system("cls");
    fflush(stdin);
    int Aver;
    struct student *p1,*p2;
    char num[20]={'1'};//用户即将输入的学号
    char choose[20];
    printf("*****************************************************分数修改***********************************************************\n");
    if(head == NULL)//没有录信息 空表直接返回
    {
        system("cls");
        fflush(stdin);
        return;
    }
    printf("\n***************************************输入学号进行修改学生分数(输入0结束)**********************************************\n");
    do{
        printf("\n请输入学号:");
        while(scanf("%s",num)&&checknum(num)==0)
        {
            printf("输入错误的学号,重新输入:\n");
        }
        if(transformint(num)==0)
        {
            break;
        }
        p1=p2=head;
        while(transformint(p1->num)!=transformint(num)&&p1->next!=NULL)//没找到,往后走
        {
            p2=p1;
            p1=p1->next;
        }
        if(transformint(p1->num)==transformint(num))//找到了,开始选修改的科目
        {
            printf("修改语文请输入1,数学输入2,英语3,体育4,专业5\n");
            printf("请输入修改科目对应的数字:");
            while(scanf("%s",choose)&&checknum(choose)==0||transformint(choose)<1||transformint(choose)>5)
            {
                printf("输入无效的编号,重新输入:\n");
            }
            printf("请输入修改后的分数:");
            switch(transformint(choose))
            {
                case 1:
                    while(scanf("%s",p1->CHN)&&checknum(p1->CHN)==0)
                    {
                        printf("输入错误的语文分数,重新输入:\n");
                    }
                    break;
                case 2:
                    while(scanf("%s",p1->MATH)&&checknum(p1->MATH)==0)
                    {
                        printf("输入错误的数学分数,重新输入:\n");
                    }
                    break;
                case 3:
                    while(scanf("%s",p1->ENG)&&checknum(p1->ENG)==0)
                    {
                        printf("输入错误的英语分数,重新输入:\n");
                    }
                    break;
                case 4:
                    while(scanf("%s",p1->PE)&&checknum(p1->PE)==0)
                    {
                        printf("输入错误的体育分数,重新输入:\n");
                    }
                    break;
                case 5:
                    while(scanf("%s",p1->PRO)&&checknum(p1->PRO)==0)
                    {
                        printf("输入错误的专业分数,重新输入:\n");
                    }
                    break;
            }
            Aver=(transformint(p1->CHN)+transformint(p1->MATH)+transformint(p1->ENG)+transformint(p1->PE)+transformint(p1->PRO))/5;
            itoa(Aver,p1->average_score,10);//平均分转换字符串形式
        }else
        {
            printf("没有找到学号为%s的学生\n",num);
        }
    }while(transformint(num)!=0);
    system("cls");
    fflush(stdin);
}

void Oscore(struct student*head)//排序输出
{
    system("cls");
    fflush(stdin);
    printf("*****************************************************查看排名***********************************************************\n");
    int ranking=0;
    struct student *p=NULL,*p1=NULL;
    for(p=head;p!=NULL;p=p->next)
    {
        if(checkscore(p->average_score)==0)
        {
            printf("有同学只录取了信息,没有录成绩。所以无法公布排名\n");
            system("pause");
            system("cls");
            fflush(stdin);
            return;
        }
    }
    for(p=head;p!=NULL;p=p->next)
    {
        for(p1=p->next;p1!=NULL;p1=p1->next)
        {
            if(transformint(p->average_score)<transformint(p1->average_score))
            {
                swap(p,p1);
            }
        }
    }
    printf("学号\t\t姓名\t\t平均分\t\t名次\t语文\t数学\t英语\t体育\t专业\t\n");
    for(p=head;p!=NULL;p=p->next)
    {
        ranking+=1;
        printf("%s\t\t%s\t\t%s\t\t%d\t%s\t%s\t%s\t%s\t%s\t\n",p->num,p->name,p->average_score,ranking,p->CHN,p->MATH,p->ENG,p->PE,p->PRO);
    }
    printf("\n");
    system("pause");
    system("cls");
    fflush(stdin);
}

void swap(struct student*p1,struct student*p2)//交换数据(辅助函数)
{
    char tempCHN[20];
    char tempMATH[20];
    char tempENG[20];
    char tempPE[20];
    char tempPRO[20];
    char tempaverage[20];
    char tempname[20];
    char tempnum[20];

    strcpy(tempnum,p1->num);///
    strcpy(p1->num,p2->num);
    strcpy(p2->num,tempnum);
    strcpy(tempname,p1->name);//
    strcpy(p1->name,p2->name);
    strcpy(p2->name,tempname);
    strcpy(tempCHN,p1->CHN);///
    strcpy(p1->CHN,p2->CHN);
    strcpy(p2->CHN,tempCHN);
    strcpy(tempMATH,p1->MATH);///
    strcpy(p1->MATH,p2->MATH);
    strcpy(p2->MATH,tempMATH);
    strcpy(tempENG,p1->ENG);///
    strcpy(p1->ENG,p2->ENG);
    strcpy(p2->ENG,tempENG);
    strcpy(tempPE,p1->PE);///
    strcpy(p1->PE,p2->PE);
    strcpy(p2->PE,tempPE);
    strcpy(tempPRO,p1->PRO);///
    strcpy(p1->PRO,p2->PRO);
    strcpy(p2->PRO,tempPRO);
    strcpy(tempaverage,p1->average_score);///
    strcpy(p1->average_score,p2->average_score);
    strcpy(p2->average_score,tempaverage);
}

void fenduan(struct student*head)//分段输出
{
    system("cls");
    fflush(stdin);
    printf("*****************************************************成绩分段***********************************************************\n\n");
    struct student *p;
    for(p=head;p!=NULL;p=p->next)
    {
        if(checkscore(p->average_score)==0)
        {
            printf("有同学只录取了信息,没有录成绩。所以无法公布分段\n");
            system("pause");
            system("cls");
            fflush(stdin);
            return;
        }
    }
    printf("********************************************************A***************************************************************\n");
    printf("学号\t\t姓名\t\t平均分\t\t语文\t数学\t英语\t体育\t专业\t\n");
    for(p=head;p!=NULL;p=p->next)
    {
        if(transformint(p->average_score)>=80)
        {
            printf("%s\t\t%s\t\t%s\t\t%s\t%s\t%s\t%s\t%s\t\n",p->num,p->name,p->average_score,p->CHN,p->MATH,p->ENG,p->PE,p->PRO);
        }
    }
    printf("********************************************************B***************************************************************\n");
    printf("学号\t\t姓名\t\t平均分\t\t语文\t数学\t英语\t体育\t专业\t\n");
    for(p=head;p!=NULL;p=p->next)
    {
        if(transformint(p->average_score)<80&&transformint(p->average_score)>=60)
        {
            printf("%s\t\t%s\t\t%s\t\t%s\t%s\t%s\t%s\t%s\t\n",p->num,p->name,p->average_score,p->CHN,p->MATH,p->ENG,p->PE,p->PRO);
        }
    }
    printf("********************************************************C***************************************************************\n");
    printf("学号\t\t姓名\t\t平均分\t\t语文\t数学\t英语\t体育\t专业\t\n");
    for(p=head;p!=NULL;p=p->next)
    {
        if(transformint(p->average_score)<60)
        {
            printf("%s\t\t%s\t\t%s\t\t%s\t%s\t%s\t%s\t%s\t\n",p->num,p->name,p->average_score,p->CHN,p->MATH,p->ENG,p->PE,p->PRO);
        }
    }
    printf("\n");
    system("pause");
    system("cls");
    fflush(stdin);
}



void save(struct student *head)//文件保存
{
    system("cls");
    fflush(stdin);
    FILE *fp;
    struct student *p;
    fp=fopen("stu.db","wb");

    for(p=head;p!=NULL;p=p->next)
    {
        fwrite(p,LEN,1,fp);
    }
    fclose(fp);
    printf("♂♂♂♂保存完毕♂♂♂♂♂\n");
    system("pause");
    system("cls");
    fflush(stdin);
}

void export1()//文件输出
{
    system("cls");
    fflush(stdin);
    FILE *fp;
    struct student *t;
    t=(struct student *)malloc(LEN);
    if((fp=fopen("stu.db","r"))==NULL){
        printf("未找到文件\n");
    }
    else{
        printf("学号\t\t姓名\t\t平均分\t\t语文\t数学\t英语\t体育\t专业\t\n");
        int w;
        fseek(fp,0,2);
        w=ftell(fp);
        fseek(fp,0,0);
        while(w!=ftell(fp)){
            fread(t,LEN,1,fp);
            printf("%s\t\t%s\t\t%s\t\t%s\t%s\t%s\t%s\t%s\t\n",t->num,t->name,t->average_score,t->CHN,t->MATH,t->ENG,t->PE,t->PRO);
        }
        fclose(fp);
    }
    system("pause");
    system("cls");
    fflush(stdin);
}

struct student *import()//文件导入
{
    system("cls");
    fflush(stdin);
    FILE *fp;
    if((fp=fopen("stu.db","r"))==NULL){
        printf("未找到文件\n");
    }
    else{
        struct student *p1,*p2,*head;
        p1=p2=(struct student *)malloc(LEN);
        fread(p1,LEN,1,fp);
        while(!feof(fp)) {//end of file
            n+=1;
            if(n==1){
                head=p1;
            }
            else{
                p2->next=p1;
            }
            p2=p1;
            p1=(struct student *)malloc(LEN);
            fread(p1,LEN,1,fp);
        }
        p2->next=NULL;
        fclose(fp);
        printf("文件导入成功\n");
        system("pause");
        system("cls");
        fflush(stdin);
        return head;
    }
    system("cls");
    fflush(stdin);
    return NULL;
}

int checknum(char ch[])//检查纯数字的数据里是否混入了非数字的非法输入;
{
    int i,flag=1;
    for(i=0;i<strlen(ch);i++)
    {
        if(ch[i]<'0'||ch[i]>'9')
        {
            flag=0;
            break;
        }
    }
    return flag;
}

int checkscore(char ch[])//检查0-99分数
{
    int i,flag=1;
    if(strlen(ch)>=3)
    {
        return 0;
    }
    for(i=0;i<strlen(ch);i++)
    {
        if(ch[i]<'0'||ch[i]>'9')
        {
            flag=0;
            break;
        }
    }
    return flag;
}

int IncludeChinese(char *str)//是否包含中文
{
    char c;
    while(1)
    {
        c=*str++;
        if (c==0) break;  //如果到字符串尾则说明该字符串没有中文字符
        if (c&0x80)        //如果字符高位为1且下一字符高位也是1则有中文字符
            if (*str & 0x80) return 1;
    }
    return 0;
}

int transformint(char ch[])//纯数字整数(字符串转向int类型)
{
    int i=0,sum=0;
    for(i=0;i<strlen(ch);i++)
    {
        sum=sum*10+ch[i]-48;
    }
    return sum;
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 C语言中文社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
c语言学生成绩管理系统(c语言链表实现学生管理系统)
二、目的与要求 每位学生记录包含有学号、姓名、性别、出生日期、三门功课的成绩(高等数学、大学英语、C语言)、总分和平均分 系统菜单: (1)录入学生记录 (2)添加学生记录 (3)删除学生记录 (4)修改学生记录(要求输入密码) (5)查找学生记录(按学号、按姓名) (6)按总分对记录进行降序排列 (7)将当前结果显示或打印,重新保存进数据文件中 (8)输出所有学生信息 (9)计算班级平均分 (10)修改管理员密码(未保存至文件,程序关闭后失效) (11)C语言挂科人数 (0)结束程序
全栈程序员站长
2022/07/25
4.4K0
c语言学生成绩管理系统(c语言链表实现学生管理系统)
C语言实现数独小游戏
C语言控制台数独游戏,注释详细 效果图 #include <stdio.h> #include <stdlib.h> #include <memory.h> #include <math.h> #include <time.h> #include <windows.h> #include <string.h> #include <conio.h> #include <stdarg.h> #include <ctype.h> #define MAX 999 #define MAXN 9 ty
程序员小涛
2022/05/07
2K0
C语言实现数独小游戏
用单链表构建学生信息管理系统(一)
#define Max_studnet 100 //学生数量最大值,可根据情况调节
Reborn Lee
2020/06/29
2.2K0
C语言开发简单的学生成绩管理系统(附源码)
(2)不修改函数,仅仅修改项目的属性。因为fopen_s是一种Microsoft的函数,若纯做Windows开发则直接改为_s也无妨,但是我们尽量还是用标准C++比较好,这样代码有较好的移植性。
全栈程序员站长
2022/08/28
1.4K0
C语言开发简单的学生成绩管理系统(附源码)
C语言课程实训:员工信息管理系统
一家公司不仅应该有管理者,还应该有数量更多的普通员工,一个员工信息管理系统,不仅要有管理员操作的模块还要有员工模块。
十二惊惶
2024/02/28
3510
c语言学生成绩管理系统总结
c语言的大作业,主要功能是录入、修改、删除、插入、排序等,可能有些地方仍然有点bug。
全栈程序员站长
2022/09/06
3.4K0
c语言学生成绩管理系统总结
学生成绩管理系统(C++指针、链表、文件及面向对象的运用)
 学生成绩管理系统 功能页面显示: 实现源码: 1 #include<iostream> 2 #include<fstream> 3 #include<cstring> 4 #includ
泰斗贤若如
2019/06/19
1.6K0
学生成绩管理系统(C++指针、链表、文件及面向对象的运用)
学生信息管理系统(C实现)
头文件 1 #ifndef __SIMS__ 2 #define __SIMS__ 3 #include<stdio.h> 4 #include<stdlib.h> 5 #includ
小爷毛毛_卓寿杰
2019/02/13
3.6K0
学生信息管理系统(C实现)
c语言实现的简单学生管理系统
本文链接:https://blog.csdn.net/sakurakider/article/details/72823662
C语言中文社区
2022/05/30
4770
c语言实现的简单学生管理系统
总结了一些指针易出错的常见问题(五)
指针与链表及其操作 //结构体定义 typedef struct _person{ char* firstname; char* lastname; char* title; unsigned int age; }Person; Person person; //分配内存 Person *ptrPerson; ptrPerson = (Person*) malloc (sizeof(Person));   为结构体分配内存 #include<stdio.h> int ma
互联网金融打杂
2018/04/03
5860
总结了一些指针易出错的常见问题(五)
C语言-学生管理系统
#include <sys/mman.h> #include <fcntl.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define HEAD_INFO "学号\t姓名\t性别\t年龄\t语文\t数学\t英语\t体育\t总分\t平均分\n" #define HEAD_INFO2 "学号\t姓名\t性别\t年龄\t语文\t数学\t英语\t体育\n" // 定义学生信息数据
天天Lotay
2022/12/02
2.7K0
C语言-学生管理系统
年底搞个基于C语言的运动会学生志愿者管理系统
为了迎接某市运动会,请你学习C语言中相关知识,帮助组委会设计一个运动会志愿者信息管理系统,包含以下主要功能(不限于以下):
苏州程序大白
2022/04/13
3030
年底搞个基于C语言的运动会学生志愿者管理系统
C语言学生成绩管理系统详解[通俗易懂]
引言:最近写了C语言的大作业,感觉做得还行,记录一下,给后人一些参考,给自己留更深印象方便后续改进!
全栈程序员站长
2022/07/28
3K0
C语言学生成绩管理系统详解[通俗易懂]
【C语言】链表的使用及链表的实现原理
1.逻辑结构上⼀个挨⼀个的数据,在实际存储时,并没有像顺序表那样也相互紧挨着。恰恰相 反,数据随机分布在内存中的各个位置,这种存储结构称为线性表的链式存储。
大数据小禅
2021/12/20
1.1K0
C语言实现学生成绩管理系统
相关视频——https://www.bilibili.com/video/BV13z4y117qC?p=8 代码实现 #define _CRT_SECURE_NO_WARNINGS 1 #includ
半生瓜的blog
2023/05/12
3630
链表项目实战
链表的基本知识点和基本操作相信各位小伙伴已经能闭上眼睛可以敲出来而且不需要调试一次过,这次呢我们来讲一个案例:学生管理系统,这是我大一C语言课程设计做的,采用单链表,很简单,就是帮大家理一下思路。
石璞东
2020/04/21
6390
链表项目实战
【实现报告】学生信息管理系统(链表实现)
(2) 程序要具有一定的健壮性,即当输入数据非法时,程序也能适当地做出反应,如插入删除时指定的位置不对等等。
走在努力路上的自己
2024/04/02
6090
【实现报告】学生信息管理系统(链表实现)
c语言学生成绩管理系统源码
1.JPG 来源:公众号(c语言与cpp编程) #include "stdio.h" /*标准输入输出函数库*/ #include "stdlib.h" /*标准函数库*/ #include "string.h" /*字符串函数库*/ #include "conio.h" /*屏幕操作函数库*/ #define HEADER1 " ----------------------------STUDENT---------------------------------- \n"
C语言与CPP编程
2020/10/18
4K0
用c语言编写一个学生成绩管理系统_c语言成绩查询系统编程
第一次写这么长的代码,确实挺累的,但收获也不小,但是还有还不够完善,比如密码加密未完成,还有这个系统只能管理一个班级,若要实现多个班级的成绩管理就不嗯呢该完成了…… 最后的最后,这是我的第一篇博客,希望对浏览的人能有所帮助,也希望之后的自己能变得更好,加油!
全栈程序员站长
2022/09/27
5.1K0
用c语言编写一个学生成绩管理系统_c语言成绩查询系统编程
C语言实现一个简单学生信息管理系统
然后呢,增,删,查,改,显示,分别封装为五个函数。其中添加和删除的部分,为了使数据长度随函数内增加和删除的操作改变,传参时除了数组指针,数组的长度也使用指针型传递。
英雄爱吃土豆片
2021/01/21
2K0
推荐阅读
相关推荐
c语言学生成绩管理系统(c语言链表实现学生管理系统)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验