C语言考勤管理系统
我是一个粉刷匠1 人气:0这些天因为补修c语言课设,在花费了一段时间后写完了这个课设,课设的要求如下:
考勤信息记录了学生的缺课情况,它包括:缺课日期、第几节课、课程名称、学生姓名、缺课类型(迟到、早退、请假及旷课)。试设计一考勤管理系统,使之能提供以下功能:
(1) 录入学生的缺课记录;
(2) 修改某个学生的缺课记录;
(3) 查询某个学生的缺课情况;
(4) 统计某段时间内,旷课学生姓名及旷课次数,按旷课次数由多到少排序;
(5) 统计某段时间内,有学生旷课的课程及旷课人次,按旷课人次由多到少排序;
(6) 系统以菜单方式工作。
本程序由visual studio 2017编写
我会先将程序放上来然后后面慢慢加注释,程序的大概思路是设计三个结构体,考勤信息结构体负责保存每一条缺课信息,其中包括学生信息和课程信息,每次添加考勤信息的时候,剩下的两个学生和课程结构体会自动从里面添加所需要的信息,整个程序的功能实现也是建立在三个结构体的基础上的。
#define _CRT_SECURE_NO_WARNINGS #define N 1000 #define M 100 #include<stdio.h> #include<stdlib.h> #include<string.h> struct kaoqing { //int total;//旷课总节数 int number;// 旷课的第几节 char coure_name[20];//课程名称 char stu_name[20];//学生名字 char type[20];//课程类型 int year; int month; int day; }; struct stu { char stu_name2[20]; int num;//每个学生的旷课总节数,旷课次数 }; struct course { char coure_name2[20];//课程名称 int num;//本门课程旷课人次 }; struct kaoqing K[N+1]= { 0 }; struct stu S[M + 1] = { 0 }; struct course C[M + 1] = { 0 }; int add_course(char name[], int *t) { int z = *t; int i = 1; int flag = 0; for (; i < z; i++) { if (strcmp(C[i].coure_name2, name) == 0) { flag = 1; } } if (flag) { return 1;// } strcpy(C[i].coure_name2, name); ++(*t); return 0; } int add_stu(char name[],int *t) { int m = *t; int i = 1; int flag = 0; for(;i<m;i++) { if (strcmp(S[i].stu_name2, name) == 0) { flag = 1; } } if (flag) { return 1;// } strcpy(S[i].stu_name2, name); ++(*t); return 0; } void Coure_show(int n,int m) { int imax; int temp; int i = 1, j = 1; int by, bm, bd, ey, em, ed; for (; i < n; i++) { printf("%s缺课日期:%d年%d月%d日 第%d节课 %s %s\n", K[i].stu_name, K[i].year, K[i].month, K[i].day, K[i].number, K[i].coure_name, K[i].type); } printf("请输入统计时间段的起点时间:"); scanf("%d%d%d", &by, &bm, &bd); printf("请输入统计时间段的终点时间:"); scanf("%d%d%d", &ey, &em, &ed); i = 1; j = 1; for (; i < m; i++) { for (j = 1; j < n; j++) { if ((K[j].year >= by) && (K[j].year <= ey)) { if ((K[j].month >= bm) && (K[j].month <= em)) { if ((K[j].day >= bd) && (K[j].day <= ed)) { if (strcmp(K[j].coure_name, C[i].coure_name2) == 0) { ++C[i].num; } } } } } } i = 1; j = 1; for (; i < m; i++) { imax = i; for (j = i + 1; j < m; j++) { if (C[j].num > C[imax].num) { imax = j; } } temp = C[imax].num; C[imax].num = C[i].num; C[i].num = temp; } i = 1; j = 1; printf("从%d年%d月%d日到%d年%d月%d日这段时间内,旷课情况如下:\n", by, bm, bd, ey, em, ed); for (; i < m; i++) { //if (C[i].num > 0) { printf("%s 旷课人次%d\n", C[i].coure_name2, C[i].num); //} for (j = 1; j < n; j++) { if (strcmp(K[j].coure_name, C[i].coure_name2) == 0) { printf("缺课日期:%d年%d月%d日 第%d节课 %s %s\n", K[j].year, K[j].month, K[j].day, K[j].number, K[j].stu_name, K[j].type); } } } i = 1; for (; i < m; i++) { C[i].num = 0; } } void Info_show(int n,int m) { int imax; int temp; int i = 1,j=1; int by, bm, bd,ey,em,ed; for (; i < n; i++) { printf("%s缺课日期:%d年%d月%d日 第%d节课 %s %s\n",K[i].stu_name,K[i].year, K[i].month, K[i].day, K[i].number, K[i].coure_name, K[i].type); } printf("请输入统计时间段的起点时间:"); scanf("%d%d%d", &by, &bm, &bd); printf("请输入统计时间段的终点时间:"); scanf("%d%d%d", &ey, &em, &ed); i = 1; j = 1; for (; i < m; i++) { for (j=1; j < n; j++) { if ((K[j].year >= by) && (K[j].year <= ey)) {//满足年份则不需要管月份和日期 if ((K[j].month >= bm) && (K[j].month <= em)) {//不满足年份满足月份则不需要管 if ((K[j].day >= bd) && (K[j].day <= ed)) { if (strcmp(K[j].stu_name,S[i].stu_name2)==0) { ++S[i].num; } } } } } } i = 1; j = 1; for (; i < m; i++) { imax = i; for (j = i + 1; j < m; j++) { if (S[j].num > S[imax].num) { imax = j; } } temp = S[imax].num; S[imax].num = S[i].num; S[i].num = temp; } i = 1; j = 1; printf("从%d年%d月%d日到%d年%d月%d日这段时间内,旷课情况如下:\n",by,bm,bd,ey,em,ed); for (; i < m; i++) { if (S[i].num > 0) { printf("%s 旷课次数%d\n", S[i].stu_name2, S[i].num); } for (j=1; j < n; j++) { if (strcmp(K[j].stu_name, S[i].stu_name2) == 0) { printf("缺课日期:%d年%d月%d日 第%d节课 %s %s\n", K[j].year, K[j].month, K[j].day, K[j].number, K[j].coure_name, K[j].type); } } } i = 1; for (; i < m; i++) { S[i].num = 0; } } void Info_change(int n) { char name[20]; int i=1; int flag = 0;//记录是否修改 int year, month, day, number; printf("请输入想修改的学生姓名:"); scanf("%s", name); printf("请输入想修改记录的时间和节数:"); scanf("%d%d%d%d", &year, &month, &day, &number); for (; i < n; i++) { if ((strcmp(K[i].stu_name,name) == 0)&&((K[i].year==year)&&(K[i].month==month)&&(K[i].day==day)&&(K[i].number==number))) { printf("请依次输入新的该条信息!"); printf("请输入缺课日期,格式为年 月 日:"); scanf("%d%d%d", &K[i].year, &K[i].month, &K[i].day); printf("请输入缺课课程为当日第几节:"); scanf("%d", &K[i].number); printf("请输入缺课课程名称:"); scanf("%s", K[i].coure_name); printf("请输入缺课类型:"); scanf("%s", K[i].type); printf("请输入缺课学生姓名:"); scanf("%s", K[i].stu_name); printf("修改成功!"); ++flag; } } if (!flag) { printf("修改失败!请联系管理员进行错误排查!"); } } void Info_find(int n) { char name[20]; int i = 1; printf("请输入查找学生姓名:"); scanf("%s", name); printf("%s的缺课情况如下:\n",name); for (; i < n; i++) { if (strcmp(K[i].stu_name, name) == 0) { printf("缺课日期:%d年%d月%d日 第%d节课 %s %s\n", K[i].year, K[i].month, K[i].day, K[i].number, K[i].coure_name, K[i].type); } } } void Info_init(int *x,int *y,int *z) { /* int number;// 旷课的第几节 char coure_name[20];//课程名称 char stu_name[20];//学生名字 char type[20];//课程类型 int year; int month; int day; */ int a_s; int a_c; int X = *x; int Y = *y; int Z = *z; int numbera;// 旷课的第几节 char coure_namea[20];//课程名称 char stu_namea[20];//学生名字 char typea[20];//课程类型 int yeara; int montha; int daya; FILE *fp; if ((fp = fopen("INFO.txt", "r")) == NULL) { printf("数据读入失败!请联系管理员进行错误排查!"); exit(0); //退出程序(结束程序) } while (fscanf(fp, "%d%s%s%s%d%d%d", &numbera, coure_namea, stu_namea, typea, &yeara, &montha, &daya) == 7) { K[*x].number = numbera; strcpy(K[*x].coure_name,coure_namea); strcpy(K[*x].stu_name, stu_namea); strcpy(K[*x].type, typea); K[*x].year = yeara; K[*x].month = montha; K[*x].day = daya; ++(*x); printf("%d\n", *x); a_s = add_stu(stu_namea,y); a_c = add_course(coure_namea,z); /*if (!a_s) { printf("%d\n", *y); printf("学生姓名数组初始化成功!\n"); } if (!a_c) { printf("%d\n", *z); printf("课程名称数组初始化成功!\n"); }*/ } fclose(fp); } void Info_save(int n) { int i=1; FILE * fp; if ((fp = fopen("INFO.txt", "w")) == NULL) { printf("数据读入失败!请联系管理员进行错误排查!"); exit(0); //退出程序(结束程序) } for (; i < n; i++) { fprintf(fp, "%d %s %s %s %d %d %d\n", K[i].number, K[i].coure_name, K[i].stu_name, K[i].type, K[i].year, K[i].month, K[i].day); } fclose(fp); } void Info_in(int *w,int *z,int *v) { char name[20]; char c_name[20]; int flag1, flag2; int n = *w;//记录数组的控制数 int m = *z;//学生数组的控制数 int o = *z;//课程数组的控制数 printf("请依次输入学生的缺课情况:"); printf("请输入缺课日期,格式为年 月 日:"); scanf("%d%d%d", &K[n].year, &K[n].month, &K[n].day); printf("请输入缺的课程为当日第几节:"); scanf("%d", &K[n].number); printf("请输入缺的课程的名称:"); scanf("%s", K[n].coure_name); strcpy(c_name, K[n].coure_name); flag1 = add_course(c_name, v); if (!flag1) { printf("课程名称添加成功"); } printf("请输入缺课的学生姓名:"); scanf("%s", K[n].stu_name); strcpy(name, K[n].stu_name); flag2=add_stu(name,z); if (!flag2) { printf("学生姓名添加成功"); } printf("请输入缺课类型:"); scanf("%s", K[n].type); printf("添加成功!"); ++(*w); } int main() { int X = 1; int Y = 1; int Z = 1; Info_init(&X,&Y,&Z); while (1) { system("cls"); int n; printf(" *************************************************************************\n"); printf(" ** **\n"); printf(" ** -------欢迎使用考勤管理系统------ **\n"); printf(" ** **\n"); printf(" *************************************************************************\n\n"); printf("\t\t\t [ 1.缺课信息登记 ]\n\n"); printf("\t\t\t [ 2.缺课信息修改 ]\n\n"); printf("\t\t\t [ 3.缺课信息查询 ]\n\n"); printf("\t\t\t [ 4.旷课学生信息展示]\n\n"); printf("\t\t\t [ 5.课程情况展示 ]\n\n"); printf("\t\t\t [ 6.退出系统 ]\n\n"); printf("请输入需要使用的功能数字:"); scanf("%d", &n); while (n < 1 || n > 7) { printf("\n\n代码输入有误,请您重新输入:"); scanf("%d", &n); } switch (n) { case 1:Info_in(&X,&Y,&Z); break; case 2:Info_change(X); break; case 3:Info_find(X); break; case 4:Info_show(X,Y); break; case 5:Coure_show(X,Z); break; case 6:exit(0); } Info_save(X); system("pause"); } return 0; }
加载全部内容