C语言课程设计学生考勤系统12115.docx
C语言程序设计课程设计报报告设计题目:学生考勤勤系统设计计专 业微电电子科学与与工程班 级微电电131 学 生赵 杨 怡怡指导教师 年 学期设计任务:C语言课课程设计任任务书100题目:学生生考勤系统统设计功能:学生生考勤系统统应包含各各班学生的的全部信息息。每个学学生是一条条记录,包包括姓名、性性别、学号号、日期、节节次、出勤勤情况等信信息。本系系统可以模模拟考勤过过程、记录录考勤结果果,并能在在课程结束束后按照设设定的考勤勤评分标准准自动给出出每个学生生的考勤分分数。要求:1、用用C语言实实现程序设设计;2、利用结结构体进行行相关信息息处理;3、系统的的各个功能能模块要求求用函数的的形式实现现;4、界面友友好(良好好的人机交交互),程程序加必要要的注释。平时成绩:验收答辩成成绩:设计报告成成绩:总评成绩:指导教师:一、总体设设计1程序的的总体设计计确定界面面,使用户户可选择操操作项目(录录入,修改改,查询,评评分)。录入功能能:使用结结构体,要要求用户输输入姓名、性性别、学号号、日期、节节次、当前前出勤情况况等信息,并并写入文件件。 修改功能能:使用户户输入学号号,姓名其其中一项可可以修改考考勤其信息息。对于修修改功能的的实现,是是先将所有有文件内容容读入到内内存中,然然后修改考考勤值,最最后再重新新覆盖写入入文件。查询模块块:使用字字符串比较较函数,利利用循环找找到对应结结构体数组组元素,然然后输出需需要信息。对对于查询功功能的实现现,同修改改,是先将将所有文件件内容读入入到内存中中,然后查查找到其中中某项,最最后输出到到屏幕。评分模块块:系统根根据总的应应道考勤数数按照百分分制,求出出每个学生生的分数,并并输出到屏屏幕。2. 数据据结构学生信息用用结构体记记录,包括括姓名(字字符数组)、性性别(字符符型)、日日期(年月月日三个字字符数组)、节节次(整型型)、出情情况(整型型)。3. 函数数原型声明明 voiid maain() /主函数void inpuut(); /录入数数据函数void channge(); /修修改数据函函数void searrch(); /查询询数据函数数void evalluatee(); /计算算总评函数数二、详细设设计1.maiin( )函数void mainn()void inpuut(); /录入数数据函数void channge(); /修修改数据函函数void searrch(); /查询询数据函数数void evalluatee(); /计算算总评函数数 cchar itemm; ssysteem("ccolorr 34"");printtf(" n");printtf(" n");printtf(" 学 生生 考 勤 管 理理 系 统 n");printtf(" n");printtf(" BYY 朱胜佳佳 n");printtf(" n");printtf(" n");printtf(" n");printtf(" 11.学生信信息及考勤勤情况录入入 n");printtf(" n");printtf(" 22.学生信信息及考勤勤情况修改改 n");printtf(" n");printtf(" 33.学生信信息及考勤勤情况查询询 n");printtf(" n");printtf(" 44.学生考考勤总评分分数查询 n");printtf(" n");printtf(" n"); /用用户界面printtf("n");printtf(" 请请选择您需需要的操作作n");scanff("%cc",&iitem); sswitcch(ittem) caase ''1': inpuut();breaak; caase ''2': channge();breeak; caase ''3': searrch();breeak; caase ''4': evalluatee();bbreakk; /实现功能能选择流程图:开 始1breakgoal()search()amend()record()432switch(item) switch(item)switch(item)输出界面结束2.inpput() 函数void inpuut()int ii,j=00,jx=1;printtf(" *学 生 基 本 信 息 录 入*n");if(ffp=foopen("datte.txxt",""w")=NUULL)printtf("文文件打开失失败n""); eexit(0);for(ii=0;jjx=11;i+) /输入信息息循环 ffor(;j=00;) /输输入确认循循环getchhar();printtf("请请输入第%d个学生生的姓名 ",i+1);gets(stui.nname);printtf("请请输入第%d个学生生的学号 ",i+1);gets(stui.nnumbeer);printtf("请请输入第%d个学生生的性别(男:m 女:f) ",ii+1);stuii.seex=geetchaar();printtf("请请输入第%d个学生生的生日(格式:年年 月 日日) ",i+1);scanff("%dd%d%dd",&sstuii.yeear,&&stui.mmonthh,&sttui.dayy); pprinttf("请请输入第%d个学生生的当前考考勤次数 ",i+1);scanff("%dd",&sstuii.kqq);printtf("您您输入的信信息为 姓姓名 %ss 学号 %s 性性别 %cc 生日 %d年%d月%dd日n 0 重重输 1 确认",stui.nname,stui.nnumbeer,sttui.sexx,stuui.yearr,stuui.montth,sttui.dayy);scanff("%dd",&jj); /输入确认认 jj=0; iif(fwwritee(&sttui,sizzeof(struuct sstudeent),1,fpp)!=11) prrintff("文件件写入错误误n"); /写写入文件printtf(" 是否继续续输入下一一个学生信信息 0 终止 1 继续续n");scanff("%dd",&jjx); /继续输入入选择fclosse(fpp); pprinttf("00 返回主主菜单nn");getchhar();a=gettcharr();getchhar();if(a='0'') maain(); /返回回主菜单流程图:开始0=>j打开文件1=>jx0=>ijx=1?Yj=0?Y输入i+1个学生信息生信息N输入j值选择是否确认写入文件i+1=>i输入jx值选择是否继续结束3.chaange()函数void channge() iint ii=0,jj=0,ssway,t,x; cchar namee10,nummber10;printtf(" *学 生 考 勤 修 改*n""); iif(ffp=foopen("datte.txxt",""r")=NUULL) /将文文件内容读读入内存printtf("文文件打开失失败n""); eexit(0);for(ii=0;ffeof(fp)=0;ii+) freaad(&sstuii,siizeoff(strruct studdent),1,ffp); /读取文文件内容fclosse(fpp); /关闭文件件printtf("选选择查找方方式 1 按照姓名名查找 2 按照照学号查找找");scanff("%dd",&ssway); /*按照姓名名查找开始始*/if(swway=1)printtf("请请输入需要要修改学生生的姓名 ");/priintf("i=%d",ii);scanff("%ss",naame);for(jj=0;tt!=0;j+) tt=strrcmp(stuj.nname,namee);if(j=i) t=0;printtf("未未找到您所所查询的数数据,请重重新输入n");if(j<<i) /查查询成功printtf("您您查找的学学生信息如如下n 姓名 %s 学号号 %s 性别 %c 生日日 %d年年%d月%d日 当当前考勤次次数 %ddn",stuj-1.namme,sttuj-1.nnumbeer,sttuj-1.ssex,sstujj-1.yearr,stuuj-11.moonth,stuj-1.dayy,stuuj-11.kqq); pprinttf("是是否修改该该生考勤信信息 00 否 1 是""); /选择是否否修改考勤勤 sscanff("%dd",&xx); /输输入选择变变量值if(x=1)printtf("请请输入新的的考勤值 ");scanff("%dd",&sstujj-1.kq); /输入新新的考勤值值 iif(ffp=foopen("datte.txxt",""w")=NUULL) /以只写写方式打开开文件 priintf("文件打打开失败n"); exiit(0); ffor(jj=0;jj<i;jj+) if(ffwritte(&sstujj,siizeoff(strruct studdent),1,ffp)!=1) pprinttf("文文件写入错错误n""); /写入文件件 ffclosse(fpp); /关闭文件件printtf("是是否继续修修改其他学学生考勤 0 否 1 是是");scanff("%dd",&xx);if(x=1) channge();/*按照照姓名查找找结束*/ /*按照学号号查找开始始*/if(swway=2)printtf("请请输入需要要修改学生生的学号 ");/priintf("i=%d",ii);scanff("%ss",nuumberr);for(jj=0;tt!=0;j+) tt=strrcmp(stuj.nnumbeer,nuumberr);if(j=i) t=0;printtf("未未找到您所所查询的数数据,请重重新输入n");if(j<<i) /查查询成功printtf("您您查找的学学生信息如如下n 姓名 %s 学号号 %s 性别 %c 生日日 %d年年%d月%d日 当当前考勤次次数 %ddn",stuj-1.namme,sttuj-1.nnumbeer,sttuj-1.ssex,sstujj-1.yearr,stuuj-11.moonth,stuj-1.dayy,stuuj-11.kqq); pprinttf("是是否修改该该生考勤信信息 00 否 1 是""); /选择是否否修改考勤勤 sscanff("%dd",&xx); /输输入选择变变量值if(x=1)printtf("请请输入新的的考勤值 ");scanff("%dd",&sstujj-1.kq); /输入新新的考勤值值 iif(ffp=foopen("datte.txxt",""w")=NUULL) /以只写写方式打开开文件 priintf("文件打打开失败n"); exiit(0); ffor(jj=0;jj<i;jj+) if(ffwritte(&sstujj,siizeoff(strruct studdent),1,ffp)!=1) pprinttf("文文件写入错错误n""); /写入文件件 ffclosse(fpp); /关闭文件件printtf("是是否继续修修改其他学学生考勤 0 否 1 是是");scanff("%dd",&xx);if(x=1) channge();/*按照照学号查找找结束*/printtf("00 返回主主菜单nn");getchhar();a=gettcharr();getchhar();if(a='0'') maain();开始打开文件将文件内容全部读入结构体数组输入sway值选择查找方式Sway=1?NSway=2?Y输入要查找的学号输入要查找的姓名N查找学号查找姓名输入X值选择是否修改考勤X=1?Y输入新的考勤值写入文件结束4. seearchh()函数数void searrch() iint ii=0,jj=0,ssway,t,x; cchar namee10,nummber10;printtf(" *学学 生 信信 息 查查 询*n""); iif(ffp=foopen("datte.txxt",""r")=NUULL) /将将文件内容容读入内存存printtf("文文件打开失失败n""); eexit(0);for(ii=0;ffeof(fp)=0;ii+) freaad(&sstuii,siizeoff(strruct studdent),1,ffp); /读取文文件内容fclosse(fpp); /关闭文件件printtf("选选择查找方方式 1 按照姓名名查找 2 按照照学号查找找");scanff("%dd",&ssway); /*按照姓名名查找开始始*/if(swway=1)printtf("请请输入需要要修改学生生的姓名 ");/priintf("i=%d",ii);scanff("%ss",naame);for(jj=0;tt!=0;j+) tt=strrcmp(stuj.nname,namee);if(j=i) t=0;printtf("未未找到您所所查询的数数据,请重重新输入n");if(j<<i) /查查询成功printtf("您您查找的学学生信息如如下n 姓名 %s 学号号 %s 性别 %c 生日日 %d年年%d月%d日 当当前考勤次次数 %ddn",stuj-1.namme,sttuj-1.nnumbeer,sttuj-1.ssex,sstujj-1.yearr,stuuj-11.moonth,stuj-1.dayy,stuuj-11.kqq); printtf("是是否继续查查询其他学学生信息 0 否 1 是是");scanff("%dd",&xx);if(x=1) searrch();/*按照照姓名查找找结束*/ /*按照学号号查找开始始*/if(swway=2)printtf("请请输入需要要修改学生生的学号 ");/priintf("i=%d",ii);scanff("%ss",nuumberr);for(jj=0;tt!=0;j+) tt=strrcmp(stuj.nnumbeer,nuumberr);if(j=i) t=0;printtf("未未找到您所所查询的数数据,请重重新输入n");if(j<<i) /查查询成功printtf("您您查找的学学生信息如如下n 姓名 %s 学号号 %s 性别 %c 生日日 %d年年%d月%d日 当当前考勤次次数 %ddn",stuj-1.namme,sttuj-1.nnumbeer,sttuj-1.ssex,sstujj-1.yearr,stuuj-11.moonth,stuj-1.dayy,stuuj-11.kqq);printtf("是是否继续查查询其他学学生信息 0 否 1 是是");scanff("%dd",&xx);if(x=1) searrch();/*按照照学号查找找结束*/printtf("00 返回主主菜单nn");getchhar();a=gettcharr();getchhar();if(a='0'') maain(); 流流程图:开始打开文件将文件内容全部读入结构体数组输入sway值选择查找方式Sway=1?NSway=2?Y输入要查找的学号输入要查找的姓名查找学号查找姓名输出该生信息5.evaaluatte()函函数void evalluatee() iint ii=0,jj=0,ssway,t,x; ffloatt scoore; cchar namee10,nummber10;printtf(" *学 生 考 勤 分 数 计 算*n"");if(kqqcs=0)printtf("请请输入应到到考勤总数数 "); /请输入应应到考勤总总数scanff("%ff",&kkqcs); iif(ffp=foopen("datte.txxt",""r")=NUULL) /将将文件内容容读入内存存printtf("文文件打开失失败n""); eexit(0);for(ii=0;ffeof(fp)=0;ii+) freaad(&sstuii,siizeoff(strruct studdent),1,ffp); /读取文文件内容fclosse(fpp); /关闭文件件printtf("选选择查找方方式 1 按照姓名名查找 2 按照照学号查找找");scanff("%dd",&ssway); /*按照姓名名查找开始始*/if(swway=1)printtf("请请输入需要要修改学生生的姓名 ");/priintf("i=%d",ii);scanff("%ss",naame);for(jj=0;tt!=0;j+) tt=strrcmp(stuj.nname,namee);if(j=i) t=0;printtf("未未找到您所所查询的数数据,请重重新输入n");if(j<<i) /查查询成功printtf("您您查找的学学生信息如如下n 姓名 %s 学号号 %s 性别 %c 生日日 %d年年%d月%d日 当当前考勤次次数 %ddn",stuj-1.namme,sttuj-1.nnumbeer,sttuj-1.ssex,sstujj-1.yearr,stuuj-11.moonth,stuj-1.dayy,stuuj-11.kqq); sscoree=(sttuj-1.kkq)/kkqcs*100; pprinttf("该该生当前考考勤分数为为 %5.2f",scorre);printtf("是是否继续计计算其他学学生考勤分分数 0 否 11 是");scanff("%dd",&xx);if(x=1) evalluatee();/*按照照姓名查找找结束*/ /*按照学号号查找开始始*/if(swway=2)printtf("请请输入需要要修改学生生的学号 ");/priintf("i=%d",ii);scanff("%ss",nuumberr);for(jj=0;tt!=0;j+) tt=strrcmp(stuj.nnumbeer,nuumberr);if(j=i) t=0;printtf("未未找到您所所查询的数数据,请重重新输入n");if(j<<i) /查查询成功printtf("您您查找的学学生信息如如下n 姓名 %s 学号号 %s 性别 %c 生日日 %d年年%d月%d日 当当前考勤次次数 %ddn",stuj-1.namme,sttuj-1.nnumbeer,sttuj-1.ssex,sstujj-1.yearr,stuuj-11.moonth,stuj-1.dayy,stuuj-11.kqq);scoree=(sttuj-1.kkq)/kkqcs*100; pprinttf("该该生当前考考勤分数为为 %5.2f",scorre);printtf("是是否继续计计算其他学学生考勤分分数 0 否 11 是");scanff("%dd",&xx);if(x=1) evalluatee();/*按照照学号查找找结束*/printtf("00 返回主主菜单nn");getchhar();a=gettcharr();getchhar();if(a='0'') maain();流程图:开始输入应到考勤次数kqcs值打开文件将文件内容全部读入结构体数组输入sway值选择查找方式Sway=1?YNSway=2?输入要查找的学号输入要查找的姓名查找学号查找姓名输出该生信息计算考勤分数输出考勤分数结束三、测试及及调试(测测试方案、存存在的问题题及解决方方法)测试方案:按照每个个函数功能能进行测试试,在做完完每个函数数对其进行行测试,主主函数测试试,先将所所有需要的的功能模块块函数设置置为空,每每个函数用用一个prrintff语句来测测试主函数数。1. 存在问题:开始将生生日定义为为字符数组组,当用sscanff来输入年年月日时,年年月日之间间用空格分分隔,但在在输出时发发现年月日日出现错误误。分析原因:用scaanf输入入年月日时时,系统会会把用来分分隔的空格格当做字符符读入。解决方法:将年月日日定义为整整型,这样样就可以用用scannf输入,用用空格隔开开。2. 存在问题22:在查找找数据时,需需要先将所所有数据读读入一个结结构体数组组,在读取取后未关闭闭文件,执执行查找时时查找不到到相关信息息。分析原因:再利用ffor循环环读取全部部文件内容容后,文件件指针将会会移至文件件末尾,这这样再执行行查找时就就会从文件件末尾开始始,显然不不符合要求求,所以会会出现错误误。解决方法:在读取完完数据后先先关闭文件件,在查找找时再次打打开文件,这这时文件指指针就会指指向文件开开头。3. 存在问题33:再多个个使用geetchaar或者ggets输输入的时候候,会出现现直接跳过过输入的情情况。分析原因:在使用ggetchhar或者者getss输入的时时候,系统统会将前一一步用来确确认执行的的回车当成成字符读入入,导致跳跳过该步输输入。解决方法:再gettcharr或者geets前面面加上geetchaar()语语句,读掉掉回车,下下面的geetchaar或者ggets就就可以正常常输入。四、小结通过编写该该程序,熟熟悉了C语语言的基本本语法,选选择,循环环等结构,深深入练习了了函数的调调用方法,和和文件的读读写方法,熟熟悉了结构构体的使用用,更加深深化了面向向过程语言言思想,和和一些基本本算法。通过对程序序的后期调调试,熟悉悉了C常见见错误,锻锻炼了思维维的严密性性,和完备备性。通过对程序序的注释和和画流程图图,形成了了一套自己己编程的风风格,和清清晰地思路路,使思维维更加条理理化,清晰晰化。附件:主要要源程序代代码(需打打印)#incllude<<stdiio.h>>#incllude<<striing.hh>#incllude<<stdllib.hh>FILE *fp; /定义文件件char a; /返回选选择变量floatt kqccs=0; /应到到考勤次数数变量strucct sttudennt chaar naame110;char numbber111;char sex;int yyear;int mmonthh;int dday;int kkq;stu100; /定义义储存学生生信息的结结构体数组组/*主 函函 数 开开 始*void mainn()void inpuut(); /录入数数据函数void channge(); /修修改数据函函数void searrch(); /查询询数据函数数void evalluatee(); /计算算总评函数数char itemm;systeem("ccolorr 34"");printtf(" n");printtf(" n");printtf(" 学 生生 考 勤 管 理理 系 统 n");printtf(" n");printtf(" BYY 朱胜佳佳 n");printtf(" n");printtf(" n");printtf(" n")