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