C语言实现考勤管理系统

 更新时间:2022年02月28日 08:50:26   作者:我是一个粉刷匠1  
这篇文章主要为大家详细介绍了C语言实现考勤管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

这些天因为补修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;
}

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

相关文章

  • 详解C语言中strcpy()函数与strncpy()函数的使用

    详解C语言中strcpy()函数与strncpy()函数的使用

    这篇文章主要介绍了详解C语言中strcpy()函数与strncpy()函数的使用,是C语言入门学习中的基础知识,需要的朋友可以参考下
    2015-08-08
  • C++中点操作符和箭头操作符的使用详解

    C++中点操作符和箭头操作符的使用详解

    本篇文章介绍了,C++中点操作符和箭头操作符的使用详解。需要的朋友参考下
    2013-05-05
  • c++ 中__declspec 的用法详解

    c++ 中__declspec 的用法详解

    这篇文章主要介绍了c++ 中__declspec 的用法详解,对初学者有一定的帮助,有需要的可以了解一下。
    2016-11-11
  • 基于C++编写一个密码系统

    基于C++编写一个密码系统

    这篇文章主要为大家详细介绍了如何基于C++编写一个简单的密码系统,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-11-11
  • 一起聊聊C++中的智能指针

    一起聊聊C++中的智能指针

    C++ 是手工管理内存的分配和释放,这给了程序员极大的自由度也给了我们极高的门槛,弄不好就得内存泄露。使用智能指针能更好的管理堆内存,本文主要给大家介绍一下c++的智能指针,需要的朋友可以参考下
    2022-07-07
  • 一文掌握C++ const与constexpr及区别

    一文掌握C++ const与constexpr及区别

    C++ 11标准中,const 用于为修饰的变量添加“只读”属性而 constexpr关键字则用于指明其后是一个常量,编译器在编译程序时可以顺带将其结果计算出来,而无需等到程序运行阶段,这样的优化极大地提高了程序的执行效率,本文重点介绍C++ const与constexpr区别介绍,一起看看吧
    2024-02-02
  • Qt调用MATLAB引擎混合编程的过程详解

    Qt调用MATLAB引擎混合编程的过程详解

    这篇文章给大家介绍了Qt调用MATLAB引擎混合编程的全过程,文中通过图文结合的方式给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-01-01
  • 插入排序算法之希尔排序+直接插入排序

    插入排序算法之希尔排序+直接插入排序

    这篇文章主要介绍了插入排序算法之希尔排序+直接插入排序的相关知识,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-11-11
  • C++ 函数重载详情介绍

    C++ 函数重载详情介绍

    这篇文章主要介绍了C++ 函数重载详情,函数重载还有一个别名叫函数多态,函数多态是C++在C语言基础上的新特性,它可以让我们使用多个同名函数,下面来看看文章具体内容的介绍
    2021-11-11
  • opencv实现颜色检测

    opencv实现颜色检测

    这篇文章主要为大家详细介绍了opencv实现颜色检测,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04

最新评论