/*
**作者:张迪
**版本: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;
}
学生管理系统
最新推荐文章于 2019-03-03 09:22:14 发布