基于C++实现(控制台)职工信息管理系统

news2024/10/18 14:15:21

高级程序设计实验报告

一、实验内容

设计一个职工信息管理案例,实现不同类别职工的工资数据。职工的种类包括:正式职工和临时工。定义一个基本的职工类,基本信息包括:编号、姓名、性别、年龄、家庭住址、基本职务工资。派生出正式职工类,增加的属性包括:岗位津贴、养老金、住房公积金、所得税、医疗保险、实发工资;临时工增加的属性包括:奖金、所得税、实发工资。
  • 正式职工:实发工资=基本职务工资 + 岗位津贴-养老金-住房公积金-所得税-医疗保险-所得税;
  • 临时工:实发工资=基本职务工资 + 奖金-所得税;

基本功能与技术要求

数据文件管理功能:创建新文件、打开文件、保存文件。

计算与统计功能:完成记录中相关数据的统计;

  • 能够打开已存在的数据表文件,对数据表中与某关键字匹配的相关记录进行数据统计(包括:工资总额、平均值)
  • 计算每个职工的实发工资,排序输出。

记录管理功能:记录的管理采用链表或者指针数组实现。

  • 输入/添加/插入记录,并保存到数据文件中。
  • 查询、显示记录,根据用户要求按所给编号、姓名、工资等记录关键字排序,查询一个或多个相关联记录的各项信息。
  • 修改记录:能够打开已存在的数据表文件,并对确定的任意记录进行修改,在修改过程中,应显示记录信息,给出确认提示,并对更新的记录信息进行文件保存。
  • 删除记录:能够打开已存在的数据表文件,可以删除数据表中的任一记录,要求具备逻辑删除(具有恢复功能)和物理删除功能,并对新的数据表信息进行文件保存。

二、代码说明

2.1 类与函数功能

main

主要实现功能选择,运用 flag 变量,用户输入,进入 swith 选择对应功能,在程序的开始和结束及时读取和写入文件,及时更新用户信息。

print

主要负责打印出不同功能下所要对应的界面,有以下函数:

打印选择功能界面:

void printFunction();

打印功能一对应界面:

void printFunction1();

打印功能一用户选择的数据:

void printFunction1(listpoint1 *head, int i);void printFunction1(listpoint2 *head, int i);

打印功能二对应界面:

void printFunction2(listpoint1 *head1, listpoint2 *head2);

打印功能三对应界面:

void printFunction3();

打印功能四选择界面,以及需要操作的员工类型界面:

void printFunction4(string s);

打印功能四选择查询方式界面:

void printFunction4();

打印功能五选择更改信息界面:

void printFunction5(listpoint1 *head);void printFunction5(listpoint2 *head);

打印功能六选择删除方式界面:

void printFunction6();

function

主要负责对员工进行操作的一些函数,其中的函数有以下几个:

建立正式员工对应链表:

typedef struct listpoint1 {
    fullTimeEmployee *e;
    bool fireEmployee = false;
    struct listpoint1 *next;
    struct listpoint1 *last;
} listpoint1;

建立临时员工对应链表:

typedef struct listpoint2 {
    temporaryEmployee *e;
    bool fireEmployee = false;
    struct listpoint2 *next;
    struct listpoint2 *last;
} listpoint2;

增加正式员工和临时员工:

void addEmployee(listpoint1 *head);void addEmployee(listpoint2 *head);

写入文件:

void writeCsv(fullTimeEmployee e);void writeCsv(temporaryEmployee e);

读取 CSV 文件:

void readCsv(listpoint1 *temp);void readCsv(listpoint2 *temp);

对员工进行排序:

void update(listpoint1 *temp);void update(listpoint2 *temp);

输出员工总工资:

void printWages(listpoint1 *temp, int i);void printWages(listpoint2 *temp, int i);

打印单个员工工资:

void printEmployee(listpoint1 *temp);void printEmployee(listpoint2 *temp);

打印即将被操作的员工全部信息:

void print(listpoint1 *flag);
void print(listpoint2 *flag);
打印全部员工信息:
void printEmployees(listpoint1 *head);
void printEmployees(listpoint2 *head);

按不同方式查找员工:

listpoint1* findEmplpoyee(listpoint1 *head, int i);listpoint2* findEmplpoyee(listpoint2 *head, int i);

打印全部查询到的正式员工或临时员工:

void printEmplpoyee(int i, int j, listpoint1 *head1, listpoint2 *head2);

更改员工信息:

void changeEmplpoyee(int i,listpoint1 *head1,listpoint2 *head2);

删除员工:

void deleteEmplpoyee(int i, int j, listpoint1 *head1, listpoint2 *head2);

保存员工信息:

void saveEmployee(listpoint1 *head);void saveEmployee(listpoint2 *head);employee:

主要员工类,包含了员工的一些基本信息,:

普通员工类:

class employee {
private:
    int num = 0;             //职工编号  
    string name = "";        //职工姓名  
    string gender = "";      //性别  
    int age = 0;             //年龄  
    string address = "";     //家庭住址  
    int wages = 0;           //基本职务工资
public:
    void setNum(int _num);
    void setName(string _name);
    void setGender(string _gender);
    void setAge(int _age);
    void setAddress(string _address);
    void setWages(int _wages);
    void set();
    int getNum();
    string getName();
    string getGender();
    int getAge();
    string getAddress();
    int getWages();
    employee();
};

派生出正式员工类:

class fullTimeEmployee : public employee {
private:
    int moreMoney1 = 0;  //岗位津贴  
    int moreMoney2 = 0;  //养老金  
    int moreMoney3 = 0;  //住房公积金  
    int moreMoney4 = 0;  //所得税  
    int moreMoney5 = 0;  //医疗保险  
    int sumMoney = 0;    //实发工资
public:
    void setMoney1(int _moreMoney1);
    void setMoney2(int _moreMoney2);
    void setMoney3(int _moreMoney3);
    void setMoney4(int _moreMoney4);
    void setMoney5(int _moreMoney5);
    void setSumMoney();
    void set();
    int getMoney1();
    int getMoney2();
    int getMoney3();
    int getMoney4();
    int getMoney5();
    int getSumMoney();
    fullTimeEmployee();
    fullTimeEmployee(int i);
};

派生出临时员工类:

class temporaryEmployee : public employee {
    int moreMoney1 = 0;   //奖金  
    int moreMonry2 = 0;   //所得税  
    int sumMoney = 0;     //实发工资
public:
    void setMoney1(int _moreMoney1);
    void setMoney2(int _moreMoney2);
    void setSumMoney();
    void set();
    int getMoney1();
    int getMoney2();
    int getSumMoney();
    temporaryEmployee();
    temporaryEmployee(int i);
};

2.2 运行截图

开始界面:

功能一功能选择界面:

功能一工资总额输出界面:

功能一平均工资输出界面:

功能二输出界面:

功能三选择截图:

增加正式员工:

增加临时员工:

功能四查询数据(例 按编号查询):

功能五修改数据:

功能六删除选择删除方式:

功能七显示所有员工:

三、心得体会

通过此次高级程序设计的代码编写,让我更加熟悉了用 C++ 语言完成一个程序的过程,对我以后的代码编写,起着非常重要的作用,让我对编程的过程有了更深刻的理解。

在代码编写的过程中,我也遇到了很多困难,也少不了查找和修改 bug 的过程,其中困扰我最长时间的 bug 是当时我在给链表分配空间的时候,大小分配成了链表指针,导致在运行程序的时候总是玄学报错,在单步调试的时候也查不出来,但是最后通过在网上查找资料和找同学帮助,才发现给链表分配内存的时候出错。还有一些 bug 比如忘记给链表的 next 指针设为 null,导致在循环最后报错等等。

在检查的过程中,老师也给我提了一些很有帮助的意见,站在客户的角度来让我修改我的程序,我觉得这对我来说是很重要的。对于我们现在编程来说,可能有一些点会注意不到,还没有养成站在客户角度想问题的习惯。比如在修改员工信息的时候,老师会告诉我应该先输出他要被修改的信息,还有比如在删除员工的时候,应该先输出所有员工的信息来供客户修改。还有一些程序运行的效率问题,就我现在而言,只是想着实现它,而很少考虑它的效率问题,比如在排序的过程中,我第一时间想到的是冒泡排序,而没有根据具体的情况来选择排序的方式,再比如老师提醒我横向输出比竖向输出的效率会高。以上的种种可能都是我不太会注意的点,老师能给我指出,这对我以后的程序编写会有更重要的作用,会让我考虑事情考虑的更加的全面。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2217832.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

当前python文件所在位置的上级文件夹的路径表示法:..的等价表示法os.pardir

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 当前python文件 所在位置的上级文件夹 的路径表示法:.. 的等价表示法 os.pardir [太阳]选择题 下列说法中正确的是? import os parent_dir os.pardir print("【显示】…

Axure重要元件三——中继器表单制作

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! 本节课:中继器表单制作 课程内容:利用中继器制作表单 应用场景:台账、表单 案例展示: 步骤一:建立一个背景区…

【WPF】04 Http消息处理类

这里引入微软官方提供的HttpClient类来实现我们的目的。 首先,介绍一下官方HttpClient类的内容。 HttpClient 类 定义 命名空间: System.Net.Http 程序集: System.Net.Http.dll Source: HttpClient.cs 提供一个类,用于从 URI 标识的资源发送 HTTP 请…

探索性数据分析 (EDA) 简介

文章目录 一、介绍二、探索性数据分析 (EDA)三、探索性数据分析的类型3.1 单变量分析3.2 双变量分析3.3 多元分析 四、理解 EDA五、结论 一、介绍 探索性数据分析是研究或理解数据并提取洞察数据集以识别数据模式或主要特征的过程。EDA 通常分为两种方法,即图形分析…

Spring Boot 整合 RocketMQ 之顺序消息

前言: 上一篇我们分享了 Spring Boot 整合 RocketMQ 完成普通消息发送的过程,本篇我们来分享一下 RocketMQ 顺序消息的发送。 RocketMQ 系列文章传送门 RocketMQ 的介绍及核心概念讲解 Spring Boot 整合 RocketMQ 之普通消息 Spring Boot 整合 Rock…

大数据-178 Elasticsearch Query - Java API 索引操作 文档操作

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

芯片设计企业ERP软件如何选择更好

在芯片设计这一高科技领域,高效的企业管理成为推动创新与市场响应速度的关键。ERP(企业资源计划)软件作为企业管理的核心工具,其选择直接关系到企业的运营效率与竞争力。那么,芯片设计企业在面对琳琅满目的ERP软件时,如何做出更优…

【HTML + CSS 魔法秀】打造惊艳 3D 旋转卡片

HTML结构 box 类是整个组件的容器。item-wrap 类是每个旋转卡片的包装器&#xff0c;每个都有一个内联样式–i&#xff0c;用于控制动画的延迟。item类是实际的卡片内容&#xff0c;包含一个图片。 <template><div class"box"><div class"item…

Axure横向菜单高级交互

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 课程主题&#xff1a;横向菜单高级交互 主要内容&#xff1a;横向菜单左右拖动、选中效果 应用场景&#xff1a;app横向菜单、pc后台动态区域 案例展示&#xff1a; 演…

ThreadLocal源码详解

目录 Thread、ThreadLocalMap 、ThreadLocal关系 ThreadLocal中的get、Set方法 ThreadLocal 内存泄露问题 Thread、ThreadLocalMap 、ThreadLocal关系 从源码可以看出&#xff1a;Thread类中有成员变量ThreadLocalMap&#xff0c;ThreadLocalMap类中有成员变量Entry[]数组&a…

Spring Cache Caffeine 高性能缓存库

​ Caffeine 背景 Caffeine是一个高性能的Java缓存库&#xff0c;它基于Guava Cache进行了增强&#xff0c;提供了更加出色的缓存体验。Caffeine的主要特点包括&#xff1a; 高性能&#xff1a;Caffeine使用了Java 8最新的StampedLock乐观锁技术&#xff0c;极大地提高了缓存…

buffer/cache内存优化_posix_fadvise_主动释放读缓存cache

1.问题现象 1.htop free命令发现系统 buffer/cache 内存占用高 free -h total used free shared buff/cache available Mem: 61Gi 15Gi 569Mi 1.7Gi 45Gi 43Gi Swap: 30Gi 0.0Ki 30Gi cat /proc/meminfo or grep -E "Buff|Cache" /proc/meminfo Buffers: 370568 kB …

Linux 进程终止和进程等待

目录 0.前言 1. 进程终止 1.1 进程退出的场景 1.2 进程常见退出方法 1.2.1 正常退出 1.2.2 异常退出 2. 进程等待 2.1 进程等待的重要性 2.2 进程等待的方法 2.2.1 wait() 方法 2.2.2 waitpid() 方法 2.3 获取子进程 status 2.4 阻塞等待和非阻塞等待 2.4.1 阻塞等待 2.4.2 非阻…

拼三角问题

欢迎来到杀马特的主页&#xff1a;羑悻的小杀马特.-CSDN博客 目录 一题目&#xff1a; 二思路&#xff1a; 三解答代码&#xff1a; 一题目&#xff1a; 题目链接&#xff1a; 登录—专业IT笔试面试备考平台_牛客网 二思路&#xff1a; 思路&#xff1a;首先明白能组成三角形…

php的echo和print输出语句⑥

在 PHP 中有两个基本的输出方式&#xff1a; echo 和 print。 echo 和 print 区别: echo : 可以输出一个或多个字符串 print : 只允许输出一个字符串。 提示&#xff1a;echo 输出的速度比 print 快&#xff0c; echo 没有返回值&#xff0c;print有返回值1。 <?php …

【赵渝强老师】Oracle的联机重做日志文件与数据写入过程

在Oracle数据库中&#xff0c;一个数据库可以有多个联机重做日志文件&#xff0c;它记录了数据库的变化。例如&#xff0c;当Oracle数据库产生异常时&#xff0c;导致对数据的改变没有及时写入到数据文件中。这时Oracle数据库就会根据联机重做日志文件中的信息来获得数据库的变…

Submariner 服务更新同步测试

测试服务更新同步问题 在集群1 部署 nginx1服务&#xff0c;导出服务&#xff0c;分配的虚拟 IP 为 100.1.255.253 在其他集群检测 serviceimport &#xff0c;可以检测到 nginx1 服务对应的 serviceimport 正常情况下的 serviceexport 如果删除 service 或者 删除 serviceexp…

OpenAI Canvas用户反馈:并不如外界传言般“炸裂”,更不是“AGI的终极交互形态” | LeetTalk Daily...

“LeetTalk Daily”&#xff0c;每日科技前沿&#xff0c;由LeetTools AI精心筛选&#xff0c;为您带来最新鲜、最具洞察力的科技新闻。 Canvas作为一个独立的界面&#xff0c;通过与ChatGPT的结合来提升用户的协作能力和创作效率。尽管用户对其独立性与现有工具的整合存在不同…

闯关leetcode——112. Path Sum

大纲 题目地址内容 解题代码地址 题目 地址 https://github.com/f304646673/leetcode/tree/main/112-Path-Sum 内容 Given the root of a binary tree and an integer targetSum, return true if the tree has a root-to-leaf path such that adding up all the values alo…

OpenCV高级图形用户界面(17)设置一个已经创建的滚动条的最小值函数setTrackbarMin()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::setTrackbarMin 这个函数的作用就是设置指定窗口中轨迹条的最小位置。这使得开发者能够在程序运行时动态地调整轨迹条的范围&#xff0c;而不…