学生管理系统

本文介绍了一个学生管理系统的设计与实现,包括添加、修改、删除学生信息等功能,并实现了成绩排序、颜色标记等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
**作者:张迪
**版本: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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值