




已阅读5页,还剩31页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
中国地质大学C语言课程设计院 系: 工程学院 姓 名: 、俊 学 号: 班 号: 051163 指导老师 : 日 期: 2016-12-4 目录1、 题目要求2、 需求分析三、总体设计四、详细设计1.菜单函数和主函数 2.各功能模块设计 (1)输入模块 (2)追加模块 (3)修改模块 (4)删除模块 (5)修改成绩模块 (6)排序模块 (7)浏览模块 3.公共函数 (1)保存函数 (2)加载函数 (3)学号输入函数 (4)输入三科成绩函数 (5)求总分函数 (6)输入一个记录的函数 (7)修改成绩函数 (8)修改记录函数 (9)显示数据结构项目函数 (10)显示一个记录的函数五、上机操作六、总结 学生成绩管理系统一 题目要求对在校某班学生几门课程的考试成绩进行统一管理。每个学生记录包括学号、姓名、年龄、数学、英语、物理成绩,默认以学号为序存放。(1)建立一个文件,以班为单位存储学生记录。(2)将允许的操作分为四种,以A、B、C、D、E、F为标志(若设置菜单操作更佳): A:插入一个新的学生记录(录入学生信息);B:修改学生记录;C:删除一个学生记录;D:登记成绩;E:修改成绩;F:浏览全班成绩。(3)计算学生的总成绩。(4)按学号排序输出全班成绩表。二需求分析学生记录用文件存储,因而要提供文件的输入、输出等操作;要实现插入一个新生的学生记录,因而要提供文件的插入操作;要实现学生记录的修改和删除,以及登记成绩修改成绩,因而要提供文件记录的修改和删除操作;要浏览全班成绩,故要提供显示操作;计算学生总成绩需要提供简单的统计操作;要按学号排序输出全班成绩表,因而要提供排序操作;另外还应提供键盘式选择菜单实现功能选择。三 总体设计 根据上面的需求分析,可以将这个系统的设计分为8个模块,数据输入,添加数据,修改数据,删除数据,修改成绩,学号排序,浏览成绩,退出模块.学生成绩管理系统数据输入添加数据修改数据删除数据修改成绩学号排序浏览成绩退出模块四.详细设计1.菜单函数和主函数 将各个功能模块设置为菜单选项,方便调用,且执行完每部分功能模块后能够方便返回到系统界面.流程图显示一系列功能选项 N 输入n,判断n是否是A-H Y 根据n的值调用各功能模块函数 void menu() /*主界面*/int w1; char n; /*.变量n保存选择菜单数字,w1判断输入的数字是否在功能菜单对应数字范围*/ do puts(tt*MENU*nn); puts(ttttA.Enter new data); puts(ttttB.Addition data); puts(ttttC.Modify data); puts(ttttD.Delete data); puts(ttttE.Modify score); puts(ttttF.Order by number); puts(ttttG.Browse all); puts(ttttH.Exit); puts(nntt*n); printf(Choice your number(A-H): bb); n=getchar(); printf(n); if(nH) w1=1; /*对选择的数字作判断*/ else w1=0; while(w1=1); switch(n) /*选择功能*/ case A:enter();break; /*输入模块*/ case B:add();break; /*添加模块*/ case C:modify();break; /*修改数据模块*/ case D:del ();break; /*删除模块*/ case E:modify_score();break; /*修改成绩模块*/ case F:order();break; /*排序模块*/ case G:browse();break; /*浏览模块*/ case H:exit(0); /*退出模块*/ main() /*主函数*/ menu();2.各功能模块设计 (1) 输入模块数据分析单看各数据信息,学号年龄以及数学英语物理各科成绩和总分均是整型,姓名可以采用字符型数组.数据信息存放在文件中,一条记录对应一个学生,既符合习惯也方便信息管理.把学生的学号姓名年龄各科成绩及总分作为结构体成员,存放若干个学生信息就用结构体数组.struct student int num; char name20; int age; int Math; int English; int Physical; long int sum;stuN;/*stuN中每个数组元素对应一个学生*/ 注意stuN中的N为学生个数,程序中采用宏定义的方式,可以随时在源程序宏定义中修改,本程序宏定义#define N 30流程图输入用户要输入学生记录的个数n i从0到n-1调用输入函数input(i) i!=0 Y调用保存函数save(n)程序/*输入模块*/void enter() /*输入模块*/int i,n; printf(How many students(1-%d)?:,N); scanf(%d,&n); /*要输入的记录个数*/ printf(nEnter data nownn); for(i=0;in;i+) printf(n Input %dth student record.n,i+1); input(i); /*调用输入函数*/ if(i!=0) save(n); /*调用保存函数*/ printf_back(); /*一个任务结束时让用户选择是浏览还是返回*/ (2)追加模块需求分析 该模块的功能是用户需要增加新的学生记录, 请从键盘输入并逐条写到原来的输入文件中.流程图调用加载函数n=load();并计算可以记录个数n输入用户要添加学生记录的个数mK=m+ni从n到k调用输入函数input(i)保存添加的记录程序/*添加模块*/void add() /*添加模块*/int i,n,m,k; FILE *fp; n=load(); printf(How many students are you want to add(1-%d)?:,N-n); scanf(%d,&m); /*输入要添加的记录个数*/ k=m+n; for(i=n;ik;i+) printf(n Input %dth student record.n,i+1); input(i); /*调用输入函数*/ if(fp=fopen(score.txt,ab)=NULL) /*以ab方式打开文件,添加保存*/ printf(Cannot open file.n); for(i=n;ik;i+) /*输出到文件*/ if(fwrite(&stui,sizeof(struct student),1,fp)!=1) printf(file write error.n); fclose(fp); printf_back(); /*一个任务结束时的选择浏览还是返回*/ (3)修改模块需求分析该模块的功能是显示所有学生信息,考虑到记录很多,故采用分屏显示。显示完所有记录后,用户输入要修改学生的学号,根据学号查找学生记录,并提示用户修改该记录的哪部分信息,是学号、姓名、年龄或某科成绩、总分还是所有信息都修改,根据用户选择修改相应信息。流程图显示所有记录,让用户看哪个要修改输入要修改的学号是否找到此学生记录显示找到的记录调用修改函数提示没有找到继续修改?YNYYYYY N返回主菜单程序/*修改模块*/void modify() /*修改模块*/struct student s; FILE *fp; int i,n,k,w0=1,w1,w2=0; n=load(); do k=-1; /*给用户看全部记录以便确认要修改的记录*/ printf_face(); /*调用显示数据结构项目函数*/ for(i=0;in;i+) if(i!=0)&(i%10=0) /*目的是分屏显示*/ printf(nnRemember NO.051163h needed modify.Pass any key to continue .); getch(); puts(nn); printf_one(i); /*调用显示一个记录的函数*/ printf(n); do printf(nnEnter NO.051163 you want to modify! NO.:051163-); scanf(%d,&s.num); /*输入要修改的数据的学号*/ for(i=0;in;i+) /*查找要修改的数据*/ if(s.num=stui.num) k=i; /*找到要修改的记录*/s=stui; /* 把stui备份给s,以便用户反悔时恢复*/ if(k=-1) printf(nnNO exist!please again); while(k=-1); /*当k=-1表示没有找到*/ printf_face(); /*调用显示一个记录的函数*/ printf_one(k); w1=modify_data(k,n); /*修改学生记录并且返回保存控制值w1,w1=1则表示用户已确认修改*/ if(w1=1) /*确认修改*/ printf(nSuccessful _.nnAre you modify another?nnt1.Yes2.Back with savet bb); scanf(%d,&w0); w2=1; /*来控制保存,使w2=1是标记已有过修改*/ else w0=0; /* end */ if(w2=1) stuk=s; /*没有修改,把备份的s恢复,使w0=0是为了让循环终止*/ if(w0!=1&w2=1) save(n); /*正常返回,且有过修改 */ while(w0=1); menu(); (4)删除模块需求分析该模块的功能是与修改模块一样先显示所有的学生信息,同样考虑到记录很多,采用分屏显示。显示完所有记录后,用户输入要删除学生的学号,根据学号查找学生记录并删除。删除一般的做法是将数据从文件中删除,删除位置后面的记录往前挪。 流程图返回主菜单 显示所有记录,让用户看哪个要删除输入要删除的学号是否找到此学生记录显示找到的记录使stuk.sum=0提示没有找到继续删除?YNYYYYYN程序void del () /*删除模块*/struct student s; FILE *fp; int i,n,k,w0=1,w1,w2=0; n=load(); do k=-1; printf_face(); for(i=0;in;i+) if(i!=0)&(i%10=0) /*分屏显示*/ printf(nnRemember NO.051163- which needed delete.Pass any key to continue .); getch(); puts(nn); printf_one(i); printf(n); do printf(nnEnter NO.051163- that you want to delete! NO.:051163-); scanf(%d,&s.num); for(i=0;in;i+) if(s.num=stui.num) k=i; s=stui; /*将要删除的记录备份给s */ if(k=-1) printf(nnNO exist!please again); while(k=-1); printf_face(); printf_one(k); printf(nAre you sure?nnt1.Sure2.Back without save in this time bb); scanf(%d,&w1); if(w1=1) stuk.sum=0; /*标记为0后,保存时便不保存*/ printf(nSuccessful _.nnAre you delete another?nnt1.Yes2.Back with savet bb); scanf(%d,&w0); w2=1; /*确认删除*/ else w0=0; /* end */ if(w2=1) stuk=s; if(w0!=1&w2=1) save(n); /*正常返回且已删除*/ while(w0=1); menu(); (5)修改成绩模块需求分析该模块的功能是修改各科成绩或全体成绩。流程图 显示所有记录,让用户看哪个要修改输入要修改的学号是否找到此学生记录显示找到记录调用修改成绩函数提示没有找到继续修改?YNYYYYY返回主菜单N程序void modify_score() /*修改成绩模块*/struct student s; FILE *fp; int i,n,k,w0=1,w1,w2=0; n=load(); do k=-1; printf_face(); for(i=0;in;i+) if(i!=0)&(i%10=0) /*分屏显示*/ printf(nnRemember NO.051163 which score needed modify.Pass any key to continue .); puts(nn); printf_one(i); printf(n); do printf(nnEnter NO.051163- that you want to modify! NO.:051163-); scanf(%d,&s.num); /*输入要修改的学生学号*/ for(i=0;in;i+) if(s.num=stui.num) k=i; s=stui; /* 将要修改的记录备份*/ if(k=-1) printf(nnNO exist!please again); while(k=-1); printf_face(); printf_one(k); w1=modify_score1(k); /*调用修改成绩函数*/ if(w1=1) printf(nSuccessful _.nnAre you modify another score?nnt1.Yes2.Back with savet bb); scanf(%d,&w0); w2=1; /*确认修改*/ else w0=0; /* end */ if(w2=1) stuk=s; if(w0!=1&w2=1) save(n); /* w0!=1 return w2=1 modify */ while(w0=1); /*正常返回且已修改*/ menu(); (6)排序模块需求分析该模块的功能是要求将学生记录按照学号排序,这里采用选择法排序。流程图 用选择法排序保存返回主菜单程序void order() /*排序模块*/int i,j,k,n; struct student s; n=load(); for(i=0;in-1;i+) /*用选择法排序*/ k=i; for(j=i+1;jn;j+) if(stuj.numstuk.num) k=j; s=stui;stui=stuk;stuk=s; save(n); puts(nn); printf_back(); (7)浏览模块需求分析该模块的功能是显示所有学生记录信息。流程图显示学生记录,十个一屏按任意键显示下一屏按任意键返回主菜单程序void browse() /*浏览模块*/int i,n; n=load(); /*加载记录*/ printf_face(); /*调用显示数据结构项目函数*/ for(i=0;in;i+) if(i!=0)&(i%10=0) /*分屏显示*/ printf(nnPass any key to contiune .); getch(); puts(nn); printf_one(i); /*调用显示一个记录的函数*/ printf(n); printf(tThere are %d record.n,n); printf(nPass any key to back.); getch(); /*按任意键*/ menu();3公共函数下面是在每个模块中都有可能用到的一些公共函数。(1) 保存函数save(int n)说明形参n控制保存的个数。当stuk.sum=0表示删除,不保存该记录。程序void save(int n) /*保存函数,保存n个记录*/FILE *fp; int i; if(fp=fopen(score.txt,wb)=NULL) /*以输出打开方式,在此前的记录被覆盖*/ printf(nCannot open filen); for(i=0;in;i+) if(stui.sum!=0) /*stui.sum=0表示该记录已删除*/ if(fwrite(&stui,sizeof(struct student),1,fp)!=1) printf(file write errorn); fclose(fp);(2) 加载函数load()说明 该函数可以用来加载所有记录,并且可以返回所有记录的个数。程序int load() /*加载记录或可以计算记录个数的函数*/FILE *fp; int i; if(fp=fopen(score.txt,rb)=NULL) /*以输出打开方式,在此前的记录被覆盖*/ printf(nCannot open filen); return 0; for(i=0;!feof(fp);i+) fread(&stui,sizeof(struct student),1,fp); fclose(fp); return(i-1); /*返回记录个数*/(3) 学号输入函数no_input(int i,int n)说明该函数对输入学号进行判断,确保输入的学号唯一。形参i表示第i个学生记录,形参n表示总共有n个学生记录。程序void no_input(int i,int n) /*学号输入函数*/int k,w1; do w1=0; printf(NO.:051163-); scanf(%d,&stui.num); if(stui.numN) /*判断学号是否在1到N之间*/ puts(Input error! Only be made up of(1-N).Please reinput!n); w1=1; if(w1!=1) for(k=0;knn 1.Math 2.English 3.Physical4.all score 5.cancel and back); printf(Which you needed?: bb); /*输入选择作个判断*/ scanf(%d,&c); if(c5|c5|c0&cnn 1.NO. 2.name 3.age 4.Math 5.English 6.Physical7.all score 8.all data 9.cancel and back); printf(Which you needed?: bb); /*输入选择作个判断*/ scanf(%d,&c); if(c9|c9|c3&c8) sum(i); puts(nNow:n); printf_face(); printf_one(i); printf(nAre you sure?nnt1.Sure 2.No and remodify3.Back without save in this time bb); scanf(%d,&w1); while(w1=2); return(w1); /*返回控制值*/(9)显示数据结构项目函数void printf_face()printf(nNO.051163 name age Math English Physical sumn);(10)显示一个记录的函数void printf_one(int i) printf(%6d %8s %4d,stui.num,,stui.age); printf(%5d %5d %8d %10d,stui.Math,stui.English,stui.Physical,stui.sum);(11)一个任务结束时的选择浏览还是返回的函数void printf_back()int w; printf(nntSuccessful._nn); printf(What do you want to do?nnt1.Browse all nowt2.Back: bb); scanf(%d,&w); if(w=1) browse(); /*调用浏览函数*/ else menu(); /*调用菜单函数*/五上机操作下面是各个模块的界面图: (1)主菜单函数 (2)输入模块在主界面出现后输入A回车后看到下图:输入要输入的记录数然后输入,如下图:(3)添加模块(4)修改模块(5)删除模块(6)修改成绩模块(7)排序模块下面附上本次课程设计的源代码,不足之处请老师指正;#include#include#include#include#include#include#define N 27void menu();void add();void enter();void modify();void del();void modify_score();void browse();void order();void save(int n);int load();void no_input(int i,int n);void enter_score(int i);void sum(int i);void input(int i);int modify_score1(int i);int modify_data(int i,int n);void printf_face();void printf_one(int i);void printf_back(); struct student int num; char name20; int age; int Math; int English; int Physical; long int sum;stuN;/*stuN中每个数组元素对应一个学生*/ void main() /*主函数*/ menu();void menu() /*主界面*/ int w1; char n; /*.变量n保存选择菜单数字,w1判断输入的数字是否在功能菜单对应数字范围内*/ do puts(tt*MENU*nn); puts(ttttA.Enter new data); puts(ttttB.Addition data); puts(ttttC.Modify data); puts(ttttD.Delete data); puts(ttttE.Modify score); puts(ttttF.Order by number); puts(ttttG.Browse all); puts(ttttH.Exit); puts(nntt*n); printf(Choice your number(A-H): bb); n=getchar(); printf(n); if(nH) w1=1; /*对选择的数字作判断*/ else w1=0; while(w1=1); switch(n) /*选择功能*/ case A:enter();break; /*输入模块*/ case B:add();break; /*添加模块*/ case C:modify();break; /*修改数据模块*/ case D:del ();break; /*删除模块*/ case E:modify_score();break; /*修改成绩模块*/ case F:order();break; /*排序模块*/ case G:browse();break; /*浏览模块*/ case H:exit(0); /*退出模块*/ /*输入模块*/void enter() /*输入模块*/ int i,n; printf(How many students(1-%d)?:,N); scanf(%d,&n); /*要输入的记录个数*/ printf(nEnter data nownn); for(i=0;in;i+) printf(n Input %dth student record.n,i+1); input(i); /*调用输入函数*/ if(i!=0) save(n); /*调用保存函数*/ printf_back(); /*一个任务结束时让用户选择是浏览还是返回*/ /*添加模块*/void add() /*添加模块*/ int i,n,m,k; FILE *fp; n=load(); printf(How many students are you want to add(1-%d)?:,N-n); scanf(%d,&m); /*输入要添加的记录个数*/ k=m+n; for(i=n;ik;i+) printf(n Input %dth student record.n,i+1); input(i); /*调用输入函数*/ if(fp=fopen(score.txt,ab)=NULL) /*以ab方式打开文件,添加保存*/ printf(Cannot open file.n); for(i=n;ik;i+) /*输出到文件*/ if(fwrite(&stui,sizeof(struct student),1,fp)!=1) printf(file write error.n); fclose(fp); printf_back(); /*一个任务结束时的选择浏览还是返回*/*修改模块*/void
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 建筑工程设计优化及技术咨询服务合同
- 观革命电影有感450字14篇
- 直接引语和间接引语的转换技巧:初中英语课程教案
- 纪检委员培训课件
- 人教版八年级英语上册Unit 5完形填空专题复习练习题(含答案解析)
- 唐诗三百首鉴赏与实践教学方案
- 工业园区招商合同
- 早教课件在家听
- 企业间知识产权保护与交易合作合同
- 纪念塔课件教学课件
- GB/T 242-2007金属管扩口试验方法
- 政治理论水平任职资格考试题库
- Unit 2 Lets celebrate Developing ideas-Writing a letter to express 课件【知识精讲+拓展训练】高中英语外研版(2019)必修第二册
- 路基压实度汇总表
- 【食品生产加工技术】香肠的加工技术
- 图标设计与制作PPT完整全套教学课件
- 贫困户访谈记录
- 道路喷雾降尘方案
- 唐恬人世间的孤勇者与追光者
- 数学基础模块上册课件
- 智慧羊场建设方案 智慧养殖监管系统解决方案
评论
0/150
提交评论