[内附完整源码和文档] 基于C++的职工信息表系统

1.设计目标
使用类和向量的方法,编写能够输入职工的信息的职工信息表,再根据这个表产生一个职工信息简表,并利用多态性实现信息的输出。

本设计要求实现如下功能:

增加职工信息记录

生成信息简表

显示原始记录

显示简表记录

结束程序运行

在功能2,3,4中如果没有输入信息,程序会提示要先输入信息。

2.设计思想
在本程序中包含一个头文件 .h 和两个cpp文件。其中头文件除了对函数进行原型声明外,还定义了两个类来建立职工的信息数据。这一点会在下一部分中作详细说明。当然还有普通函数对信息的处理。

void addin(); //增加职工记录
void brevity(); //生成信息简表
void Dispwks(); //显示职工信息
void Dispwk(); //显示简表信息
另外,菜单是该程序的整体框架,主要通过使用控制语句用来改变程序执行的顺序,即根据用户选择的不同功能来调用不同的实现函数,这是实现结构化程序设计的基础。如:

void handle_menu(); //菜单设计函数
int nemu_select(); //菜单选择函数
3.类及对象设计
3.1 类的设计
本程序通过继承的方法,定义两个类——职工简表类(worker),职工信息类(workers),这里把简表类的内容作为基类,由它派生出详表类,两个类之间的关系,可以由以下的结构图中清楚地表现出来。

worker
|–Num:char
|–Name:char
|
|–setname:void
|–Setnum: setnum:void
|–*getna *getname:char
|–*getnu *getnum:char
|–display: display:virtual void
workers
|–sex:char
|–age:int
|–sal:int
|
|–setsex:void
|–setage:void
|–setsal:void
|–*getsex:char
|–getage:int
|–getsal:int
|–display:void
其中,简表主要存放职工的编号,姓名,等信息,派生类中,除了继承基类的数据成员外,还在原有的基础上添加了职工性别,年龄,工资三项数据以丰富职工记录,而这些数据成员的获取与传值主要通过类中的成员函数来实现。

如两个类中,返回类型为int与char的成员函数,是实现数据的获取,由用户输入;而返回类型为void(除display外)的函数,实现传值的功能。在这里我想特别强调的是基类中的函数void display,将其设计为虚函数,主要是由于程序中的一个打印函数print是使用基类worker对象的引用作为参数,以便实现多态性(print(worker &))。

3.2 对象的设计
该程序的另一个特点是向量数组的使用,即主要通过向量的方法生成两个对象:

vectorvwk;//简表信息的向量数组
vectorvwks;//完整信息的向量数组
运用向量主要是考虑编程的方便;因为向量是一种容器,系统已经为用户预定义了相关操作的公有成员函数,我们可以通过调用其成员函数的方法直接完成程序设计,如在添加函数中:

void addin(){
worker wks;//暂存对象
……
cout<<“\t年龄”;
cin>>age;
wks.setage(age);
vwks.push_back(wks);
}
push_back()是向量的内部函数,主要用于向容器尾部插入对象,改变容器的大小,实现从向量的尾部增加记录。

4.调试记录
调试通过的结果如下:

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

完整的源码和详细的文档,上传到了 WRITE-BUG技术共享平台 上,需要的请自取:

https://www.write-bug.com/article/2896.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
#include<iostream> #include<string> #include<fstream> #include <vector> #include <functional> #include <algorithm> #include<string> using namespace std; class Employee{ protected: int number; string name; public: Employee(){} Employee(int num,string nam); void setname(string n); void setnumber(int n); string getname(void); int getnumber(void); virtual void display(void); friend bool less_number(const Employee & m1, const Employee & m2); }; class EmployeeDetial:public Employee{ protected: string sex; int age; public: EmployeeDetial(){} EmployeeDetial(int num,string nam,string se,int ag); void setsex (string s); void setage(int a); string getsex(void); int getage(void); void display(void); friend bool less_age(const EmployeeDetial & m1, const EmployeeDetial & m2); }; void Employee::setname(string n){ name=n; } void Employee::setnumber(int n){ number=n; } string Employee::getname(void){ return name; } int Employee::getnumber(void){ return number; } void Employee::display(void){ // cout<<"E.display"<<endl; cout<<number<<" "<<name<<endl; } void EmployeeDetial::setsex(string s){ sex=s; } void EmployeeDetial::setage(int a){ age=a; } string EmployeeDetial::getsex(void){ return sex; } int EmployeeDetial::getage(void){ return age; } void EmployeeDetial::display(void){ // cout<<"ED.display"<<endl; cout<<number<<" "<<name<<" "<<sex <<" "<<age<<" "<<endl; } EmployeeDetial::EmployeeDetial(int num,string nam,string se,int ag){ number=num; name=nam; sex=se; age=ag; } Employee::Employee(int num,string nam){ number=num; name=nam; } bool less_number(const Employee & m1, const Employee & m2) { return m1.number<m2.number; } bool less_age(const EmployeeDetial & m1, const EmployeeDetial & m2) { return m1.age<m2.age; } using namespace std; static int counter=0; vector<EmployeeDetial> vED; vector<Employee> vE; void load_f_ED(){ int num,age; string name,sex; ifstream fin("EmployeeDetial.txt"); if(!fin){ cout<<"open file error!"<<endl; exit(1); } while(fin>>num>>name>>sex>>age){ // fin>>num>>name>>sex>>age; vED.push_back(EmployeeDetial(num,name,sex,age)); counter++; } fin.close(); } bool load_f_E(){ int num; string name; ifstream fin("Employee.txt"); if(!fin)return false; while(fin>>num>>name){ // fin>>num>>name>>sex>>age; vE.push_back(Employee(num,name)); } fin.close(); return true; } void display_E(){ for(int i=0;i<counter;i++)vE.at(i).display(); } void display_ED(){ for(int i=0;i<counter;i++){ vED.at(i).display(); } } void E_fout(){ ofstream fout("Employee.txt"); for(int i=0;i<counter;i++){ fout<<vE.at(i).getnumber()<<" "<<vE.at(i).getname()<<"\n"; } fout.close(); } void ED_fout(){ ofstream fout("EmployeeDetial.txt"); for(int i=0;i<counter;i++){ fout<<vED.at(i).getnumber()<<" "<<vED.at(i).getname()<<" "<< vED.at(i).getsex()<<" "<<vED.at(i).getage()<<"\n"; } fout.close(); } void E_ED(){ for(int i=0;i<counter;i++)vE.push_back(Employee(vED.at(i).getnumber(),vED.at(i).getname())); } void add(){ int num,age; string name,sex; cout<<"input the number:"<<endl; cin>>num; cout<<"input the name:"<<endl; cin>>name; cout<<"input the sex:"<<endl; cin>>sex; cout<<"input the age:"<<endl; cin>>age; vED.push_back(EmployeeDetial(num,name,sex,age)); vE.push_back(Employee(num,name)); counter++; cout<<"add success!"<<endl; } void delet(){ int a; cout<<"input the number which you want to delete:"<<endl; cin>>a; for(int i=0;i<counter;i++){ if(vED.at(i).getnumber()==a){ for(int n=i;n<counter-1;n++){ vED.at(n)=vED.at(n+1); vE.at(n)=vE.at(n+1); } } } counter--; } void screen(){ cout<<"1. 增加职工记录"<<endl; cout<<"2. 删除职工记录"<<endl; cout<<"3. 生成信息"<<endl; cout<<"4. 显示原始记录"<<endl; cout<<"5. 显示简记录"<<endl; cout<<"6. 原始记录排序"<<endl; cout<<"7. 简记录排序"<<endl; cout<<"8. 结束程序运行"<<endl; } int dd(){ int a; screen(); cin>>a; return a; } void ED_sort_age(){ sort(vED.begin(), vED.end(), less_age); } void ED_sort_number(){ sort(vED.begin(), vED.end(), less_number); } void E_sort_number(){ sort(vE.begin(), vE.end(), less_number); } int main(){ int a=dd(); while(a!=8){ load_f_ED(); if(!load_f_E())E_ED(); switch(a){ case 1: add();break; case 2:delet();break; case 3: E_fout();cout<<"success!"<<endl;break; case 4: display_ED();break; case 5:display_E();break; case 6:cout<<"1.按number排序"<<endl; cout<<"2.按age排序"<<endl; cin>>a; if(1==a){ED_sort_number();display_ED();break;} if(2==a){ED_sort_age();display_ED();break;} case 7:E_sort_number();display_E();break; default:cout<<"what are you doing?"<<endl;;break; } ED_fout(); E_fout(); vED.clear(); vE.clear(); counter=0; a=dd(); } return 0; }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值