基于C++实现(控制台)单位职工管理系统(数据结构)【100010017】

news2024/11/13 14:50:30

1需求分析

1.1 问题描述

对单位的职工进行管理, 包括插入、 删除、 查找、 排序等功能。

1.2 问题要求

职工对象数不必很多, 便于一次读入内存, 所有操作不经过内外存交换。

(1) 由键盘输 入职工对象, 以文件方式保存。 程序执行时先将文件读入内存。

(2) 对职工对象中的"姓名"按字典顺序进行排序。

(3) 对排序后的职工对象进行增、 删、 查询、 修改、 排序等操作。

2总体设计

2.1 设计思路

该系统的功能大致为增删改查和排序,分别将这些功能在不同的函数中实现,主菜单为显示所有功能,并有一个修改数据的子菜单,这两个菜单可以来回切换,主菜单包括:

  1. 显示所有成员
  2. 注册员工
  3. 按姓名查询员工
  4. 按职务查询员工
  5. 按id删除员工
  6. 按姓名删除员工
  7. 按年龄对数据进行升序
  8. 按年龄对数据进行降序
  9. 按名字字典进行升序
  10. 按名字字典进行降序
  11. 修改员工信息

子菜单包括:修改员工id,性别,年龄,住址,职务,电话,工作年月,学历,以及修改全部,在修改全部功能中,类似于注册员工一样,只不过有些信息是一旦注册了就不能改变的,比如出生日期。

每回注册员工都会将数据写入文件,没回退出也会将程序执行的一系列修改的新数据写入文件,所以如果非正常方式退出可能会导致数据丢失。

对数据的录入进行限制,年龄只能在0-100,注册以及修改id不能重复,学历只能从提供的几个选项中进行选择,性别也是只有男女,出生年月注册时需要填写,年份会根据年龄进行计算,并进行相应的存储,工作时间会以当前注册的时间为工作时间并进行存储,工作时间也可人为修改,即进行重置,电话号码有位数要求,必须填写正确格式的电话号码。

如果进行命令选择的时候选择了错误的命令,系统提示指令物,请重新选择,如果输入的数据不符合要求,系统会提示数据不符合要求,请重新输入,按退出键时会提示是否真的要退出,在进行一次选择,指令错误依然会提示指令错误,对界面加一些装饰进行美化。

所以,根据上面的模型分析及输入输出参数分析,可以定义一种数据结构后进行算法实现。

2.2总体设计功能图

在这里插入图片描述

图2-1 总体功能图(5号字,按节编号,表示第2节第1个图)

3详细设计

对数据结构进行详细的描述, 设计好相应数据结构以及其操作功能, 要求用C或C++; 用文字详细描述每个功能实现的算法及思路。画出各函数的调用关系图。模块功能说明(如函数功能、入口及出口参数说明,函数调用关系描述等)

3.1抽象数据类型定义

数据对象:员工id,员工名字,员工年龄,员工性别,员工出生日期,员工工作日期,员工住址,员工所在部门,员工电话号码,以及指向下一个对象的类指针。

数据关系:所有的数据对象封装到一个类中,,每个成员都会指向下一个成员。

基本操作:对对象进行查找,删除,修改,增加,将所有对象进行排序,将对象中的数据写入文件,将数据从文件中读取到内存中。

3.2存储结构设计

链式存储结构

3.3算法设计

自然语言描述

(1)对链式结构的查找

(2)对链式结构的排序

(3)对链式结构的删除

(4)对链式结构的增加

(5)对链式结构的修改

流程图描述

查找
在这里插入图片描述

排序

在这里插入图片描述
在这里插入图片描述

删除

在这里插入图片描述

增加

在这里插入图片描述

修改
在这里插入图片描述

4代码实现

4.1 函数清单

列出所有编写的函数清单,说明每个函数的功能,函数形式参数的设置及意义

staff() : next(NULL) {}
    void registeration(class staff *head);//注册员工
    void query_name(class staff *t);//按名字查找
    void query_depart(class staff *t);//按部门查找
    void delete_num(class staff *t);//按id删除
    void delete_name(class staff *t);//按名字删除
    void show_all(class staff *head);//显示所有数据
    void update(class staff *head);//更新所有数据(子菜单)
    void update_num(class staff *head);//修改员工的id
    void update_name(class staff *head);修改员工的名字
    void update_age(class staff *head);//修该员工的年纪
    void update_sex(class staff *head);//修改员工的性别
    void update_study(class staff *head);//修改员工的学历
    void update_work(class staff *head);//修改员工的工作日期
    void update_address(class staff *head);//修改员工的住址
    void update_depart(class staff *head);//修改员工的部门
    void update_phone(class staff *head);//修改员工的电话号码
    void update_all(class staff *head);//修改所有数据
    void sort_up(class staff *head);//按年龄升序
    void sort_down(class staff *head);//按年龄降序
		void sort_nup(class staff *head);//按名字字典升序
		void sort_ndown(class staff *head);//按名字字典降序
    int read(class staff *head);//读文件
    void write(class staff *t);//写文件

**4.2 主函数 **

主函数代码

#include <iostream>
#include <string>
#include <fstream>

#include "staff.cpp"
//#include "staff.h"

using namespace std;

int main()
{
    staff *head = new staff;
    head->read(head);
    string temp;
    cout << "简单的职工管理系统--课程设计" << endl;
    while (1)
    {
        cout << "--------1.显示所有成员--------------------------------------------------" << endl;
        cout << "--------1.注册员工id(注册完毕后默认按名字字典升序存储在文件中)--------" << endl;
        cout << "--------2.按照姓名查询员工信息------------------------------------------" << endl;
        cout << "--------3.按照职务查询员工信息------------------------------------------" << endl;
        cout << "--------4.按id删除员工信息----------------------------------------------" << endl;
        cout << "--------5.按姓名删除员工信息--------------------------------------------" << endl;
        cout << "--------6.按年纪升序排列------------------------------------------------" << endl;
        cout << "--------7.按年纪降序排列------------------------------------------------" << endl;
        cout << "--------8.修改员工信息--------------------------------------------------" << endl;
		cout << "--------9.按名字字典升排序----------------------------------------------" << endl;
		cout << "--------10.按名字字典降排序---------------------------------------------" << endl;
		cout << "--------11.生成排序数据---------------------------------------------" << endl;
        cout << "--------0.退出----------------------------------------------------------" << endl;
        cout << endl;
        cout << "请输入你想选择的功能:" << endl;
        int number;
        cin >> number;
        switch (number)
        {
        case -1:
        {
            head->show_all(head);
            break;
        }
        case 1:
        {
            head->registeration(head);
			head->sort_nup(head);
            head->write(head);
            break;
        }
        case 2:
        {
            head->query_name(head);
            break;
        }
        case 3:
        {
            head->query_depart(head);
            break;
        }
        case 4:
        {
            head->delete_num(head);
            head->write(head);
            break;
        }
        case 5:
        {
            head->delete_name(head);
            head->write(head);
            break;
        }
        case 6:
        {
            head->sort_up(head);
            head->write(head);
			cout<<"排序完成------------------"<<endl;
			cout<<"是否显示排序过后的数据:(1.是/0.否)";
			int x;
			cin>>x;
			if(x==1){
				head->show_all(head);
				cout<<"排序完成------------------"<<endl;
			}
			else{
				cout<<"排序完成------------------"<<endl;
			}
            break;
        }
        case 7:
        {
            head->sort_down(head);
            head->write(head);
			cout<<"排序完成------------------"<<endl;
			cout<<"是否显示排序过后的数据:(1.是/0.否)";
			int x;
			cin>>x;
			if(x==1){
				head->show_all(head);
				cout<<"排序完成------------------"<<endl;
			}
			else{
				cout<<"排序完成------------------"<<endl;
			}
            break;
        }
        case 8:
        {
            head->update(head);
			head->sort_nup(head);
			head->write(head);
            break;
        }
		case 9:
        {
            head->sort_nup(head);
            head->write(head);
			cout<<"排序完成------------------"<<endl;
			cout<<"是否显示排序过后的数据:(1.是/0.否)";
			int x;
			cin>>x;
			if(x==1){
				head->show_all(head);
				cout<<"排序完成------------------"<<endl;
			}
			else{
				cout<<"排序完成------------------"<<endl;
			}
            break;
        }
		case 10:
        {
            head->sort_ndown(head);
            head->write(head);
			cout<<"排序完成------------------"<<endl;
			cout<<"是否显示排序过后的数据:(1.是/0.否)";
			int x;
			cin>>x;
			if(x==1){
				head->show_all(head);
				cout<<"排序完成------------------"<<endl;
			}
			else{
				cout<<"排序完成------------------"<<endl;
			}
            break;
        }
		case 11:
        {
            head->hahaha(head);
            head->write(head);
			cout<<"数据生成完毕"<<endl;
            break;
        }
        case 0:
        {
            char sign;
            cout << "是否要退出(y/n)?";
            cin >> sign;
            switch (sign)
            {
            case 'y':
            {
                head->write(head);
                return 0;
            }
            case 'n':
            {
                break;
            }
            default:
            	cout << "请输入正确的指令" << endl;
            	continue;
            }
        }
        default:
            cout << "请输入正确的指令" << endl;
        }
    }
    //system("chcp 65001");
}

4.3 其他函数

读写文件的函数操作,自动生成数据的函数操作,在staff.cpp中实现。

5运行与测试

针对不同情况列出对应的输入和输出,用有代表性的例子说明程序完成了设计任务和目标。

(1)正常测试数据和运行结果

(要求提供正常测试数据和运行结果,根据题目的功能选择几组)

程序开始执行,显示了菜单,输入-1,因为此时文件里没有任何数据,所以数据的内容为一各成员也没有,快来添加一个吧,输入1,进行数据的注册,跟着程序的提示一步一步进行输入,输入过程中如果了不符合格式的数据,会被要求重新输入此选项,知道输入正确地格式,才能进行下一个数据的输入,重复录入多组数据后,这些数据会被保存在文件中,以便下一次程序执行来读取,然后执行查找操作,根据名字或职务都能对应显示相应的数据,一组或多组,执行排序操作,根据id或名字字典都能进行正确地排序,并显示排序过的新数据,退出程序后,文件里数据顺序发生相应的变化(输入11,可以自动生成数据,来进行排序测试),执行删除操作,根据id或姓名进行删除可以正常执行。

执行修改操作首先输入8,进入修改页面,进行进一步选择,选择单个信息进行修改,id不能修改为重复的,其余的数据修改格式若修改格式不正确也会提示让重新输入。进入修改全部会对一个成员的信息进行全部修改,都会对应进行正确地修改。

下面来看一下测试:

注册员工

在这里插入图片描述
在这里插入图片描述

删除员工

在这里插入图片描述
在这里插入图片描述

查找

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

按名字字典排序

在这里插入图片描述

修改数据

在这里插入图片描述

在这里插入图片描述

(2)异常测试数据及运行结果

(要求提供 几组异常测试数据和运行结果)

异常数据:

当输入重复id时,会显示,id会已存在,当交替进行这个错误操作,会出现已存在的id允许被录入,比如:输入1(id已存在),在输入2(id已存在),都会显示id已存在,请重新输入,但在输入1时,这个id却可以被录入。

异常分析:

这样的原因是是由于,每次判断完id后,指向该id的指针,还指向该id,就导致了如果下一个输入的id若在此id后面,会将指针后移,然而在输入该id前面的,虽然该id已存在,但由于判断指针无法再是指向该id,导致这个bug的产生。

解决方法:

在函数开始出定义一个永远指向头结点的指针,每次判断完毕后,将判断指针指向该永久指向头结点的指针,这样一来就可以避免漏掉已经判断过的id。

注:改程序依然存在一个小bug,但不影响整体功能!

那就是,虽然输入错误的指令,选择错误的选项会让重新输入,并可以一直循环下去,知道用户输入正确的位置,但有一处选择功能,就是选择(y/n) 的时候,若果不按照要求输入,会出现死循环,这里的不按照要求是指,输入了多个字符,原因是,写代码时,在这里加的判断使用char判断的,所以如果多输了字符,多出来的另一个字符就会导致循环一直执行下去,其实我当时应该字符串判断的,但我后后悔当初没这么做,现在想改已经来不及了,因为今天就要交了,而我是今天测试时才发现的,有点尴尬,但这个bug我后面一定会修复这个bug。

♻️ 资源

在这里插入图片描述

大小: 3.76MB
➡️ 资源下载:https://download.csdn.net/download/s1t16/87248047

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

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

相关文章

1564_AURIX_TC275_电压监控寄存器整理

全部学习汇总&#xff1a; GreyZhang/g_TC275: happy hacking for TC275! (github.com) 1. 如果HSM保护开启了&#xff0c;那么访问修改其他的bit就会导致一个总线错误。 2. SMU中可以配置电压监控的相关alarm是否配置 生效。 这个寄存器是几个欠压阈值的配置&#xff0c;在这…

在Ubuntu中为ROG笔记本安装驱动asusctl

我是在Kubuntu22.04上安装的&#xff0c;系统自带“省电”、“平衡”、“性能”三个电源选项&#xff0c;显卡模式切换是拿nvidia驱动切换的&#xff0c;所以目前装的这个驱动我只用到了灯光调节功能。 文章目录介绍安装安装asusctl卸载显卡模式切换驱动supergfxctl使用方法启用…

LwIP——无操作系统启动流程

目录 启动流程 虚拟网卡控制块 发送流程 接收流程 总结 启动流程 通过阅读正点原子的无操作系统移植工程的源码&#xff0c;可以总结出LwIP的无操作系统的启动流程。 前面一些都是基于其他的外设的初始化&#xff0c;我们只关心这里lwip_comm_init()&#xff0c;这个函数的…

eve-ng ubuntu 20.04 设置iptables

eve-ng ubuntu 20.04 设置iptables一、设置方法1、建立iptables规则开机加载脚本2、建立iptables规则关机/重启保存脚本3、添加可执行权限4、保存当前iptables规则到配置文件二、命令解释一、设置方法 1、建立iptables规则开机加载脚本 sudo vi /etc/network/if-pre-up.d/ipt…

(十一)Vue之条件渲染

文章目录v-if与v-else-if、v-else一起使用v-show关于 <template>标签Vue学习目录 上一篇&#xff1a;&#xff08;十&#xff09;Vue之绑定样式 v-if v-if&#xff0c;默认为true&#xff0c;如果为false&#xff0c;底层实现是直接把这个节点删除 适用于&#xff1a;…

MLE,MAP,经验风险最小化,结构风险最小化,邻域风险最小化

文章目录Maximun likelihood extimationMaximum A Posterior EstimationVicinal Risk Minimization, VRMMaximun likelihood extimation 最大似然估计:样本->参数,完全相信观测到的数据,最优可能产生这些看到的数据的模型就是最理想的模型. 频率学派认为,参数是一个常数,不…

fpga实操训练(基础)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 之前我们虽然说过怎么编写verilog代码&#xff0c;怎么用iverilog软件和gtkwave软件进行仿真验证&#xff0c;但是一直没有说明如何在真实的板子上…

web前端期末大作业——基于HTML+CSS+JavaScript仿蘑菇街时尚服装购物商城

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…

28个你应该知道的JavaScript技巧

今天我将分享一些Javascript中的常用技巧&#xff0c;以帮助您解决问题。设置过程中的常见问题更快更容易。 01、Javascript 反向字符串 下面是代码&#xff1a; /*niemvuilaptrinh.com*/const stringReverse str > str.split("").reverse().join("")…

搜索引擎项目测试报告

目录单元测试构建索引模块文档信息对象Document的构建的单元测试**针对每一篇文档进行分析、处理、分词**针对文档内容提取关键字的测试&#xff08;正则表达式&#xff09;测试去掉script测试去掉标签完整测试Document类中的parseContent方法关于ansj分词器的测试关于构建倒排…

CleanMyMac4.12.2最新免费的macOS电脑清理工具

相信不少的小伙伴都在用苹果电脑&#xff0c;不论是 iMac&#xff0c;还是 MacBook&#xff0c;用着用着电脑就变慢了。这通病与苹果电脑的性能无关&#xff0c;主要是硬盘空间不足的问题&#xff01;当然你可以在购买电脑的时候就把硬盘升级&#xff0c;但主要的问题是 – 没有…

python代码圣诞树你还没有嘛?所有画法都在这篇文章里拉~

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~ 今天&#xff0c;我就来给大家分享一下python制作的几种圣诞树吧~ 一&#xff1a;唯美圣诞 代码展示 导入模块 完整源码点击领取即可 import turtle as t from turtle import * import random as r import time n 100.0spee…

【JavaWeb】Tomcat的入门使用

1Tomcat的相关概念: Tomcat是Apache软件基金会一个核心项目&#xff0c;是一个开源免费的轻量级Web服务器&#xff0c;支持Servlet/JSP少量JavaEE规范。 概念中提到了JavaEE规范&#xff0c;那什么又是JavaEE规范呢? JavaEE: Java Enterprise Edition,Java企业版。指Java企业…

5年Java开发干到月薪38k?当初实习期2.5k的苦我也吃过...

每一个能在所属行业中成为佼佼者的人&#xff0c;一定都会有他自己的独到的见解以及成长方法......这个观点我非常认同&#xff0c;我不自诩自己是个大佬&#xff0c;但现在也算是做出了头&#xff0c;我从刚毕业做 Java 实习生月薪 2.5k&#xff0c;到现在干了 5 年 Java 开发…

仿雷速体育app踢足球tab

MyTabLayout MyTabLayout用法参照BaseLibrary的Demo GitHub仓库地址 效果图 引入 gradle allprojects {repositories {maven { url https://jitpack.io }} }implementation com.github.DL-ZhangTeng:BaseLibrary:2.3.0属性 MyTabLayout属性名描述&#xff1a;可参考原生控…

Chat GPT使用体验,它真的好厉害!!!

最近的chat GTP很火&#xff0c;起因是OpenAI发布了一个全新的聊天机器人模型。就连马斯克也在感叹“很多人疯狂地陷入了 ChatGPT 循环中”&#xff0c;“ChatGPT 好得吓人&#xff0c;我们离强大到危险的人工智能不远了”。 官方的介绍是&#xff0c;这一模型可以与人类进行谈…

人类特有本能:保护族群老弱病残

人有哪些特有的本能&#xff1f; - 知乎 对于动物群体来说&#xff0c;受伤了就不管了&#xff0c;自生自灭。对于人类来说&#xff0c;受伤了尽量照顾恢复。这看起来吃亏&#xff0c;实际上划算。一个成年人&#xff0c;长大需要20年&#xff0c;受伤恢复只要3个月。 远方青木…

全新CorelDRAW2023最新版矢量图软件功能简介

CorelDRAW2023简介 &#xff1a;设计绘画 CorelDraw 是一个绘图与排版的软件&#xff0c;它广泛地应用于商标设计、标志制作、模型绘制、插图描画、排版及分色输出等诸多领域。 作为一个强大的绘图软件&#xff0c;它被喜爱的程度可用下面的事实说明&#xff1a;用作商业设计和…

WPFUI LiveCharts使用记录(一)柱状图

前言&#xff1a;LiveCharts是一个图标控件库集&#xff0c;可以实现柱状图、折线图、饼图、仪表盘等图表控件。而且最新版本支持全平台使用&#xff0c;实现的样例展示可以点击查看作者Alberto Rodrguez的 github仓库 1.背景 1.1 新建项目 这篇文章使用的是.NET framework4.…

Foxmail升级后图片链接乱

升级后默认勾选了总是以纯文本格式阅读邮件。 在设置-高级-中取消勾选