一、设计要求
1. 输入职工信息并保存
功能描述:允许用户输入新的职工信息,并将这些信息保存到系统内存和一个外部文件中。
2. 查询职工信息
功能描述:提供两种查询方式:
- 通过工号查询:用户输入职工工号,系统显示对应职工的详细信息。
- 通过姓名或系部查询:用户输入职工的姓名或所属系部,系统显示匹配的所有职工信息。
3. 职称统计
功能描述:统计每种职称的职工人数,并输出统计结果。
4. 根据职称排序输出
功能描述:根据职称对所有职工进行排序,并输出排序后的职工信息。
👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 职工 ” 获取。👈👈👈
5. 根据工号修改职工信息
功能描述:允许用户输入职工工号,并修改该职工的相关信息。
6. 根据工号删除职工信息
功能描述:允许用户输入职工工号,并删除该职工的信息。
7. 显示功能菜单
功能描述:显示职工管理系统的功能菜单,供用户选择操作。
8. 加载职工信息
功能描述:从外部文件中加载职工信息到系统内存,保证系统启动时能够读取之前保存的职工数据。
9. 系统主函数
功能描述:程序的入口,控制系统的运行流程,包括显示菜单和处理用户输入的操作。
二、设计思路
1. 结构体设计
代码首先定义了一个名为Employee
的结构体,用于存储职工的基本信息。结构体包括以下字段:
struct Employee { string name; string gender; string id; string phone; string department; string title; };
这种结构体的设计使得每个职工的信息都能被有序地存储和访问。
2. 全局变量设计
代码定义了一个全局变量employees
,这是一个vector<Employee>
类型,用于存储所有职工的信息。
vector<Employee> employees;
选择vector
作为数据结构是因为它支持动态大小,并且提供了方便的元素添加和遍历功能。
3. 功能菜单设计
函数showMenu
用于显示系统的主菜单。菜单包含了所有可供用户选择的功能选项,便于用户根据需求进行操作。
void showMenu() { cout << "职工管理系统菜单:" << endl; cout << "1. 输入职工信息并保存" << endl; cout << "2. 查询职工信息" << endl; cout << "3. 职称统计" << endl; cout << "4. 根据职称排序输出" << endl; cout << "5. 根据工号修改职工信息" << endl; cout << "6. 根据工号删除职工信息" << endl; cout << "0. 退出系统" << endl; }
4. 输入职工信息并保存
函数inputEmployee
实现了输入职工信息并保存到文件的功能。
void inputEmployee() { Employee emp; // 略...(至少10行代码) cin >> emp.title; employees.push_back(emp); ofstream outFile("employees.txt", ios::app); if (outFile.is_open()) { outFile << emp.name << " " << emp.gender << " " << emp.id << " " << emp.phone << " " << emp.department << " " << emp.title << endl; outFile.close(); cout << "职工信息已保存。" << endl; } else { cout << "无法打开文件。" << endl; } }
5. 加载职工信息
函数loadEmployees
用于从文件employees.txt
中加载职工信息。
void loadEmployees() { ifstream inFile("employees.txt"); if (inFile.is_open()) { // 略...(至少10行代码) inFile.close(); } }
6. 查询职工信息
系统提供了两种查询方式:通过工号查询和通过姓名或系部查询。
通过工号查询
void searchById(const string &id) { for (const auto &emp : employees) { // 略...(至少10行代码) cout << "未找到该工号的职工信息。" << endl; }
通过姓名或系部查询
void searchByNameOrDepartment(const string &nameOrDept) { for (const auto &emp : employees) { // 略...(至少10行代码) }
7. 职称统计
函数countTitles
用于统计每种职称的职工人数。
void countTitles() { map<string, int> titleCount; for (const auto &emp : employees) { // 略...(至少10行代码) cout << "职称: " << entry.first << ", 人数: " << entry.second << endl; } }
8. 根据职称排序输出
函数sortByTitle
实现了根据职称排序并输出职工信息的功能。
void sortByTitle() { sort(employees.begin(), employees.end(), [](const Employee &a, const Employee &b) { return a.title < b.title; }); // 略...(至少10行代码) } }
9. 根据工号修改职工信息
函数modifyById
实现了根据工号修改职工信息的功能。
void modifyById(const string &id) { // 略...(至少10行代码) } cout << "未找到该工号的职工信息。" << endl; }
10. 根据工号删除职工信息
函数deleteById
实现了根据工号删除职工信息的功能。
void deleteById(const string &id) { auto it = remove_if(employees.begin(), employees.end(), [&id](const Employee &emp) { return emp.id == id; }); // 略...(至少10行代码) } else { cout << "未找到该工号的职工信息。" << endl; } }
11. 主函数设计
主函数main
是程序的入口。
int main() { loadEmployees(); int choice; do { showMenu(); cout << "选择功能: "; cin >> choice; switch (choice) { case 1: inputEmployee(); break; case 2: { // 略...(至少10行代码) case 0: cout << "退出系统。" << endl; break; default: cout << "无效的选择,请重新输入。" << endl; break; } } while (choice != 0); return 0; }
主函数首先调用loadEmployees函数加载职工信息,然后进入一个do-while循环,不断显示菜单并根据用户的选择调用相应的函数处理用户请求。用户可以通过输入相应的数字选择功能,输入0退出系统。通过使用switch-case结构,主函数能够清晰地根据用户的输入调用相应的功能函数。
👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 职工 ” 获取。👈👈👈
三、可视化分析
👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 职工 ” 获取。👈👈👈
👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 职工 ” 获取。👈👈👈
👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 职工 ” 获取。👈👈👈
👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 职工 ” 获取。👈👈👈