C语言课程设计总结报告学生考勤系统设计_第1页
C语言课程设计总结报告学生考勤系统设计_第2页
C语言课程设计总结报告学生考勤系统设计_第3页
C语言课程设计总结报告学生考勤系统设计_第4页
C语言课程设计总结报告学生考勤系统设计_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

1、C语言程序设计课程设计报告设计题目:学生考勤系统设计专业自动化班 级 自动化071学生朱胜佳指导教师梁德胜彫禺銘丿A字2008 年春季学期设计任务:C语言课程设计任务书10题目:学生考勤系统设计功能:学生考勤系统应包含各班学生的全部信息。 每个学生是一条记录,包 括姓名、性别、学号、日期、节次、出勤情况等信息。本系统可以模拟考勤 过程、记录考勤结果,并能在课程结束后按照设定的考勤评分标准自动给出 每个学生的考勤分数。要求:1、用C语言实现程序设计;2、利用结构体进行相关信息处理;3、系统的各个功能模块要求用函数的形式实现;4、界面友好(良好的人机交互),程序加必要的注释。平时成绩:验收答辩成绩

2、:设计报告成绩:总评成绩:指导教师:、总体设计1程序的总体设计确定界面,使用户可选择操作项目(录入,修改,查询,评 分)。录入功能:使用结构体,要求用户输入姓名、性别、学号、日 期、节次、当前出勤情况等信息,并写入文件。修改功能: 使用户输入学号, 姓名其中一项可以修改考勤其信 息。对于修改功能的实现,是先将所有文件内容读入到内存中,然 后修改考勤值,最后再重新覆盖写入文件。查询模块: 使用字符串比较函数, 利用循环找到对应结构体数 组元素,然后输出需要信息。对于查询功能的实现,同修改,是先 将所有文件内容读入到内存中,然后查找到其中某项,最后输出到 屏幕。评分模块: 系统根据总的应道考勤数按

3、照百分制, 求出每个学 生的分数,并输出到屏幕。2. 数据结构学生信息用结构体记录,包括姓名(字符数组) 、性别(字 符型)、日期(年月日三个字符数组) 、节次(整型)、出情况(整型)363. 函数原型声明void mai n()/void record();/void ame nd();/void search();/void goal(); /、详细设计主函数录入数据函数修改数据函数查询数据函数计算总评函数void mai n()void record();/void ame nd();/void search();/void goal(); / char item;printf( n);

4、printf( n);printf(系统 n);printf( n);printf(自 071 n);printf( n);printf( n);printf( n);printf(况录入 n);printf( n);1. main()函数录入数据函数修改数据函数查询数据函数计算总评函数 学生考勤管理 作者朱胜佳西安理工1.学生信息及考勤情printf(修改 n);printf( n);printf(查询 n);printf( n);printf(询 n);printf( n);printf( n); /用户界面prin tf(n);printf(scan f(%c,&item);switch

5、(item)case 1: record();break;case 2: ame nd();break;case 3: search();break;case 4: goal();break; /流程图: 2.学生信息及考勤情况 3.学生信息及考勤情况4.学生考勤总评分数查请选择您需要的操作n);实现功能选择2. record。函数void record()int i,j=O,jx=1;学生基本信息录入printf(” * *n);if(fp=fope n(date.txt,w)=NULL)printf( 文件打开失败n);exit(0);/输入信息循环输入确认循环 for(i=0;jx=1;

6、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.day);printf(请输入第(个学生的当前考勤次数,i+1);sca nf(%d, &stui.kq);prin

7、tf(您输入的信息为 姓名%s学号%s性别c生日%d年 %d 月 %d 日 n0 重输1 确认,stui. name,stui. nu mber,stui.sex,stui.year,stui.m ont h,stui.day);sca nf(%d,&j);/输入确认j=0;if(fwrite(&stui,sizeof(structstude nt),1,fp)!=1)printf(文件写入错误n);/ 写入文件printf(是否继续输入下一个学生信息0终止1继续n);sca nf(%d,&jx);/继续输入选择fclose(fp);printf(0 返回主菜单n);getchar();a=g

8、etchar();getchar();if(a=0) mai n();/返回主菜单流程图:void ame nd() int i=0,j=0,sway,t,x;char name10, nu mber10;printf(*jz改 *n);if(fp=fope n( date.txt,r)=NULL)学生考/勤修将文件内谷读入内存文件打开失败n);printf(exit(O);for(i=0;feof(fp)=0;i+) fread(&stui,sizeof(structstude nt),1,fp);/读取文件内容fclose(fp);prin tf(选择查找方式scan f(%d,&sway

9、);*/1按照姓名查找2按照姓关闭文件 按照学号查找);名查找开III*if(sway=1)printf(请输入需要修改学生的姓名);IIprin tf(i=%d,i);sca nf(%s, name); for(j=O;t!=O;j+)t=strcmp(stuj. name, name); 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-

10、1.y ear,stuj-1.mo nth,stuj-1.day,stuj-1.kq);printf(是否修改该生考 勤信息 0否 1是);II选择是否修改考勤scan f(%d, &x);II输入选择变量值if(x=1) printf(请输入新的考勤值);sca nf(%d,&stuj-1.kq);II输入新的考勤值if(fp=fope n( date.txt,w)=NULL)/以只写方式打开文件printf(文件打开失败n);按照姓名查找结束III按照学号查找开始exit(0); for(j=0;ji;j+)if(fwrite(&stuj,sizeof(struct stude nt),1

11、,fp)!=1) pri ntf(文件写入错误n);/ 写入文件fclose(fp); /关闭文件printf(是否继续修改其他学生考勤0否1是);sca nf(%d, &x);if(x=1) ame nd();*III*if(sway=2)printf(请输入需要修改学生的学号);IIprin 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)II查询成功printf(您查找的学生信息如下n姓名

12、%s学号%s性%c生日 %d年 %d月 %d日 当前考勤次数 %dn,stuj-1. name,stuj-1. nu mber,stuj-1.sex,stuj-1.y earprintf(”是否修改该生考 勤信息 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,siz

13、eof(struct student),1,fp)!=1) printf( 写入错误n);/ 写入文件fclose(fp); /关闭文件printf(是否继续修改其他学生考勤0否1是);输入文件sca nf(%d, &x); if(x=1) ame nd();*按照学号查找*/printf(0 返回主菜单n); getchar();a=getchar();getchar();if(a=0) main();N4. search()函数void search() int i=0,j=0,sway,t,x;char name10, number10;printf(*n);if(fp=fope n(d

14、ate.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);/*/if(sway=1)prin tf(请输入需要修改学生的姓名/ prin tf(i=%d,i);sca nf(%s, name); for(j=0;t!=0;j+) t=strcmp(stuj. name, name);if(j=i)/按照姓名查找学生信息查关闭文件 按照学

15、号查找);名查找开);t=0;printf( 未找到您所查询的数据,请重新输入n); if(ji)printf(别 c生日/查询成功您查找的学生信息如下n姓名%s学号%s %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);是否继续查询其他学生信息0否1sea nf(%d, &x); if(x=1) seareh();按照姓名查找结III*按照学号查找开III*if(sway=2)printf(请输入需要修改学生的学号);IIprin

16、 tf(i=%d,i);sea 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)II查询成功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(是否继续查询其他学生信息0

17、否1是);sea nf(%d, &x);if(x=1) seareh();按照学号查找结束*IIIprintf(0 返回主菜单n); getchar();a=getchar();getehar();if(a=0) main();流程图:输入sway值选择查找方式5. goal()函数void goal() int i=0,j=0,sway,t,x; float score;char name10, nu mber10;printf(*学生考勤分数计算*n);if(kqcs=O)printf(”请输入应到考勤总数);/scan f(%f,&kqcs);if(fp=fope n( date.txt

18、,广)=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(j=0;t!=0;j+) t=strcmp(stuj. name,

19、 name);if(j=i)t=0;if(ji)printf(%c生日printf( 未找到您所查询的数据,请重新输入n);/查询成功您查找的学生信息如下n姓名%s学号%s性 %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);score=(stuj-1.kq)/kqcs*100;该生当前考勤分数为printf(是否继续计算其他学生考勤分数0否1是);sea nf(%d, &x);if(x=1) goal();名查找结/*/学号

20、查找开/*/if(sway=2)II);prin tf(请输入需要修改学生的学号/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; if(ji)printf(别 c生日/查询成功printf( 未找到您所查询的数据,请重新输入n);您查找的学生信息如下n姓名%s学号%s%d年%d月 %d 日 当前 数 %dn,stuj-1. name,stuj-1. nu mber,stuj-1.sex,stuj-1.y ear,stuj-1.mo nth,stuj-

21、1.day,stuj-1.kq);score=(stu|j-1.kq)/kqcs*100; printf( 该生当前考勤分数为5.2f,score);是);printf(是否继续计算其他学生考勤分数0否1sca nf(%d, &x);if(x=1) goal();按照学号查/*/printf(0 返回主菜单n);a=getchar();getchar();if(a=0) main(); 流程图:输出该生信息*T计算考勤分数1T输出考勤分/数结束三、测试及调试(测试方案、存在的问题及解决方法)测试方案:按照每个函数功能进行测试,在做完每个函数对其进行 测试,主函数测试,先将所有需要的功能模块函数

22、设置为空,每个 函数用一个printf 语句来测试主函数。1. 存在问题:开始将生日定义为字符数组,当用scanf来输入年月日时,年月日之间用空格分隔,但在输出时发现年月日出现错误。分析原因:用scanf输入年月日时,系统会把用来分隔的空格当做字符读入。解决方法:将年月日定义为整型,这样就可以用 scanf输入,用空格隔开。2. 存在问题2:在查找数据时,需要先将所有数据读入一个结构体数组,在读取后未关闭文件,执行查找时查找不到相关信息。分析原因:再利用for循环读取全部文件内容后,文件指针将会移至文件末 尾,这样再执行查找时就会从文件末尾开始, 显然不符合要求,所以会出现 错误。解决方法:在

23、读取完数据后先关闭文件,在查找时再次打开文件,这时文件 指针就会指向文件开头。3. 存在问题3:再多个使用getchar或者gets输入的时候,会出现直接跳过 输入的情况。分析原因:在使用getchar或者gets输入的时候,系统会将前一步用来确 认执行的回车当成字符读入,导致跳过该步输入。解决方法:再getchar或者gets前面加上getchar()语句,读掉回车,下 面的getchar或者gets就可以正常输入。四、小结通过编写该程序,熟悉了 C语言的基本语法,选择,循环等结构,深入练 习了函数的调用方法,和文件的读写方法,熟悉了结构体的使用,更加深化了 面向过程语言思想,和一些基本算法

24、。通过对程序的后期调试,熟悉了 C常见错误,锻炼了思维的严密性,和完 备性。通过对程序的注释和画流程图,形成了一套自己编程的风格,和清晰地思 路,使思维更加条理化,清晰化。附件:主要源程序代码(需打印)#i nclude#i ncludevstri ng.h#i ncludeFILE *fp;/定义文件char a;返回选择变量float kqcs=0;应到考勤次数变量struct stude nt char n ame10;char nu mber11;char sex;int year;int mon th;int day;int kq;stu100;/定义储存学生信息的结构体数组主函数开

25、女台 *void mai n()void record();/录入数据函数void ame nd();/修改数据函数void search();/查询数据函数void goal();计算总评函数char item;printf(n);prin tf( n);printf( 学生考勤管理系统 n);printf( n);printf(作者朱胜佳西安理工自071 n); n);printf(printf(n); n);printf(printf(1.学生信息及考勤情况录入 n); n);printf(printf(2.学生信息及考勤情况修改 n); n);printf(printf(3.学生信息及

26、考勤情况查询 n); n);printf( n);printf(4.学生考勤总评分数查询 n);printf(printf( n);/用户界面prin tf(n);printf(scan f(%c,&item); switch(item)case 1: record();break; case 2: ame nd();break; case 3: search();break;case 4: goal();break;请选择您需要的操作n);*/实现功能选择*主P函数结*束录入数据函数内*容开始*void record()int i,j=O,jx=1;学生基本信息录r 尸;r*n);if(fp

27、=fope n( date.txt,w)=NULL)printf(文件打开失败n);exit(O);for(i=0;jx=1;i+)输入信息循环for(;j=O;)输入确认循环getchar();printf(请输入第%d个学生的姓名,i+1); gets(stui. name);printf(请输入第%d个学生的学号,i+1); gets(stui. nu mber);printf(请输入第%d个学生的性别(男:m女:f) ,i+1);stui.sex=getchar();printf(请输入第%d个学生的生日(格式:年 月 日),i+1); scan f(%d%d%d,&stui.year

28、,&stui.mo nth,&stui.day);printf(请输入第%d个学生的当前考勤次数,i+1);scan f(%d,&stui.kq);printf(您输入的信息为姓名 s学号 %s性别 c生日%d年 %d 月 %d 日 n0 重 输1 确 认,stui. name,stui. nu mber,stui.sex,stui.year,stui.m on th,stui.day);scan f(%d,&j);/ 输入确认j=0;if(fwrite(&stui,sizeof(struct student),1,fp)!=1) printf(文件写入错误n);写入文件printf(是否继续

29、输入下一个学生信息0终止 1继续n);scan f(%d,&jx);/继续输入选择fclose(fp);printf(0返回主菜单n);getchar();a=getchar();getchar();III*录入数据函数内II返回主菜单if(a=O) mai n();容结束III*修改数据函数内*容开始*void ame nd() int i=0,j=0,sway,t,x; char name1O, nu mber10;printf(*n);if(fp=fope n( date.txt,r)=NULL)学生考勤修改II将文件内容读入内存printf(文件打开失败n);exit(O);for(i

30、=0;feof(fp)=0;i+)/读取文件内容fread(&stui,sizeof(structstude nt),1,fp);fclose(fp);printf(选择查找方式 scan f(%d,&sway);*1按照姓名查找按照II关闭文件2按照学号查找);姓名查找开III*if(sway=1)printf(请输入需要修改学生的姓名);IIprin tf(i=%d,i);scan f(%s, name);for(j=0;t!=0;j+)t=strcmp(stuj. name, name);if(j=i)t=0;printf(未找到您所查询的数据,请重新输入n);if(ji)II查询成功p

31、rintf(您查找的学生信息如下n姓名%s学号%s性别%c生 日%d 年 %d 月 %d 日当 前考 勤次数 dn-1.day,stuj-1.kq);printf(是否修改该生考勤信息0否1是);选择是否修改考勤scan f(%d, &x);输入选择变量值if(x=1)printf(请输入新的考勤值);scan f(%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 student)

32、,1,fp)!=1) printf(文件写入错误n);/写入文件*fclose(fp);/ 关闭文件printf(是否继续修改其他学生考勤0否scan f(%d, &x); if(x=1) ame nd();/*按照姓八、/丄1 是);名查/按照学号查*/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)pri

33、ntf(您查找的学生信息如下n姓名%s学号%s性别%c生 日%d 年 %d 月 %d 日当 前考 勤次数 %dn,,stuj-1.number,stuj-1.sex,stuj-1.year,stuj-1.month,stuj -1.day,stuj-1.kq);printf(是否修改该生考勤信息0否1是);选择是否修改考勤输入选择变量值scan f(%d, &x);if(x=1) printf(请输入新的考勤值);scan f(%d,&stuj-1.kq);if(fp=fope n(date.txt,w)=NULL)输入新的考勤值/以只写方式打开文printf(文件打开失

34、败n); exit(0);for(j=0;ji;j+) if(fwrite(&stuj,sizeof(struct student),1,fp)!=1) printf(文件写入错误n);/写入文件fclose(fp);/ 关闭文件printf(是否继续修改其他学生考勤0否scan f(%d, &x); if(x=1) ame nd();/*/printf(0返回主菜单n);getchar();a=getchar();getchar();if(a=0) main();/*容结束 */*容开女台 *void search() int i=0,j=0,sway,t,x;char name10, nu

35、mber10;printf(*n);1 是);查找结束修改数据函数内查询数据函数内生信息查询/将文件内谷读if(fp=fope n( date.txt,r)=NULL)入内存printf(文件打开失败n);exit(0);fread(&stui,sizeof(structstude nt),1,fp);for(i=0;feof(fp)=0;i+)读取文件内容fclose(fp);printf(选择查找方式 scan f(%d,&sway);*/关闭文件1按照姓名查找2按照学号查找);按照姓名查找开/*if(sway=1)printf(请输入需要修改学生的姓名);/prin tf(i=%d,i)

36、;scan f(%s, name);for(j=0;t!=0;j+)t=strcmp(stuj. name, name);if(j=i)t=0;printf(未找到您所查询的数据,请重新输入n);if(ji)/查询成功printf(您查找的学生信息如下n姓名%s学号%s性别%c生 日%d 年 %d 月 %d 日当 前考 勤次数 %dn,,stuj-1.number,stuj-1.sex,stuj-1.year,stuj-1.month,stuj-1.day,stuj-1.kq);printf(是否继续查询其他学生信息 scan f(%d, &x);if(x=1) sear

37、ch();0否1 是);昭八、姓i/*按名查找结束*/*/按昭八、学号查找开始printf(请输入需要修改学生的学号);/prin tf(i=%d,i);sea 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)/查询成功printf(您查找的学生信息如下n姓名%s学号%s性别%c生 日%d 年 %d 月 %d 日当 前考 勤次数 %dn,,stuj-1.number,stuj-1.sex,stuj-1.year,stuj-1.month,stuj -1.day,stuj-1.kq);printf(是否继续查询其他学生信息0否scan f(%d, &x); if(x=1) search();/*/printf(0返回主菜单n);getchar();a=getchar();getchar();if(a=0) main();/*容结束 */*数内容*void goal() int i=0,j=0,sway,t,x;float score;char name10,

温馨提示

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

评论

0/150

提交评论