1、完整word版C语言课程设计学生考勤系统方案C语言程序设计课程设计报告设计题目:学生考勤系统设计专 业微电子科学与工程班 级 微电131学 生 赵杨怡指导教师 更场弘丿A字年学期设计任务:C语言课程设计任务书10题目:学生考勤系统设计功能:学生考勤系统应包含各班学生的全部信息。 每个学生是一条记录,包 括姓名、性别、学号、日期、节次、出勤情况等信息。本系统可以模拟考勤 过程、记录考勤结果,并能在课程结束后按照设定的考勤评分标准自动给出 每个学生的考勤分数。要求:1、用C语言实现程序设计;2、 利用结构体进行相关信息处理;3、 系统的各个功能模块要求用函数的形式实现;4、 界面友好(良好的人机交
2、互),程序加必要的注释。平时成绩:验收答辩成绩:设计报告成绩:总评成绩:指导教师:一、总体设计1 程序的总体设计确定界面,使用户可选择操作项目(录入,修改,查询,评 分)。录入功能:使用结构体,要求用户输入姓名、性别、学号、日 期、节次、当前出勤情况等信息,并写入文件。修改功能:使用户输入学号,姓名其中一项可以修改考勤其信 息。对于修改功能的实现,是先将所有文件内容读入到内存中,然 后修改考勤值,最后再重新覆盖写入文件。查询模块:使用字符串比较函数,利用循环找到对应结构体数 组元素,然后输出需要信息。对于查询功能的实现,同修改,是先 将所有文件内容读入到内存中,然后查找到其中某项,最后输出到
3、屏幕。评分模块:系统根据总的应道考勤数按照百分制, 求出每个学生的分数,并输出到屏幕。2. 数据结构学生信息用结构体记录,包括姓名(字符数组)、性别(字符型)、日期(年月日三个字符数组)、节次(整型)、出情况(整型)3. 函数原型声明void mai n() / 主函数void in put(); / 录入数据函数void chan ge(); / 修改数据函数void search(); / 查询数据函数void evaluate。; / 计算总评函数、详细设计1. main()函数void mai n()void in put(); /void cha nge(); /void searc
4、h(); / void evaluate(); / char item;system(color 34); printf( n);printf( n);printf(管理系统printf( n);printf( n);录入数据函数修改数据函数查询数据函数 计算总评函数 学生考勤 BY 朱胜佳prin tf( n);prin tf( n);printf( n);printf(1.学生信息及考勤情况录入 n);printf( n);printf(2.学生信息及考勤情况修改 n);printf( n);printf(3.学生信息及考勤情况查询 n);printf( n);printf(4.学生考勤总
5、评分数查询 n);printf( n);printf( n); / 用户界面prin tf(n);printf( 请选择您需要的操作n);scan f(%c,&item);switch(item)case 1: in put();break;case 2: cha nge();break;case 3: search();break;case 4: evaluate();break; / 实现功能选择流程图:2. input ()函数void in put()int i,j=O,jx=1;printf( *学生基本信息录入*n);*if(fp=fope n(date.txt,w)=NULL)
6、printf( 文件打开失败n);exit(0);for(i=0;jx=1;i+) / 输入信息循环 for(;j=0;) / 输入确认循环getchar();printf( 请输入第4个学生的姓名,i+1);gets(stui. name);printf( 请输入第4个学生的学号,i+1);gets(stui. nu mber);printf( 请输入第d个学生的性别(男:m女:f) ,i+1);stui.sex=getchar();printf(请输入第4个学生的生日(格式:年 月 日),i+1);sca nf(%d%d%d,&stui.year,&stui.mo nth,&stui.da
7、y);printf( 请输入第(个学生的当前考勤次数,i+1);sca nf(%d, &stui.kq);printf( 您输入的信息为 姓名%s学号%s性别c生日%d 年 %d 月 %d 日 n 0 重输 1 确认,stui. name,stui. nu mber,stui.sex,stui.year,stui.m onth,stui.day);sca nf(%d,&j); / 输入确认j=0;if(fwrite(&stui,sizeof(struct stude nt),1,fp)!=1)printf( 文件写入错误n); / 写入文件printf( 是否继续输入下一个学生信息 0终止1继
8、续n);sca nf(%d,&jx); / 继续输入选择fclose(fp);printf(0 返回主菜单n);getchar();a=getchar();getchar();if(a=0) mai n(); / 返回主菜单流程图:0=jYj=0?YN8输入j值选择是否确认输入jx值选择是否继续/输入i+1个学生信i+1=i写入文件1=jx0=i开始打开文件结束3. change。函数void cha nge() int i=0,j=0,sway,t,x;char name10, nu mber10;printf(*jz改 *n);if(fp=fope n( date.txt,r)=NULL)
9、件内容读入内存学生考勤修/ 将文printf( 文件打开失败n); exit(0);for(i=0;feof(fp)=0;i+)fread(&stui,sizeof(structstude nt),1,fp); / 读取文件内容fclose(fp);prin tf( 选择查找方式scan f(%d,&sway);*/1按照姓名查找2按照姓关闭文件 按照学号查找);名查找开III*if(sway=1)printf( 请输入需要修改学生的姓名);II prin tf(i=%d,i);sca nf(%s, name);for(j=0;t!=0;j+)t=strcmp(stuj. name, name
10、);if(j=i)t=0;printf( 未找到您所查询的数据,请重新输入n);if(ji) II 查询成功printf( 您查找的学生信息如下n姓名%s学号别 c生日 %d年%d月 %d日 当前考 数 %dn,stuj-1. name,stuj-1. nu mber,stuj-1.sex,stu|j-1.y ear,stuj-1.mo nth,stuj-1.day,stu|j-1.kq);printf( 是否修改该生考 勤信息 0否 1/选择是否修改考勤scan f(%d, &x); / 输入选择变量值if(x=1)printf(请输入新的考勤值); sca nf(%d, &stuj-1.k
11、q); /新的考勤值if(fp=fope n( date.txt,w)=NULL) /以只写方式打开文件printf(文件打开失败n);exit(0);for(j=0;ji;j+)if(fwrite(&stuj,sizeof(struct student),1,fp)!=1) printf( 写入错误n); / 写入文件fclose(fp); / 关闭文件printf( 是否继续修改其他学生考勤0否1是);sca nf(%d, &x);if(x=1) cha nge();*按照姓名查找*III按照学号查找%s性勤次是);输入文件结束开始*IIIif(sway=2)printf(请输入需要修改学
12、生的学号); II prin tf(i=%d,i);sca nf(%s ,nu mber);for(j=0;t!=0;j+)t=strcmp(stuj. nu mber, nu mber);if(j=i) t=0;printf( 未找到您所查询的数据,请重新输入n);if(jvi) / 查询成功printf( 您查找的学生信息如下n姓名%s学号%s性 %c生日 %d年 %d月 %d日 当前考勤次数 %dn,stuj-1. name,stuj-1. nu mber,stuj-1.sex,stuj-1.y ear,stuj-1.mo nth,stuj-1.day,stuj-1.kq);printf
13、( 是否修改该生考 勤信息 0否 1是);/选择是否修改考勤scan f(%d, &x); / 输入选择变量值if(x=1)printf(请输入新的考勤值);sca nf(%d,&stuj-1.kq); / 输入新的考勤值if(fp=fope n( date.txt,w)=NULL) /以只写方式打开文件printf( 文件打开失败n);exit(0); for(j=0;ji;j+) if(fwrite(&stuj,sizeof(struct stude nt),1,fp)!=1) pri ntf( 文件写入错误n); / 写入文件fclose(fp); / 关闭文件printf( 是否继续修
14、改其他学生考勤0否1是);sca nf(%d, &x);if(x=1) cha nge();按照学号查找结束III*printf(O 返回主菜单n); getchar();a=getchar();getchar();if(a=O) main();输入sway值选择查找方式4. search。函数void search() int i=0,j=0,sway,t,x;char name10, nu mber10;printf(*n);if(fp=fope n( date.txt,r)=NULL)文件内容读入内存学生信息查询/ 将printf( 文件打开失败n);exit(0);for(i=0;fe
15、of(fp)=0;i+) fread(&stui,sizeof(structstude nt),1,fp); / 读取文件内容fclose(fp); / 关闭文件printf( 选择查找方式1按照姓名查找2按照学号查找);scan f(%d,&sway);*按照姓名查找开始III*if(sway=1)printf( 请输入需要修改学生的姓名);II prin tf(i=%d,i);sca nf(%s, name);for(j=0;t!=0;j+)t=strcmp(stuj. name, name); if(j=i) t=0;printf( 未找到您所查询的数据,请重新输入n);if(ji) I
16、I 查询成功printf( 您查找的学生信息如下n姓名%s学号%s%c生日 %d年%d月 %d日 当前考勤数 %dn,stuj-1. name,stuj-1. nu mber,stuj-1.sex,stu|j-1.year,stuj-1.mo nth,stuj-1.day,stuj-1.kq);printf( 是否继续查询其他学生信息0否1是);sca nf(%d, &x); if(x=1) search();*照姓名查找*III按照学号查找开性次束始III*if(sway=2)printf(请输入需要修改学生的学号);II prin tf(i=%d,i);sca nf(%s ,nu mber
17、);for(j=0;t!=0;j+)t=strcmp(stuj. nu mber, nu mber);if(j=i)t=0;printf( 未找到您所查询的数据,请重新输入n);if(ji) II 查询成功printf( 您查找的学生信息如下n姓名%s学号%s性 %c生日 %d年 %d月 %d日 当前考勤次数 %dn,stuj-1. name,stuj-1. nu mber,stuj-1.sex,stuj-1.year,stuj-1.mo nth,stuj-1.day,stuj-1.kq);printf( 是否继续查询其他学生信息0否1是);sca nf(%d, &x); if(x=1) se
18、arch();按照 学号查 找结束*III*printf(0 返回主菜单n); getchar();a=getchar();getchar();if(a=0) main();流程图:输入sway值选择查找方式Sway=1?YNSway=2?输入要查找的姓名查找姓名1F查找学号输入要查找的学号输出该生信息5. evaluate。函数void evaluate() int i=0,j=0,sway,t,x;float score;char name10, nu mber10;printf(*n);if(kqcs=0)prin tf( 请输入应到考勤总数);scan f(%f,&kqcs);if(f
19、p=fope n( date.txt,r)=NULL)读入内存printf( 文件打开失败n);学生考勤分数计算/ 请输入应到考勤总数/ 将文件内容exit(0);for(i=0;feof(fp)=0;i+)fread(&stui,sizeof(structstude nt),1,fp); / 读取文件内容fclose(fp);prin tf( 选择查找方式scan f(%d,&sway);/*/1按照姓名查找2按照姓关闭文件 按照学号查找);名查找开if(sway=1)printf( 请输入需要修改学生的姓名);/ prin tf(i=%d,i);sca nf(%s, name); for(
20、j=0;t!=0;j+)t=strcmp(stuj. name, name);if(j=i)t=0;printf( 未找到您所查询的数据,请重新输入n); if(ji) printf(别 c生日/ 查询成功您查找的学生信息如下n%d年%d月 %d 日姓名 %s学号%s性 当前考勤次printf(该生当前考勤分数为5.2f,score);数 %dn,stuj-1. name,stuj-1. nu mber,stuj-1.sex,stuj-1.y ear,stuj-1.mo nth,stuj-1.day,stuj-1.kq);score=(stuj-1.kq)/kqcs*100;printf( 是
21、否继续计算其他学生考勤分数 0否1是);sca nf(%d, &x); if(x=1) evaluate。;*按照姓名查找结束*/按照学号查找开始/*if(sway=2)printf(请输入需要修改学生的学号);/ prin tf(i=%d,i);sca nf(%s ,nu mber);for(j=0;t!=0;j+)t=strcmp(stuj. nu mber, nu mber);if(j=i) t=0;printf( 未找到您所查询的数据,请重新输入n);if(ji)/查询成功n姓名 %s学号 %s性日 当前考勤次prin tf( 您查找的学生信息如下%c生日 %d年%d月 %d数 %dn
22、,stuj-1. name,stuj-1. nu mber,stuj-1.sex,stuj-1.y ear,stuj-1.mo nth,stuj-1.day,stuj-1.kq);score=(stuj-1.kq)/kqcs*100;printf( 该生当前考勤分数为5.2f,score);printf( 是否继续计算其他学生考勤分数 0否1是);sca nf(%d, &x);if(x=1) evaluate。;按照学号查找结束/*printf(0 返回主菜单n); getchar();a=getchar();getchar();if(a=0) main();流程图:输出该生信息Sway=1?
23、Sway=2?输入sway值选择查找方式输入应到考勤次数kqcs值输入要查找 的学号输入要查 找的姓名将文件内容全部读入结构查找姓名查找学号打开文件计算考勤分数三、测试及调试(测试方案、存在的问题及解决方法)测试方案:按照每个函数功能进行测试,在做完每个函数对其进行测试,主函数测试,先将所有需要的功能模块函数设置为空,每个 函数用一个printf 语句来测试主函数。1. 存在问题:开始将生日定义为字符数组,当用scanf来输入年月日时,年月日之间用空格分隔,但在输出时发现年月日出现错误。分析原因:用scanf输入年月日时,系统会把用来分隔的空格当做字符读入。解决方法:将年月日定义为整型,这样就
24、可以用 scanf输入,用空格隔开。2. 存在问题2:在查找数据时,需要先将所有数据读入一个结构体数组,在读取后未关闭文件,执行查找时查找不到相关信息。分析原因:再利用for循环读取全部文件内容后,文件指针将会移至文件末 尾,这样再执行查找时就会从文件末尾开始, 显然不符合要求,所以会出现 错误。解决方法:在读取完数据后先关闭文件,在查找时再次打开文件,这时文件 指针就会指向文件开头。3. 存在问题3:再多个使用getchar或者gets输入的时候,会出现直接跳过 输入的情况。分析原因:在使用getchar或者gets输入的时候,系统会将前一步用来确 认执行的回车当成字符读入,导致跳过该步输入。解决方法:再getchar或者gets前面加上getchar()语句,读掉回车,下面的getchar或者gets就可以正常输入。四、小结通过编写该程序,熟悉了 C语
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1