《c语言成绩统计系统.docx》由会员分享,可在线阅读,更多相关《c语言成绩统计系统.docx(16页珍藏版)》请在三一办公上搜索。
1、c语言成绩统计系统 C语言成绩统计系统 #include #include #include int shoudsave=0; /* 为后面判断是否改动资料做铺垫*/ struct student char num11;/*学号*/ char name20; int cgrade; int mgrade; int egrade; int totle; int ave; float ajd;/平均绩点 ; typedef struct node struct student data; struct node *next; Node,*Link; void menu printf(*); pri
2、ntf(t1输入学生资料ttttt2删除学生资料n); printf(t3查询学生资料ttttt4修改学生资料n); printf(t5显示学生资料ttttt6统计学生成绩n); printf(t7排序学生成绩ttttt8保存学生资料n); printf(t9获取帮助信息ttttt0退出系统n); printf(*n); void printstart printf(-n); void Wrong printf(n=提示:输入错误!n); void Nofind printf(n=提示:没有找到该学生!n); void printc /* 本函数用于输出中文标题 */ printf( 学号t
3、姓名 英语成绩 数学成绩 C语言成绩 总分 平均分 平均绩点n); void printe(Node *p)/*本函数用于输出中文标题下的具体内容 */ printf(%-12s%st%dt %dt %dt %dt %dt %2.1fn,p-data.num,p-data.name, p-data.egrade,p-data.mgrade,p-data.cgrade,p-data.totle,p-data.ave,p-data.ajd); Node *Locate(Link l,char findmess,char nameornum) /*该函数用于定位连表中符合要求的接点,并返回该指针 *
4、/ Node *r; if(strcmp(nameornum,num)=0) /*按学号查询*/ r=l-next; while(r) if(strcmp(r-data.num,findmess)=0) return r; r=r-next; else if(strcmp(nameornum,name)=0) /*按姓名查询 */ r=l-next; while(r) if(strcmp(r-data.name,findmess)=0) return r; r=r-next; return 0; float jd(Node *p) int b3,i; float sum=0.0,a; b0=p
5、-data.cgrade;b1=p-data.mgrade;b2=p-data.egrade; for( i=0;i=90) a=5.0 ; else if(bi=85) a=4.5; else if(bi=80) a=4.0; else if(bi=75) a=3.5; else if(bi=70) a=3.0; else if(bi=65) a=2.5; else if(bi=60) a=2.0; else a=0.0 ; sum+=a; return sum/3; void Add(Link l) /*增加学生*/ Node *p,*r,*s; char num11; r=l; s=l-
6、next; while(r-next!=NULL) r=r-next; while(1) k0: printf(请你输入学号(以0返回上一级菜单); scanf(%s,num); getchar; if(strcmp(num,0)=0) break; while(s) if(strcmp(s-data.num,num)=0) printf(=提示:学号为%s的学生已经存在,若要修改请你选择4 修改!n,num); printstart; printc; printe(s); printstart; printf(n); return; s=s-next; p=(Node *)malloc(si
7、zeof(Node); strcpy(p-data.num,num); k1: printf(请你输入姓名(以101返回主菜单,102返回上一级菜单):); scanf(%s,p-data.name); getchar;/程序暂停等待输入 if(strcmp(p-data.name,101)=0) free(p); return; else if(strcmp(p-data.name,102)=0) goto k0; k2:printf(请你输入c语言成绩(以101返回主菜单,102返回上一级菜单):); scanf(%d,&p-data.cgrade); getchar; if(p-data
8、.cgrade=101) free(p);/释放内存 return; else if(p-data.cgrade=102)/此处内存不能释放 goto k1;/虽然102被输入c语言成绩,但会再次输入将其覆盖 k3:printf(请你输入数学成绩(以101返回主菜单,102返回上一级菜单):); scanf(%d,&p-data.mgrade); getchar; if(p-data.mgrade=101) free(p); return; else if(p-data.mgrade=102) goto k2; K4:printf(请你输入英语成绩(以101返回主菜单,102返回上一级菜单):
9、); scanf(%d,&p-data.egrade); getchar; if(p-data.egrade=101) free(p); return; else if(p-data.egrade=102) goto k3; p-data.totle=p-data.egrade+p-data.cgrade+p-data.mgrade; p-data.ave=p-data.totle / 3;p-data.ajd=jd(p);/*信息输入已经完成*/ p-next=NULL; r-next=p; r=p; shoudsave=1;/为后面改动数据判断做铺垫 void Qur(Link l) /*
10、查询学生*/ int sel; char findmess20; Node *p; if(!l-next) printf(n=提示:没有资料可以查询!n); return; a0:printf(n=1按学号查找n=2按姓名查找n); scanf(%d,&sel); if(sel=1)/*学号*/ printf(请你输入要查找的学号(以0返回主菜单,1返回上一级菜单):); scanf(%s,findmess); if(strcmp(findmess,1)=0) goto a0; else if(strcmp(findmess,0)=0) return; else p=Locate(l,find
11、mess,num); if(p) printf(tttt查找结果n); printstart; printc; printe(p); printstart; else Nofind; else if(sel=2) /*姓名*/ printf(请你输入要查找的姓名(以0返回主菜单,1返回上一级菜单):); scanf(%s,findmess); if(strcmp(findmess,0)=0) return; else if(strcmp(findmess,1)=0) goto a0; else p=Locate(l,findmess,name); if(p) printf(tttt查找结果n)
12、; printstart; printc; printe(p); printstart; else Nofind; else Wrong; void Del(Link l) /*删除*/ void Save(Link l); int sel; Node *p,*r,*d=NULL,*j=NULL; char findmess20,ch; if(!l-next) printf(n=提示:没有资料可以删除!n); return; k:printf(n=1按学号删除n=2按姓名删除n=3全部删除n=0返回上一级菜单n); scanf(%d,&sel); if(sel=0) return; if(se
13、l=3) k1:printf(=确认全部删除(y/n)?n); getchar; scanf(%c,&ch); if(ch=y) d=l-next; while(d) j=d; d=d-next; free(j); l-next=NULL; printf(数据已清空!); Save(l); return ; else if(ch=n) goto k; else printf(输入错误!); goto k1; if(sel=1) printf(请你输入要删除的学号:); scanf(%s,findmess); p=Locate(l,findmess,num); if(!p) do printf(
14、您输入的学号不存在,请重新输入);/当输入学号未找到相应学生时,可以重新输入,而不会跳出当前操作平台 scanf(%s,findmess); p=Locate(l,findmess,num); while(p=NULL); if(p) r=l; while(r-next!=p) r=r-next; r-next=p-next; free(p); printf(n=提示:该学生已经成功删除!n); Save(l);/= shoudsave=1; else if(sel=2) printf(请你输入要删除的姓名:);/待改动、 scanf(%s,findmess); p=Locate(l,find
15、mess,name); if(!p) doprintf(请重新输入);/当输入学号未找到相应学生时,可以重新输入,而不会跳出当前操作平台 scanf(%s,findmess); p=Locate(l,findmess,name); while(p=NULL); if(p) r=l; while(r-next!=p) r=r-next; r-next=p-next; free(p); printf(n=提示:该学生已经成功删除!n); Save(l); shoudsave=1; else Wrong; void Modify(Link l)/修改学生资料 Node *p; char findme
16、ss20; if(!l-next) printf(n=提示:没有资料可以修改!n); return; c0: printf(请你输入要修改的学生学号(以0返回主菜单):); scanf(%s,findmess); if(strcmp(findmess,0)=0) return; p=Locate(l,findmess,num); if(p) c1: printf(请你输入新的c语言成绩(原来是%d分)(以101返回主菜单,102返回上一菜单):,p-data.cgrade); scanf(%d,&p-data.cgrade); if(p-data.cgrade=101) return; els
17、e if(p-data.cgrade=102) goto c0; c2: printf(请你输入新的英语成绩(原来是%d分)(以101返回主菜单,102返回上一菜单):,p-data.egrade); scanf(%d,&p-data.egrade); if(p-data.egrade=101) return; else if(p-data.egrade=102) goto c1; printf(请你输入新的高数成绩(原来是%d分)(以101返回主菜单,102返回上一菜单):,p-data.mgrade); scanf(%d,&p-data.mgrade); if(p-data.mgrade=
18、101) return; else if(p-data.mgrade=102) goto c2; p-data.totle=p-data.cgrade+p-data.egrade+p-data.mgrade; p-data.ave=p-data.totle/3.0; printf(n=提示:资料修改成功!n); shoudsave=1; else Nofind; void Disp(Link l)/显示学生资料 int count=0; Node *p; p=l-next; if(!p) printf(n=提示:没有资料可以显示!n); return; printf(tttt显示结果n); p
19、rintstart; printc; printf(n); while(p) printe(p); p=p-next; printstart; printf(n); Node *select_order(Node *head,int a)/排序学生资料 Node *first; /*排列后有序链的表头指针*/ Node *tail; /*排列后有序链的表尾指针*/ Node *p_min; /*保留键值更小的节点的前驱节点的指针*/ Node *min; /*存储最小节点*/ Node *p; /*当前比较的节点*/ float bj; first = NULL;/带存入有序数据的链表 whi
20、le (head != NULL) /*在原链表中找键值最小的节点。*/ /*注意:这里for语句就是体现选择排序思想的地方*/ for (p=head,min=head; p-next!=NULL; p=p-next) /*循环遍历链表中的节点,找出此时最小的节点。*/ if(a=1) bj=strcmp(p-next-data.num,min-data.num); if(a=2) bj=min-data.ajd-p-next-data.ajd; if (bjnext的前驱节点是p。*/ min = p-next; /*保存键值更小的节点。*/ /*上面for语句结束后,就要做两件事;一是把
21、它放入新的有序链表中;二是根据相应的条件判断,安排它离开原来输入的链表*/ /*第一件事*/ if (first = NULL) /*如果有序链表目前还是一个空链表*/ first = min; /*第一次找到键值最小的节点。*/ tail = min; /*注意:尾指针让它指向最后的一个节点。*/ else /*有序链表中已经有节点*/ tail-next = min; /*把刚找到的最小节点放到最后,即让尾指针的next指向它。*/ tail = min; /*尾指针也要指向它。*/ /*第二件事*/ if (min = head) /*如果找到的最小节点就是第一个节点*/ head =
22、head-next; /*显然让head指向原head-next,即第二个节点,就OK*/ else /*如果不是第一个节点*/ p_min-next = min-next; /*前次最小节点的next指向当前min的next,这样就让min离开了原链表。*/ if (first != NULL) /*循环结束得到有序链表first*/ tail-next = NULL; /*单向链表的最后一个节点的next应该指向NULL*/ head = first; return head; void Save(Link l)/保存学生资料 FILE *fp; Node *p; int flag=1,c
23、ount=0;/记录写入数据个数 fp=fopen(c:student,wb); if(fp=NULL) printf(n=提示:重新打开文件时发生错误!n); exit(1);/异常退出 p=l-next; while(p) if(fwrite(p,sizeof(Node),1,fp)=1) p=p-next; count+; else flag=0; break; if(flag) printf(n=提示:文件保存成功.(有%d条记录已经保存.)n,count); shoudsave=0; fclose(fp); Link Order(Link l) Node *a; int i; if(
24、!l-next) printf(n=提示:没有资料可以排序!n); return; printf(n-1按学号排序n-2按平均绩点排序n); scanf(%d,&i); a=l-next=select_order(l-next,i); printstart; if(l) printc; while(a-next!=NULL) printe(a); a=a-next; while(a-next!=NULL) a=a-next; printe(a); printstart; return l-next; void sx(Link l) void Choose(Link l) int a=2,n=0
25、,i; float t; Link p,r; r=p=l-next=select_order( l-next, a); if(!l-next) printf(n=提示:没有资料可以排序!n); return; printf(=提示:请输入你的筛选标准(绩点):); scanf(%f,&t); while(p) if(p-data.ajd=t) n+=1; if(p-data.ajdnext; if(n=0) printf(没有符合条件的学生可以显示!n); return; printstart; printc; for( i=1;inext; printstart; int main/主函数
26、Link l;/*链表*/ FILE *fp; /*文件指针*/ int sel; char ch; int count=0; Node *p,*r;/节点 printf(tttt学生成绩管理系统nttt-n); l=(Node*)malloc(sizeof(Node); l-next=NULL; r=l; fp=fopen(C:student,ab+); if(fp=NULL) printf(n=提示:文件不能打开!n); exit(0);/正常退出 printf(n=提示:文件已经打开,正在导入记录.n); while(!feof(fp)/链表没有到尾 p=(Node*)malloc(si
27、zeof(Node); if(fread(p,sizeof(Node),1,fp)=1) /*将文件的内容放入接点中 */ p-next=NULL; r-next=p; r=p; /*将该接点挂入链中*/ count+; fclose(fp); /*关闭文件 */ printf(n=提示:记录导入完毕,共导入%d条记录.n,count); menu; while(1) printf(请你选择操作:); scanf(%d,&sel); if(sel=0) if(shoudsave=1) getchar; printf(n=提示:资料已经改动,是否将改动保存到文件中(y/n)?n); scanf(
28、%c,&ch); if(ch=y|ch=Y) Save(l); printf(n=提示:你已经退出系统,再见!n); break; switch(sel) case 1:Add(l);break; /*增加学生*/ case 2:Del(l);break;/*删除学生*/ case 3:Qur(l);break;/*查询学生*/ case 4:Modify(l);break;/*修改学生*/ case 5:Disp(l);break; case 6:Choose(l);break;/筛选学生 case 7:l-next=Order(l);break;/*排序学生*/ case 8:Save(l);break;/*保存学生 */ case 9:printf(ttt=帮助信息=n);menu;break; default: Wrong;getchar;break; while (l) /*释放链表l(不是1)所占用的内存!*/ p = l; l = l-next; free(p); getchar; return 0;/?