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

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

(0)

相关推荐

  • C语言实现大学生考勤管理系统

    程序设计题:大学生考勤系统 1 问题描述 该系统要求实现一个简单.实用的学生考勤系统程序,主要功能包括考勤数据的新增.删除.修改.查找.统计.排序.输出等.所有统计数据都要利用文件系统保存,以备系统下次运行时使用.通过此课题,熟练掌握文件.数组.指针的各种操作,以及一些基本算法的应用. 2 功能要求 代码要能提供以下几个基本功能. (1)考勤数据是由多条数据记录构成,其信息包括:学号(唯一).姓名.班级.考勤日期(由月和日组成)等等. (2)数据保存形式:所有信息要以文本或二进制文件保存. (3

  • C语言实现考勤管理系统

    这些天因为补修c语言课设,在花费了一段时间后写完了这个课设,课设的要求如下: 考勤信息记录了学生的缺课情况,它包括:缺课日期.第几节课.课程名称.学生姓名.缺课类型(迟到.早退.请假及旷课).试设计一考勤管理系统,使之能提供以下功能: (1) 录入学生的缺课记录:(2) 修改某个学生的缺课记录:(3) 查询某个学生的缺课情况:(4) 统计某段时间内,旷课学生姓名及旷课次数,按旷课次数由多到少排序:(5) 统计某段时间内,有学生旷课的课程及旷课人次,按旷课人次由多到少排序:(6) 系统以菜单方式工

  • C语言学生成绩管理系统小设计

    本文实例为大家分享了C语言学生成绩管理系统的具体代码,供大家参考,具体内容如下 一.本设计涉及的重要C语言知识有: 1.单链表的各种操作 2.文件流的操作 3.单链表的排序 二.本设计主要以下几个模块组成 1.学生成绩添加模块 2.学生成绩删除模块 3.学生成绩修改模块 4.学生成绩检索模块 5.学生成绩显示模块(包括成绩排序) 6.学生成绩保存模块 效果图: 本设计大概5.6百行代码左右,通过这个设计,本人感觉C语言熟练了很多, 希望能对像我一样的C语言菜鸟同学会有点帮助,废话少说,咱们上代码

  • C语言学生成绩管理系统课程设计

    学生成绩管理系统是比较适合初学者的.它涵盖了c语言几乎知识.对于学了c语言的人,把这个课程设计搞好(当然自己能设计出来是要有很好的基础).不管自己能不能够完成,最重要的是能弄懂.参考其他资料,试着自己编写是不错的选择.这个课程设计也是我参照资料,自己编写的.自己适当地增加了一些功能.不过,编的不够那么专业吧. #include<stdio.h> #include<string.h> #include<stdlib.h> #define size 100 char* cl

  • C语言实现图书管理系统

    目前为止跟着学校进度学习C语言大概半年左右,基础学习只学到了指针,学得非常浅.说实话,起初对C语言的印象---只是一个学习计算机语言的敲门砖,对具体C语言如何应用等,非常迷茫.直到大一下半学期的高级语言设计课程之后,试过dos运行的图形化界面的完整小程序,才发现C语言的魅力. ok,废话不多说了,下面是我第二节课的作品----C语言的图书管理系统.一个简单的小程序.并非纯原创,是基于网络搜索到的"学生管理系统"改编而成的.通过直接浏览.修改一个完整的代码,我的收获颇丰.我认为这样比枯燥

  • C语言学生信息管理系统小项目

    本文为大家分享了C语言学生信息管理系统小项目,供大家参考,具体内容如下 /* 运行环境:我是在linux里面用gcc编译的,在windows里应该也能运行,用的一些文件库函数都是c标准库,没有用linux的系统调用(纠正一下:system("clear")这个系统调用是linux的,windows里面用system("cls") ) (1)问题描述 学生信息包括:学号,姓名,年龄,性别,出生年月,地址,电话,E-mail等.试设计一学生信息管理系统,使之能提供以下功

  • C语言学生学籍管理系统课程设计

    C语言学生学籍管理系统做了好长时间的,里面有点小问题,希望大佬找到并帮忙改改,注意输入密码三次错误会自动注销用户,密码123456 代码: #include<stdio.h> #include<stdlib.h> #include<string.h> #include<conio.h> struct student { char xuehao[100];//输入学号 char name[100];//输入姓名 char sex[100];//输入性别 int

  • C语言职工信息管理系统源码

    本文实例为大家分享了C语言职工信息管理系统的具体代码,供大家参考,具体内容如下 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> struct worker { char ID[20];//工号 char name[20];//姓名 char sex[5];//性别 char born[20];//生日 char edu[20];//学历 char po

  • C语言学生成绩管理系统源代码

    大学C语言实训课,C语言学生成绩管理系统,供大家参考,具体内容如下 #include<stdio.h> #include<string.h> #include<math.h> struct student { int num; char name[20]; float pingshi; float shiyan; float kaoshi; double zongping; }stu[4]; void main() { void a(); void b(); void

  • C语言实现病例管理系统

    本文实例为大家分享了C语言实现病例管理系统的具体代码,供大家参考,具体内容如下 通过十字交叉链表实现一个病例管理系统,可以查找.删除.更新信息. #include"stdio.h" #include"stdlib.h" #include"string.h" typedef struct hospital_info{ char dise_num[10]; /*病历编号*/ char ke[10]; /*门诊科别*/ char date[11]; /

  • C语言版医院管理系统

    本文实例为大家分享了C语言实现医院管理系统的具体代码,供大家参考,具体内容如下 #include "stdio.h" #include "string.h" #include "stdlib.h" #include "malloc.h" #define NULL 0 typedef struct { int num; char name[10]; int age; char sex; }people; //一个患者的信息 ty

随机推荐