C语言实现考勤管理系统

这些天因为补修c语言课设,在花费了一段时间后写完了这个课设,课设的要求如下:

考勤信息记录了学生的缺课情况,它包括:缺课日期、第几节课、课程名称、学生姓名、缺课类型(迟到、早退、请假及旷课)。试设计一考勤管理系统,使之能提供以下功能:

(1) 录入学生的缺课记录;
(2) 修改某个学生的缺课记录;
(3) 查询某个学生的缺课情况;
(4) 统计某段时间内,旷课学生姓名及旷课次数,按旷课次数由多到少排序;
(5) 统计某段时间内,有学生旷课的课程及旷课人次,按旷课人次由多到少排序;
(6) 系统以菜单方式工作。

本程序由visual studio 2017编写

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

#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;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

你可能感兴趣的:(C语言实现考勤管理系统)