c语言课程设计学生成绩管理系统_第1页
c语言课程设计学生成绩管理系统_第2页
c语言课程设计学生成绩管理系统_第3页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

1、寸录学生成绩管理程序题目要求2设计目的2总体设计3详细设计3调试与测试12源程序1430总结学生成绩管理程序题目要求1. 问题描述:对在校学生几门课程的考试成绩进行统一管理每个学生记录包括学号姓名,年龄,数学,英语,物理成绩,默认以学号为序存放2. 要求:(1) 一个文件按以班为单位存储学生记录.(2) 将允许的操作分为四种,以A,B ,C,D,E,F为标志:A:插入一个学生记录;B:修改学生记录;C:删除一个学生记录;D:查找一个学生记录;E:浏览学生成绩:F:退出3. 计算学生的总成绩.4. 按学号排序输出全班学生成绩表设计目的根据题目要求,由于学生信息是存放在文件中,所以应提供文件的输入

2、,输出 等操作;在程序中需要浏览学生的信息,应提供显示,查找,排序等操作;另外 还应提供键盘式选择菜单实现功能选择.三. 总体设计根据上面的需求分析,可以将这个系统分为以下模块:输入模块,修改模块,删 除模块,查找模块,显示模块.学生成绩管理系统E111数据输入数据显示数据修改数据删除r数据查找 1四. 详细设计1.主函数:主函数一般设计得比较简单,只提供输入,处理和输出部分的函数调用 其中各功能模块用菜单方式选择流程图:显示一系列功能模块N1*F输入n,判断n是否是A-F根据n的值调用各功能模块函数程序:#i nclude "head.h" int menu _selec

3、t() char c;prin tf("nn");prin tf(" | 1.增加学生记录5.统计信息|n");prin tf(" | 2.查询学生记录6.打开文件|n");prin tf(" | 3.修改学生记录7.保存文件|n");printf(" | 4.学生纪录排序8.显示记录|n");prin tf(" | 0.退出系统|n");prin tf("nn");printf(" 请选择(0-8):"); c=getchar();g

4、etchar();return (c-'O');2.输入模块:分析:单独看各数据信息,学号,姓名是字符型,可以采用字符型数组;分数为整数, 采用整数;数据信息存放在文件中,一条记录对应一个学生,既符合习惯又方 便信息管理如果要存放若干学生信息就用结构体数组:void addrecord(stude nt stud)int i=0,j, num;char str5;if(nu mstus!=0)printf("已有记录存在是否覆盖?(y/n)n");gets(str);if(str0='Y'|str0='y')i=0;else

5、i=nu mstus;printf("请输入增加的学生信息条目数:");sca nf("%d",&nu m);if(i=0)nu mstus=num;else nu mstus+=num;if(nu mstus>le ns)len s+=50;poin ter=(stude nt *)realloc(poi nter,le ns*LEN);printf("请输入学生信息:n");for(;i< nu mstus;i+)getchar();printf("请输入学号:");gets(po in t

6、eri. nu mber);printf("请输入姓名:");gets(poi nteri. name);printf("请输入性别(男/女1/0):");gets(po in teri.sex);if(poi nteri.sex0='0') strcpy(poi nteri.sex,"女");else strcpy(poi nteri.sex,"男");printf("请输入各科成绩:(按“语文,数学,英语,历史,政治”的顺序):");studi.score=0; for(j=

7、0;jv nu msubs;j+)scanf("%f",&studi.subjectj); /*计算总分 */studi.score+=studi.subjectj;studi.average=studi.score/numsubs; /*计算平均分 */cou nt(stud); /* 附名次 */display(stud,0, nu mstus-1);getchar();int nu mstus;int len s;stude nt *po in ter; void main()int i=1;char str2;len s=100;pointer=(stude

8、nt *)malloc(lens*LEN); /*分配内存 */nu mstus=0;welcome(); /* 欢迎界面 */while(i>0)i=me nu _select(); /* switch(i)控制菜单*/case 1:addrecord(poi nter);break; /*case 2:fin drecord(poi nter);break; /* case 3:ame ndrecord(po in ter);break; /*增加学生信息*/查询学生信息*/修改学生信息*/case 4:sort(po in ter);break; /* case 5:statist

9、ic(poi nter);break; /* case 6:ope nfile(po in ter);break; /*学生信息排序*/ 统计信息*/ 打开文件*/case 7:writetotext(po in ter);break; /*保存文件*/case 8:display(poi nter,0, nu mstus-1);break; /*显示记录*/case 0:if(numstus!=0) printf("是否保存当前记录?(y/n)");gets(str);if(str0='y'|str0='Y')writetotext(poi

10、 nter);i=-1;break; /* 退出系统 */default:printf("请输入数字 08:n");i=1; /*输入错误 */prin tf("tt欢迎再次使用本系统。nn");display1();3修改模块:分析:用户输入要修改学生的学号,根据学生的学号等信息查找学生记录 并提示用户修改该记录的哪部分信息根据用户选择修改相应的信息.流程图:程序: void xiugai()if(fp=fope n("s_score.txt","rb+")=NULL|(fp 仁 fope n( "te

11、mp.txt","wb+")=NULL)/*检查是否出错*/prin tf("Ca nnot ope n this file.' n");exit(0);prin tf("nPLease shuru xiugai xuehao:");scan f("%d",&i); getchar();while(fread(&data,sizeof(data),1,fp)=1)j=atoi(data.xuehao);if(j=i)prin tf("xuehao:%snmi ngzi:%

12、sn nian li ng:%sn",data.xuehao,data.mi ngzi,data. nianl in g);prin tf("Please shuru min gzi:");gets(data. min gzi);prin tf("Please shuru shuxue score:");gets(temp);data.score0=atof(temp);prin tf("Please in put yin gyu score:");gets(temp);data.score1=atof(temp);prin

13、 tf("Please in put wuli score:");gets(temp);data.score2=atof(temp);data.score3=data.score0+data.score1+data.score2; fwrite(&data,sizeof(data),1,fp1);fseek(fp,0L,0); /*将位置指针移到离头文件0个字节处*/fseek(fp1,0L,0);while(fread(&data,sizeof(data),1,fp1)=1)fwrite(&data,sizeof(data),1,fp);fclos

14、e(fp);fclose(fpl);4.删除模块:分析:该模块的功能是,用户输入要删除的学生的学号,根据学生学号查找记录并 删除流程图:程序:void deleterecord(student stu,int i) /*删除信息 */int j;while(i>=0)for(j=i;j< nu mstus;j+) stuj=stuj+1;nu mstus-;printf(”删除成功!n");void coun t(stude nt stud)int i,j;for(i=0;i <nu mstus;i+)studi.i ndex=1;for(j=0;j< nu

15、mstus;j+) if(studj.score>studi.score) studi.i ndex+;5.查找模块:需求分析:该模块的功能是根据输入的学生的姓名查找对应的记录,找到以后Y程序:#i nclude "head.h"int findrecord(student stud) /*查找信息 */char str2;int i,num;if(nu mstus=O)printf("没有可被查找的记录n");return -1;elseprintf("以何种方式查找? n1.学号t2.姓名t3.名次n");gets(str)

16、;if(str0='1') /*按学号查找 */printf("请输入学号:");gets(str);for(i=0;i<=nu mstus;i+)if(strcmp(str,studi. nu mber)=0)display(stud,i,i);break;else con ti nue;else if(str0='2') /*按姓名查找 */printf("请输入姓名:");gets(str);for(i=0;i<=nu mstus;i+)if(strcmp(str,studi. name)=0)displ

17、ay(stud,i,i);break;else con ti nue;else if(str0='3') /*按名次查找 */printf("请输入名次:");scan f("%d",&nu m);getchar();for(i=0;i<=nu mstus;i+)if(num=studi.i ndex)display(stud,i,i);break;else con ti nue;if(i> nu mstus)printf("没有查找所要的信息。n");return -1;return i;6.显示

18、模块:需求分析:该模块的功能是显示所有学生记录信息程序:void welcome()prin tf("t*n");prin tf("tttt* 用!n");学生成绩管理系统*ntttt倾情奉献欢迎使prin tf("t*n");void showtable()printf("n");printf("学号t姓名t性别t语文t数学t英语t历史t政治t总分t平均分t名次n");printf("n");void display(stude nt stud,i nt n 1,i nt

19、n2)int i;showtable(); /*显示表头 */for(i=n 1;i<=n 2;i+)prin tf("%st%st%st%.2ft%.2ft%.2ft%.2ft%.2ft%.2ft%.2ft%dtn",studi. nu mber,studi. name,studi.sex,studi.subjectO,studi.s ubject1,studi.subject2,studi.subject3,studi.subject4,st udi.score,studi.average,studi.i ndex);/*通过循环输出数据*/void displa

20、y1()printf("tt本系统由计科二班制作nn");printf("tt制作人员列表:nn");prin tf("tt殷增锋 ttt 邵超 n");prin tf("nn");getchar();五. 调试与测试在这次课程设计中,程序编写过程中遇到了很多的问题,各种函数的运用也让人 头疼,在上机编译运行过程中出现了很多的错误,例如:各种数据类型的定义, 函数的调用等等。但最终还是在老师同学的帮助下进行了各种代码的编写与修改 最终程序成功的运行。F面是各个模块的界面图(1)主菜单函数:鬧塞隼3SSr录录養 记记

21、记排; 生生生录统 加询星出12 3 4 05-统计信息!fi-Mzn记杀I请供择0-8 ::输入模块:AAAAAA+.JW.-mrr-prr-f#-fJT-林亠Mui那号匂 low4 BB - - ( le 加生号宀US英语,历史,政治"的顺序咖98 97 98 99 98畫菸 姓名 性别 ft B C D E 总分 平均分M BM HHiIMHHMM HM MKaM BM,MM.BM *!* HMIKMM» BM _ BW MM1张三 男 98. SQ 9H.0097.0098.0B 9?. 08490.00 98.00:显示模块:(4):删除模块:请选择0-8):3

22、斑加方式宴孩? L-栄号氛姓名3.名次穆输入学号汉姓名 性别 语文若次数学英语 Bv mmnaamb-aia mbhm 历史 政治总分平均分L张三男90-00夔删除这个学生的信息吗翼“n St). 00?0_0987.00?8.06445.3089.001低输入学号江3 名次矿姓名性别语文数学英语历史政治总分平均分L张三h男99.0088.0098,0089.09482.&092.40(5):查找模块:姓名 性别 fiBCDE总分 平均分(6):修改模块:吗珪握口 皐生 生个入 送修書子妊性序1WAAA®删要确r请请请请1 1 三淼 张男愿jLLiEn>n ?<y

23、Xn>y张三 男99.00 BS.Q0 77.009?.00S8.0U41. Q0 90.20六. 程序源#ifndef H_STUDENT_HH #defi ne H_STUDENT_HH#include "stdio.h"#include "string.h"#include "malloc.h"#defi ne LEN sizeof(struct message_stude nt) /*个结构体数组元素的长度*/#define numsubs 5 /* 学科数目 */typedef struct message_stude

24、nt /*结构体定义 */ _char nu mber6;char n ame20;char sex4;float subject nu msubs;float score;float average;int in dex;stude nt;extern int numstus; /*学生数目 */extern student *pointer; /*指向结构体数组 */exter n int lens;int menu_select(); /*函数声明 */int ope nfile(stude nt stu);int fin drecord(stude nt stud);int write

25、totext(stude nt stud);void welcome();void display1();void showtable();void sort(stude nt stu);void deleterecord(stude nt stu,i nt i);void addrecord(stude nt stud);void display(stude nt stud,i nt n 1,i nt n 2); void ame ndrecord(stude nt stud);void coun t(stude nt stud);void sort nu m(stude nt stud);

26、void sort nu m2(stude nt stud);void sort name(stude nt stud);void sort name2(stude nt stud);void sortco un t(stude nt stud);void sortco un t2(stude nt stud);void statistic(stude nt stud);void display1();#en dif#i nclude "head.h"int menu _select() _char c;prin tf("nn");prin tf(&qu

27、ot; | 1.增加学生记录5.统计信息|n");prin tf(" | 2.查询学生记录6.打开文件|n");prin tf(" | 3.修改学生记录7.保存文件|n");printf(" | 4.学生纪录排序8.显示记录|n");prin tf(" | 0.退出系统|n");prin tf("nn");printf(" 请选择(0-8):");c=getchar();getchar();return (c-'0');#i nclude "

28、;head.h"int findrecord(student stud) /*查找信息 */char str2;int i,num;if(nu mstus=O)printf("没有可被查找的记录n");return -1;elseprintf("以何种方式查找? n1.学号t2.姓名t3.名次n");gets(str);if(str0='1') /*按学号查找 */printf("请输入学号:");gets(str);for(i=0;i<=nu mstus;i+)if(strcmp(str,studi.

29、 nu mber)=0)display(stud,i,i);break;else con ti nue;else if(str0='2') /*按姓名查找 */printf("请输入姓名:");gets(str);for(i=0;i<=nu mstus;i+)if(strcmp(str,studi. name)=0)display(stud,i,i);break;else con ti nue;else if(str0='3') /*按名次查找 */printf("请输入名次:");scan f("%d&q

30、uot;,&nu m);getchar();for(i=0;i<=nu mstus;i+)if(num=studi.i ndex)display(stud,i,i);break;else con ti nue;if(i> nu mstus)printf("没有查找所要的信息。n");return -1;return i;#i nclude"head.h"int ope nfile(stude nt stu)int i=0,j;FILE *fp;char file name20,str2;if(nu mstus!=0)printf(&q

31、uot;已经有记录存在,是否保存?(y/n)");gets(str);if(str0='y'|str0='Y')writetotext(stu);printf("请输入文件名:");gets(file name);nu mstus=0;if(fp=fope n(file name,"rb+")=NULL)printf("无法打开该文件n");return(-1);fsca nf(fp,"%d",&n umstus);fgetc(fp);while(i< nu

32、mstus)fscan f(fp,"%s",stui. nu mber);fscan f(fp,"%s",stui. name);fscan f(fp,"%s",stui.sex);for(j=0;j< nu msubs;j+)fscan f(fp,"%f",&stui.subjectj);fscan f(fp,"%f", &stui.score);fscan f(fp,"%f", &stui.average);fscan f(fp,"

33、%d",&stui.i ndex);i+;fclose(fp);printf("文件读取成功n");printf("是否显示纪录?(y/n)");gets(str);if(str0='y'|str0='Y')display(stu,O, nu mstus-1);return(0);/#i nclude "head.h"void sort(stude nt stud)int i,j=0;char str5;stude nt *p;p=stud;if(nu mstus=0)printf(&

34、quot; 没有可供查询的记录!");while(1)for(i=0;i+)printf("请输入查询方式:");n");printf("(直接输入回车则结束查询操作)prin tf("1.按照学号t");printf("2.按照姓名t");prin tf("3.按照名次n");gets(str);if(strle n( str)=0) break;if(str0='1')printf("1.升序排列 t");printf("2.降序排列

35、n");gets(str);if(str0='1')sort nu m2(p);elsesort nu m(p);display(stud,0, nu mstus-1);else if(str0=2)prin tf("请输入排序次序:n");printf("1.升序排列 t");printf("2.降序排列 n");gets(str);if(str0='1')sort name2(p);elsesort name(p);display(stud,0, nu mstus-1);else if(s

36、tr0=3)prin tf("请输入排序次序:n");printf("1.升序排列 t");printf("2.降序排列 n");gets(str);if(str0='1')sortco un t2(p);elsesortco un t(p);display(stud,0, nu mstus-1);else prin tf(" 请输入 13"); printf("是否退出排序?(y/n)");gets(str);if(str0='y'|str0='Y

37、9;) break;return;void sort nu m(stude nt stud)int i,j;stude nt temp;stude nt *p;p=stud;for(i=0;i <nu mstus;i+)for(j=0;jv nu mstus-i-1;j+)if(strcmp(studj+1. nu mber,studj. nu mber)>0) temp=*(p+j);*(p+j)=*(p+j+1);*(p+j+1)=temp;void sort nu m2(stude nt stud)int i,j;stude nt temp;stude nt *p;p=stu

38、d;for(i=0;i <nu mstus;i+)for(j=0;j< nu mstus-i-1;j+)if(strcmp(studj. nu mber,studj+1. nu mber)>0) temp=*(p+j);*(p+j)=*(p+j+1);*(p+j+1)=temp;void sort name(stude nt stud)int i,j;stude nt temp;stude nt *p;p=stud;for(i=0;i <nu mstus;i+)for(j=0;j< nu mstus-i-1;j+)if(strcmp(studj+1. name,s

39、tudj. name)>0)temp=*(p+j);*(p+j)=*(p+j+1);*(p+j+1)=temp;void sort name2(stude nt stud)int i,j;stude nt temp;stude nt *p;p=stud;for(i=0;i <nu mstus;i+)for(j=0;j< nu mstus-i-1;j+)if(strcmp(studj. name,studj+1. name)>0) temp=*(p+j);*(p+j)=*(p+j+1);*(p+j+1)=temp;void sortco un t(stude nt stu

40、d)int i,j;stude nt temp;stude nt *p;p=stud;for(i=0;i <nu mstus;i+)for(j=0;j< nu mstus-i-1;j+)if(studj+1.i ndex>studj.i ndex)temp=*(p+j);*(p+j)=*(p+j+1);*(p+j+1)=temp;void sortco un t2(stude nt stud)int i,j;stude nt temp;stude nt *p;p=stud;for(i=0;i <nu mstus;i+)for(j=0;jv nu mstus-i-1;j+

41、)if(studj.i ndex>studj+1.i ndex)temp=*(p+j);*(p+j)=*(p+j+1);*(P+j+1)=temp;#i nclude"head.h"void statistic(student stud) /*新增功能,输出统计信息 */int i,j=0,k=0;char c1,str2;float average nu msubs,sum=0;if(nu mstus=0)printf("没有可被查找的记录n");elsewhile(1)printf("下面将统计考试成绩n");printf(

42、"请选择你要统计哪科的成绩1.At2.Bt3.Ct4.Dt5.En");c1=getchar();printf("t一共有个d记录n",numstus); /* 总共记录数*/switch(cl)case '1':for(i=0;i<numstus;i+)/*循环输入判断 */sum+=studi.subject0;if(studk.subject0>studi.subject0) k=i; if(studj.subject0<studi.subject0) j=i;average0=su m/nu mstus;prin

43、tf("t科目A的最高分:n"); /* 最高分*/prin tf("tt学号:s姓名:s分数:%.2fn",studj. number,studj. name,studj.subject0);printf("t 科目A的最低分是:n"); /* 最低分*/prin tf("tt学号:s姓名:s分数:.2fn",studk. nu mber,studk .n ame,studk.subject0);printf("t科目 A 的平均分是 %5.2fn",average0); /* 平均分 */b

44、reak; case 2:for(i=0;i<numstus;i+)/*循环输入判断 */sum+=studi.subject1;if(studk.subject1>studi.subject1) k=i; if(studj.subject1<studi.subject1) j=i;average1=su m/nu mstus;printf("t科目B的最高分:n"); /* 最高分*/prin tf("tt学号:s姓名:s数:%.2fn",studj. number,studj. name,studj.subject1);printf

45、("t 科目B的最低分是:n"); /* 最低分*/prin tf("tt学号:s姓名:s数:%.2fn",studk. nu mber,studk .n ame,studk.subject1);printf("t科目 B 的平均分是 %5.2fn",average1); /* 平均分 */break;case 3:for(i=0;i<numstus;i+)/*循环输入判断 */sum+=studi.subject2;if(studk.subject2>studi.subject2) k=i; if(studj.subje

46、ct2<studi.subject2) j=i;average2=sum/numstus;printf("t科目C的最高分:n"); /* 最高分*/prin tf("tt学号:s姓名:s数:%.2fn",studj. number,studj. name,studj.subject2);printf("t 科目C的最低分是:n"); /* 最低分*/prin tf("tt学号:s姓名:s数:%.2fn",studk. nu mber,studk .n ame,studk.subject2);printf(&

47、quot;t科目 C 的平均分是 5.2fn",average2); /* 平均分 */break;case '4':for(i=0;i<numstus;i+)/*循环输入判断 */sum+=studi.subject3;if(studk.subject3>studi.subject3) k=i; if(studj.subject3<studi.subject3) j=i;average3=su m/nu mstus;printf("t科目D的最高分:n"); /* 最高分*/prin tf("tt学 号 :s 姓 名

48、:s数:%.2fn",studj. number,studj. name,studj.subject3);printf("t科目D的最低分是:n"); /*最低分*/prin tf("tt学 号 :s 姓 名 :s数:.2fn",studk. nu mber,studk .n ame,studk.subject3);printf("t科目 D 的平均分是 5.2fn",average3); /* 平均分 */break;case '5':for(i=0;i<numstus;i+)/*循环输入判断 */s

49、um+=studi.subject4;if(studk.subject4>studi.subject4) k=i; if(studj.subject4<studi.subject4) j=i;average4=sum/numstus;printf("t科目E的最高分:n"); /* 最高分*/prin tf("tt学号:s姓名:s数:%.2fn",studj. number,studj. name,studj.subject4);printf("t 科目E的最低分是:n"); /* 最低分*/prin tf("t

50、t学号:s姓名:s数:%.2fn",studk. nu mber,studk .n ame,studk.subject4);printf("t科目 E 的平均分是 %5.2fn",average4); /* 平均分 */break;default:pri ntf("输入错误!请输入15之间的数n");sum=0;getchar();printf("是否继续进行统计?(y/n)");gets(str); if(strO='y'|strO='Y'); else break;int writetot

51、ext(student stud) /*将所有记录写入文件 */int i=0,j;FILE *fp;char file name20;printf("输入文件名称:");gets(file name);fp=fope n(filen ame,"w");fprin tf(fp,"%dn" ,n umstus);while(i< nu mstus)fprin tf(fp,"%s %s %s ",studi. nu mber,studi. name,studi.sex); for(j=0;jv nu msubs;

52、j+)fprin tf(fp,"%f ",studi.subjectj);fprin tf(fp,"%f%f %d ",studi.score,studi.average,studi.i ndex);i+;fclose(fp);printf("已成功存储!n");display(stud,0, nu mstus-1);nu mstus=0;return 0; void welcome() prin tf("t*n");倾情奉献欢迎使prin tf("tttt*学生成绩管理系统 *ntttt用!n"

53、;);prin tf("t* *n");void showtable()printf("n");printf(" 学号t姓名t性别tAtBtCtDtEt总分t平均分t名次n");printf("n"); void display(stude nt stud,i nt n 1,i nt n2) int i;showtable(); /* 显示表头 */for(i=n 1;i<=n 2;i+)prin tf("%st%st%st%.2ft%.2ft%.2ft%.2ft%.2ft%.2ft%.2ft%dt

54、n" ,studi. nu mber,studi. name,studi.sex,studi.subjectO,studi.s ubject1,studi.subject2,studi.subject3,studi.subject4,st udi.score,studi.average,studi.i ndex);/*通过循环输出数据*/ void display1()printf("tt本系统由计科二班制作nn");printf("tt制作人员列表:nn");prin tf("tt殷增锋 ttt 邵超 n");prin tf("nn");getchar();#i ncludevstri ng.h>void ame ndrecord(stude nt stud)char str5; /* 供用户输入*/int i=-1,j;if(numstus=0) /* 没有记录返回*/prin tf(" 没有可供修改的记录!");while(i<0)i=fi ndrecord(stud);if(i>=0)printf("要删除这个学生的信息吗?(y/n)");gets(str);if(str0='

温馨提示

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

评论

0/150

提交评论