職工工資管理系統 c++課程設計


功能設計要求

1. 輸入記錄:將每一個職工的姓名、ID號以及基本工資、職務工資、崗位津貼、醫療保險、公積金的數據作為一個記錄。該軟件能建立一個新的數據文件或給已建立好的數據文件增加記錄。

2. 顯示記錄:根據用戶提供的記錄或者根據職工姓名顯示一個或幾個職工的各項工資和平均工資。

3. 修改記錄:可以對數據文件的任意記錄的數據進行修改並在修改前后對記錄內容進行顯示。

4.查找記錄:可以對數據文件的任意記錄的數據進行查找並在查找前后對記錄內容進行顯示。

5. 刪除記錄:可刪除數據文件中的任一記錄。

6. 統計: (A)計算各項工資平均工資及總工資, (B)統計符合指定條件(如職工工資前三項之和在3000元以上、3000~2000元、2000~1000) 以內的工資職工人數及占總職工人數的百分比。(C)按字符表格形式打印全部職工工資信息表及平均工資(包括各項總的平均工資)

7.保存數據文件功能。

例如:職工工資信息表
ID號 姓名 基本工資 職務工資 津貼 醫療保險- 公積金- 總工資
01   張望 1286 794 198 109 135 2034
02 李明 1185 628 135 94 114 1740
03 王小民 895 438 98 64 73 1294
04 張效章 1350 868 210 116 150 2162
05 彭山 745 398 84 61 68 1098
¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ 
各項平均工資 1092.2 625.2 145 88.8 108

基本思想 

 

(a)在實驗中采用類與繼承來實現職工及其工資信息的封裝。

(b)將職工信息、工資信息、職工工資信息分別封裝為一個類,其中職工工資信息繼承職工信息與工資信息。

(c)各部分功能的實現封裝為一個功能類來實現。

 

c++代碼實現如下:

存放於Tworker.h中的類的封裝實現部分:

#include<iostream>
#include<string.h>
#include<fstream>
#include<iomanip>
#include<stdlib.h>
using namespace std;
static int total=0;//職工總數

class TWorker
{
 public:
     void set_worker()//輸入職工信息
  {
   cout<<"請輸入職工編號:";   cin>>number;
      cout<<"請輸入職工姓名:";   cin>>name;
  }
 protected:
  char name[18],number[18];
};

class TSalary
{
 public:
  void set_salary()//輸入工資數
  {
   cout<<"請輸入所得基本工資:";     cin>>BSalary;
   cout<<"請輸入所得職務工資:";     cin>>ZSalary;
         cout<<"請輸入所得津貼:";         cin>>bonus;
      cout<<"請輸入醫療保險:";         cin>>Medical_insurance;
      cout<<"請輸入公積金:";           cin>>fund;
  }
    protected:
  float BSalary,ZSalary,bonus,Medical_insurance,fund;
};

class TWorker_salary:public TWorker,public TSalary
{
    public:
     friend class Tmanage;//作為友元函數訪問
     void set_work_salary()
        {
       set_worker();
       set_salary();
  }
};

class Tmanage
{
 public:
  int Input();//輸入職工的個人信息
  void Print();//輸出職工信息
  void Update();//修改職工信息
  void Query();//查找職工信息
  void Delete();//刪除職工信息
  void T_J();//統計職工在一定區域內的百分比
 private:
  TWorker_salary worker;
};

int Tmanage::Input()
{
 ofstream ofile("D:\\worker.txt",ios::app);    //以追加方式打開,防止輸入的覆蓋
 if(!ofile)
 {
  cout<<"文件夾不能打開!"<<endl;
  return 0;
 }
 int n=1;
    while(n)//繼續輸入判斷
    {
        worker.set_work_salary(); //輸入職工信息
        ofile<<setw(10)<<worker.number<<setw(10)<<worker.name<<setw(10)<<worker.BSalary<<setw(10)<<worker.ZSalary<<setw(10)<<worker.bonus<<setw(10)<<worker.Medical_insurance <<setw(10)<<worker.fund<<endl;//將輸入信息寫入文件中
        cout<<"輸入成功!"<<endl;
        total++;  //統計輸入職工的總個數
        cout<<"繼續輸入請按1 / 退出請按0:";
        cin>>n;
    }
    ofile.close();//關閉文件
    return 0;
}

void Tmanage::Print()
{
 ifstream ifile("D:\\worker.txt",ios::in);//打開並讀取文件
    if(!ifile)
    {
        cout<<"文件夾不能打開!"<<endl;
        abort();
    }
    bool flag = true;//用於標識是否找到職工
    string s;   //用於存放從文件中讀到的記錄
    while(getline(ifile, s))
    {
        if(flag)
        {
   cout<<setw(10)<<"職工ID號"<<setw(10)<<"職工姓名"<<setw(10)<<"基本工資"<<setw(10)<<"職務工資"<<setw(10)<<"所得津貼"<<setw(10)<<"醫療保險"<<setw(10)<<"公積金"<<endl;
        }
        cout<<s<<endl;//輸出職工信息
        flag=false;
    }
    if(flag)  cout<<"系統中沒有職工信息!"<<endl;
    ifile.close();
}

void Tmanage::Delete()
{
 TWorker_salary worker[100];//用於存放從文件中讀取到的記錄
    ifstream ifile("D:\\worker.txt",ios::in);
  if(!ifile)//判斷文件是否能打開
   {
     cout<<"文件夾不能打開!"<<endl;
        abort();
   }
   cout<<setw(10)<<"職工ID號"<<setw(10)<<"職工姓名"<<setw(10)<<"基本工資"<<setw(10)<<"職務工資"<<setw(10)<<"所得津貼"<<setw(10)<<"醫療保險"<<setw(10)<<"公積金"<<endl;
   for(int i=0;i<total;i++)//將文件中的內容提取出來且存放在數組里
   {
    ifile>>worker[i].number>>worker[i].name>>worker[i].BSalary>>worker[i].ZSalary>>worker[i].bonus>>worker[i].Medical_insurance>>worker[i].fund;
     cout<<setw(10)<<worker[i].number<<setw(10)<<worker[i].name<<setw(10)<<worker[i].BSalary<<setw(10)<<worker[i].ZSalary<<setw(10)<<worker[i].bonus<<setw(10)<<worker[i].Medical_insurance <<setw(10)<<worker[i].fund<<endl;
 }
 ifile.close();
 int n=1;
 int q;
 while(n)
 {
  ofstream ofile("D:\\worker.txt",ios::out); //out方式打開,即可覆蓋,即重新往文件里添加記錄
  if(!ofile)
  {
   cout<<"文件夾不能打開!"<<endl;
   abort();
  }
  bool flag; //用於標識該職工是否存在
  char nu[18];
        cout<<"請輸入要刪除的職工的職工號:";
        cin>>nu;
        flag=false;
        for(int i=0;i<total;i++)
        {
         if(strcmp(nu,worker[i].number)!=0)//不是所要刪除的職工
                ofile<<setw(10)<<worker[i].number<<setw(10)<<worker[i].name<<setw(10)<<worker[i].BSalary<<setw(10)<<worker[i].ZSalary<<setw(10)<<worker[i].bonus<<setw(10)<<worker[i].Medical_insurance <<setw(10)<<worker[i].fund<<endl;//寫入文件
   if(strcmp(nu,worker[i].number)==0)  //是所要刪除的職工
   {
    flag=true;
    cout<<"*****刪除成功*****"<<endl;
    q=i; //記錄要刪除的職工
   }
  }
  Tmanage::Print();//輸出刪除后情況
  ofile.close();//關閉文件
        if(!flag)
        {
            cout<<"查詢不到該ID的職工,無法刪除!繼續刪除請按1 / 退出請按0:";
         cin>>n;
        }
        else
        { 
         for(int k=q;k<total-1;k++)  //刪除該職工
   {
    strcpy(worker[k].number,worker[k+1].number);
    strcpy(worker[k].name ,worker[k+1].name);
    worker[k].BSalary =worker[k+1].BSalary;
    worker[k].ZSalary =worker[k+1].ZSalary;
    worker[k].fund =worker[k+1].fund;
    worker[k].Medical_insurance=worker[k+1].Medical_insurance;
    worker[k].bonus =worker[k+1].bonus;
   }
      total--; //刪除成功時職工個數減1
         cout<<"繼續刪除請按1 / 退出請按0:";
            cin>>n;
        } 
    }
}

void Tmanage::Update()
{
 TWorker_salary worker[100];//用於存放從文件中讀取到的記錄
    ifstream ifile("D:\\worker.txt",ios::in);

  if(!ifile)//判斷文件是否能打開
   {
     cout<<"文件夾不能打開!"<<endl;
        abort();
   }
   cout<<setw(10)<<"職工ID號"<<setw(10)<<"職工姓名"<<setw(10)<<"基本工資"<<setw(10)<<"職務工資"<<setw(10)<<"所得津貼"<<setw(10)<<"醫療保險"<<setw(10)<<"公積金"<<endl;
   for(int i=0;i<total;i++)//將文件中的內容提取出來
   {
    ifile>>worker[i].number>>worker[i].name>>worker[i].BSalary>>worker[i].ZSalary>>worker[i].bonus>>worker[i].Medical_insurance>>worker[i].fund;
     cout<<setw(10)<<worker[i].number<<setw(10)<<worker[i].name<<setw(10)<<worker[i].BSalary<<setw(10)<<worker[i].ZSalary<<setw(10)<<worker[i].bonus<<setw(10)<<worker[i].Medical_insurance <<setw(10)<<worker[i].fund<<endl;
 }
 ifile.close();
 ofstream ofile("D:\\worker.txt",ios::out);
 if(!ofile)
 {
  cout<<"文件夾不能打開!"<<endl;
  abort();
 }
 bool flag;//用於標識職工是否存在
 int n=1;
 char nu[18];
 float new_BSalary,new_ZSalary,new_bonus,new_Medical_insurance,new_fund;
 while(n)//繼續修改判斷
 {
        cout<<"請輸入要修改信息的職工號:";
  cin>>nu;
  flag=false;
  int a;
     for(int i=0;i<total;i++)
          if(strcmp(nu,worker[i].number)==0)//判斷找到對應職工號
   do{
    cout<<"請選擇要修改的信息:"<<endl;
    cout<<"****************************************"<<endl;
    cout<<"-----------[1] 修改基本工資-------------"<<endl;
    cout<<"-----------[2] 修改職務工資-------------"<<endl;
    cout<<"-----------[3] 修改津貼-----------------"<<endl;
    cout<<"-----------[4] 修改醫療保險-------------"<<endl;
    cout<<"-----------[5] 修改公積金---------------"<<endl;
    cout<<"****************************************"<<endl;
    cout<<"請選擇對應數字序號進行操作:";
    cin>>a;
    if(a==1)
    {
     cout<<"請輸入新的基本工資:";
     cin>>new_BSalary;
     for(i=0;i<total;i++)
     {
      if(strcmp(worker[i].number,nu)==0)
       worker[i].BSalary =new_BSalary;
     }
    }
       if(a==2)
    {
     cout<<"請輸入新的職務工資:";
     cin>>new_ZSalary;
     for(i=0;i<total;i++)
     {
      if(strcmp(worker[i].number,nu)==0)
       worker[i].ZSalary =new_ZSalary;
     }
    }
       if(a==3)
    {
     cout<<"請輸入新的津貼:";
     cin>>new_bonus;
     for(i=0;i<total;i++)
     {
      if(strcmp(worker[i].number,nu)==0)
       worker[i].bonus =new_bonus;
     }
    }
       if(a==4)
    {
     cout<<"請輸入新的醫療保險:";
     cin>>new_Medical_insurance;
     for(i=0;i<total;i++)
     {
      if(strcmp(worker[i].number,nu)==0)
       worker[i].Medical_insurance =new_Medical_insurance;
     }
    }
    if(a==5)
    {
     cout<<"請輸入新的公積金:";
     cin>>new_fund;
     for(i=0;i<total;i++)
     {
      if(strcmp(worker[i].number,nu)==0)
       worker[i].fund=new_fund;
     }
    }
    flag=true;
              }while(a<1 && a>5);
                if(!flag)//判斷是否存在職工信息
                {
                    cout<<"查詢不到該職工的ID,無法修改!繼續修改請按1 / 退出請按0:";
                    cin>>n;
                }
                else
                {
                 cout<<"繼續修改請按1 / 退出請按0:";
                    cin>>n;
                }
 }
 for(int j=0;j<total;j++)
  ofile<<setw(10)<<worker[j].number<<setw(10)<<worker[j].name<<setw(10)<<worker[j].BSalary<<setw(10)<<worker[j].ZSalary<<setw(10)<<worker[j].bonus<<setw(10)<<worker[j].Medical_insurance <<setw(10)<<worker[j].fund<<endl;
 ofile.close();//關閉文件
}

void Tmanage::Query()
{
 TWorker_salary worker[100];//用於存放從文件中讀取到的記錄
    ifstream ifile("D:\\worker.txt",ios::in);

  if(!ifile)//判斷文件是否能打開
   {
     cout<<"文件夾不能打開!"<<endl;
        abort();
   }
   cout<<setw(10)<<"職工ID號"<<setw(10)<<"職工姓名"<<setw(10)<<"基本工資"<<setw(10)<<"職務工資"<<setw(10)<<"所得津貼"<<setw(10)<<"醫療保險"<<setw(10)<<"公積金"<<endl;
   for(int i=0;i<total;i++)//將文件中的內容提取出來
   {
    ifile>>worker[i].number>>worker[i].name>>worker[i].BSalary>>worker[i].ZSalary>>worker[i].bonus>>worker[i].Medical_insurance>>worker[i].fund;
     cout<<setw(10)<<worker[i].number<<setw(10)<<worker[i].name<<setw(10)<<worker[i].BSalary<<setw(10)<<worker[i].ZSalary<<setw(10)<<worker[i].bonus<<setw(10)<<worker[i].Medical_insurance <<setw(10)<<worker[i].fund<<endl;
 }
 ifile.close();
 cout<<"-----------------[1] 按姓名查詢-------------------"<<endl;
 cout<<"-----------------[2] 按工號查詢-------------------"<<endl;
 cout<<"----請選擇查詢的方式(輸入對應方式的序號1或2)----:";
    int k;
 cin>>k;
 char na[18],nu[18];
 if(k==1)//按姓名查詢
 {
     int u[18];//考慮重名
        int n=1;
     while(n)
  {
            cout<<"請輸入要查詢的職工的姓名:";
   cin>>na;
   int j=0;
   for(int i=0;i<total;i++)
     if(strcmp(na,worker[i].name)==0)//重名處理
     {
        u[j]=i;
        j++;
     }
            if(j==0)
            {
                cout<<"沒有你要查詢的職工名!"<<endl;
                cout<<"是否繼續查詢,繼續請按1 / 退出按0:";
                cin>>n;
            }
            else
            {
    cout<<"查找結果如下:";
    cout<<setw(10)<<"職工ID號"<<setw(10)<<"職工姓名"<<setw(10)<<"基本工資"<<setw(10)<<"職務工資"<<setw(10)<<"所得津貼"<<setw(10)<<"醫療保險"<<setw(10)<<"公積金"<<endl;
               for(int b=0;b<j;b++)
                cout<<setw(10)<<worker[u[b]].number<<setw(10)<<worker[u[b]].name<<setw(10)<<worker[u[b]].BSalary<<setw(10)<<worker[u[b]].ZSalary<<setw(10)<<worker[u[b]].bonus<<setw(10)<<worker[u[b]].Medical_insurance <<setw(10)<<worker[u[b]].fund<<endl;
          cout<<"是否繼續查詢,繼續請按1 / 退出按0:";
                cin>>n;
        }
        }
    }
    else//按職工號查詢
    {
     int n=1;
  while(n)
  {
     cout<<"請輸入要查詢的職工的職工號:";
     cin>>nu;
     bool flag=false;
     for(int i=0;i<total;i++)
      if(strcmp(nu,worker[i].number)==0)
          {
                    cout<<"查找結果如下:";
                    cout<<setw(10)<<"職工ID號"<<setw(10)<<"職工姓名"<<setw(10)<<"基本工資"<<setw(10)<<"職務工資"<<setw(10)<<"所得津貼"<<setw(10)<<"醫療保險"<<setw(10)<<"公積金"<<endl;
                   cout<<setw(10)<<worker[i].number<<setw(10)<<worker[i].name<<setw(10)<<worker[i].BSalary<<setw(10)<<worker[i].ZSalary<<setw(10)<<worker[i].bonus<<setw(10)<<worker[i].Medical_insurance <<setw(10)<<worker[i].fund<<endl;
                    flag=true;
                }
            if(!flag)
            {
                cout<<"查詢不到該職工信息,繼續請按1 / 退出按0";
             cin>>n;
            }
      else
         {
                cout<<"是否繼續查詢,繼續請按1 / 退出按0:";
                cin>>n;
         }
        }
    }
}

void Tmanage::T_J()//統計職工在一定區域內的百分比
{
    TWorker_salary worker[100];
    ifstream ifile("D:\\worker.txt",ios::in);
  if(!ifile)//判斷文件是否能打開
   {
     cout<<"文件夾不能打開!"<<endl;
        abort();
   }
   cout<<setw(10)<<"職工ID號"<<setw(10)<<"職工姓名"<<setw(10)<<"基本工資"<<setw(10)<<"職務工資"<<setw(10)<<"所得津貼"<<setw(10)<<"醫療保險"<<setw(10)<<"公積金"<<endl;
   for(int i=0;i<total;i++)//將文件中的內容提取出來
   {
    ifile>>worker[i].number>>worker[i].name>>worker[i].BSalary>>worker[i].ZSalary>>worker[i].bonus>>worker[i].Medical_insurance>>worker[i].fund;
     cout<<setw(10)<<worker[i].number<<setw(10)<<worker[i].name<<setw(10)<<worker[i].BSalary<<setw(10)<<worker[i].ZSalary<<setw(10)<<worker[i].bonus<<setw(10)<<worker[i].Medical_insurance <<setw(10)<<worker[i].fund<<endl;
 }
 ifile.close();
 int k,p;
 float totale[total];
 for(int i=0;i<total;i++)//統計收益總和
 {
  totale[i]=worker[i].BSalary+worker[i].ZSalary+worker[i].bonus;
 }
 int n=1;
 while(n)
 {
        cout<<"-----------------[1] 前三項工資之和在3000元以上的百分比-------------------"<<endl;
        cout<<"-----------------[2] 前三項工資之和在2000元以下的百分比-------------------"<<endl;
        cout<<"-----------------[3] 前三項工資之和在2000元到3000元之間的百分比-----------"<<endl;
        cout<<"-----------------請選擇統計的方式(輸入對應方式的序號1,2,3):----------";
  cin>>k;
  if(k==1)
     {
    p=0;  //計數器每次計數歸零
    for(int i=0;i<total;i++)
      if(totale[i]>=3000) p++;
     cout<<"前三項工資之和在3000元以上的百分比是:"<<(p/total)*100<<"%";
     cout<<"是否繼續查詢,繼續請按1 / 退出按0:";
            cin>>n;
   }
   if(k==2)
   {
    p=0;
    for(int i=0;i<total;i++)
      if(totale[i]<2000) p++;
     cout<<"前三項工資之和在2000元以下的百分比是:"<<(p/total)*100<<"%";
     cout<<"是否繼續查詢,繼續請按1 / 退出按0:";
            cin>>n;
   }
  if(k==3)
   {
    p=0;
    for(int i=0;i<total;i++)
      if(totale[i]<3000 && totale[i]>2000) p++;
     cout<<"前三項工資之和在2000元到3000元之間的百分比是:"<<(p/total)*100<<"%";
     cout<<"是否繼續查詢,繼續請按1 / 退出按0:";
            cin>>n;
   }
 }
}

 

主函數的實現部分:

#include<iostream>
#include<fstream>
#include<string.h>
#include<stdlib.h>
#include"Tworker.h"
using namespace std;
void menu();//主界面

int main()
{
 Tmanage aa;
 int a;
 while(1)
    {
        menu();
        cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
        cout<<"------------------------請輸入序號選擇對應功能-------------------------"<<endl;
        cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
        cout<<"請輸入菜單選項:";
        cin>>a;
        switch(a)
  {
            case 1:system("cls");aa.Input();break;
            case 2:system("cls");aa.Print();break;
            case 3:system("cls");aa.Delete();break;
            case 4:system("cls");aa.Query();break;
            case 5:system("cls");aa.Update();break;
            case 6:system("cls");aa.T_J();break;
            case 0:system("cls");printf("*****謝謝使用*****");exit(0);
  }
  system("pause");
  system("cls");
 }
 return 0;
}

void menu()//主界面
{
 cout<<"***********************************************************************"<<endl;
 cout<<"**------------------------職工工資管理系統---------------------------**"<<endl;
 cout<<"***********************************************************************"<<endl;
 cout<<"**                        1. 輸入職工信息                            **"<<endl;
 cout<<"**                        2. 顯示職工工資                            **"<<endl;
    cout<<"**                        3. 刪除職工信息                            **"<<endl;
    cout<<"**                        4. 查詢職工工資                            **"<<endl;
 cout<<"**                        5. 修改職工信息                            **"<<endl;
 cout<<"**                        6. 統計職工信息                            **"<<endl;
 cout<<"**                        0. 退出系統                                **"<<endl;
 cout<<"***********************************************************************"<<endl;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM