C++实现考勤管理系统

C++实现考勤管理系统

简介

考勤管理系统是一种可以对员工的出勤情况进行统计和分析的工具,它可以帮助企业更加有效地管理其员工,并且提高员工出勤率。本文将介绍如何用C++实现考勤管理系统。

设计思路

考勤管理系统需要满足以下功能:

  1. 输入员工的考勤信息。
  2. 对员工的考勤记录进行存储和管理。
  3. 统计员工的出勤情况,并给出相应的报告。

为了实现这些功能,我们需要设计以下几个类:

  1. Employee类:用于表示每个员工的基本信息和考勤记录。
  2. AttendanceRecord类:用于表示每个员工每天的考勤记录。
  3. AttendanceManager类:用于管理所有员工的考勤信息和生成报告。

类设计

Employee

Employee类需要包含以下成员变量:

class Employee {
public:
    string name; //姓名
    string id; //工号
    string department; //所属部门
    vector<AttendanceRecord> attendanceRecords; //考勤记录
}

Employee类还需要包含以下方法:

class Employee {
public:
    void addAttendanceRecord(AttendanceRecord record); //添加考勤记录
}

AttendanceRecord

AttendanceRecord类需要包含以下成员变量:

class AttendanceRecord {
public:
    string date; //日期
    int signInHour; //上班签到小时
    int signInMinute; //上班签到分钟
    int signOutHour; //下班签退小时
    int signOutMinute; //下班签退分钟
}

AttendanceManager

AttendanceManager类需要包含以下成员变量:

class AttendanceManager {
private:
    vector<Employee> employees; //所有员工的考勤信息
public:
    void addEmployee(Employee e); //添加员工
    void addAttendanceRecord(string id, AttendanceRecord record); //为指定员工添加考勤记录
    void generateReport(); //生成考勤报告
}

代码实现

Employee类实现

class Employee {
public:
    string name;
    string id;
    string department;
    vector<AttendanceRecord> attendanceRecords;

    void addAttendanceRecord(AttendanceRecord record) {
        attendanceRecords.push_back(record);
    }
};

AttendanceRecord类实现

class AttendanceRecord {
public:
    string date;
    int signInHour;
    int signInMinute;
    int signOutHour;
    int signOutMinute;
};

AttendanceManager类实现

class AttendanceManager {
private:
    vector<Employee> employees;

public:
    void addEmployee(Employee e) {
        employees.push_back(e);
    }

    void addAttendanceRecord(string id, AttendanceRecord record) {
        for (int i = 0; i < employees.size(); ++i) {
            if (employees[i].id == id) {
                employees[i].addAttendanceRecord(record);
                break;
            }
        }
    }

    void generateReport() {
        cout << "部门\t姓名\t日期\t上班签到时间\t下班签退时间\t迟到\t早退\n";
        cout << "--------------------------------------------------------------\n";
        for (int i = 0; i < employees.size(); ++i) {
            for (int j = 0; j < employees[i].attendanceRecords.size(); ++j) {
                AttendanceRecord record = employees[i].attendanceRecords[j];
                int late = (record.signInHour * 60 + record.signInMinute) - (9 * 60 + 0);
                int early = (18 * 60 + 0) - (record.signOutHour * 60 + record.signOutMinute);
                if (late < 0) {
                    late = 0;
                }
                if (early < 0) {
                    early = 0;
                }
                cout << employees[i].department << "\t" << employees[i].name << "\t" << record.date << "\t"
                     << record.signInHour << ":" << record.signInMinute << "\t"
                     << record.signOutHour << ":" << record.signOutMinute << "\t"
                     << late << "\t" << early << "\n";
            }
        }
    }
};

示例说明

假设我们有两个员工A、B,他们都在同一个部门,需要记录他们的考勤信息。以下是代码示例:

AttendanceManager manager;

Employee e1;
e1.name = "张三";
e1.id = "10001";
e1.department = "研发一部";

AttendanceRecord r1;
r1.date = "2022-01-01";
r1.signInHour = 8;
r1.signInMinute = 50;
r1.signOutHour = 17;
r1.signOutMinute = 30;
e1.addAttendanceRecord(r1);

manager.addEmployee(e1);
manager.addAttendanceRecord("10001", r1);

Employee e2;
e2.name = "李四";
e2.id = "10002";
e2.department = "研发一部";

AttendanceRecord r2;
r2.date = "2022-01-01";
r2.signInHour = 9;
r2.signInMinute = 10;
r2.signOutHour = 18;
r2.signOutMinute = 15;
e2.addAttendanceRecord(r2);

manager.addEmployee(e2);
manager.addAttendanceRecord("10002", r2);

manager.generateReport();

执行完毕后,将会输出一份考勤报告,如下所示:

部门  姓名  日期  上班签到时间  下班签退时间  迟到  早退
--------------------------------------------------------------
研发一部    张三  2022-01-01  8:50    17:30   0   30
研发一部    李四  2022-01-01  9:10    18:15   10  0

考勤报告中,包含两个员工的考勤记录情况,以及他们当天的迟到和早退情况。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实现考勤管理系统 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • 通过VS中的数据源选择对话框简单实现数据库连接配置

    通过VS中的数据源选择对话框,可以简单地实现数据库连接配置。下面将分为以下几个步骤来介绍如何实现: 1. 打开Server Explorer 在Visual Studio的视图菜单中选择“Server Explorer”或者使用快捷键“Ctrl+\,Ctrl+S”来打开Server Explorer。 2. 添加数据源 在Server Explorer中右键…

    C 2023年5月23日
    00
  • MFC程序对文件的处理方法

    MFC程序对文件的处理方法主要包括文件的创建、读取、写入和关闭操作。下面将针对每一种操作进行详细讲解。 文件的创建 要在MFC程序中创建一个新文件,可以使用CFile类的Open方法,该方法会打开指定的文件并返回一个CFile对象,可以通过该对象对文件进行操作。 示例1:创建一个名为”test.txt”的文本文件 CFile file; if (file.O…

    C 2023年5月23日
    00
  • Java自动拆箱空指针异常的解决

    Java自动拆箱空指针异常通常发生在Java中使用装箱类型与基本数据类型混合运算的过程中。在这种情况下,装箱类型将被自动展开成基本数据类型,这个过程称为自动拆箱。如果装箱类型为null,则在自动拆箱时会抛出NullPointerException。下面是解决Java自动拆箱空指针异常的攻略: 解决方案1:显式进行空值判断 因为空指针异常是由于装箱类型为nul…

    C 2023年5月22日
    00
  • c语言实现足球比赛积分统计系统

    使用C语言实现足球比赛积分统计系统 介绍 足球比赛积分统计系统是一个基本的数据管理系统,它能够记录球队之间的胜、负、平等信息,计算出每个球队的比赛积分。本文将详细讲解如何使用C语言实现一个简单的足球比赛积分统计系统。 准备工作 要使用C语言实现足球比赛积分统计系统,您需要了解一些基本的程序设计概念,例如: 变量 运算符 控制结构(如if/else) 循环结构…

    C 2023年5月22日
    00
  • linux c++ 服务器端开发面试必看书籍整理

    Linux C++ 服务器端开发面试必看书籍整理 作为一位 Linux C++ 服务器端开发人员,你需要深入掌握 C++ 语言、 Linux 操作系统、网络编程、多线程编程等知识。以下是一些值得推荐的书籍: 1.《UNIX环境高级编程》 该书是 UNIX 系统编程的经典著作,全书共 2 卷,主要介绍 UNIX 系统编程的基础知识、文件 I/O、进程控制、信号…

    C 2023年5月22日
    00
  • DEV C++源码编译后控制台输出中文乱码问题解决

    以下是详细讲解“DEV C++源码编译后控制台输出中文乱码问题”的完整攻略: 问题原因及解决方案 开发过程中,我们经常会遇到中文输出乱码的问题。这是因为 C/C++ 标准库使用的是 ASCII 编码,而中文的编码不是 ASCII,所以输出会产生乱码。在 Windows 下,可以使用一些特殊的函数来解决这个问题。 解决方案 使用 _setmode 函数 _se…

    C 2023年5月23日
    00
  • C++计数排序详解

    C++计数排序详解 什么是计数排序? 计数排序是一种非比较型排序算法,它的基本思想是统计所有元素的出现次数,然后根据每个元素的出现次数,依次将这些元素放入数组中,从而得到排好序的数组。 计数排序的基本原理 计数排序利用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素个数。然后根据数组C来将A中的元素排到正确的位置。例如,如果C[3]=4,那么值…

    C 2023年5月22日
    00
  • C语言利用模板实现简单的栈类

    C语言利用模板实现简单的栈类 概述 本文介绍如何利用C语言中的模板来实现一个简单的栈类,使用者可以通过该类方便地进行基本的栈操作,比如入栈、出栈、查看栈顶元素等。 设计思路 栈是一种后进先出的数据结构,本文中我们采用单向链表的形式来实现栈,每个节点存储一个数据元素,同时每个节点还有个指向下一个节点的指针。栈的主要操作为入栈、出栈、查看栈顶元素,我们在代码中实…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部