欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOCX文档下载  

    C语言课程设计学生考勤系统.docx

    • 资源ID:1893782       资源大小:258.78KB        全文页数:32页
    • 资源格式: DOCX        下载积分:16金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要16金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    C语言课程设计学生考勤系统.docx

    C语言程序设计课程设计报告设计题目:学生考勤系统设计专 业 微电子科学与工程班 级 微电 131 学 生 赵 杨 怡 指导教师 年 学期 设计任务:C语言课程设计任务书10题目:学生考勤系统设计功能:学生考勤系统应包含各班学生的全部信息。每个学生是一条记录,包括姓名、性别、学号、日期、节次、出勤情况等信息。本系统可以模拟考勤过程、记录考勤结果,并能在课程结束后按照设定的考勤评分标准自动给出每个学生的考勤分数。要求:1、用C语言实现程序设计;2、利用结构体进行相关信息处理;3、系统的各个功能模块要求用函数的形式实现;4、界面友好(良好的人机交互),程序加必要的注释。平时成绩:验收答辩成绩:设计报告成绩:总评成绩:指导教师:一、总体设计1程序的总体设计 确定界面,使用户可选择操作项目(录入,修改,查询,评分)。 录入功能:使用结构体,要求用户输入姓名、性别、学号、日期、节次、当前出勤情况等信息,并写入文件。 修改功能:使用户输入学号,姓名其中一项可以修改考勤其信息。对于修改功能的实现,是先将所有文件内容读入到内存中,然后修改考勤值,最后再重新覆盖写入文件。 查询模块:使用字符串比较函数,利用循环找到对应结构体数组元素,然后输出需要信息。对于查询功能的实现,同修改,是先将所有文件内容读入到内存中,然后查找到其中某项,最后输出到屏幕。 评分模块:系统根据总的应道考勤数按照百分制,求出每个学生的分数,并输出到屏幕。2. 数据结构学生信息用结构体记录,包括姓名(字符数组)、性别(字符型)、日期(年月日三个字符数组)、节次(整型)、出情况(整型)。3. 函数原型声明 void main() /主函数void input(); /录入数据函数void change(); /修改数据函数void search(); /查询数据函数void evaluate(); /计算总评函数二、详细设计1.main( )函数void main()void input(); /录入数据函数void change(); /修改数据函数void search(); /查询数据函数void evaluate(); /计算总评函数 char item; system("color 34");printf(" n");printf(" n");printf(" 学 生 考 勤 管 理 系 统 n");printf(" n");printf(" BY 朱胜佳 n");printf(" n");printf(" n");printf(" n");printf(" 1.学生信息及考勤情况录入 n");printf(" n");printf(" 2.学生信息及考勤情况修改 n");printf(" n");printf(" 3.学生信息及考勤情况查询 n");printf(" n");printf(" 4.学生考勤总评分数查询 n");printf(" n");printf(" n"); /用户界面printf("n");printf(" 请选择您需要的操作n");scanf("%c",&item); switch(item) case '1': input();break; case '2': change();break; case '3': search();break; case '4': evaluate();break; /实现功能选择 流程图: 开 始1breakgoal()search()amend()record()432switch(item) switch(item)switch(item)输出界面 结束2. input() 函数void input()int i,j=0,jx=1;printf(" *学 生 基 本 信 息 录 入*n");if(fp=fopen("date.txt","w")=NULL)printf("文件打开失败n"); exit(0);for(i=0;jx=1;i+) /输入信息循环 for(;j=0;) /输入确认循环getchar();printf("请输入第%d个学生的姓名 ",i+1);gets(stui.name);printf("请输入第%d个学生的学号 ",i+1);gets(stui.number);printf("请输入第%d个学生的性别(男:m 女:f) ",i+1);stui.sex=getchar();printf("请输入第%d个学生的生日(格式:年 月 日) ",i+1);scanf("%d%d%d",&stui.year,&stui.month,&stui.day); printf("请输入第%d个学生的当前考勤次数 ",i+1);scanf("%d",&stui.kq);printf("您输入的信息为 姓名 %s 学号 %s 性别 %c 生日 %d年%d月%d日n 0 重输 1 确认",stui.name,stui.number,stui.sex,stui.year,stui.month,stui.day);scanf("%d",&j); /输入确认 j=0; if(fwrite(&stui,sizeof(struct student),1,fp)!=1) printf("文件写入错误n"); /写入文件printf(" 是否继续输入下一个学生信息 0 终止 1 继续n");scanf("%d",&jx); /继续输入选择fclose(fp); printf("0 返回主菜单n");getchar();a=getchar();getchar();if(a='0') main(); /返回主菜单流程图:开始0=>j打开文件1=>jx0=>ijx=1?Yj=0?Y输入i+1个学生信息生信息N输入j值选择是否确认写入文件i+1=>i输入jx值选择是否继续结束3. change()函数void change() int i=0,j=0,sway,t,x; char name10,number10;printf(" *学 生 考 勤 修 改*n"); if(fp=fopen("date.txt","r")=NULL) /将文件内容读入内存printf("文件打开失败n"); exit(0);for(i=0;feof(fp)=0;i+) fread(&stui,sizeof(struct student),1,fp); /读取文件内容fclose(fp); /关闭文件printf("选择查找方式 1 按照姓名查找 2 按照学号查找");scanf("%d",&sway); /*按照姓名查找开始*/if(sway=1)printf("请输入需要修改学生的姓名 ");/printf("i=%d",i);scanf("%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 学号 %s 性别 %c 生日 %d年%d月%d日 当前考勤次数 %dn",stuj-1.name,stuj-1.number,stuj-1.sex,stuj-1.year,stuj-1.month,stuj-1.day,stuj-1.kq); printf("是否修改该生考勤信息 0 否 1 是"); /选择是否修改考勤 scanf("%d",&x); /输入选择变量值if(x=1)printf("请输入新的考勤值 ");scanf("%d",&stuj-1.kq); /输入新的考勤值 if(fp=fopen("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("是否继续修改其他学生考勤 0 否 1 是");scanf("%d",&x);if(x=1) change();/*按照姓名查找结束*/ /*按照学号查找开始*/if(sway=2)printf("请输入需要修改学生的学号 ");/printf("i=%d",i);scanf("%s",number);for(j=0;t!=0;j+) t=strcmp(stuj.number,number);if(j=i) t=0;printf("未找到您所查询的数据,请重新输入n"); if(j<i) /查询成功printf("您查找的学生信息如下n 姓名 %s 学号 %s 性别 %c 生日 %d年%d月%d日 当前考勤次数 %dn",stuj-1.name,stuj-1.number,stuj-1.sex,stuj-1.year,stuj-1.month,stuj-1.day,stuj-1.kq); printf("是否修改该生考勤信息 0 否 1 是"); /选择是否修改考勤 scanf("%d",&x); /输入选择变量值if(x=1)printf("请输入新的考勤值 ");scanf("%d",&stuj-1.kq); /输入新的考勤值 if(fp=fopen("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("是否继续修改其他学生考勤 0 否 1 是");scanf("%d",&x);if(x=1) change();/*按照学号查找结束*/printf("0 返回主菜单n");getchar();a=getchar();getchar();if(a='0') main();开始 打开文件将文件内容全部读入结构体数组输入sway值选择查找方式Sway=1?NSway=2?Y输入要查找的学号输入要查找的姓名N查找学号查找姓名输入X值选择是否修改考勤X=1?Y输入新的考勤值写入文件结束4. search()函数void search() int i=0,j=0,sway,t,x; char name10,number10;printf(" *学 生 信 息 查 询*n"); if(fp=fopen("date.txt","r")=NULL) /将文件内容读入内存printf("文件打开失败n"); exit(0);for(i=0;feof(fp)=0;i+) fread(&stui,sizeof(struct student),1,fp); /读取文件内容fclose(fp); /关闭文件printf("选择查找方式 1 按照姓名查找 2 按照学号查找");scanf("%d",&sway); /*按照姓名查找开始*/if(sway=1)printf("请输入需要修改学生的姓名 ");/printf("i=%d",i);scanf("%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 学号 %s 性别 %c 生日 %d年%d月%d日 当前考勤次数 %dn",stuj-1.name,stuj-1.number,stuj-1.sex,stuj-1.year,stuj-1.month,stuj-1.day,stuj-1.kq); printf("是否继续查询其他学生信息 0 否 1 是");scanf("%d",&x);if(x=1) search();/*按照姓名查找结束*/ /*按照学号查找开始*/if(sway=2)printf("请输入需要修改学生的学号 ");/printf("i=%d",i);scanf("%s",number);for(j=0;t!=0;j+) t=strcmp(stuj.number,number);if(j=i) t=0;printf("未找到您所查询的数据,请重新输入n"); if(j<i) /查询成功printf("您查找的学生信息如下n 姓名 %s 学号 %s 性别 %c 生日 %d年%d月%d日 当前考勤次数 %dn",stuj-1.name,stuj-1.number,stuj-1.sex,stuj-1.year,stuj-1.month,stuj-1.day,stuj-1.kq);printf("是否继续查询其他学生信息 0 否 1 是");scanf("%d",&x);if(x=1) search();/*按照学号查找结束*/printf("0 返回主菜单n");getchar();a=getchar();getchar();if(a='0') main(); 流程图:开始 打开文件将文件内容全部读入结构体数组输入sway值选择查找方式Sway=1?NSway=2?Y输入要查找的学号输入要查找的姓名查找学号查找姓名输出该生信息5. evaluate()函数 void evaluate() int i=0,j=0,sway,t,x; float score; char name10,number10;printf(" *学 生 考 勤 分 数 计 算*n");if(kqcs=0)printf("请输入应到考勤总数 "); /请输入应到考勤总数scanf("%f",&kqcs); if(fp=fopen("date.txt","r")=NULL) /将文件内容读入内存printf("文件打开失败n"); exit(0);for(i=0;feof(fp)=0;i+) fread(&stui,sizeof(struct student),1,fp); /读取文件内容fclose(fp); /关闭文件printf("选择查找方式 1 按照姓名查找 2 按照学号查找");scanf("%d",&sway); /*按照姓名查找开始*/if(sway=1)printf("请输入需要修改学生的姓名 ");/printf("i=%d",i);scanf("%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 学号 %s 性别 %c 生日 %d年%d月%d日 当前考勤次数 %dn",stuj-1.name,stuj-1.number,stuj-1.sex,stuj-1.year,stuj-1.month,stuj-1.day,stuj-1.kq); score=(stuj-1.kq)/kqcs*100; printf("该生当前考勤分数为 %5.2f",score);printf("是否继续计算其他学生考勤分数 0 否 1 是");scanf("%d",&x);if(x=1) evaluate();/*按照姓名查找结束*/ /*按照学号查找开始*/if(sway=2)printf("请输入需要修改学生的学号 ");/printf("i=%d",i);scanf("%s",number);for(j=0;t!=0;j+) t=strcmp(stuj.number,number);if(j=i) t=0;printf("未找到您所查询的数据,请重新输入n"); if(j<i) /查询成功printf("您查找的学生信息如下n 姓名 %s 学号 %s 性别 %c 生日 %d年%d月%d日 当前考勤次数 %dn",stuj-1.name,stuj-1.number,stuj-1.sex,stuj-1.year,stuj-1.month,stuj-1.day,stuj-1.kq);score=(stuj-1.kq)/kqcs*100; printf("该生当前考勤分数为 %5.2f",score);printf("是否继续计算其他学生考勤分数 0 否 1 是");scanf("%d",&x);if(x=1) evaluate();/*按照学号查找结束*/printf("0 返回主菜单n");getchar();a=getchar();getchar();if(a='0') main();流程图:开始输入应到考勤次数kqcs值打开文件将文件内容全部读入结构体数组输入sway值选择查找方式Sway=1?YNSway=2?输入要查找的学号输入要查找的姓名查找学号查找姓名输出该生信息计算考勤分数输出考勤分数结束三、测试及调试(测试方案、存在的问题及解决方法)测试方案:按照每个函数功能进行测试,在做完每个函数对其进行测试,主函数测试,先将所有需要的功能模块函数设置为空,每个函数用一个printf语句来测试主函数。1. 存在问题:开始将生日定义为字符数组,当用scanf来输入年月日时,年月日之间用空格分隔,但在输出时发现年月日出现错误。分析原因:用scanf输入年月日时,系统会把用来分隔的空格当做字符读入。解决方法:将年月日定义为整型,这样就可以用scanf输入,用空格隔开。2. 存在问题2:在查找数据时,需要先将所有数据读入一个结构体数组,在读取后未关闭文件,执行查找时查找不到相关信息。分析原因:再利用for循环读取全部文件内容后,文件指针将会移至文件末尾,这样再执行查找时就会从文件末尾开始,显然不符合要求,所以会出现错误。解决方法:在读取完数据后先关闭文件,在查找时再次打开文件,这时文件指针就会指向文件开头。3. 存在问题3:再多个使用getchar或者gets输入的时候,会出现直接跳过输入的情况。分析原因:在使用getchar或者gets输入的时候,系统会将前一步用来确认执行的回车当成字符读入,导致跳过该步输入。解决方法:再getchar或者gets前面加上getchar()语句,读掉回车,下面的getchar或者gets就可以正常输入。四、小结通过编写该程序,熟悉了C语言的基本语法,选择,循环等结构,深入练习了函数的调用方法,和文件的读写方法,熟悉了结构体的使用,更加深化了面向过程语言思想,和一些基本算法。通过对程序的后期调试,熟悉了C常见错误,锻炼了思维的严密性,和完备性。通过对程序的注释和画流程图,形成了一套自己编程的风格,和清晰地思路,使思维更加条理化,清晰化。附件:主要源程序代码(需打印)#include<stdio.h>#include<string.h>#include<stdlib.h>FILE *fp; /定义文件char a; /返回选择变量float kqcs=0; /应到考勤次数变量struct student char name10;char number11;char sex;int year;int month;int day;int kq;stu100; /定义储存学生信息的结构体数组/*主 函 数 开 始*void main()void input(); /录入数据函数void change(); /修改数据函数void search(); /查询数据函数void evaluate(); /计算总评函数char item;system("color 34");printf(" n");printf(" n");printf(" 学 生 考 勤 管 理 系 统 n");printf(" n");printf(" BY 朱胜佳 n");printf(" n");printf(" n");printf(" n");printf(" 1.学生信息及考勤情况录入 n");printf(" n");printf(" 2.学生信息及考勤情况修改 n");printf(" n");printf(" 3.学生信息及考勤情况查询 n");printf(" n");printf(" 4.学生考勤总评分数查询 n");printf(" n");printf(" n"); /用户界面printf("n");printf(" 请选择您需要的操作n");scanf("%c",&item);switch(item)case '1': input();break;case '2': change();break;case '3': search();break;case '4': evaluate();break; /实现功能选择/*主 函 数 结 束*/*录入数据函数内容开始*void record()int i,j=0,jx=1;printf(" *学 生 基 本 信 息 录 入*n");if(fp=fopen("date.txt","w")=NULL)printf("文件打开失败n");exit(0);for

    注意事项

    本文(C语言课程设计学生考勤系统.docx)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开