C语言学生考勤系统:实现多次考勤记录功能
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #define FILE_NAME "employee.txt"
void save(); void load(); void input(); void check_in(); void check_out(); void search(); void search_name(); int search_num(); void search_dianhua(); void xiugai(); void add(); void shuchu(); void revise(int k); void deletel(int k); unsigned long suiji();
int M = 0;
struct employee { char name[20]; unsigned long num; char sex; int age; char tel[12]; time_t check_in_time[31]; time_t check_out_time[31]; int score; int count; // 考勤次数 };
struct employee emp[1000];
int main()
{
int a;
load(); // 加载之前保存的学生信息
while(1)
{
printf("================学生考勤系统================
");
printf(" \t1.录入学生信息 2.学生信息浏览
\n");
printf(" \t3.学生签到 4.学生签退
\n");
printf(" \t5.学生查询 6.信息修改和删除
\n");
printf(" \t7.添加学生信息 8.退出系统
");
printf("==========================================
");
printf(" 请选择,输入1-8键:");
scanf("%d",&a);
switch(a) {
case 1:
input();
break;
case 2:
shuchu();
break;
case 3:
check_in();
break;
case 4:
check_out();
break;
case 5:
search();
break;
case 6:
xiugai();
break;
case 7:
add();
break;
case 8:
exit(0);
break;
default:
printf("\n非法操作!
");
}
system("pause");
system("cls");
}
}
void input() { int i,j,k; printf("\n 欢迎进入录入学生信息 "); printf("============================================================= "); printf("\n输入要添加的学生人数:"); for(i=0;i<10;i++) { scanf("%d",&j); if(j<1000) { break; } printf("该系统只能存放1000人以内的信息,请重新输入 "); } if(i==10) { printf("输入的人数超过范围 "); exit(0); } for(i=0;i<j;i++) { printf("输入第%d个学生的姓名:",i+1); scanf("%s",emp[i].name); printf("输入第%d个学生的性别(w/m):",i+1); getchar(); scanf("%c",&emp[i].sex); printf("输入第%d个学生的年龄:",i+1); scanf("%d",&emp[i].age); getchar(); printf("输入第%d个学生的联系电话:",i+1); scanf("%s",emp[i].tel); emp[i].num=suiji(); printf("该学生的学号被系统定义为:%lu ",emp[i].num); printf("\n"); emp[i].check_in_time[0]=0; emp[i].check_out_time[0]=0; emp[i].count = 0; // 初始化考勤次数 } M+=j; save(); printf("\n\n 录入成功! "); system("pause"); }
void save() { FILE* fp; int i,j; fp=fopen(FILE_NAME,"w"); if(fp==NULL) { printf("\n文件打开失败! "); exit(0); } fprintf(fp,"%d\n",M); for(i=0;i<M;i++) { fprintf(fp,"%s %lu %c %d %s ",emp[i].name,emp[i].num,emp[i].sex,emp[i].age,emp[i].tel); for(j=0;j<31;j++) { fprintf(fp,"%lld %lld ",emp[i].check_in_time[j],emp[i].check_out_time[j]); } fprintf(fp,"%d\n", emp[i].count); // 保存考勤次数 } fclose(fp); }
void load() { FILE* fp; int i,j; fp=fopen(FILE_NAME,"r"); if(fp==NULL) { printf("\n文件打开失败! "); return; } fscanf(fp,"%d",&M); for(i=0;i<M;i++) { fscanf(fp,"%s %lu %c %d %s ",emp[i].name,&emp[i].num,&emp[i].sex,&emp[i].age,emp[i].tel); for(j=0;j<31;j++) { fscanf(fp,"%lld %lld ",&emp[i].check_in_time[j],&emp[i].check_out_time[j]); } fscanf(fp, "%d", &emp[i].count); // 加载考勤次数 } fclose(fp); }
unsigned long suiji() { unsigned long h; srand(time(NULL)); h=rand()%1000+2023000; return h; }
void check_in() { int n; printf("\n 欢迎进入学生签到 "); printf("============================================================= "); n=search_num(); if(n==-1) { printf("\n没有该学生! "); return; } if(emp[n].check_in_time[0]!=0) { printf("\n该学生已经签到! "); return; } printf("\n请输入该学生的分数:"); scanf("%d", &emp[n].score); emp[n].check_in_time[emp[n].count] = time(NULL); // 将新的签到时间追加到数组中 emp[n].count++; // 更新考勤次数 printf("\n签到成功! "); save(); return; }
void check_out() { int n; printf("\n 欢迎进入学生签退 "); printf("============================================================= "); n=search_num(); if(n==-1) { printf("\n没有该学生! "); return; } if(emp[n].check_in_time[0]==0) { printf("\n该学生尚未签到! "); return; } if(emp[n].check_out_time[0]!=0) { printf("\n该学生已经签退! "); return; } emp[n].check_out_time[emp[n].count] = time(NULL); emp[n].count++; // 更新考勤次数 printf("\n签退成功! "); save(); return; }
void search()//查询的主菜单 { int a; while(1) { printf("\n 欢迎进入学生信息查询 "); printf("============================================================= "); printf(" \t1.按学号查询 2.按姓名查询 3.按联系电话查询 \n"); printf(" \t4.返回上一级 5.退出系统 "); printf("============================================================= "); printf(" 请选择,输入1-5键:"); scanf("%d",&a); switch(a) { case 1: search_num(); break; case 2: search_name(); break; case 3: search_dianhua(); break; case 4: return; case 5: exit(0); break; default: printf("\n非法操作! "); } system("pause"); system("cls"); } }
int search_num()//按学号查询 { unsigned long k; int i; printf("\n请输入要查询的学生学号:"); scanf("%lu",&k); for(i=0;i<M;i++) { if(k==emp[i].num) { printf("\n"); printf("============================================================= "); printf("学号:%lu 姓名:%s 性别:%c 年龄:%d 联系电话:%s ",emp[i].num,emp[i].name,emp[i].sex,emp[i].age,emp[i].tel); if(emp[i].check_in_time[0]==0) { printf("尚未签到 "); } else { printf("签到时间:%s",asctime(localtime(&emp[i].check_in_time[0]))); } if(emp[i].check_out_time[0]==0) { printf("尚未签退 "); } else { printf("签退时间:%s",asctime(localtime(&emp[i].check_out_time[0]))); } printf("============================================================= "); return i; } } return -1; }
void search_name()//按姓名查询 { char k[20]; int i,j=0; printf("\n请输入要查询的学生姓名:"); scanf("%s",k); for(i=0;i<M;i++) { if(strcmp(k,emp[i].name)==0) { printf("\n"); printf("============================================================= "); printf("学号:%lu 姓名:%s 性别:%c 年龄:%d 联系电话:%s ",emp[i].num,emp[i].name,emp[i].sex,emp[i].age,emp[i].tel); if(emp[i].check_in_time[0]==0) { printf("尚未签到 "); } else { printf("签到时间:%s",asctime(localtime(&emp[i].check_in_time[0]))); } if(emp[i].check_out_time[0]==0) { printf("尚未签退 "); } else { printf("签退时间:%s",asctime(localtime(&emp[i].check_out_time[0]))); } printf("============================================================= "); j=1; } } if(j==0) { printf("\n没有该学生! "); } return; }
void search_dianhua()//按电话查询 { char k[12]; int i,j=0; printf("\n请输入要查询的学生联系电话:"); scanf("%s",k); for(i=0;i<M;i++) { if(strcmp(k,emp[i].tel)==0) { printf("\n"); printf("============================================================= "); printf("学号:%lu 姓名:%s 性别:%c 年龄:%d 联系电话:%s ",emp[i].num,emp[i].name,emp[i].sex,emp[i].age,emp[i].tel); if(emp[i].check_in_time[0]==0) { printf("尚未签到 "); } else { printf("签到时间:%s",asctime(localtime(&emp[i].check_in_time[0]))); } if(emp[i].check_out_time[0]==0) { printf("尚未签退 "); } else { printf("签退时间:%s",asctime(localtime(&emp[i].check_out_time[0]))); } printf("============================================================= "); j=1; } } if(j==0) { printf("\n没有该学生! "); } return; }
void xiugai() { int k,chose; printf("\n 欢迎进入学生信息修改和删除 "); printf("============================================================= "); k=search_num(); if(k==-1) { printf("\n没有该学生! "); return; } printf("\n请选择,输入1-2键:"); printf("\n \t1.修改 2.删除 "); scanf("%d",&chose); switch(chose) { case 1: revise(k); break; case 2: deletel(k); break; default: printf("\n非法操作! "); } return; } void revise(int k) { printf("\n请输入修改后的学生姓名:"); scanf("%s",&emp[k].name); getchar(); printf("请输入修改后的学生性别(w/m):"); scanf("%c",&emp[k].sex); getchar(); printf("请输入修改后的学生年龄:"); scanf("%d",&emp[k].age); getchar(); printf("请输入修改后的学生联系电话:"); scanf("%s",&emp[k].tel); save(); printf("\n修改成功! "); }
void deletel(int k) { int i; for(i=k;i<M-1;i++) { emp[i]=emp[i+1]; } M--; save(); printf("\n 删除成功! "); } void add() { int i,j; printf("\n 欢迎进入添加学生信息 "); printf("============================================================= "); printf("\n输入要添加的学生人数:"); for(i=0;i<10;i++) { scanf("%d",&j); if(M+j<=1000) { break; } printf("该系统只能存放1000人以内的信息,还能添加%d人,请重新输入添加人数 ",1000-M); } if(i==10) { printf("可添加人数为%d ",1000-M); return; } for(i=M;i<M+j;i++) { printf("输入第%d个学生的姓名:",i+1); scanf("%s",emp[i].name); printf("输入第%d个学生的性别(w/m):",i+1); getchar(); scanf("%c",&emp[i].sex); printf("输入第%d个学生的年龄:",i+1); scanf("%d",&emp[i].age); getchar(); printf("输入第%d个学生的联系电话:",i+1); scanf("%s",emp[i].tel); emp[i].num=suiji(); printf("\n"); emp[i].check_in_time[0]=0; emp[i].check_out_time[0]=0; emp[i].count = 0; // 初始化考勤次数 } M+=j; save(); printf("\n\n 添加成功! "); system("pause"); } void shuchu() { int i, j; printf("\n 欢迎进入学生信息浏览 "); printf("============================================================= "); if(M==0) { printf("\n暂无学生信息! "); return; } printf("\n当前学生信息如下:(共%d人) ",M); printf("============================================================= "); for(i=0;i<M;i++) { printf("学号:%lu 姓名:%s 性别:%c 年龄:%d 联系电话:%s 分数:%d ",emp[i].num,emp[i].name,emp[i].sex,emp[i].age,emp[i].tel,emp[i].score); for (j = 0; j < emp[i].count; j++) { // 循环输出每一次的考勤信息 if(emp[i].check_in_time[j] == 0) { printf("尚未签到 "); } else { printf("第%d次签到时间:%s", j + 1, asctime(localtime(&emp[i].check_in_time[j]))); } if(emp[i].check_out_time[j] == 0) { printf("尚未签退 "); } else { printf("第%d次签退时间:%s", j + 1, asctime(localtime(&emp[i].check_out_time[j]))); } } printf("============================================================= "); } return; }
原文地址: https://www.cveoy.top/t/topic/o6cs 著作权归作者所有。请勿转载和采集!