版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C语言程序设计课程设计报告设计题目:学生考勤系统设计专业微电子科学与工程班级微电 131学生赵杨怡指导教师 貶禺耗丿禺字年学期设计任务: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 search(); / void evaluate(); / char item;sy
4、stem("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&quo
5、t;);printf("2.学生信息及考勤情况修改 n");printf(" n");printf("3.学生信息及考勤情况查询 n");printf(" n");printf("4.学生考勤总评分数查询 n");printf(" n");printf(" n");/ 用户界面prin tf("n");printf("请选择您需要的操作n");scan f("%c",&item);swit
6、ch(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) printf(" 文件打开失败n");exit(0)
7、;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",&am
8、p;stui.year,&stui.mo nth,&stui.day);printf("请输入第(个学生的当前考勤次数",i+1);sca nf("%d", &stui.kq);printf(" 您输入的信息为 姓名%s学号%s性别c生日%d 年 %d 月 %d 日 n0 重输1 确认",stui. name,stui. nu mber,stui.sex,stui.year,stui.m onth,stui.day);sca nf("%d",&j);/输入确认j=0;if(fwrit
9、e(&stui,sizeof(structstude nt),1,fp)!=1)printf("文件写入错误n");/ 写入文件printf("是否继续输入下一个学生信息0终止1继续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值选择是否继
10、续/输入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)件内容读入内存学生考勤修/将文printf(" 文件打开失败n"); exit(0);for(i=0;feof(fp)=0;i+)fread(&stui,sizeof(s
11、tructstude nt),1,fp);/读取文件内容fclose(fp);prin tf("选择查找方式scan f("%d",&sway);*/1按照姓名查找2按照姓关闭文件 按照学号查找");名查找开III*if(sway=1)printf("请输入需要修改学生的姓名");IIprin 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("
12、;未找到您所查询的数据,请重新输入n");if(j<i)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("请输入新的考勤
13、值"); sca nf("%d", &stuj-1.kq);/新的考勤值if(fp=fope n( "date.txt","w")=NULL)/以只写方式打开文件printf("文件打开失败n");exit(0);for(j=0;j<i;j+)if(fwrite(&stuj,sizeof(struct student),1,fp)!=1) printf(" 写入错误n");/写入文件fclose(fp); /关闭文件printf("是否继续修改其他学生考
14、勤0否1是");sca nf("%d", &x);if(x=1) cha nge();*按照姓名查找*III按照学号查找%s性勤次是");输入文件结束开始*IIIif(sway=2)printf("请输入需要修改学生的学号"); 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(" 未找到您所查询的数据,请重
15、新输入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("是否修改该生考 勤信息 0否 1是");/选择是否修改考勤scan f("%d", &x);/输入选择变量值if(x=1)printf("请输入新的考勤值&quo
16、t;);sca nf("%d",&stuj-1.kq);/输入新的考勤值if(fp=fope n( "date.txt","w")=NULL)/以只写方式打开文件printf("文件打开失败n");exit(0); for(j=0;j<i;j+) if(fwrite(&stuj,sizeof(struct stude nt),1,fp)!=1) pri ntf("文件写入错误n");/ 写入文件fclose(fp); /关闭文件printf("是否继续修改其他学生
17、考勤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&quo
18、t;,"r")=NULL)文件内容读入内存学生信息查询/将printf("文件打开失败n");exit(0);for(i=0;feof(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
19、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(j<i)II查询成功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,
20、stuj-1.day,stuj-1.kq);printf("是否继续查询其他学生信息0否1是");sca nf("%d", &x); if(x=1) search();*照姓名查找*III按照学号查找开性次束始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;pr
21、intf(" 未找到您所查询的数据,请重新输入n");if(j<i)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) search();按照 学
22、号查 找结束*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("请输入应
23、到考勤总数);scan f("%f",&kqcs);if(fp=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);/*
24、/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, name);if(j=i)t=0;printf(" 未找到您所查询的数据,请重新输入n"); if(j<i) printf("别 c生日/查询成功您查找的学生信息如下n%d年%d月 %d 日姓名 %s学号%s性 当前
25、考勤次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("是否继续计算其他学生考勤分数0否1是");sca nf("%d", &x); if(x=1) evaluate。;*按照姓名查找结束*/按照学号查找开始/*if(sway=2)printf(&q
26、uot;请输入需要修改学生的学号");/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(j<i)/查询成功n姓名 %s学号 %s性日 当前考勤次prin tf(" 您查找的学生信息如下%c生日 %d年%d月 %d数 %dn",stuj-1. name,stuj-1. nu mber,s
27、tuj-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
28、9;) main();流程图:输出该生信息Sway=1?Sway=2?输入sway值选择查找方式输入应到考勤次数kqcs值输入要查找 的学号输入要查 找的姓名将文件内容全部读入结构查找姓名查找学号打开文件计算考勤分数三、测试及调试(测试方案、存在的问题及解决方法)测试方案:按照每个函数功能进行测试,在做完每个函数对其进行测试,主函数测试,先将所有需要的功能模块函数设置为空,每个 函数用一个printf 语句来测试主函数。1. 存在问题:开始将生日定义为字符数组,当用scanf来输入年月日时,年月日之间用空格分隔,但在输出时发现年月日出现错误。分析原因:用scanf输入年月日时,系统会把用来分隔
29、的空格当做字符读入。解决方法:将年月日定义为整型,这样就可以用 scanf输入,用空格隔开。2. 存在问题2:在查找数据时,需要先将所有数据读入一个结构体数组,在读取后未关闭文件,执行查找时查找不到相关信息。分析原因:再利用for循环读取全部文件内容后,文件指针将会移至文件末 尾,这样再执行查找时就会从文件末尾开始, 显然不符合要求,所以会出现 错误。解决方法:在读取完数据后先关闭文件,在查找时再次打开文件,这时文件 指针就会指向文件开头。3. 存在问题3:再多个使用getchar或者gets输入的时候,会出现直接跳过 输入的情况。分析原因:在使用getchar或者gets输入的时候,系统会将
30、前一步用来确 认执行的回车当成字符读入,导致跳过该步输入。解决方法:再getchar或者gets前面加上getchar()语句,读掉回车,下面的getchar或者gets就可以正常输入。四、小结通过编写该程序,熟悉了 C语言的基本语法,选择,循环等结构,深入练 习了函数的调用方法,和文件的读写方法,熟悉了结构体的使用,更加深化了 面向过程语言思想,和一些基本算法。通过对程序的后期调试,熟悉了 C常见错误,锻炼了思维的严密性,和完 备性。通过对程序的注释和画流程图,形成了一套自己编程的风格,和清晰地思 路,使思维更加条理化,清晰化。附件:主要源程序代码(需打印)#i nclude<stdi
31、o.h> #i ncludevstri ng.h>#i nclude<stdlib.h>FILE *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;数组主函数开女台 *void mai n()void in put ();录入数据函数void cha nge();修改数据函数void search();/查询数据函
32、数void evaluate ();/计算总评函数char item;system("color 34");printf(" n"); n");printf("printf("学生考勤管理系统'"); n");printf(" n");printf("BY朱胜佳 n");printf("printf(" n");printf(" n");printf("1.学生信息及考勤情况录入 n");
33、printf(" n");printf("2.学生信息及考勤情况修改 n");printf(" n");printf("3.学生信息及考勤情况查询 n");printf(" n");printf("4.学生考勤总评分数查询 n");printf(" n");printf(" n");用户界面prin tf("n");printf(”请选择您需要的操作n");scan f("%c",&am
34、p;item);switch(item)case '1':input ();break;case '2':cha nge();break;case 3: search();break;case devaluate ();break;实现功能选择数结束*/*录入数据函数内容开始*void record()int i,j=O,jx=1;printf("*学生基本信息录入*n");if(fp=fope n( "date.txt","w")=NULL)printf("文件打开失败n");ex
35、it(0);for(i=0;jx=1;i+)输入信息循环for(;j=0;)输入确认循环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&quo
36、t;,&stui.year,&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);/ 输入确认if
37、(fwrite(&stui,sizeof(structstudent),1,fp)!=1) printf("文件写入错误n");/写入文件是否继续输入下一个学生信息0终止 1继续n");scan f("%d",&jx);fclose(fp);printf("0返回主菜单n"); getchar(); a=getchar(); getchar();if(a='0') main();/*容结士束 */继续输入选择/返回主菜单录入数据函数内/*修改数据函数内printf("容开始*void
38、 cha nge() 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;feof(fp)=0;i+)读取文件内容fread(&stui,sizeof(structstude nt),1,fp);fclose(fp);printf("选择查找方式 scan f(&quo
39、t;%d",&sway);*/关闭文件1按照姓名查找 2按照学号查找");按照姓名查找开*/if(sway=1)printf("请输入需要修改学生的姓名");/prin 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(j<i)/查询成功printf("您查找的学生信息如下n姓名%s学号%
40、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
41、( "date.txt","w")=NULL)/ 以只写方式打开文件printf("文件打开失败n");exit(0);for(j=0;j<i;j+) if(fwrite(&stuj,sizeof(struct student),1,fp)!=1) printf(" 文件写入错误n");/写入文件fclose(fp);/ 关闭文件1 是");名查号查printf("是否继续修改其他学生考勤0否scan f("%d", &x);if(x=1) cha ng
42、e();*III照八、*if(sway=2) '请输入需要修改学生的学号II/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(j<i)/查询成功printf("您查找的学生信息如下n姓名%s学号%s性别%c生 日%d 年 %d 月 %d 日当 前考 勤次数 %dn",,
43、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)/ 以只写方式打开文
44、件printf("文件打开失败n");exit(0);for(j=0;j<i;j+) if(fwrite(&stuj,sizeof(struct student),1,fp)!=1) printf(" 文件写入错误n");/写入文件fclose(fp);/ 关闭文件printf("是否继续修改其他学生考勤0否1是");scan f("%d", &x); if(x=1) cha nge();按照 学号查 找结束*返回主菜单n");getchar();a=getchar();getcha
45、r();if(a='O') main();/ / *修改数据函数内容结束/*查询数据函数内*容开始*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;feof(fp)=0;i+)读取文件内容fread(&stui,sizeof(s
46、tructstude nt),1,fp);fclose(fp);printf("选择查找方式 scan f("%d",&sway);*/关闭文件1按照姓名查找2按照学号查找");按照姓名查找开*/if(sway=1)printf("请输入需要修改学生的姓名");/ prin 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("未找到您所查询的数
47、据,请重新输入n");if(j<i)/查询成功printf("您查找的学生信息如下n姓名%s学号%s性别%c生 日%d 年 %d 月 %d 日当 前考 勤次数 %dn",,stuj-1.number,stuj-1.sex,stuj-1.year,stuj-1.month,stujprintf("是否继续查询其他学生信息 scan f("%d", &x);if(x=1) search();0否1 是");I*按昭姓八、/丄名查*111-1.day,stuj-1.kq);找结束按照学号查找开*
48、/if(sway=2)printf("请输入需要修改学生的学号");/ prin tf("i=%d",i);sca nf("%s" ,nu mber);for(j=0;t!=O;j+)t=strcmp(stuj. nu mber, nu mber);if(j=i)t=0;printf("未找到您所查询的数据,请重新输入n");if(j<i)/查询成功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否1是");scan f("%d", &x); if(x=1) search();按照 学号查 找结束*printf("O返回主菜单n");容结束a=getchar();getchar();if(a='O') main();/ / */*内容*void evaluate () int i=0,j=0,sway,t,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《孔乙己》课文教案
- PS基础工具精讲
- 86编号《电子商务安全与支付》课程教案
- 征兵知识竞赛题库及答案解析
- 《朝花夕拾》公开课展示实录
- 2024年电子商务教学教案x
- 职场入门宝典专业渗透测试题库及答案详解
- 心肺复苏知识竞赛题及答案全收录
- 应急救援模拟卷及参考答案详解
- 志愿选择策略模拟题及参考答案
- 注会-会计习题及答案
- 液碱的培训试题及答案
- 2025版国家心力衰竭诊断和治疗指南(完整版)
- 土木工程力学基础课件 项目2 平面力系的平衡
- 天然气巡线员培训
- 小学校本课程-硬笔书法教材
- 《SMT详细流程图更》课件
- 遇见白玉兰(2024年江苏盐城中考语文试卷散文阅读试题)
- 如何培养临床思维
- 提高住院病人入院宣教知晓率课件
- 水下砌砖墙封堵施工方案
评论
0/150
提交评论