C语言课程设计学生考勤系统5323.docx
C语言程序设计课程设计报告设计题目:学生考考勤系统统设计专 业微微电子科科学与工工程班 级微微电1331 学 生赵赵 杨 怡指导教师 年 学期设计任务:C语言言课程设设计任务务书100题目:学生生考勤系系统设计计功能:学生生考勤系系统应包包含各班班学生的的全部信信息。每每个学生生是一条条记录,包包括姓名名、性别别、学号号、日期期、节次次、出勤勤情况等等信息。本本系统可可以模拟拟考勤过过程、记记录考勤勤结果,并并能在课课程结束束后按照照设定的的考勤评评分标准准自动给给出每个个学生的的考勤分分数。要求:1、用用C语言言实现程程序设计计;2、利用结结构体进进行相关关信息处处理;3、系统的的各个功功能模块块要求用用函数的的形式实实现;4、界面友友好(良良好的人人机交互互),程程序加必必要的注注释。平时成绩:验收答辩成成绩:设计报告成成绩:总评成绩:指导教师:一、总体设设计1程序的的总体设设计确定界面面,使用用户可选选择操作作项目(录录入,修修改,查查询,评评分)。录入功能能:使用用结构体体,要求求用户输输入姓名名、性别别、学号号、日期期、节次次、当前前出勤情情况等信信息,并并写入文文件。 修改功能能:使用用户输入入学号,姓姓名其中中一项可可以修改改考勤其其信息。对对于修改改功能的的实现,是是先将所所有文件件内容读读入到内内存中,然然后修改改考勤值值,最后后再重新新覆盖写写入文件件。查询模块块:使用用字符串串比较函函数,利利用循环环找到对对应结构构体数组组元素,然然后输出出需要信信息。对对于查询询功能的的实现,同同修改,是是先将所所有文件件内容读读入到内内存中,然然后查找找到其中中某项,最最后输出出到屏幕幕。评分模块块:系统统根据总总的应道道考勤数数按照百百分制,求求出每个个学生的的分数,并并输出到到屏幕。2. 数据据结构学生信息用用结构体体记录,包包括姓名名(字符符数组)、性性别(字字符型)、日日期(年年月日三三个字符符数组)、节节次(整整型)、出出情况(整整型)。3. 函数数原型声声明 voiid mmainn() /主主函数void inpput(); /录录入数据据函数void chaangee(); /修改改数据函函数void seaarchh(); /查询数数据函数数void evaaluaate(); /计算算总评函函数二、详细设设计1.maiin( )函数数void maiin()void inpput(); /录录入数据据函数void chaangee(); /修改改数据函函数void seaarchh(); /查询数数据函数数void evaaluaate(); /计算算总评函函数 ccharr ittem; ssysttem("coolorr 344");printtf("" n");printtf("" n"");printtf("" 学 生 考 勤 管 理 系 统 n"");printtf("" n"");printtf("" BY 朱胜佳佳 n"");printtf("" n"");printtf("" n");printtf("" n"");printtf("" 1.学生信信息及考考勤情况况录入 n"");printtf("" n"");printtf("" 2.学生信信息及考考勤情况况修改 n"");printtf("" n"");printtf("" 3.学生信信息及考考勤情况况查询 n"");printtf("" n"");printtf("" 4.学生考考勤总评评分数查查询 n"");printtf("" n"");printtf("" n"); /用户户界面printtf(""n"");printtf("" 请请选择您您需要的的操作n");scanff("%c",&ittem); sswittch(iteem) caase '1'': iinpuut();brreakk; caase '2'': cchannge();bbreaak; caase '3'': ssearrch();bbreaak; caase '4'': eevalluatte();brreakk; /实现功功能选择择流程图:开 始1breakgoal()search()amend()record()432switch(item) switch(item)switch(item)输出界面结束2.inpput() 函函数void inpput()int ii,j=0,jjx=11;printtf("" *学 生 基基 本 信 息息 录 入*n"");if(ffp=ffopeen(""datte.ttxt"","ww")=NNULLL)printtf(""文件打打开失败败n""); eexitt(0);for(ii=0;jx=1;i+) /输输入信息息循环 ffor(;j=0;) /输入确确认循环环getchhar();printtf(""请输入入第%dd个学生生的姓名名 ",i+11);gets(stuui.naame);printtf(""请输入入第%dd个学生生的学号号 ",i+11);gets(stuui.nuumbeer);printtf(""请输入入第%dd个学生生的性别别(男:m 女女:f) ",i+11);stuii.ssex=gettchaar();printtf(""请输入入第%dd个学生生的生日日(格式式:年 月 日日) "",i+1);scanff("%d%dd%d"",&sstui.yeaar,&&stuui.moonthh,&sstui.dayy); priintff("请请输入第第%d个个学生的的当前考考勤次数数 ",i+11);scanff("%d",&sttuii.kkq);printtf(""您输入入的信息息为 姓姓名 %s 学学号 %s 性性别 %c 生生日 %d年%d月%d日n 0 重重输 11 确认认",sstui.namme,sstui.nummberr,sttuii.ssex,stuui.yeear,stuui.moonthh,sttuii.dday);scanff("%d",&j); /输入入确认 jj=0; iif(ffwriite(&sttuii,ssizeeof(strructt sttudeent),1,fp)!=11) pprinntf("文件件写入错错误nn"); /写入文文件printtf("" 是否继继续输入入下一个个学生信信息 00 终止止 11 继续续n"");scanff("%d",&jxx); /继续续输入选选择fclosse(ffp); pprinntf("0 返回主主菜单n");getchhar();a=gettchaar();getchhar();if(a='00') maiin(); /返回回主菜单单流程图:开始0=>j打开文件1=>jx0=>ijx=1?Yj=0?Y输入i+1个学生信息生信息N输入j值选择是否确认写入文件i+1=>i输入jx值选择是否继续结束3.chaangee()函函数void chaangee() iint i=00,j=0,sswayy,t,x; ccharr naame10,nuumbeer110;printtf("" *学 生生 考 勤 修修 改*nn"); iif(fp=foppen("daate.txtt",""r")=NULLL) /将将文件内内容读入入内存printtf(""文件打打开失败败n""); eexitt(0);for(ii=0;feoof(ffp)=0;i+) ffreaad(&&stuui,siizeoof(sstruuct stuudennt),1,ffp); /读取文文件内容容fclosse(ffp); /关闭文文件printtf(""选择查查找方式式 1 按照姓姓名查找找 22 按照照学号查查找");scanff("%d",&swway); /*按按照姓名名查找开开始*/if(swway=1)printtf(""请输入入需要修修改学生生的姓名名 ");/priintff("ii=%dd",ii);scanff("%s",namme);for(jj=0;t!=0;jj+) t=strrcmpp(sttujj.nnamee,naame);if(j=i) t=0;printtf(""未找到到您所查查询的数数据,请请重新输输入nn");if(j<<i) /查询询成功printtf(""您查找找的学生生信息如如下nn 姓名名 %ss 学号号 %ss 性别别 %cc 生日日 %dd年%dd月%dd日 当当前考勤勤次数 %dn",stuuj-1.namme,sstuj-11.nnumbber,stuuj-1.sexx,sttujj-1.yeear,stuuj-1.monnth,stuuj-1.dayy,sttujj-1.kqq); prrinttf(""是否修修改该生生考勤信信息 0 否否 11 是""); /选选择是否否修改考考勤 sscannf(""%d"",&xx); /输输入选择择变量值值if(x=1)printtf(""请输入入新的考考勤值 ");scanff("%d",&sttujj-1.kqq); /输入入新的考考勤值 iif(fp=foppen("daate.txtt",""w")=NULLL) /以只写写方式打打开文件件 pprinntf("文件件打开失失败nn"); exiit(00); ffor(j=00;j<<i;jj+) iff(fwwritte(&&stuuj,siizeoof(sstruuct stuudennt),1,ffp)!=1) prrinttf(""文件写写入错误误n""); /写写入文件件 ffcloose(fp); /关闭闭文件printtf(""是否继继续修改改其他学学生考勤勤 0 否 1 是是");scanff("%d",&x);if(x=1) chhangge();/*按照姓姓名查找找结束*/ /*按按照学号号查找开开始*/if(swway=2)printtf(""请输入入需要修修改学生生的学号号 ");/priintff("ii=%dd",ii);scanff("%s",nummberr);for(jj=0;t!=0;jj+) t=strrcmpp(sttujj.nnumbber,nummberr);if(j=i) t=0;printtf(""未找到到您所查查询的数数据,请请重新输输入nn");if(j<<i) /查询询成功printtf(""您查找找的学生生信息如如下nn 姓名名 %ss 学号号 %ss 性别别 %cc 生日日 %dd年%dd月%dd日 当当前考勤勤次数 %dn",stuuj-1.namme,sstuj-11.nnumbber,stuuj-1.sexx,sttujj-1.yeear,stuuj-1.monnth,stuuj-1.dayy,sttujj-1.kqq); prrinttf(""是否修修改该生生考勤信信息 0 否否 11 是""); /选选择是否否修改考考勤 sscannf(""%d"",&xx); /输输入选择择变量值值if(x=1)printtf(""请输入入新的考考勤值 ");scanff("%d",&sttujj-1.kqq); /输入入新的考考勤值 iif(fp=foppen("daate.txtt",""w")=NULLL) /以只写写方式打打开文件件 pprinntf("文件件打开失失败nn"); exiit(00); ffor(j=00;j<<i;jj+) iff(fwwritte(&&stuuj,siizeoof(sstruuct stuudennt),1,ffp)!=1) prrinttf(""文件写写入错误误n""); /写写入文件件 ffcloose(fp); /关闭闭文件printtf(""是否继继续修改改其他学学生考勤勤 0 否 1 是是");scanff("%d",&x);if(x=1) chhangge();/*按照学学号查找找结束*/printtf(""0 返返回主菜菜单nn");getchhar();a=gettchaar();getchhar();if(a='00') maiin();开始打开文件将文件内容全部读入结构体数组输入sway值选择查找方式Sway=1?NSway=2?Y输入要查找的学号输入要查找的姓名N查找学号查找姓名输入X值选择是否修改考勤X=1?Y输入新的考勤值写入文件结束4. seearcch()函数void seaarchh() iint i=00,j=0,sswayy,t,x; ccharr naame10,nuumbeer110;printtf("" *学 生 信信 息 查 询询*n""); iif(fp=foppen("daate.txtt",""r")=NULLL) /将文件件内容读读入内存存printtf(""文件打打开失败败n""); eexitt(0);for(ii=0;feoof(ffp)=0;i+) ffreaad(&&stuui,siizeoof(sstruuct stuudennt),1,ffp); /读取文文件内容容fclosse(ffp); /关闭文文件printtf(""选择查查找方式式 1 按照姓姓名查找找 22 按照照学号查查找");scanff("%d",&swway); /*按按照姓名名查找开开始*/if(swway=1)printtf(""请输入入需要修修改学生生的姓名名 ");/priintff("ii=%dd",ii);scanff("%s",namme);for(jj=0;t!=0;jj+) t=strrcmpp(sttujj.nnamee,naame);if(j=i) t=0;printtf(""未找到到您所查查询的数数据,请请重新输输入nn");if(j<<i) /查询询成功printtf(""您查找找的学生生信息如如下nn 姓名名 %ss 学号号 %ss 性别别 %cc 生日日 %dd年%dd月%dd日 当当前考勤勤次数 %dn",stuuj-1.namme,sstuj-11.nnumbber,stuuj-1.sexx,sttujj-1.yeear,stuuj-1.monnth,stuuj-1.dayy,sttujj-1.kqq); printtf(""是否继继续查询询其他学学生信息息 0 否 1 是是");scanff("%d",&x);if(x=1) seearcch();/*按照姓姓名查找找结束*/ /*按按照学号号查找开开始*/if(swway=2)printtf(""请输入入需要修修改学生生的学号号 ");/priintff("ii=%dd",ii);scanff("%s",nummberr);for(jj=0;t!=0;jj+) t=strrcmpp(sttujj.nnumbber,nummberr);if(j=i) t=0;printtf(""未找到到您所查查询的数数据,请请重新输输入nn");if(j<<i) /查询询成功printtf(""您查找找的学生生信息如如下nn 姓名名 %ss 学号号 %ss 性别别 %cc 生日日 %dd年%dd月%dd日 当当前考勤勤次数 %dn",stuuj-1.namme,sstuj-11.nnumbber,stuuj-1.sexx,sttujj-1.yeear,stuuj-1.monnth,stuuj-1.dayy,sttujj-1.kqq);printtf(""是否继继续查询询其他学学生信息息 0 否 1 是是");scanff("%d",&x);if(x=1) seearcch();/*按照学学号查找找结束*/printtf(""0 返返回主菜菜单nn");getchhar();a=gettchaar();getchhar();if(a='00') maiin(); 流流程图:开始打开文件将文件内容全部读入结构体数组输入sway值选择查找方式Sway=1?NSway=2?Y输入要查找的学号输入要查找的姓名查找学号查找姓名输出该生信息5.evaaluaate()函数数void evaaluaate() iint i=00,j=0,sswayy,t,x; ffloaat sscorre; ccharr naame10,nuumbeer110;printtf("" *学 生 考考 勤 分 数数 计 算*n"");if(kqqcs=0)printtf(""请输入入应到考考勤总数数 "); /请输入入应到考考勤总数数scanff("%f",&kqqcs); iif(fp=foppen("daate.txtt",""r")=NULLL) /将文文件内容容读入内内存printtf(""文件打打开失败败n""); eexitt(0);for(ii=0;feoof(ffp)=0;i+) ffreaad(&&stuui,siizeoof(sstruuct stuudennt),1,ffp); /读取文文件内容容fclosse(ffp); /关闭文文件printtf(""选择查查找方式式 1 按照姓姓名查找找 22 按照照学号查查找");scanff("%d",&swway); /*按按照姓名名查找开开始*/if(swway=1)printtf(""请输入入需要修修改学生生的姓名名 ");/priintff("ii=%dd",ii);scanff("%s",namme);for(jj=0;t!=0;jj+) t=strrcmpp(sttujj.nnamee,naame);if(j=i) t=0;printtf(""未找到到您所查查询的数数据,请请重新输输入nn");if(j<<i) /查询询成功printtf(""您查找找的学生生信息如如下nn 姓名名 %ss 学号号 %ss 性别别 %cc 生日日 %dd年%dd月%dd日 当当前考勤勤次数 %dn",stuuj-1.namme,sstuj-11.nnumbber,stuuj-1.sexx,sttujj-1.yeear,stuuj-1.monnth,stuuj-1.dayy,sttujj-1.kqq); sscorre=(stuuj-1.kq)/kqqcs*1000; pprinntf("该生生当前考考勤分数数为 %5.22f",scoore);printtf(""是否继继续计算算其他学学生考勤勤分数 0 否否 11 是"");scanff("%d",&x);if(x=1) evvaluuatee();/*按照姓姓名查找找结束*/ /*按按照学号号查找开开始*/if(swway=2)printtf(""请输入入需要修修改学生生的学号号 ");/priintff("ii=%dd",ii);scanff("%s",nummberr);for(jj=0;t!=0;jj+) t=strrcmpp(sttujj.nnumbber,nummberr);if(j=i) t=0;printtf(""未找到到您所查查询的数数据,请请重新输输入nn");if(j<<i) /查询询成功printtf(""您查找找的学生生信息如如下nn 姓名名 %ss 学号号 %ss 性别别 %cc 生日日 %dd年%dd月%dd日 当当前考勤勤次数 %dn",stuuj-1.namme,sstuj-11.nnumbber,stuuj-1.sexx,sttujj-1.yeear,stuuj-1.monnth,stuuj-1.dayy,sttujj-1.kqq);scoree=(sstuj-11.kkq)/kqccs*1100; pprinntf("该生生当前考考勤分数数为 %5.22f",scoore);printtf(""是否继继续计算算其他学学生考勤勤分数 0 否否 11 是"");scanff("%d",&x);if(x=1) evvaluuatee();/*按照学学号查找找结束*/printtf(""0 返返回主菜菜单nn");getchhar();a=gettchaar();getchhar();if(a='00') maiin();流程图:开始输入应到考勤次数kqcs值打开文件将文件内容全部读入结构体数组输入sway值选择查找方式Sway=1?YNSway=2?输入要查找的学号输入要查找的姓名查找学号查找姓名输出该生信息计算考勤分数输出考勤分数结束三、测试及及调试(测测试方案案、存在在的问题题及解决决方法)测试方案:按照每每个函数数功能进进行测试试,在做做完每个个函数对对其进行行测试,主主函数测测试,先先将所有有需要的的功能模模块函数数设置为为空,每每个函数数用一个个priintff语句来来测试主主函数。1. 存在问题:开始将将生日定定义为字字符数组组,当用用scaanf来来输入年年月日时时,年月月日之间间用空格格分隔,但但在输出出时发现现年月日日出现错错误。分析原因:用sccanff输入年年月日时时,系统统会把用用来分隔隔的空格格当做字字符读入入。解决方法:将年月月日定义义为整型型,这样样就可以以用sccanff输入,用用空格隔隔开。2. 存在问题22:在查查找数据据时,需需要先将将所有数数据读入入一个结结构体数数组,在在读取后后未关闭闭文件,执执行查找找时查找找不到相相关信息息。分析原因:再利用用forr循环读读取全部部文件内内容后,文文件指针针将会移移至文件件末尾,这这样再执执行查找找时就会会从文件件末尾开开始,显显然不符符合要求求,所以以会出现现错误。解决方法:在读取取完数据据后先关关闭文件件,在查查找时再再次打开开文件,这这时文件件指针就就会指向向文件开开头。3. 存在问题33:再多多个使用用gettchaar或者者getts输入入的时候候,会出出现直接接跳过输输入的情情况。分析原因:在使用用gettchaar或者者getts输入入的时候候,系统统会将前前一步用用来确认认执行的的回车当当成字符符读入,导导致跳过过该步输输入。解决方法:再geetchhar或或者geets前前面加上上gettchaar()语句,读读掉回车车,下面面的geetchhar或或者geets就就可以正正常输入入。四、小结通过编写该该程序,熟熟悉了CC语言的的基本语语法,选选择,循循环等结结构,深深入练习习了函数数的调用用方法,和和文件的的读写方方法,熟熟悉了结结构体的的使用,更更加深化化了面向向过程语语言思想想,和一一些基本本算法。通过对程序序的后期期调试,熟熟悉了CC常见错错误,锻锻炼了思思维的严严密性,和和完备性性。通过对程序序的注释释和画流流程图,形形成了一一套自己己编程的的风格,和和清晰地地思路,使使思维更更加条理理化,清清晰化。附件:主要要源程序序代码(需需打印)#inclludee<sttdioo.h>>#inclludee<sttrinng.hh>#inclludee<sttdliib.hh>FILE *fpp; /定义文文件char a; /返回回选择变变量floatt kqqcs=0; /应应到考勤勤次数变变量strucct sstuddentt chaar nnamee100;char nummberr111;char sexx;int yyearr;int mmontth;int dday;int kkq;stu1000; /定义储储存学生生信息的的结构体体数组/*主主 函 数 开开 始*