我会先将程序放上来然后后面慢慢加注释,程序的大概思路是设计三个结构体,考勤信息结构体负责保存每一条缺课信息,其中包括学生信息和课程信息,每次添加考勤信息的时候,剩下的两个学生和课程结构体会自动从里面添加所需要的信息,整个程序的功能实现也是建立在三个结构体的基础上的。
#define _CRT_SECURE_NO_WARNINGS
#define N 1000
#define M 100
#include
#include
#include
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= 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;
}