C语言实现大学生考勤管理系统
程序设计题:大学生考勤系统
1问题描述
该系统要求实现一个简单、实用的学生考勤系统程序,主要功能包括考勤数据的新增、删除、修改、查找、统计、排序、输出等。所有统计数据都要利用文件系统保存,以备系统下次运行时使用。通过此课题,熟练掌握文件、数组、指针的各种操作,以及一些基本算法的应用。
2功能要求
代码要能提供以下几个基本功能。
(1)考勤数据是由多条数据记录构成,其信息包括:学号(唯一)、姓名、班级、考勤日期(由月和日组成)等等。
(2)数据保存形式:所有信息要以文本或二进制文件保存。
(3)需要实现的功能
a新增学生信息数据(避免重复记录,若在,不可再增加)。
b查找数据(可按学号、姓名、考勤日期等查找)。
c修改学生记录(可以先查找,再修改)。
d删除学生记录(请参考上面修改的处理)。
e 显示学生考勤数据列表(可显示部分或全部)。
f 排序(可按学号、姓名、考勤日期等排序)。
g数据统计(对考勤数据统计分析,统计完成后,可以通过考勤系统中得出考勤明细表,考勤日报表、考勤汇总表、考勤异常表,请假汇总表等)。
h 保存数据到文件中并从文件中读入数据。
(4)界面功能要求:
1)采用友好的界面,实现一个功能控制菜单。
2)每次操作都从该菜单选择,利用循环结构使得一次运行程序可进行多次操作。
备注:
(1)数据完整性保证。例如:学号和姓名必须严格、规范。
(2)要求报表格式灵活、形式多样、内容清楚,具体请学生自己构思、设计。
(3)考勤符号:出勤√ 旷课X 事假△ 病假○ 迟到+ 早退–
(4)考勤时间段不少于十条。
3其他要求
(1)界面美观,交互方便。
(2)注释详细:每个函数有注释说明功能,对参数、返回值也要以注释的形式说明用途;关键的语句段要求有注释解释。
(3)程序的层次清晰,可读性强。
(4)变量、函数命名符合规范。
(5)如有可能,可使用MFC等开发工具,实现彩色或图形操作界面。
4开发环境
可以选择TC2.0、TC3.0、VC++6.0、vs2010等开发环境,或者与老师讨论,选择自己熟悉的开发工具与平台。
#include#include #include #definemaxsize15 #definemaxnum1000 typedefstruct{ charStudent_ID[maxsize]; charName[maxsize]; charClass_Number[maxsize]; charAttandance_date[maxsize]; charAttandance_Result[maxsize]; }student; studentStudents[maxnum]; intnum=0; charbuf[maxsize]; /*实现每次输入结束最后输入回车退出的功能,更好的实现与用户的交互*/ voidwait_for_Enter(){ getchar(); getchar(); } /*为了实现对日期进行排序,我的想法是对于月份,直接用atoi截取出来转化成月份,对于天数,则需要用以下函数计算*/ intconvert(charstr[]){ inti,j,res=0,cnt=0; for(i=strlen(str)-3;i>=0;i--){ if(str[i]>='0'&&str[i]<='9')res*=10,res+=(str[i]-'0'); elsebreak; } returnres;//返回天数,也就是一月中的第几天,例如11月5日,返回的就是5;5月23日,返回的就是23 } /*该函数实现的是把student类型变量b的所有信息赋给student类型的变量a*/ voidcopy(student*a,student*b){ strcpy(a->Student_ID,b->Student_ID); strcpy(a->Name,b->Name); strcpy(a->Class_Number,b->Class_Number); strcpy(a->Attandance_Result,b->Attandance_Result); strcpy(a->Attandance_date,b->Attandance_date); } /*此函数的作用是实现对已存在的学生不可再次添加的作用*/ booljudge(char*ID){ inti; for(i=0;i 按学号查找<2>按姓名查找<3>按考勤日期查找\n"); scanf("%d",&op); if(op==1){ printf("请输入该生学号:"); scanf("%s",information); for(i=0;i 按学号修改<2>按姓名修改<3>按考勤日期修改\n"); scanf("%s",op); if(op[0]=='1')setInfo("请输入该生学号",information); elseif(op[0]=='2')setInfo("请输入该生姓名",information); elsesetInfo("请输入考核日期",information); strcpy(find,information); if(op[0]=='1') for(i=0;i 修改学号<2>修改姓名<3>修改考勤日期",op); if(op[0]=='1'){ setInfo("请输入修改后的新学号",information); strcpy(Students[j].Student_ID,information); }elseif(op[0]=='2'){ setInfo("请输入修改后的新姓名",information); strcpy(Students[j].Name,information); }else{ setInfo("请输入修改后的新考核日期",information); strcpy(Students[j].Attandance_date,information); } printf("修改完成!按回车键返回!\n"); wait_for_Enter(); } /*该函数实现的是对已经存在于系统种的同学的信息进行删除操作,具体想法是学生人数num--,后面所有人的信息前移一个位置,实现信息的覆盖*/ voidDelete(){ inti,j,flag=-1; charop[2],information[maxsize]; setInfo("请输入:<1>按学号删除<2>按姓名删除",op); if(op[0]=='1'){ setInfo("请输入学号",information); for(i=0;i 部分打印(输出学生姓名和考勤日期和考勤情况)\n<2>全部打印(输出所有学生的所有信息):"); scanf("%d",&op); if(op==1)PrintPartInformation(); elsePrintAllInformation(); } /*交换两个变量的所有成员的数值,因为成员都是char数组,所以用到了strcmp函数。此函数主要是为排序进行服务,采用指针进行交换*/ voidexchange(student*a,student*b){ chartmp[maxsize]; strcpy(tmp,a->Student_ID); strcpy(a->Student_ID,b->Student_ID); strcpy(b->Student_ID,tmp); strcpy(tmp,a->Name); strcpy(a->Name,b->Name); strcpy(b->Name,tmp); strcpy(tmp,a->Class_Number); strcpy(a->Class_Number,b->Class_Number); strcpy(b->Class_Number,tmp); strcpy(tmp,a->Attandance_Result); strcpy(a->Attandance_Result,b->Attandance_Result); strcpy(b->Attandance_Result,tmp); strcpy(tmp,a->Attandance_date); strcpy(a->Attandance_date,b->Attandance_date); strcpy(b->Attandance_date,tmp); return; } /*实现功能6排序,可以按学号,姓名,考勤日期进行排序,使用的是冒泡排序对所要求的信息进行排序*/ voidOrder(){ intop,i,j; chartmp[maxsize]; printf("请输入:<1>按学号从小到大排序<2>按学生姓名ASCLL码排序<3>按考勤日期从小到大排序:\n"); scanf("%d",&op); if(op==1){ for(i=0;i 0){ exchange(&Students[i],&Students[j]); } } } }elseif(op==2){ for(i=0;i 0){ exchange(&Students[i],&Students[j]); } } } }else{ intmonth_1,month_2,day_1,day_2; for(i=0;i month_2)exchange(&Students[i],&Students[j]); elseif(month_1==month_2&&day_1>day_2)exchange(&Students[i],&Students[j]); } } } printf("排序成功!按回车键返回\n"); wait_for_Enter(); } /*输出考勤明细表,考勤明细表具体值得是啥样的表,是按我个人的理解,如果我理解有问题,可以再叫我改*/ voidDetail_Print(){ inti,j; chartmp[maxsize]; intmonth_1,month_2,day_1,day_2; for(i=0;i 考勤明细表\n<2>考勤日报表\n<3>考勤异常表\n<4>请假汇总表",op); if(op[0]=='1'){ Detail_Print(); }elseif(op[0]=='2'){ Daily_Print(); }elseif(op[0]=='3'){ Informal_Print(); }else{ AskForLeave_Print(); } } intmain(){ inti,a,b=1; FILE*fp=fopen("Manage.txt","at+"); if(!fp){ printf("错误!未能打开文件\n"); exit(0); } fscanf(fp,"%d",&num);//读入已经在系统中的学生的个数 printf("当前系统中储存的学生个数:%d人\n",num); for(i=0;i 新增学生数据<2>查找学生数据<3>修改学生记录\n"); printf("<4>删除学生记录<5>显示学生考勤的数据列表<6>对指定数据进行排序\n"); printf("<7>进行数据统计<8>quit\n\n"); scanf("%d",&a); switch(a){ case1: ADD(); break; case2: Find(); break; case3: Change(); break; case4: Delete(); break; case5: Print(); break; case6: Order(); break; case7: Statistics(); break; case8: printf("已退出\n"); b=0; break; } system("cls");//清屏函数,为了使界面更加美观 } //在最后把信息输入到文件,保留以备下次运行使用 FILE*F=fopen("Manage.txt","wt");//注意这里是wt只写打开或建立一个文本文件,只允许写数据 fprintf(F,"%d\n",num); for(inti=0;i 2020.6.14小小的更新一下:
很多小伙伴私信问我为什么自己机器上运行不了,可能的原因是因为我编写这个程序时用的是.cpp后缀命名的c++文件,而你用的是.c后缀命名的c语言文件,这二者有着很多的差别,例如c语言里是没有bool类型的变量的,所以到你们的机器上可能会报错。
大家可以把.c文件换成.cpp文件再次运行一下,或者bool类型的变量用int类型的0和1来代替,这个程序是绝对没有问题的。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。