多文件编译任务:员工考勤信息管理

多文件编译任务:员工考勤信息管理

  • 搭建框架
    • 主文件
    • 头文件
    • 自定义函数文件
  • 运行流程
    • cmt.h
    • main.c
    • cmt.c

搭建框架

1、建立主文件main.c
2、编写自定义函数文件cmt.c
3、建立对应头文件cmt.h

主文件

1、包含头文件:#include
2、声明存储信息的全局结构体变量以及对应指针
3、含有唯一主函数:int main()
4、含有专用的子函数和附加定义

// 员工信息录入,员工信息管理
// void staff_book(struct InfoM *stfm);
// void start_staff_manager();

头文件

1、公开的宏定义

// 定义一些常用变量
// 并外部添加
#ifndef CMT_H_
#define CMT_H_

#endif 
防止重定义

2、公开的结构体定义

// 该结构体类型可由声明该头文件的任意文件调用

3、公开的库函数声明

// 其中定义的子函数可由声明该头文件的任意文件调用

自定义函数文件

将之前的打卡机文件改成自定义的函数库文件
修改1:去除主函数

// 保留原有的子函数
// 开机函数、打卡函数、退卡函数
void clockin_machine_start(struct InfoM *stfm)
int CardOn(struct InfoM *stfm, time_t tempClock);
int CardOff(struct InfoM *stfm, time_t tempClock);

修改2:修改原先的结构体

// 采用内嵌结构体的形式
// 通常信息+考勤信息
// 该文件中的函数对通常信息仅做读取,对考勤信息可以修改

修改3:添加头文件包含:#include

运行流程

1、声明全局构造类型变量
2、录入员工信息
3、打卡机操作流程
4、每周打卡信息整理
5、按工时排序
其中1、2、4、5操作在主文件main.c下定义;
3操作在库文件cmt.c下定义,经由头文件cmt.h声明实现主文件的调用。

cmt.h

/** 宏定义与结构体定义 */
/** 模拟:每小时长度,转换为实际分钟 */
#define HOUR 6
#define TRANS 10 //60/6
#define POWER 7
#define WEEKDAY 5
#define STUFF 4
#define NUMS 6

#ifndef CMT_H_
#define CMT_H_

/** 员工考勤表 */
struct Info
{
   
    //char code[NUMS];
    int Schedule[2]; //每日上下班时间
    int L; //迟到
    int E; //早退
    int X; //旷工
    int F; //全勤
    int D[5]; //每周持续上班时间
    int AVED;
};

/** 员工信息表 */
struct InfoM
{
   
    char name[16];
    char code[NUMS];
    short age;
    char sex;
    char call[16];
    char mail[32];
    struct Info ct;
};

/** 头文件中不能定义结构体数组 */
//struct InfoM stfm[STUFF]={};

/** 打卡操作声明 */
void clockin_machine_start(struct InfoM *stfm);

#endif // CMT_H_

main.c

#include 
#include 
#include "cmt.h"

struct InfoM stfm[STUFF] = {
   };
struct InfoM st[STUFF] = {
   };
struct InfoM *p = &stfm[0];

void start_staff_manager();
void staff_book(struct InfoM *stfm);

int main()
{
   
    start_staff_manager();
    return 0;
}

void start_staff_manager()
{
   
    /** 录入员工信息 */
    staff_book(p);

    /** 打卡操作 */
    clockin_machine_start(p);

    /** 信息备份 */
    FILE *fp;
    fp = fopen("result.txt","w+");
    fwrite(&stfm,sizeof(stfm),1,fp);

    /** 将文件内部指针fp指向文件内容开头 */
    rewind(fp);

    /** 信息读取 */
    fread(&st,sizeof(st),1,fp);
    printf("员工姓名\t迟到\t早退\t旷工\t全勤\n");
    for(int i=0; i<STUFF; i++)
    {
   
        printf("%s\t\t%d\t%d\t%d\t%d\n", st[i].name, st[i].ct.L, st[i].ct.E, st[i].ct.X, st[i].ct.F);
    }
    fclose(fp);

    /** 排序模块 */
    for(int i=0; i<STUFF; i++)
    {
   
        /** 大--->小 */
        for(int j=0; j<STUFF-i-1; j++)
        {
   
            if( st[j].ct.AVED  <  st[j+1].ct.AVED)
            {
   
                /** 注意 temp 的类型 */
                struct InfoM temp = st[j];
                st[j] = st[j+1];
                st[j+1] = temp;
            }
        }
    }

    /** 输出排序结果 */
    for(int i=

你可能感兴趣的:(C/C++项目任务树)