职工管理系统

需求分析

  1. 系统需要能够实现对职工信息的插入、删除、查找、修改和排序功能。
  2. 职工信息包括职工编号、姓名、性别、出生年月、参加工作年月、学历、职务、住址、电话等信息。
  3. 界面友好,通过菜单实现以上功能,操作简单,能够方便快捷地进行信息管理。
  4. 由键盘输入职工信息,以文件方式保存。程序执行时先将文件读入内存

设计分析

1.结构体的设计:创建一个名为“employee”的结构体,结构体成员变量包括职工编号、姓名、性别、出生年月、参加工作年月、学历、职务、住址、电话等信息。
2.数据结构选择:使用线性表来存储数据
3. 插入设计:用户可以输入职工的各项信息,将新增职工按姓名以字典顺序插入职工管理文件中,保存起来。
4. 删除设计:用户可以根据职工编号或姓名删除指定的职工信息。
5. 查找设计:用户可以根据某个限定条件(年龄,学历,职务等)查找符合条件的职工信息,并显示在界面上。
6. 修改设计,查找到某个职工,选择职工的职务住址或者电话进行修改。
7. 排序设计:用户可以按照职工编号进行排序,重新输入文件。

分模块编写,创建三个文件
在这里插入图片描述

test.cpp

#include "Employee_management.h"

//int main()
//{
//	PLinear_List l;
//	
//	//插入测试
//	Push_Back(l);
//	Push_Back(l);
//	return 0;
//}

//主函数

int main()
{
	PLinear_List l;
	Init_List(l);
	while (1)
	{
		menu();
		int input;
		cin >> input;
		if (input == 8) {
			cout << "退出成功" << endl;
			break;
		}
		switch (input)
		{
		case 1:
			Push_Back(l);
			break;
		case 2:
			Delete(l);
			break;
		case 3:
			Modfif(l);
			break;
		case 4:
			Find(l);
			break;
		case 5:
			Print(l);
			break;
		case 6:
			Sort(l);
			break;
		case 7:
			Save(l);
		}
	}
	Destroy(l);
	return 0;
}

Employee_management.h

#include <iostream>
#include <assert.h>
using namespace std;

//定义职工结构体

typedef struct Employee {
	//编号
	char number[20];
	char name[20];
	char sex[20];
	int age;
	//出生年月
	char date_of_birth[20];
	//参加工作年月
	char date_work[20];
	//学历
	char educational_backgrounf[20];
	char job[20];
	//住址
	char address[20];
	//电话
	char tele_num[20];

}Employee, *PEmployee;

//存储职工信息的线性表

typedef struct Linear_List {
	//容量
	int capacity;
	//职工个数
	int size;
	//动态数组
	PEmployee data;
}Linear_List, *PLinear_List;

//菜单(插入,删除,查找,修改,排序)
void men0u();

//初始化线性表
void Init_List(PLinear_List& PL);

//职工信息的输入
void Input(PEmployee& PE);

//扩容
void Increase_capacity(PLinear_List& PL);

//删除
void Delete(PLinear_List& PL);

//按照姓名字典序,插入新职工

void Push_Back(PLinear_List& PL);

//根据某个信息查找个别职工信息, 并且显示到标准输出

void Find(PLinear_List& PL);

//分信息查找
PEmployee Findname(PLinear_List& PL);
PEmployee Findnumber(PLinear_List& PL);

//查找可能为多个,不设置返回值,直接在函数内部打印信息
void Findjob(PLinear_List& PL);
void Finded_b(PLinear_List& PL);
void Findage(PLinear_List& PL);

//打印全体职工信息-->指定文件中
void Print(PLinear_List& PL);

//打印出职工的信息
void PrintOne(PEmployee& PE);

//按工号进行排序,并且重新输入到文件
void Sort(PLinear_List& PL);

//保存到文件
void Save(PLinear_List& PL);

//修改职工信息

void Modfif(PLinear_List& PL);

//销毁,释放内存
void Destroy(PLinear_List& PL);

Employee_management.cpp

#define _CRT_SECURE_NO_WARNINGS 

#include "Employee_management.h"

void menu()
{
	printf("\n\n\n");
	printf("\t\t-------------------------------------------------\n");
	printf("\t\t||              ----------------               ||\n");
	printf("\t\t||**************职工信息管理系统***************||\n");
	printf("\t\t||              ----------------               ||\n");
	printf("\t\t||                                             ||\n");
	printf("\t\t||~~~~~~~~~~~~~~~1.录入职工信息~~~~~~~~~~~~~~~~||\n");
	printf("\t\t||~~~~~~~~~~~~~~~2.删除职工信息~~~~~~~~~~~~~~~~||\n");
	printf("\t\t||~~~~~~~~~~~~~~~3.修改职工信息~~~~~~~~~~~~~~~~||\n");
	printf("\t\t||~~~~~~~~~~~~~~~4.查询职工信息~~~~~~~~~~~~~~~~||\n");
	printf("\t\t||~~~~~~~~~~~~~~~5.显示职工信息~~~~~~~~~~~~~~~~||\n");
	printf("\t\t||~~~~~~~~~~~~~~~6.排序职工信息~~~~~~~~~~~~~~~~||\n");
	printf("\t\t||~~~~~~~~~~~~~~~7.输入到文件~~~~~~~~~~~~~~~~~~||\n");
	printf("\t\t||~~~~~~~~~~~~~~~8.退出系统~~~~~~~~~~~~~~~~~~~~||\n");
	printf("\t\t||                                             ||\n");
	printf("\t\t||*********************************************||\n");
}

void Init_List(PLinear_List& PL)
{
	PL = new Linear_List;
	PL->capacity = 4;
	PL->size = 0;
	PL->data = new Employee[4];//(PEmployee)malloc(sizeof(Employee) * PL->capacity);
}

void Destroy(PLinear_List& PL)
{
	PL->size = 0;
	PL->capacity = 0;
	delete PL->data;
	delete PL;
}

void Increase_capacity(PLinear_List& PL)
{
	PL->capacity *= 2;

	PEmployee newdata = (PEmployee)realloc(PL->data, PL->capacity * sizeof(Employee));
	assert(newdata);

	PL->data = newdata;
}

void Push_Back(PLinear_List& PL)
{
	if (PL->size == PL->capacity)
	{
		//扩容
		Increase_capacity(PL);
	}
	PEmployee PE = new Employee;
	//输入数据
	Input(PE);
	//按照姓名字典序插入
	//计算插入的位置
	int pos = 0;
	for (pos = 0; pos < PL->size; pos++)
	{
		if (strcmp(PE->name, PL->data[pos].name) < 0)
			break;
	}
	//将pos位置后面的数据右移
	int i = PL->size - 1;
	while (i >= pos)
	{
		PL->data[i + 1] = PL->data[i];
		i--;
	}
	PrintOne(PE);
	PL->data[pos] = *PE;
	PL->size++;
	delete PE;

	cout << "录入成功" << endl;
}

void Delete(PLinear_List& PL)
{
	//根据职工编号或者姓名删除职工信息
	cout << "1.根据姓名查找该员工" << endl;
	cout << "2.根据工号查找该员工" << endl;
	int x;
	cin >> x;
	int pos = 0;
	//找到要删除职工的下标
	if (x == 1)
	{
		cout << "请输入姓名" << endl;
		char fname[20];
		cin >> fname;
		for (pos = 0; pos < PL->size; pos++)
		{
			if (strcmp(fname, PL->data[pos].name) == 0)
				break;
		}
	}
	else
	{
		cout << "请输入工号" << endl;
		char fnumber[20];
		cin >> fnumber;
		for (pos = 0; pos < PL->size; pos++)
		{
			if (strcmp(fnumber, PL->data[pos].number) == 0)
				break;
		}
	}
	//向前覆盖,size--
	PL->size--;
	for (int i = pos; pos < PL->size; pos++)
	{
		PL->data[i] = PL->data[i + 1];
	}

	cout << "删除成功" << endl;
}

void Input(PEmployee& PE)
{
	cout << "请输入要插入的职工的信息" << endl;

	cout << "职工编号: ";
	cin >> PE->number;

	cout << "姓名: ";
	cin >> PE->name;

	cout << "性别: ";
	cin >> PE->sex;

	cout << "年龄: ";
	cin >> PE->age;

	cout << "出生年月: ";
	cin >> PE->date_of_birth;

	cout << "参与工作年月: ";
	cin >> PE->date_work;

	cout << "学历: ";
	cin >> PE->educational_backgrounf;;

	cout << "职务: ";
	cin >> PE->job;

	cout << "住址: ";
	cin >> PE->address;

	cout << "电话: ";
	cin >> PE->tele_num;
}


PEmployee Findname(PLinear_List& PL)
{
	cout << "请输入要查找的职工的姓名:";
	char fname[20];
	cin >> fname;
	for (int i = 0; i < PL->size; i++)
	{
		if (strcmp(PL->data[i].name, fname) == 0)
		{
			return &(PL->data[i]);
		}
	}
	cout << "输入错误,没有该员工" << endl;
	return nullptr;
}

PEmployee Findnumber(PLinear_List& PL)
{
	cout << "请输入要查找的职工的工号:";
	char fnumber[20];
	cin >> fnumber;
	for (int i = 0; i < PL->size; i++)
	{
		if (strcmp(PL->data[i].number, fnumber) == 0)
		{
			return &(PL->data[i]);
		}
	}
	cout << "输入错误,没有该员工" << endl;
	return nullptr;
}

void Findjob(PLinear_List& PL)
{
	cout << "请输入要查找的职工的工作:";
	char fjob[20];
	cin >> fjob;
	printf("工号\t\t\t姓名\t\t\t性别\t\t\t年龄\t\t\t出生日期\t\t\t工作日期\t\t\t学历\t\t\t职务\t\t\t住址\t\t\t电话\n");
	for (int i = 0; i < PL->size; i++)
	{
		if (strcmp(PL->data[i].job, fjob) == 0)
		{
			//输出该类职工信息
			PEmployee PE = &(PL->data[i]);
			PrintOne(PE);
		}
	}
}

void Finded_b(PLinear_List& PL)
{
	cout << "请输入要查找的职工的学历:";
	char fed_b[20];
	cin >> fed_b;
	printf("工号\t\t\t姓名\t\t\t性别\t\t\t年龄\t\t\t出生日期\t\t\t工作日期\t\t\t学历\t\t\t职务\t\t\t住址\t\t\t电话\n");
	for (int i = 0; i < PL->size; i++)
	{
		if (strcmp(PL->data[i].educational_backgrounf, fed_b) == 0)
		{
			//输出该职工信息
			PEmployee PE = &(PL->data[i]);
			PrintOne(PE);
		}
	}
}

void Findage(PLinear_List& PL)
{
	cout << "请输入要查找的职工的年龄:";
	int fage;
	cin >> fage;
	printf("工号\t\t\t姓名\t\t\t性别\t\t\t年龄\t\t\t出生日期\t\t\t工作日期\t\t\t学历\t\t\t职务\t\t\t住址\t\t\t电话\n");
	for (int i = 0; i < PL->size; i++)
	{
		if (PL->data[i].age == fage)
		{
			//打印信息
			PEmployee PE = &(PL->data[i]);
			PrintOne(PE);
		}
	}
}

void Find(PLinear_List& PL)
{
	int x;

	printf("…………1.根据姓名查找…………\n");
	printf("…………2.根据工号查找…………\n");
	printf("…………3.根据职务查找…………\n");
	printf("…………4.根据学历查找…………\n");
	printf("…………5.根据年龄查找…………\n");
	cin >> x;
	PEmployee cur;
	switch (x)
	{
	case 1:
		 cur = Findname(PL);
		if (cur)
		{
			//输出该职工的信息
			PrintOne(cur);
		}
		break;
	case 2:
		cur = Findnumber(PL);
		if (cur)
		{
			//输出该职工的信息
			PrintOne(cur);
		}
		break;
	case 3:
		Findjob(PL);
		break;
	case 4:
		Finded_b(PL);
		break;
	case 5:
		Findage(PL);
		break;
	}
}

//排序
void Sort(PLinear_List& PL)
{
	int n = PL->size;
	//冒泡排序实现
	for (int i = 0; i < n - 1; i++)
	{
		for (int j = 0; j < n - i - 1; j++)
		{
			if (strcmp(PL->data[j].number, PL->data[j + 1].number) < 0)
				swap(PL->data[j], PL->data[j + 1]);
		}
	}

	cout << "排序成功" << endl;
}


void Save(PLinear_List& PL)
{
	FILE* fp;
	int n = PL->size;
	char filename[100];
	cout << "请输入要保存的文件名: " << endl;
	cin >> filename;
	//断言
	assert(fp = fopen(filename, "w"));
	fprintf(fp, "工号\t\t\t姓名\t\t\t性别\t\t\t年龄\t\t\t-出生日期\t\t\t-工作日期\t\t\t学历\t\t\t职务\t\t\t住址\t\t\t电话\n");
	for (int i = 0; i < n; i++)
		fprintf(fp, "%s\t\t\t%s\t\t\t%s\t\t\t%d\t\t\t%s\t\t\t%s\t\t\t%s\t\t\t%s\t\t\t%s\t\t\t%s\n", PL->data[i].number, PL->data[i].name, PL->data[i].sex,
			PL->data[i].age, PL->data[i].date_of_birth, PL->data[i].date_work,
			PL->data[i].educational_backgrounf, PL->data[i].job, PL->data[i].address, PL->data[i].tele_num);
	cout << "保存成功" << endl;
	fclose(fp);

}

void Print(PLinear_List& PL)
{
	int n = PL->size;
	printf("工号\t\t\t姓名\t\t\t性别\t\t\t年龄\t\t\t出生日期\t\t\t工作日期\t\t\t学历\t\t\t职务\t\t\t住址\t\t\t电话\n");
	for (int i = 0; i < n; i++)
		printf("%s\t\t\t%s\t\t\t%s\t\t\t%d\t\t\t%s\t\t\t%s\t\t\t%s\t\t\t%s\t\t\t%s\t\t\t%s\n", PL->data[i].number, PL->data[i].name, PL->data[i].sex,
			PL->data[i].age, PL->data[i].date_of_birth, PL->data[i].date_work,
			PL->data[i].educational_backgrounf, PL->data[i].job, PL->data[i].address, PL->data[i].tele_num);
}


void PrintOne(PEmployee& PE)
{
	printf("工号\t\t\t姓名\t\t\t性别\t\t\t年龄\t\t\t出生日期\t\t\t工作日期\t\t\t学历\t\t\t职务\t\t\t住址\t\t\t电话\n");
	printf("%s\t\t\t%s\t\t\t%s\t\t\t%d\t\t\t%s\t\t\t%s\t\t\t%s\t\t\t%s\t\t\t%s\t\t\t%s\n", PE->number, PE->name, PE->sex,
		PE->age, PE->date_of_birth, PE->date_work,
		PE->educational_backgrounf, PE->job, PE->address, PE->tele_num);
}


//修改职工信息

void Modfif(PLinear_List& PL)
{
	//先找到要修改的职工, 通过工号和姓名进行型查找
	cout << "1.根据姓名查找该员工" << endl;
	cout << "2.根据工号查找该员工" << endl;
	int x;
	cin >> x;
	PEmployee cur;
	if (x == 1)
	{
		cur = Findname(PL);
		PrintOne(cur);
	}
	else
	{
		cur = Findnumber(PL);
		PrintOne(cur);
	}
	//选择要修改的值
	printf("…………1.修改年龄…………\n");
	printf("…………2.修改学历…………\n");
	printf("…………3.修改住址…………\n");
	printf("…………4.修改职务…………\n");
	printf("…………5.修改电话…………\n");
	cin >> x;
	switch (x)
	{
	case 1:
		cout << "年龄修改为:";
		cin >> cur->age;
		break;
	case 2:
		cout << "学历修改为:";
		cin >> cur->educational_backgrounf;
		break;
	case 3:
		cout << "住址修改为:";
		cin >> cur->address;
		break;
	case 4:
		cout << "职务修改为:";
		cin >> cur->job;
		break;
	case 5:
		cout << "电话修改为:";
		cin >> cur->tele_num;
		break;
	}
	cout << "修改成功" << endl;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RAG实操教程langchain+Milvus向量数据库创建你的本地知识库 二

Miluvs 向量数据库 关于 Milvui 可以参考我的前两篇文章 • 一篇文章带你学会向量数据库Milvus&#xff08;一&#xff09;[1]• 一篇文章带你学会向量数据库Milvus&#xff08;二&#xff09;[2] 下面我们安装 pymilvus 库 pip install --upgrade --quiet pymilvus如果你…

【自撰写】【国际象棋入门】第7课 常见战术分析(二)牵制、驱赶和腾挪

第7课 常见战术分析&#xff08;二&#xff09;牵制、驱赶和腾挪 在《第6课&#xff1a;常见战术分析&#xff08;一&#xff09;吃双和抽将》中&#xff0c;我们通过一系列实际棋局的例子&#xff0c;简单介绍了“吃双”和“抽将”这两种十分常见的战术。本次课中&#xff0c…

Apache DolphinScheduler 亚马逊云科技联合Meetup: 基于云上的最佳实践

引言 随着大数据和云计算技术的快速发展&#xff0c;企业在数据管理和任务调度上面临着前所未有的挑战&#xff0c;包括复杂的配置过程、性能优化和成本管理等问题。同时&#xff0c;确保数据在传输和存储过程中的安全性&#xff0c;并满足合规性要求&#xff0c;也是一个重要…

12通道温振信号采集卡

12 通道智能数据采集器&#xff0c;以下简称 SG-Vib-S12。 SG-Vib-S12 旨在帮助用户对工业生产中的设备健康状况进行监测与诊断&#xff0c; 降低因设备故障对生产过程产生的影响。SG-Vib-S12 输入同时兼容 IEP、ICP 两 线制、三线制&#xff08;振温一体&#xff09;传感器&…

QT4-QT5升级(4)GBK-UTF-8-乱码-QT工程构建的区别

文件编码为UTF-8 QString 正常 char* 中文乱码解决方法&#xff1a; #include <iostream> #include <QString> #include <QTextCodec>int main() {QString qstr "你好&#xff0c;世界&#xff01;"; // 中文字符串// 获取 GBK 编码的 QTex…

数据链路层【Linux网络复习版】

目录 一、数据链路层主要解决的是什么问题&#xff1f; 二、什么是以太网&#xff1f; 三、什么是MAC地址&#xff1f; 四、以太网帧的格式是什么&#xff1f; 五、 什么是MTU&#xff1f; 六、MTU和分片 MTU对IP协议的影响&#xff1f; 如何分片&#xff1f; 如何组装&a…

应用篇| 深入浅出LLM应用之RAG

相信很多人都使用过LLM大模型&#xff0c;但是现有大模型或多或少都有以下问题&#xff1a; LLM幻觉问题&#xff1a;从《【小白入门篇1】GPT到底是怎样练成&#xff1f;》我们知道虽然大模型现在能力很强,但是本质就是在做文字接龙,而且每次接龙都具有随机性, 导致模型有时候…

追求零缺陷?找六西格玛培训公司,轻松搞定!

在瞬息万变的商业环境中&#xff0c;企业面临着巨大的挑战和激烈的竞争。为了保持领先地位&#xff0c;企业必须不断寻求优化流程、提高效率、提升质量&#xff0c;并降低成本和风险。在这样的背景下&#xff0c;六西格玛培训公司应运而生&#xff0c;成为企业追求卓越、实现持…

LearnOpenGL - Android OpenGL ES 3.0 绘制纹理

系列文章目录 LearnOpenGL 笔记 - 入门 01 OpenGLLearnOpenGL 笔记 - 入门 02 创建窗口LearnOpenGL 笔记 - 入门 03 你好&#xff0c;窗口LearnOpenGL 笔记 - 入门 04 你好&#xff0c;三角形OpenGL - 如何理解 VAO 与 VBO 之间的关系LearnOpenGL - Android OpenGL ES 3.0 绘制…

ATA-4051C高压功率放大器在压电电机中的作用是什么

压电电机是一种特殊的电机&#xff0c;其工作原理基于压电效应&#xff0c;这是一种将电能转化为机械振动的现象。压电电机通常用于精密定位、振动控制和声波生成等应用。为了驱动和控制压电电机&#xff0c;需要高压功率放大器。下面将介绍高压功率放大器在压电电机中的作用&a…

外贸SEO工具有哪些推荐?

"我们作为一个专业的Google SEO团队&#xff0c;比较推荐一下几个适合外贸SEO的工具。Ahrefs 是一个非常强大的工具&#xff0c;可以帮助你深入分析竞争对手的表现&#xff0c;找到有潜力的关键词&#xff0c;还可以监控你的网站链接状况。另外&#xff0c;SEMrush 也很不…

ubuntu访问windows共享文件夹

方法: Ubuntu访问Windows共享文件夹的方法-CSDN博客 基于交换机的PC端网络通信_服务器交换机pc端-CSDN博客 补充说明&#xff1a; 在这里面输入&#xff1a; smb://192.168.0.30/WindowsShareToLinux

NGINX_二十 nginx 监控

二十 nginx 监控 1 nginx的基础监控 进程监控端口监控 注意&#xff1a; 这两个是必须要加在zabbix监控&#xff0c;加触发器有问题及时告警。 web 服务器 nginx 以其高性能与抗并发能力越来越多的被用户使用 作为一款服务器产品&#xff0c;其运行状态是运维密切关注的&a…

解决IDEA使用卡顿的问题,设置JVM内存大小和清理缓存

解决IntelliJ IDEA中卡顿问题&#xff0c;可以尝试以下几个常见且有效的步骤&#xff1a; 1 增加IDEA的JVM内存分配&#xff1a; 位于IDEA安装目录的bin文件夹下&#xff0c;找到对应的操作系统配置文件&#xff08;idea64.exe.vmoptions&#xff08;Windows&#xff09;或id…

数学建模理论学习:线性规划模型

三要素&#xff1a;目标函数、约束条件&#xff08;s.t.&#xff09;、决策变量&#xff08;x&#xff09; 目标函数&#xff1a;z ax1 bx2 cx3 ... 其中c为一个序列&#xff0c;从左到右依次从x1到xn的系数 解决下面的线性规划问题&#xff1a; % 目标函数系数&#xf…

信息打点web篇----web后端源码专项收集

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 专栏描述&#xff1a;因为第一遍过信息收集的时候&#xff0c;没怎么把收集做回事 导致后来在实战中&#xff0c;遭遇资产获取少&#xff0c;可渗透点少的痛苦&#xff0c;如今决定 从头来过&#xff0c;全面全方位…

AI创作在论文写作中扮演什么角色?

近年来&#xff0c;随着科技的快速发展&#xff0c;AI已经逐渐渗透到了生活中的方方面面&#xff0c;其中也包含着学术领域。 作为学生党&#xff0c;你是否还在为期末论文&#xff0c;大学生实践报告而发愁&#xff1f; 有了这些AI写作神器&#xff0c;大学生们再也不用在期…

实验一:Ubuntu系统中的USB设备绑定实验

实验一&#xff1a;Ubuntu系统中的USB设备绑定实验 一、实验目的二、实验原理三、实验环境四、实验步骤任务 1&#xff1a;绑定不同USB设备任务 2&#xff1a;绑定多个相同设ID的串口设备 五、注意事项六、拓展练习 一、实验目的 学习Ubuntu中USB设备命名方法&#xff1b;掌握…

北航数据结构与程序设计图部分选填题

一、 抓两个关键信息&#xff1a;无向图&#xff0c;邻接表。无向图中&#xff0c;边&#xff08;vi&#xff0c;vj&#xff09;要在vi的链表中记录一次&#xff0c;再以&#xff08;vj&#xff0c;vi&#xff09;的形式在vj的链表中记录一次。 每个边都要记录两次&#xff0c…

Ubuntu安装qemu-guest-agent

系列文章目录 Ubuntu-24.04-live-server-amd64安装界面中文版 Ubuntu-24.04-live-server-amd64启用ssh Ubuntu乌班图安装VIM文本编辑器工具 文章目录 系列文章目录前言一、安装二、启用服务三、效果总结 前言 QEMU Guest Agent&#xff08;简称QEMU GA或QGA&#xff09;在虚拟…