学生管理系统源代码_第1页
学生管理系统源代码_第2页
学生管理系统源代码_第3页
学生管理系统源代码_第4页
学生管理系统源代码_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、. 学生管理系统源代码#include <stdio.h>#include <stdlib.h>#include <string.h>#include<malloc.h>#define LEN sizeof(struct scorenode)#define DEBUGstruct scorenodeint number;/*学号*/char name10;/*姓名*/float yuwen;/*语文成绩*/float yingyu;/*英语成绩*/float shuxue;/*数学成绩 */struct scorenode *next;typed

2、ef struct scorenode score;int n,k;/*n,k为全局变量,本程序中的函数均可以使用它*/score *creat(void)/*函数creat,功能:创建链表,此函数带回一个指向链表头的指针*/score*head;score *p1,*p2,*p3,*max;int i,j;float fen;char t10;n=0; p1=p2=p3=(score *)malloc(LEN); head=p3; /*开辟一个新单元*/ printf("请输入学生资料,输0退出!n");repeat1: printf("请输入学生学号(学号应大

3、于0):");/*输入学号,学号应大于0*/ scanf("%d",&p1->number);while(p1->number<0) getchar(); printf("输入错误,请重新输入学生学号:"); scanf("%d",&p1->number); /*输入学号为字符或小于0时,程序报错,提示重新输入学号*/ if(p1->number=0) goto end;/*当输入的学号为0时,转到末尾,结束创建链表*/ else p3=head; if(n>0) for(

4、i=0;i<n;i+) if(p1->number!=p3->number) p3=p3->next; else printf("学号重复,请重输!n"); goto repeat1; /*当输入的学号已经存在,程序报错,返回前面重新输入*/ printf("请输入学生姓名:"); scanf("%s",&p1->name);/*输入学生姓名*/ printf("请输入语文成绩(0100):");/*输入语文成绩,成绩应在0-100*/ scanf("%f"

5、,&p1->yuwen); while(p1->yuwen<0|p1->yuwen>100) getchar(); printf("输入错误,请重新输入语文成绩");/*输入错误,重新输入语文成绩直到正确为止*/ scanf("%f",&p1->yuwen); printf("请输入英语成绩(0100):");/*输入英语成绩,成绩应在0-100*/ scanf("%f",&p1->yingyu); while(p1->yingyu<0|

6、p1->yingyu>100) getchar(); printf("输入错误,请重新输入英语成绩");/*输入错误,重新输入英语成绩直到正确为止*/ scanf("%f",&p1->yingyu); printf("请输入数学成绩(0100):");/*输入数学成绩,成绩应在0-100*/ scanf("%f",&p1->shuxue); while(p1->shuxue<0|p1->shuxue>100) getchar(); printf(&qu

7、ot;输入错误,请重新输入数学成绩"); scanf("%f",&p1->shuxue);/*输入错误,重新输入数学成绩直到正确为止*/ head=NULL;while(p1->number!=0) n=n+1;if(n=1) head=p1;else p2->next=p1; p2=p1; p1=(score *)malloc(LEN); printf("请输入学生资料,输0退出!n");repeat2:printf("请输入学生学号(学号应大于0):"); scanf("%d"

8、;,&p1->number);/*输入学号,学号应大于0*/ while(p1->number<0) getchar(); printf("输入错误,请重新输入学生学号:"); scanf("%d",&p1->number); /*输入学号为字符或小于0时,程序报错,提示重新输入学号*/ if(p1->number=0) goto end;/*当输入的学号为0时,转到末尾,结束创建链表*/ else p3=head; if(n>0) for(i=0;i<n;i+) if(p1->number

9、!=p3->number) p3=p3->next; else printf("学号重复,请重输!n"); goto repeat2; /*当输入的学号已经存在,程序报错,返回前面重新输入*/ printf("请输入学生姓名:");scanf("%s",&p1->name);/*输入学生姓名*/printf("请输入语文成绩(0100):");scanf("%f",&p1->yuwen);/*输入语文成绩,成绩应在0-100*/ while(p1->

10、yuwen<0|p1->yuwen>100) getchar(); printf("输入错误,请重新输入语文成绩"); scanf("%f",&p1->yuwen); /*输入错误,重新输入语文成绩直到正确为止*/ printf("请输入英语成绩(0100):"); scanf("%f",&p1->yingyu);/*输入英语成绩,成绩应在0-100*/ while(p1->yingyu<0|p1->yingyu>100) getchar();

11、printf("输入错误,请重新输入英语成绩"); scanf("%f",&p1->yingyu); /*输入错误,重新输入英语成绩直到正确为止*/ printf("请输入数学成绩(0100):"); scanf("%f",&p1->shuxue);/*输入数学成绩,成绩应在0-100*/ while(p1->shuxue<0|p1->shuxue>100) getchar(); printf("输入错误,请重新输入数学成绩"); scanf(

12、"%f",&p1->shuxue); /*输入错误,重新输入数学成绩直到正确为止*/ end: p1=head; p3=p1; for(i=1;i<n;i+) for(j=i+1;j<=n;j+) max=p1; p1=p1->next; if(max->number>p1->number) k=max->number; max->number=p1->number; p1->number=k; /*交换前后结点中的学号值,使得学号大者移到后面的结点中*/ strcpy(t,max->name)

13、; strcpy(max->name,p1->name); strcpy(p1->name,t); /*交换前后结点中的姓名,使之与学号相匹配*/ fen=max->yuwen; max->yuwen=p1->yuwen; p1->yuwen=fen; /*交换前后结点中的语文成绩,使之与学号相匹配*/ fen=max->yingyu; max->yingyu=p1->yingyu; p1->yingyu=fen; /*交换前后结点中的英语成绩,使之与学号相匹配*/ fen=max->shuxue; max->shu

14、xue=p1->shuxue; p1->shuxue=fen; /*交换前后结点中的数学成绩,使之与学号相匹配*/ max=head;p1=head;/*重新使max,p指向链表头*/ p2->next=NULL;/*链表结尾*/ printf("输入的学生数为:%d个!n",n); return(head);score *load(score *head)/*函数load,功能:从文件读入学生记录*/ score *p1,*p2; int m=0; char filepn10; FILE *fp; printf("请输入文件路径及文件名:&qu

15、ot;); scanf("%s",filepn);/*输入文件路径及名称*/ if(fp=fopen(filepn,"r+")=NULL) printf("不能打开文件!n"); return 0; fscanf(fp," 考试成绩管理系统 n"); fscanf(fp,"作者:袁杰 班级:计科七班 学号:2009301500206 n"); fscanf(fp,"-n"); fscanf(fp,"|学号t|姓名t|语文t|英语t|数学t|n"); fsc

16、anf(fp,"-n");/*读入表格域*/ printf(" 考试成绩管理系统 n"); printf(" 作者:袁杰 班级:计科七班 学号:2009301500206 n"); printf("-n"); printf("|学号t|姓名t|语文t|英语t|数学t|n"); printf("-n");/*打印表格域*/ m=m+1; if(m=1) p1=(score *)malloc(LEN); /*开辟一个新单元*/ fscanf(fp,"%d%s%f%f%f

17、",&p1->number,p1->name,&p1->yuwen,&p1->yingyu,&p1->shuxue); printf("|%dt|%st|%.1ft|%.1ft|%.1ft|n",p1->number,p1->name,p1->yuwen,p1->yingyu,p1->shuxue); /*文件读入与显示*/ head=NULL; do n=n+1; if(n=1) head=p1; else p2->next=p1; p2=p1; p1=(score

18、 *)malloc(LEN); /*开辟一个新单元*/ fscanf(fp,"%d%s%f%f%fn",&p1->number,p1->name,&p1->yuwen,&p1->yingyu,&p1->shuxue); printf("|%dt|%st|%.1ft|%.1ft|%.1ft|n",p1->number,p1->name,p1->yuwen,p1->yingyu,p1->shuxue); /*文件读入与显示*/ while(!feof(fp); p2-

19、>next=p1; p1->next=NULL; n=n+1; printf("-n");/*表格下线*/ fclose(fp);/*结束读入,关闭文件*/ return (head);score *add(score *head,score *stu)/*函数add,功能:追加学生资料,并且将所有学生资料按学号排序*/score *p0,*p1,*p2,*p3,*max;int i,j;float fen;char t10; p3=stu=(score *)malloc(LEN);/*开辟一个新单元*/ printf("n输入要增加的学生的资料!&q

20、uot;); repeat4: printf("请输入学生学号(学号应大于0):"); scanf("%d",&stu->number); /*输入学号,学号应大于0*/while(stu->number<0) getchar(); printf("输入错误,请重新输入学生学号:"); scanf("%d",&stu->number);/*输入错误,重新输入学号*/ if(stu->number=0) goto end2;/*当输入的学号为0时,转到末尾,结束追加*/

21、else p3=head; if(n>0) for(i=0;i<n;i+) if(stu->number!=p3->number) p3=p3->next; else printf("学号重复,请重输!n"); goto repeat4; /*当输入的学号已经存在,程序报错,返回前面重新输入*/ /*/ printf("输入学生姓名:"); scanf("%s",stu->name); /*输入学生姓名*/ printf("请输入语文成绩(0100):"); scanf(&quo

22、t;%f",&stu->yuwen); /*输入语文成绩,成绩应在0-100*/ while(stu->yuwen<0|stu->yuwen>100) getchar(); printf("输入错误,请重新输入语文成绩"); scanf("%f",&stu->yuwen); /*输入错误,重新输入语文成绩直到正确为止*/ printf("请输入英语成绩(0100):"); scanf("%f",&stu->yingyu);/*输入英语成绩,

23、成绩应在0-100*/ while(stu->yingyu<0|stu->yingyu>100) getchar(); printf("输入错误,请重新输入英语成绩"); scanf("%f",&stu->yingyu);/*输入错误,重新输入英语成绩直到正确为止*/ printf("请输入数学成绩(0100):"); scanf("%f",&stu->shuxue);/*输入数学成绩,成绩应在0-100*/ while(stu->shuxue<0|s

24、tu->shuxue>100) getchar(); printf("输入错误,请重新输入数学成绩"); scanf("%f",&stu->shuxue);/*输入错误,重新输入数学成绩直到正确为止*/p1=head;p0=stu;if(head=NULL)head=p0;p0->next=NULL;/*当原来链表为空时,从首结点开始存放资料*/else/*原来链表不为空*/ if(p1->next=NULL)/*找到原来链表的末尾*/ p1->next=p0; p0->next=NULL;/*将它与新开

25、单元相连接*/ else while(p1->next!=NULL)/*还没找到末尾,继续找*/ p2=p1;p1=p1->next; p1->next=p0; p0->next=NULL; n=n+1;p1=head;p0=stu; for(i=1;i<n;i+) for(j=i+1;j<=n;j+) max=p1; p1=p1->next; if(max->number>p1->number) k=max->number; max->number=p1->number; p1->number=k; /*交换

26、前后结点中的学号值,使得学号大者移到后面的结点中*/ strcpy(t,max->name); strcpy(max->name,p1->name); strcpy(p1->name,t); /*交换前后结点中的姓名,使之与学号相匹配*/ fen=max->yuwen; max->yuwen=p1->yuwen; p1->yuwen=fen; /*交换前后结点中的语文成绩,使之与学号相匹配*/ fen=max->yingyu; max->yingyu=p1->yingyu; p1->yingyu=fen; /*交换前后结点

27、中的英语成绩,使之与学号相匹配*/ fen=max->shuxue; max->shuxue=p1->shuxue; p1->shuxue=fen; /*交换前后结点中的数学成绩,使之与学号相匹配*/ max=head;p1=head;/*重新使max,p指向链表头*/ end2:printf("现在的学生数为:%d个!n",n); return(head);score *search(score *head)/*函数search,功能:查询学生成绩*/int number;score *p1,*p2;printf("输入要查询的学生的学号

28、,");scanf("%d",&number);while(number!=0) if(head=NULL) printf("n没有任何学生资料!n");return(head); printf("-n"); printf("|学号t|姓名t|语文t|英语t|数学t|n"); printf("-n");/*打印表格域*/ p1=head; while(number!=p1->number&&p1->next!=NULL) p2=p1;p1=p1-&g

29、t;next; if(number=p1->number) printf("|%dt|%st|%.1ft|%.1ft|%.1ft|n",p1->number,p1->name,p1->yuwen,p1->yingyu,p1->shuxue); printf("-n");/*打印表格域*/ else printf("%d不存在此学生!n",number); printf("输入要查询的学生的学号,"); scanf("%d",&number);print

30、f("已经退出了!n");return(head);score *del(score *head)/*函数del,功能:删除学生资料*/score *p1,*p2;int number;printf("输入要删除的学生的学号(输入0时退出):");scanf("%d",&number);getchar();while(number!=0)/*输入学号为0时退出*/ if(head=NULL) printf("n没有任何学生资料!n"); return(head); p1=head; while(number

31、!=p1->number&&p1->next!=NULL) /*p1指向的不是所要找的首结点,并且后面还有结点*/ p2=p1;p1=p1->next; /*p1后移一个结点*/ if(number=p1->number) /*找到了*/ if(p1=head) head=p1->next; /*若p1指向的是首结点,把地二个结点地址赋予head*/ else p2->next=p1->next; /*否则将下一个结点地址 赋给前一结点地址*/ printf("删除:%dn",number);n=n-1; else

32、printf("%d不存在此学生!n",number); /*找不到该结点*/ printf("输入要删除的学生的学号:"); scanf("%d",&number); getchar();#ifdef DEBUG printf("已经退出了!n");#endifprintf("现在的学生数为:%d个!n",n);return(head); void print(score *head)/*函数print,功能:显示学生成绩*/score *p;if(head=NULL) printf(

33、"n没有任何学生资料!n");elseprintf("%dn",n);printf("-n");printf("|学号t|姓名t|语文t|英语t|数学t|n");printf("-n");/*打印表格域*/p=head; do printf("|%dt|%st|%.1ft|%.1ft|%.1ft|n",p->number,p->name,p->yuwen,p->yingyu,p->shuxue); printf("-n");/

34、*打印表格域*/ p=p->next;while (p!=NULL);/*打印完成了*/score *statistics(score *head) /*函数statistics,功能:统计学生成绩*/ float sum1=0,sum2=0,sum3=0,ave1=0,ave2=0,ave3=0,max=0,min; score *p; int x,y=0,i=0; p=head; printf("1个人总分和平均分t2单科平均分t3总分最高分t4总分最低分n"); scanf("%d",&x); getchar();switch(x)c

35、ase 1: if(head=NULL) printf("n没有任何学生资料!n");return(head);/*链表为空*/ else printf("-n"); printf("|学号t|姓名t|语文t|英语t|数学t|总分t|平均分t|n"); printf("-n");/*打印表格域*/ while(p!=NULL) sum1=p->yuwen+p->yingyu+p->shuxue; /*计算个人总分*/ ave1=sum1/3;/*计算个人平均分*/ printf("|%d

36、t|%st|%.1ft|%.1ft|%.1ft|%.1ft|%.1ft|n",p->number,p->name,p->yuwen,p->yingyu,p->shuxue,sum1,ave1); /*打印结果*/ printf("-n");/*打印表格域*/ p=p->next; return(head); break; case 2: if(head=NULL) printf("n没有任何学生资料!n");return(head);/*链表为空*/ while(p!=NULL) sum1=sum1+p-&g

37、t;yuwen; sum2=sum2+p->yingyu; sum3=sum3+p->shuxue;/*计算总分*/ y=y+1; ave1=sum1/y; ave2=sum2/y; ave3=sum3/y;/*计算平均分*/ p=p->next;/*使p指向下一个结点*/ printf("语文平均分是%.1fn",ave1); printf("英语平均分是%.1fn",ave2); printf("数学平均分是%.1fn",ave3);/*打印结果*/ return(head); break; case 3: if

38、(head=NULL) printf("n没有任何学生资料!n");return(head);/*链表为空*/ max=p->yuwen+p->yingyu+p->shuxue; while(i<n) i=i+1; sum1=p->yuwen+p->yingyu+p->shuxue; /*计算个人总分*/ if(max<sum1) max=sum1; p=p->next; printf("总分最高分:%.1f",max); printf("n"); return(head); br

39、eak; case 4: if(head=NULL) printf("n没有任何学生资料!n");return(head);/*链表为空*/ while(p!=NULL) min=p->yuwen+p->yingyu+p->shuxue; while(p!=NULL) sum2=p->yuwen+p->yingyu+p->shuxue; if(min>sum2) min=sum2; p=p->next; printf("总分最低分:%.1f",min); printf("n"); ret

40、urn(head); break; default :printf("输入错误,请重试!n");return(head);save(score *p1) /*函数save,功能:保存学生的资料*/ FILE *fp;char filepn20;/*用来存放文件保存路径以及文件名*/printf("请输入文件路径及文件名:");scanf("%s",filepn);if(fp=fopen(filepn,"w+")=NULL) printf("不能打开文件!n"); return 0; fprint

41、f(fp," 考试成绩管理系统 n");fprintf(fp," 作者:袁杰 班级:计科七班 学号:2009301500206 n"); fprintf(fp,"-n");fprintf(fp,"|学号t|姓名t|语文t|英语t|数学t|n"); fprintf(fp,"-n");/*打印表格域*/while(p1!=NULL)fprintf(fp,"%dt%st%.1ft%.1ft%.1ftn",p1->number,p1->name,p1->yuwen,

42、p1->yingyu,p1->shuxue); p1=p1->next;/*下移一个结点*/fclose(fp);printf("文件已经保存!n");return 0;score *taxis(score *head) /*定义排序函数。此函数带回一个指向链表头的指针*/ score *p,*max; int i,j,x; float fen; char t10; if(head=NULL) printf("n没有任何学生资料,请先建立链表!n");return(head);/*链表为空*/ max=p=head; for(i=0;i

43、<80;i+) printf("*"); printf("1按学生学号排序t2按学生姓名排序t3按语文成绩排序n"); printf("4按英语成绩排序t5按数学成绩排序tn"); for(i=0;i<80;i+) printf("*"); printf("请选择操作:"); scanf("%d",&x);/*选择操作*/ getchar(); switch(x) /*用switch语句实现功能选择*/ case 1 : for(i=1;i<n;i+

44、) for(j=i+1;j<=n;j+) max=p; p=p->next; if(max->number>p->number) k=max->number; max->number=p->number; p->number=k; /*交换前后结点中的学号值,使得学号大者移到后面的结点中*/ strcpy(t,max->name); strcpy(max->name,p->name); strcpy(p->name,t); /*交换前后结点中的姓名,使之与学号相匹配*/ fen=max->yuwen; max-

45、>yuwen=p->yuwen; p->yuwen=fen; /*交换前后结点中的语文成绩,使之与学号相匹配*/ fen=max->yingyu; max->yingyu=p->yingyu; p->yingyu=fen; /*交换前后结点中的英语成绩,使之与学号相匹配*/ fen=max->shuxue; max->shuxue=p->shuxue; p->shuxue=fen; /*交换前后结点中的数学成绩,使之与学号相匹配*/ max=head;p=head;/*重新使max,p指向链表头*/ print(head);br

46、eak;/*打印值排序后的链表内容*/ case 2 : for(i=1;i<n;i+) for(j=i+1;j<=n;j+) max=p; p=p->next; if(strcmp(max->name,p->name)>0)/*strcmp=>字符串比较函数*/ strcpy(t,max->name);/*strcpy=>字符串复制函数*/ strcpy(max->name,p->name); strcpy(p->name,t); /*交换前后结点中的姓名,使得姓名字符串的值大者移到后面的结点中*/ k=max->

47、number; max->number=p->number; p->number=k; /*交换前后结点中的学号值,使之与姓名相匹配*/ fen=max->yuwen; max->yuwen=p->yuwen; p->yuwen=fen; /*交换前后结点中的语文成绩,使之与姓名相匹配*/ fen=max->yingyu; max->yingyu=p->yingyu; p->yingyu=fen; /*交换前后结点中的英语成绩,使之与姓名相匹配*/ fen=max->shuxue; max->shuxue=p->shuxue; p->shuxue=fen; /*交换前后结点中的数学成绩,使之与姓名相匹配*/ p=head; max=head; print(head); break; case 3 : for(i=1;i<n;i+) for(j=i+1;j<=n;j+) max=p; p=p->next; if(max->yuwen>p->yuwen) fen=max->yuwen; max->yuwen=p->

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论