学生管理系统
来源:互联网 发布:搜狗输入法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
- 一个学生管理系统
- 学生同学录管理系统
- 学生管理系统
- 销售学生管理系统
- 学生通讯管理系统
- 学生管理系统
- 学生管理系统
- 学生管理系统
- 学生管理系统
- 学生学籍管理系统
- 学生管理系统
- 学生通讯录管理系统
- 学生管理系统
- 学生管理系统源程序
- 学生管理系统源程序
- 学生管理系统实现
- 学生管理系统
- 学生管理系统
- js时间显示源码
- postgresql数据库字节流类型详解
- PAT(A) - 1078. Hashing (25)
- IPv6详解:SHA1算法实现及详解
- 【JZOJ 4816】【NOIP2016提高组 五校联考4】label
- 学生管理系统
- Android 应用界面开发之基本控件学习总结
- [转载]各种安装包打包发布工具(安装制作工具)评测
- 图形化冒泡排序
- Ubuntu Kylin下Android编译环境构建
- 小白学习-linux之启动脚本方法
- Jenkins入门系列之——01第一章 Jenkins是什么?
- golang实现的http反向代理
- 洛谷-刷题