学生管理系统

来源:互联网 发布:搜狗输入法mac版本 编辑:程序博客网 时间:2024/06/07 09:45
/***作者:张迪**版本:V1.3.1**日期:2016.5.3**功能:学生管理系统**      实现添加、修改、删除、显示、比较、查找、退出功能**      熟练运用暂停、清屏、休眠和颜色等函数*/#include <windows.h>#include<stdio.h>#include<string.h>#include<stdlib.h>struct node//定义链表{    char name[20],tea[20],num[20];//学生姓名,辅导员姓名、学生学号    int gra,cla,dor;//成绩、班级、宿舍    struct node *next;};struct stu//建立结构体(用来比较两个学生的成绩){    char name[20],num[20];    int gra;} ar,br;struct node *head,*q,*p;double  ave;//平均成绩int sum;//管理系统中学生人数#define x (struct node *) malloc(sizeof(struct node));//自定义:x等效于(struct node *) malloc(sizeof(struct node))/***函数名:showmain()**功  能:显示用户桌面**入口参数:无**出口参数:无*/void Showmain(){    printf("\n");    for(int i=0; i<73; i++)        if(i<24||i>54) printf(" ");        else        {            Sleep(1);            printf("*");        }    Sleep(10);//休眠0.1秒    printf("\n\t\t\t*欢 迎 使 用 学 生 管 理 系 统*\n");    for(int i=0; i<73; i++)        if(i<24||i>54) printf(" ");        else        {            Sleep(1);            printf("*");        }    printf("\n\n");    Sleep(10);    printf("\t\t\t    1、添 加 学 生 信 息\n");    Sleep(10);    printf("\t\t\t    2、修 改 学 生 信 息\n");    Sleep(10);    printf("\t\t\t    3、删 除 学 生 信 息\n");    Sleep(10);    printf("\t\t\t    4、显 示 学 生 信 息\n");    Sleep(10);    printf("\t\t\t    5、学 生 成 绩 比 较\n");    Sleep(10);    printf("\t\t\t    6、按宿舍查找学生信息\n");    Sleep(10);    printf("\t\t\t    7、按班级查找学生信息\n");    Sleep(10);    printf("\t\t\t    8、    退     出\n");}/***函数名:Sort()**功  能:对链表按照成绩从高到低排序**入口参数:head**出口参数:无*/void Sort(struct node *head){    int t;    char a[20];    q=x;    q=head->next;    while(q)    {        p=q;        while(p)        {            if(q->gra<p->gra)            {                strcpy(a,q->name);                strcpy(q->name,p->name);                strcpy(p->name,a);                strcpy(a,q->tea);                strcpy(q->tea,p->tea);                strcpy(p->tea,a);                strcpy(a,q->num);                strcpy(q->num,p->num);                strcpy(p->num,a);                t=p->gra;                p->gra=q->gra;                q->gra=t;                t=p->cla;                p->cla=q->cla;                q->cla=t;                t=p->dor;                p->dor=q->dor;                q->dor=t;            }            else p=p->next;        }        q=q->next;    }}/***函数名:Ave()**功  能:求管理系统中学生成绩平均成绩(作为判断学生成绩是否达标的标准)**入口参数:head**出口参数:无*/void Ave(struct node *head){    q=head->next;    sum=0;//本函数还可求系统中总人数sum    int s=0;    while(q)    {        s+=q->gra;        sum++;        q=q->next;    }    ave=s*1.0/sum;}/***函数名:Add()**功  能:添加创建学生信息(逆序建链表)**入口参数:head**出口参数:无**注意事项(bug):创建过的学生不可以再次创建*/void Add(struct node *head){    struct node *h=head;    int n,i;    printf("\t\t\t   请输入添加学生数量:");scanf("%d",&n);    for(i=1; i<=n; i++)    {        p=x;        system("cls");//清屏        printf("\n\n\t\t\t   第%d个学生学号(不可修改):",i);        scanf("%s",p->num);        int f=0;//标记变量,标记该生信息是否已经存在系统中(默认0为不存在,1为存在)        q=h->next;        while(q)//遍历链表,查找添加的学号是否已经存入系统中        {            if(strcmp(p->num,q->num)==0)//新输入的学号已存入系统,无需重复添加            {                f=1;//1为存在                i-=1;//本次输入的学生信息作废,需重新输入                printf("\n\t\t\t   该生信息已存在,不可重复添加!>_<\n\n");                Sleep(1000);                break;//以查找到该生信息,无需继续往后查找,跳出while循环            }            q=q->next;        }        if(f==0)//若该生信息不存在,逆序存入链表中        {            printf("\t\t\t   第%d个学生姓名:",i);scanf("%s",p->name);            printf("\t\t\t   第%d个学生成绩:",i);scanf("%d",&p->gra);            printf("\t\t\t   第%d个学生班级:",i);scanf("%d",&p->cla);            printf("\t\t\t   第%d个学生宿舍:",i);scanf("%d",&p->dor);            printf("\t\t\t   第%d个学生辅导员姓名:",i);scanf("%s",p->tea);            p->next=head->next;            head->next=p;        }    }}/***函数名:Change()**功  能:修改学生信息(二分查找)**入口参数:head**出口参数:无**注意事项(bug):查找存在性*/void Change(struct node *head){    Ave(head);    if(sum==0) printf("\n\t\t\t   系统中无学生信息,请添加!>_<\n\n");    else    {        char a[20],f[20],b[20];        int c,d,e;        printf("\t\t\t   请输入需要修改的学生的信息:\n");        printf("\t\t\t   学生学号:");scanf("%s",b);        printf("\t\t\t   学生姓名:");scanf("%s",a);        printf("\t\t\t   学生成绩:");scanf("%d",&c);        printf("\t\t\t   学生班级:");scanf("%d",&d);        printf("\t\t\t   学生宿舍:");scanf("%d",&e);        printf("\t\t\t   学生辅导员姓名:");scanf("%s",f);        int fl=0;//标记变量,标记该生信息是否已经存在系统中(默认0为不存在,1为存在)//该处可优化,建立一个排序成绩的子函数,建立一个二分查找的子函数。        q=x;q=head->next;        while(q)//遍历链表,查找添加的学号是否已经存入系统中        {            if(strcmp(q->num,b)==0)//找到该生信息            {                fl=1;//标记为存在                strcpy(q->name,a);strcpy(q->num,b);                q->gra=c;q->cla=d;q->dor=e;                strcpy(q->tea,f);                break;//以查找到该生信息,无需继续往后查找,跳出while循环            }            q=q->next;        }        if(fl==0)//若该生信息不存在            printf("\n\t\t\t   该生不存在,无法修改!>_<\n\n");    }}/***函数名:Delete()**功  能:删除学生信息(二分查找、新增前指针)**入口参数:head**出口参数:无**注意事项(bug):查找存在性*/void Delete (struct node *head){    Ave(head);    if(sum==0) printf("\n\t\t\t   系统中无学生信息,请添加!>_<\n\n");    else    {        printf("\t\t\t   请输入您要删除学生的学号:");        char a[20];        int f=0;        scanf("%s",a);        q=p=x;q=head;p=q->next;        while(p)        {            if(strcmp(p->num,a)==0)            {                f=1;q->next=p->next;                free(p);//优化系统内存,释放p结点所占的空间                break;            }            else            {                q=q->next;p=p->next;            }        }        if(f==0) printf("\t\t\t   该生不存在,无法删除!>_<\n\n");    }}/***函数名:Show()**功  能:显示学生信息(按照成绩排序,颜色区分成绩是否达标(平均分))**入口参数:head**出口参数:无**注意事项:换页*/void Show(struct node *head){    int ff=0;    Ave(head);system("cls");//清屏    if(sum==0) printf("\t\t\t   系统中无学生信息,请添加!>_<\n\n");    else    {        Sort(head);        printf("\n\t\t|学号\t|姓名\t|成绩\t|班级\t|宿舍\t|辅导员|\n");        q=head->next;        while(q)        {            if(ave>q->gra)//将学生成绩和平均值比较            {                ff=1;                HANDLE hOut;hOut = GetStdHandle(STD_OUTPUT_HANDLE);//设置\t是白色的,而不是黄色的                SetConsoleTextAttribute(hOut,BACKGROUND_BLUE |BACKGROUND_RED |                                        BACKGROUND_GREEN |BACKGROUND_INTENSITY);                printf("\t\t ");                SetConsoleTextAttribute(hOut,                                        FOREGROUND_RED |BACKGROUND_RED |//黄底红字标记不达标(低于平均分)的学生信息                                        BACKGROUND_GREEN |BACKGROUND_INTENSITY);                printf("%s\t %s\t %d\t %d\t %d\t %s\t\n",q->num,q->name,q->gra,q->cla,q->dor,q->tea);            }            else  printf("\t\t %s\t %s\t %d\t %d\t %d\t %s\n",q->num,q->name,q->gra,q->cla,q->dor,q->tea);            q=q->next;        }        if(ff==1)        {            HANDLE hOut;hOut = GetStdHandle(STD_OUTPUT_HANDLE);            SetConsoleTextAttribute(hOut,//设置\t是白色的,而不是黄色的                                    BACKGROUND_BLUE |BACKGROUND_RED |                                    BACKGROUND_GREEN |BACKGROUND_INTENSITY);            printf("\n\t\t\t 黄色标记学生的成绩低于平均成绩!>_<\n");        }    }}/***函数名:Cmp()**功  能:比较两学生的学习情况**入口参数:head**出口参数:无*/void Cmp(struct node *head){    Ave(head);    if(sum<2) printf("\n\t\t\t   系统中学生少于两人,请添加!>_<\n\n");    else    {   int f1=0,f2=0;        printf("\t\t\t   请输入两个要比较的学生的学号:");scanf("%s%s",ar.num,br.num);        q=head->next;        while(q)        {            if(strcmp(q->num,ar.num)==0)            {                f1=1;strcpy(ar.name,q->name);                ar.gra=q->gra;            }            if(strcmp(q->num,br.num)==0)            {                f2=1;strcpy(br.name,q->name);                br.gra=q->gra;            }            if(f1==1&&f2==1) break;//优化系统提高运行速度,减少不必要的运算(两个学生的信息都找的了就不用遍历后面的学生信息了)            q=q->next;        }        if(f1==0) printf("\n\t\t\t   未找到学号为%s的学生信息,请重新操作!>_<\n\n",ar.num);        else if(f2==0) printf("\n\t\t\t   未找到学号为%s的学生信息,请重新操作!>_<\n\n",br.num);        else if(ar.gra>br.gra)        {            printf("\t\t\t\twinner:\t");            Sleep(1000);printf("%s(%d分)\n",ar.name,ar.gra);        }        else if(ar.gra<br.gra)        {            printf("\t\t\t\twinner:\t");            Sleep(1000);printf("%s(%d分)\n",br.name,br.gra);        }        else if(ar.gra==br.gra)        {            Sleep(1000);SetConsoleTextAttribute( GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED );            printf("\t\t\t   They have the same score!^_^\n\n");        }    }}/***函数名:Dorm()**功  能:按照宿舍查找学生信息**入口参数:head**出口参数:无*/void Dorm(struct node *head){    int ff=0;    Ave(head);    system("cls");//清屏    if(sum==0) printf("\n\t\t\t   系统中无学生信息,请添加!>_<\n\n");    else    {        printf("\t\t\t   请输入您要查找的宿舍:");        int a,f=0,flo=0;        scanf("%d",&a);        Sort(head);q=head->next;        while(q)        {    if(q->dor==a)            {   ff=1;                if(flo==0)                {printf("\n\t\t|学号\t|姓名\t|成绩\t|班级\t|宿舍\t|辅导员|\n");                    flo=1;                }                if(ave>q->gra)//将学生成绩和平均值比较                {   HANDLE hOut;                    hOut = GetStdHandle(STD_OUTPUT_HANDLE);                    SetConsoleTextAttribute(hOut,                                            BACKGROUND_BLUE |BACKGROUND_RED |                                            BACKGROUND_GREEN |BACKGROUND_INTENSITY);//设置\t是白色的,而不是黄色的                    printf("\t\t ");                    SetConsoleTextAttribute(hOut,                                            FOREGROUND_RED |BACKGROUND_RED |                                            BACKGROUND_GREEN |BACKGROUND_INTENSITY);//黄底红字标记不达标(低于平均分)的学生信息                    printf("%s\t %s\t %d\t %d\t %d\t %s\t\n",q->num,q->name,q->gra,q->cla,q->dor,q->tea);                }                else  printf("\t\t %s\t %s\t %d\t %d\t %d\t %s\n",q->num,q->name,q->gra,q->cla,q->dor,q->tea);                f=1;            }            q=q->next;        }        if(ff==1)        {            HANDLE hOut;            hOut = GetStdHandle(STD_OUTPUT_HANDLE);            SetConsoleTextAttribute(hOut,                                    BACKGROUND_BLUE |BACKGROUND_RED |                                    BACKGROUND_GREEN |BACKGROUND_INTENSITY);//设置\t是白色的,而不是黄色的            printf("\n\t\t\t 黄色标记学生的成绩低于平均成绩!>_<\n");        }        if(f==0) printf("\n\t\t\t系统信息中无该宿舍,请重新操作!>_<\n\n");    }}/***函数名:Class()**功  能:按照班级查找学生信息**入口参数:无**出口参数:无*/void Class(struct node *head){    int ff=0;    Ave(head);    system("cls");//清屏    if(sum==0) printf("\n\t\t\t   系统中无学生信息,请添加!>_<\n\n");    else    {        printf("\t\t\t   请输入您要查找的班级:");        int  a;        scanf("%d",&a);        Sort(head);        q=head->next;        int f=0;        int flo=0;        while(q)        {            if(q->cla==a)            {                ff=1;                if(flo==0)                {                    flo=1;                    printf("\n\t\t|学号\t|姓名\t|成绩\t|班级\t|宿舍\t|辅导员|\n");                }                if(ave>q->gra)//将学生成绩和平均值比较                {                    HANDLE hOut;                    hOut = GetStdHandle(STD_OUTPUT_HANDLE);                    SetConsoleTextAttribute(hOut,                                            BACKGROUND_BLUE |BACKGROUND_RED |                                            BACKGROUND_GREEN |BACKGROUND_INTENSITY);//设置\t是白色的,而不是黄色的                    printf("\t\t ");                    SetConsoleTextAttribute(hOut,                                            FOREGROUND_RED |BACKGROUND_RED |                                            BACKGROUND_GREEN |BACKGROUND_INTENSITY);//黄底红字标记不达标(低于平均分)的学生信息                    printf("%s\t %s\t %d\t %d\t %d\t %s\t\n",q->num,q->name,q->gra,q->cla,q->dor,q->tea);                }                else  printf("\t\t %s\t %s\t %d\t %d\t %d\t %s\n",q->num,q->name,q->gra,q->cla,q->dor,q->tea);                f=1;            }            q=q->next;        }        if(ff==1)        {            HANDLE hOut;            hOut = GetStdHandle(STD_OUTPUT_HANDLE);            SetConsoleTextAttribute(hOut,                                    BACKGROUND_BLUE |BACKGROUND_RED |                                    BACKGROUND_GREEN |BACKGROUND_INTENSITY);//设置\t是白色的,而不是黄色的            printf("\n\t\t\t 黄色标记学生的成绩低于平均成绩!>_<\n");        }        if(f==0) printf("\n\t\t\t系统中无该班级,请重新操作!>_<\n\n");    }}/***函数名:Exit()**功  能:退出**入口参数:无**出口参数:无*/void Exit(){    system("cls");//清屏    printf("\n\n\n\n\n\n\n\n\n\n\t\t\t      欢迎下次使用!\n");}int main(){    int choose,flag=1;    head=x;    head->next=NULL;    while(flag)    {        system("color F0");//背景亮白,前景黑        Showmain();        printf("\n\t\t\t   -->\t请输入您的指令:");        scanf("%d",&choose);        switch(choose)        {        case 1:            Add(head);            break;        case 2:            Change(head);            break;        case 3:            Delete(head);            break;        case 4:            Show(head);            break;        case 5:            Cmp(head);            break;        case 6:            Dorm(head);            break;        case 7:            Class(head);            break;        case 8:            Exit ();            flag=0;            break;        default:            printf("\n\t\t\t   请重新确认你输入的功能编号!>_<\n\n");        }        HANDLE hOut;        hOut = GetStdHandle(STD_OUTPUT_HANDLE);//黄底红字标记不达标(低于平均分)的学生信息        SetConsoleTextAttribute(hOut,                                BACKGROUND_BLUE |BACKGROUND_RED |                                BACKGROUND_GREEN |BACKGROUND_INTENSITY);        printf("\n\t\t\t     ");        system("pause");//按任意键继续        system("cls");//清屏    }    return 0;}

0 0
原创粉丝点击