1、设计报告成绩:总评成绩:指导教师:一、总体设计1程序的总体设计 确定界面,使用户可选择操作项目(录入,修改,查询,评分)。 录入功能:使用结构体,要求用户输入姓名、性别、学号、日期、节次、当前出勤情况等信息,并写入文件。 修改功能:使用户输入学号,姓名其中一项可以修改考勤其信息。对于修改功能的实现,是先将所有文件内容读入到内存中,然后修改考勤值,最后再重新覆盖写入文件。 查询模块:使用字符串比较函数,利用循环找到对应结构体数组元素,然后输出需要信息。对于查询功能的实现,同修改,是先将所有文件内容读入到内存中,然后查找到其中某项,最后输出到屏幕。 评分模块:系统根据总的应道考勤数按照百分制,求出
2、每个学生的分数,并输出到屏幕。2. 数据结构学生信息用结构体记录,包括姓名(字符数组)、性别(字符型)、日期(年月日三个字符数组)、节次(整型)、出情况(整型)。3. 函数原型声明 void main() /主函数void input(); /录入数据函数 void change(); /修改数据函数 void search(); /查询数据函数 void evaluate(); /计算总评函数二、详细设计1.main( )函数void main() void input(); char item; system(color 34);printf( n printf( n 学 生 考 勤 管
3、理 系 统 n BY 朱胜佳 n 1.学生信息及考勤情况录入 n 2.学生信息及考勤情况修改 n 3.学生信息及考勤情况查询 n n 4.学生考勤总评分数查询 n n /用户界面 printf(n 请选择您需要的操作n scanf(%c,&item); switch(item) case 1: input();break;2 change();3 search();4 evaluate(); /实现功能选择 流程图:2. input() 函数void input() int i,j=0,jx=1; *学 生 基 本 信 息 录 入*n if(fp=fopen(date.txt,w)=NULL)
4、 printf(文件打开失败n exit(0); for(i=0;jx=1;i+) /输入信息循环 for(;j=0;) /输入确认循环 getchar();请输入第%d个学生的姓名 ,i+1); gets(stui.name);请输入第%d个学生的学号 gets(stui.number);请输入第%d个学生的性别(男:m 女:f) stui.sex=getchar();请输入第%d个学生的生日(格式:年 月 日) scanf(%d%d%dstui.year,&stui.month,&stui.day);请输入第%d个学生的当前考勤次数 %dstui.kq);您输入的信息为 姓名 %s 学号
5、%s 性别 %c 生日 %d年%d月%d日n 0 重输 1 确认,stui.name,stui.number,stui.sex,stui.year,stui.month,stui.day);j); /输入确认 j=0; if(fwrite(&stui,sizeof(struct student),1,fp)!=1) printf(文件写入错误n /写入文件 是否继续输入下一个学生信息 0 终止 1 继续njx); /继续输入选择 fclose(fp);0 返回主菜单n getchar(); a=getchar(); if(a=0) main(); /返回主菜单 Y3. change()函数vo
6、id change() int i=0,j=0,sway,t,x; char name10,number10; *学 生 考 勤 修 改*nr)=NULL) /将文件内容读入内存feof(fp)=0;i+) fread(&stui,sizeof(struct student),1,fp); /读取文件内容 /关闭文件选择查找方式 1 按照姓名查找 2 按照学号查找sway); /*按照姓名查找开始*/ if(sway=1)请输入需要修改学生的姓名 / printf(i=%d,i);%s,name); for(j=0;t!=0;j+) t=strcmp(stuj.name,name); if(j
7、=i) t=0; printf(未找到您所查询的数据,请重新输入n if(ji) /查询成功您查找的学生信息如下n 姓名 %s 学号 %s 性别 %c 生日 %d年%d月%d日 当前考勤次数 %dn,stuj-1.name,stuj-1.number,stuj-1.sex,stuj-1.year,stuj-1.month,stuj-1.day,stuj-1.kq);是否修改该生考勤信息 0 否 1 是 /选择是否修改考勤x); /输入选择变量值 if(x=1)请输入新的考勤值 scanf(stuj-1.kq); /输入新的考勤值 if(fp=fopen()=NULL) /以只写方式打开文件 f
8、or(j=0;ji;j+) if(fwrite(&stuj,sizeof(struct student),1,fp)!是否继续修改其他学生考勤 0 否 1 是 if(x=1) change(); /*按照姓名查找结束*/ /*按照学号查找开始*/ if(sway=2)请输入需要修改学生的学号 ,number); t=strcmp(stuj.number,number); /*按照学号查找结束*/4. search()函数void search() *学 生 信 息 查 询*n是否继续查询其他学生信息 0 否 1 是 if(x=1) search(); /*按照姓名查找结束*/ 流程图:5. e
9、valuate()函数 void evaluate() float score; *学 生 考 勤 分 数 计 算*n if(kqcs=0)请输入应到考勤总数 /请输入应到考勤总数%fkqcs); score=(stuj-1.kq)/kqcs*100;该生当前考勤分数为 %5.2f,score);是否继续计算其他学生考勤分数 0 否 1 是 if(x=1) evaluate(); score=(stuj-1.kq)/kqcs*100;三、测试及调试(测试方案、存在的问题及解决方法)测试方案:按照每个函数功能进行测试,在做完每个函数对其进行测试,主函数测试,先将所有需要的功能模块函数设置为空,每
10、个函数用一个printf语句来测试主函数。1.存在问题:开始将生日定义为字符数组,当用scanf来输入年月日时,年月日之间用空格分隔,但在输出时发现年月日出现错误。分析原因:用scanf输入年月日时,系统会把用来分隔的空格当做字符读入。解决方法:将年月日定义为整型,这样就可以用scanf输入,用空格隔开。2.存在问题2:在查找数据时,需要先将所有数据读入一个结构体数组,在读取后未关闭文件,执行查找时查找不到相关信息。再利用for循环读取全部文件内容后,文件指针将会移至文件末尾,这样再执行查找时就会从文件末尾开始,显然不符合要求,所以会出现错误。在读取完数据后先关闭文件,在查找时再次打开文件,这时文件指针就会指向文件开头。3.存在问题3:再多个使用getchar或者gets输入的时候,会出现直接跳过输入的情况。在使用getchar或者gets输入的时候,系统会将前一步用来确认执行的回车当成字符读入,导致跳过该步输入。再getchar或者gets前面加上getchar()语句,读掉回车,下面的getchar或者gets就可以正常输入。四、小结通过编写该程序,熟悉了C语言的基本语法,选择,循环等结构,深入练习了函数的调用方法,和文件的读写方法,熟悉了结构体的使用,更加深化了面向过程语言思想,和一些基本算法。通过对程序的后期调试,熟悉了C常见错误,锻炼了思维的严密性,和完备性。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1