?? gzgl.cpp
字號:
#include <fstream.h>
#include <string.h>
class Person //人員類(抽象類)
{
protected:
int No; //編號
char Name[20]; //姓名
int Duty; //人員類別標志(0-教師,1-實驗員,2-行政人員,3-教師兼實驗員,4-行政兼教師)
double Salary; //基本工資
Person *next; //指針域
public:
Person() //基類構造
{
next=0; //指針域設置為空
}
virtual ~Person() //基類虛析構
{
}
virtual void Input()=0; //從鍵盤輸入數據
virtual void Input(ifstream& ifs)=0; //從文件輸入數據
virtual void Output()=0; //向屏幕輸出數據
virtual void Output(ofstream& ofs)=0; //向文件輸出數據
virtual double Incoming()=0; //計算收入
friend class College;
};
class Teacher:virtual public Person //教師類
{
protected:
int Hours; //教師課時
public:
//為對象設置數據分為兩種途徑,通過1)構造函數,2)一般成員函數
//分開可以使得程序中應用更加靈活
//本程序采用:缺省構造+Input()
Teacher() //構造函數,初始化部分數據
{
Duty=0;
Salary=800;
}
void Input() //鍵盤補充輸入其它數據
{
cout<<"編號:"; cin>>No;
cout<<"姓名:"; cin>>Name;
cout<<"教師上學期課時:"; cin>>Hours;
}
void Input(ifstream& ifs)
{
ifs>>No>>Name>>Duty>>Hours;
}
void Output()
{
cout<<No<<"\t"<<Name<<"\t"<<Duty<<"\t"<<Hours<<"\t"<<Incoming()<<endl;
}
void Output(ofstream& ofs)
{
ofs<<No<<"\t"<<Name<<"\t"<<Duty<<"\t"<<Hours<<"\t"<<endl;
}
double Incoming()
{
return Salary+(Hours-120)*20;
}
};
class Assistant:virtual public Person //實驗員
{
protected:
int Allowance;
int Hours;
public:
Assistant()
{
Duty=1;
Salary=650;
Allowance=150;
}
void Input()
{
cout<<"編號:"; cin>>No;
cout<<"姓名:"; cin>>Name;
cout<<"實驗員上學期實驗課時:"; cin>>Hours;
}
void Input(ifstream& ifs)
{
ifs>>No>>Name>>Duty>>Hours;
}
void Output()
{
cout<<No<<"\t"<<Name<<"\t"<<Duty<<"\t"<<Hours<<"\t"<<Incoming()<<endl;
}
void Output(ofstream& ofs)
{
ofs<<No<<"\t"<<Name<<"\t"<<Duty<<"\t"<<Hours<<"\t"<<endl;
}
double Incoming()
{
return Salary+Allowance+(Hours-70)*20;
}
};
class Manager:virtual public Person //行政人員
{
protected:
int Allowance;
public:
Manager()
{
Duty=2;
Salary=750;
Allowance=250;
}
void Input()
{
cout<<"編號:"; cin>>No;
cout<<"姓名:"; cin>>Name;
}
void Input(ifstream& ifs)
{
ifs>>No>>Name>>Duty;
}
void Output()
{
cout<<No<<"\t"<<Name<<"\t"<<Duty<<"\t"<<Incoming()<<endl;
}
void Output(ofstream& ofs)
{
ofs<<No<<"\t"<<Name<<"\t"<<Duty<<"\t"<<endl;
}
double Incoming()
{
return Salary+Allowance;
}
};
class Teacher_Assistant:public Teacher,public Assistant //教師兼實驗員
{
public:
Teacher_Assistant()
{
Duty=3;
Teacher::Salary=800;
}
void Input()
{
cout<<"編號:"; cin>>No;
cout<<"姓名:"; cin>>Name;
cout<<"教師上學期課時:"; cin>>Teacher::Hours;
cout<<"教師兼職實驗員上學期實驗課時:"; cin>>Assistant::Hours;
}
void Input(ifstream& ifs)
{
ifs>>No>>Name>>Duty>>Teacher::Hours>>Assistant::Hours;
}
void Output()
{
cout<<No<<"\t"<<Name<<"\t"<<Duty<<"\t"<<Teacher::Hours<<"\t"
<<Assistant::Hours<<"\t"<<Incoming()<<endl;
}
void Output(ofstream& ofs)
{
ofs<<No<<"\t"<<Name<<"\t"<<Duty<<"\t"<<Teacher::Hours<<"\t"
<<Assistant::Hours<<"\t"<<endl;
}
double Incoming()
{
return Salary+(Teacher::Hours-120)*20
+Allowance+(Assistant::Hours-70)*20;
}
};
class Manager_Teacher:public Manager,public Teacher //行政人員兼教師
{
public:
Manager_Teacher()
{
Duty=4;
Manager::Salary=750;
}
void Input()
{
cout<<"編號:"; cin>>No;
cout<<"姓名:"; cin>>Name;
cout<<"行政人員兼職教師上學期課時:"; cin>>Hours;
}
void Input(ifstream& ifs)
{
ifs>>No>>Name>>Duty>>Hours;
}
void Output()
{
cout<<No<<"\t"<<Name<<"\t"<<Duty<<"\t"<<Hours<<"\t"<<Incoming()<<endl;
}
void Output(ofstream& ofs)
{
ofs<<No<<"\t"<<Name<<"\t"<<Duty<<"\t"<<Hours<<"\t"<<endl;
}
double Incoming()
{
return Salary+Allowance+Hours*20;
}
};
class College
{
private:
Person *PL;
void Clear();
int College::Find(int ID,Person **p1,Person **p2);
public:
College(); //構造
~College(); //析構
void Add(); //增加職工
void Delete(); //刪除職工
void Modify(); //修改職工
void Print(); //輸出職工信息
void Save(); //職工信息存盤
void Load(); //職工信息裝入
};
College::College() //構造函數(創建1個頭結點的鏈表)
{
Person *p=new Teacher;
PL=p;
cout<<"自動裝入數據...\n";
Load();
}
College::~College() //析構函數(僅保留1個頭結點)
{
Person *p=PL;
while(p) //逐個刪除結點,包括頭結點
{
PL=p->next;
delete p;
p=PL;
}
PL=0;
}
void College::Add() //增加職工
{
cout<<"\n** 增加職工 **\n";
//查找尾結點
Person *p=PL;
while(p->next)p=p->next;
int ch;
cout<<"輸入職工分類碼[0-教師,1-實驗員,2-行政人員,3-教師兼實驗員,4-行政兼教師]:"; cin>>ch;
//創建新結點,錄入數據,連接到鏈表
Teacher *pt;
Assistant *pa;
Manager *pm;
Teacher_Assistant *pta;
Manager_Teacher *pmt;
switch(ch)
{
case 0: pt=new Teacher; pt->Input();
p->next=pt;
break;
case 1: pa=new Assistant; pa->Input();
p->next=pa;
break;
case 2: pm=new Manager; pm->Input();
p->next=pm;
break;
case 3: pta=new Teacher_Assistant; pta->Input();
p->next=pta;
break;
case 4: pmt=new Manager_Teacher; pmt->Input();
p->next=pmt;
break;
default: return;
}
}
void College::Clear() //清除所有的職工結點(僅保留頭結點)
{
Person *p=PL->next;
while(p)
{
PL->next=p->next;
delete p;
p=PL->next;
}
}
//查找職工結點(返回1-找到,0-未找到.結點指針由p1返回,p2為前看指針)
int College::Find(int ID,Person **p1,Person **p2)
{
*p1=PL->next;
*p2=PL;
while(*p1)
{
if((*p1)->No==ID)
break; //找到
else
{
*p2=*p1; //繼續查找
*p1=(*p1)->next;
}
}
return *p1?1:0;
}
void College:elete() //刪除職工
{
cout<<"\n** 刪除職工 **\n";
int No;
Person *p1,*p2;
cout<<"編號:"; cin>>No;
if(!Find(No,&p1,&p2))
{
cout<<"指定的人員沒有找到!\n";
}
else
{
p2->next=p1->next; //連接
delete p1;
cout<<"正確刪除!\n";
}
}
void College::Modify() //修改職工
{
cout<<"\n** 修改職工 **\n";
int No;
Person *p1,*p2;
cout<<"編號:"; cin>>No;
if(!Find(No,&p1,&p2))
{
cout<<"指定的人員沒有找到!\n";
}
else
{
p1->Output(); //輸出原來的職工信息(做提示)
p1->Input(); //輸入新的職工信息(更新)
cout<<"修改完成!\n";
}
}
void College:rint() //輸出職工信息
{
cout<<"\n** 職工信息表 **\n";
cout<<"編號 姓名 崗位 其它 收入情況\n";
Person *p=PL->next;
if(!p)
{
cout<<"無職工記錄!\n";
return;
}
while(p) //遍歷鏈表,輸出職工信息
{
p->Output();
p=p->next;
}
}
void College::Save() //職工信息存盤
{
ofstream f("erson.dat",ios:ut); //打開文件
//遍歷輸出至文件
Person *p=PL->next;
while(p)
{
p->Output(f);
p=p->next;
}
f.close(); //關閉文件
cout<<"職工信息已經保存在Person.dat.\n";
}
void Collegead() //職工信息裝入
{
char buf[81]; //臨時空間
int Duty; //人員類型
Person *p2; //新建結點的指針
long t; //讀寫位置
//清除現有結點(保留頭結點)
Clear();
//打開文件
ifstream f("erson.dat",ios::in);
//建立結點,讀數據
Person *p=PL; //尾結點指針
while(1)
{
//讀取人員類型
t=f.tellg();
f>>buf>>buf>>Duty;
if(f)
{
//根據人員類型創建新結點
switch(Duty)
{
case 0: p2=new Teacher; break;
case 1: p2=new Assistant; break;
case 2: p2=new Manager; break;
case 3: p2=new Teacher_Assistant; break;
case 4: p2=new Manager_Teacher; break;
default: f.close(); return;
}
p->next=p2;
p=p->next;
f.seekg(t);
p->Input(f);
}
else
break;
}
//關閉文件
f.close();
}
void main()
{
char ch;
College c; //定義大學對象
//顯示主菜單,接受選擇,并分支調用大學類的相應功能的成員函數
do
{
cout<<"\n☆☆ 高校工資管理系統 ☆☆\n";
cout<<"1-增加職工\n";
cout<<"2-刪除職工\n";
cout<<"3-修改職工\n";
cout<<"4-輸出職工信息(工資)\n";
cout<<"5-數據存盤\n";
cout<<"6-數據裝入\n";
cout<<"7-退出\t請選擇(1-7):";
cin>>ch;
switch(ch)
{
case '1': c.Add(); break;
case '2': c.Delete();break;
case '3': c.Modify();break;
case '4': c.Print(); break;
case '5': c.Save(); break;
case '6': c.Load(); break;
}
}while(ch!='7');
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -