一个简单的工资管理程序(大二,无界面)

论坛 期权论坛 脚本     
匿名网站用户   2020-12-21 07:24   57   0

SalaryManagement(C++)

介绍:

这是一个员工工资管理程序。工资管理的数据文件中存储有员工姓名和工资,该程序可以录入、显示、修改、删除、查找员工姓名和工资,和求平均值。

设计:

(1) 将程序中工资数据用链表的形式存放,定义一个链表类,封装主要的操作函数。

(2) 显示、修改、删除数据项时大小写通用。

(3) 工资数据按工资值的大小进行存放。

(4) 修改、删除数据前增加提示信息,用户确认后才能进一步操作,否则取消操作。

(5) 增加文件的输入输出功能,在执行中首先将工资数据从文件中读出再进行管理,在程序结束时能将工资数据保存到原文件中。

说明:

(1)用1添加工资记录

(2)用2显示工资记录

(3)用3根据姓名查询工资数据

(4)用4根据姓名删除工资数据

(5)用5根据姓名修改工资数据

(6)用6求出平均值

(7)用0退出系统

类的封装:

class SalaryNode   数据节点类
{
private:
 char Name[25];
 double Salary;
 SalaryNode *next;
public:
SalaryNode(){Name[0] = '\0';  Salary = 0.0;  next = NULL;} 缺省的构造数
SalaryNode(char * n, double s){strcpy(Name, n);  Salary = s;  next = NULL;} 构造函数
SalaryNode(SalaryNode &Source) 拷贝构造函数
~SalaryNode() 析构函数
char * GetName(){return Name;}返回姓名
double GetSalary(){return Salary;}返回工资
SalaryNode * GetNext(){return next;}返回结点
void SetSalary(double newS){Salary = newS;}设置工资
void SetNext(SalaryNode * newNext){next = newNext;}设置结点
void DisPlay() 显示
};
class StaffList  链表类
{
private:
 int staffNum;
 SalaryNode * Head;

public:
StaffList() 构造函数
~StaffList() 析构函数
void Output()  输出文件
output.clear();
output.close(); 关闭文件
void AddNode(SalaryNode * AddNode)   插入结点
SalaryNode * ModifyDelete(char * name)   专门为Modify提供的删除函数
SalaryNode * FindNode(char * name)  //查找姓名
void DisPlay()  //显示
void Modify(char * name, double newSalary)  //修改工资
SalaryNode * GetHead()  //Get Head
int GetStaffNum()  //Get StaffNum
}

命令处理类:

class OrderProcess
{
 StaffList * List;
public:

 //Construct
 OrderProcess()
 {
  //申请一个链表
  List = new StaffList();
 }
 //Destruct
 ~OrderProcess()
 {
  delete List;
 }

 //运行函数
 void RUN()
 {
  char ch;
  ch = '1';
  char Name[25];
  double Salary;
  SalaryNode * node;

  while(ch != '0')
  {
   int isQuit = 0;
   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 << "请输入命令:";

   cin >> ch;

   switch(ch)
   {
   case '1':
    for (;;)
    {
    cout << "请输入姓名:";
    cin >> Name;
                if (strcmp(Name,"over")==0) break;
    cout << "请输入工资:";
    cin >> Salary;
    node = new SalaryNode(Name, Salary);
    List->AddNode(node);
    }
    break;
   case '2':
    List->DisPlay();
    break;
   case '3':
    cout << "请输入姓名:";
    cin >> Name;
    node = List->FindNode(Name);
    if(node == NULL)
     cout << Name << " does not exist!" <<endl;
    else 
     node->DisPlay();
    break;
   case '4':
    cout << "请输入姓名:";
    cin >> Name;
    List->DeleteNode(Name);
    break;
   case '5':
    cout << "请输入姓名:";
    cin >> Name;
    cout << "请输入新工资:";
    cin >> Salary;
    List->Modify(Name, Salary);
    break;
            case '6':
    cout <<"平均工资为:";
          cout <<List->average();
    break;

   //按0才会将数据保存到文件
   case '0':
    isQuit = 1;
    List->Output();
    break;
   default:
    cout <<  "命令输入错误!" <<endl;
    break;
   }
   cout << "===================================" << endl;
   if(isQuit == 1) break;
  }
 }
};

其中,链表类封装的主要函数:

1)添加记录

void AddNode(SalaryNode * AddNode)
 {
  //链表为空,插到表头
  if(Head == NULL)
  {
   Head = AddNode;
   staffNum++;
  }
  //表头不为空
  else
  {
   SalaryNode * p1;
   SalaryNode * p2;
   //比原来的头结点大或等,插入到原来头结点之前;
   if(AddNode->GetSalary() >= Head->GetSalary())
   {
    AddNode->SetNext(Head);
    Head = AddNode;
    staffNum++;
   }
   //比原来的头结点小
   else
   {
    p1 = Head;
    p2 = p1->GetNext();

    while(p2 != NULL)
    {
     //如果找到插入位置,结束循环
     if(p2->GetSalary() <= AddNode->GetSalary())
     {
      staffNum++;
      break;
     }

     p1 = p2;
     p2 = p1->GetNext();
    }

    //进行节点的插入
    p1->SetNext(AddNode);
    AddNode->SetNext(p2);
   }
  }

2)根据姓名删除记录:

SalaryNode * DeleteNode(char * name)
 {
  //查找改员工是否存在
  SalaryNode * node = FindNode(name);

  //如果员工不存在
  if(node == NULL)
  {
   cout << name << " does not exit!" << endl;
   return NULL;
  }

  //如果员工存在
  else
  {
   char ch;
   cout << "是否确实删除?(Y/N)" <<endl;
   cin >> ch;
   if(ch == 'N' || ch == 'n') return NULL;
   //如果删除的是头节点
   if(Head == node)
   {
    Head = node->GetNext();
   }

   //如果删除的不是头节点
   else
   {
    SalaryNode * p = Head;
    while(p->GetNext() != node) //查找待删除节点的上一个节点
    {
     p = p->GetNext();
    }
    //删除节点
    p->SetNext(node->GetNext());
   }
  }
 }

3)根据姓名查询数据:

SalaryNode * FindNode(char * name)
 {
  //person_1和person_2用来记录待比较的大写的name
  //person_1记录待查找人姓名
  char * person_1 = _strupr(name);
  //person_2记录当前节点人名
  char * person_2;


  SalaryNode * p = Head;
  while(p != NULL)
  {
   //将名字转化为大写
   char TempName[25];
   strcpy(TempName, p->GetName());
   person_2 = _strupr(TempName);
   //如果两者名字相同
   if(strcmp(person_1, person_2) == 0)
   {
    return p;
   }
   p = p->GetNext();
  }
  return NULL;
 }

4)显示工资数据:

void DisPlay()
 {
  SalaryNode *p = Head;
  while( p != NULL)
  {
   p->DisPlay();
   p = p->GetNext();
  }
 }

5)根据姓名修改工资数据:

void Modify(char * name, double newSalary)
 {
  SalaryNode * p = FindNode(name);

  if(p == NULL)
  {
   cout << name << " does not exist!" << endl;
   return;
  }
  else
  {
   char ch;
   cout << "确定修改吗?(Y/N)"<<endl;
   cin >> ch;
   if (ch == 'N' || ch == 'n') return;
   //删除原来节点
   ModifyDelete(name);
   //申请新节点
   SalaryNode * node = new SalaryNode(name, newSalary);
   //将新节点重新插入
   AddNode(node);
  }
 }
}

6)求平均值:

double average()
 {
  double n=0,a,i=0;
  SalaryNode *p=Head;
  while (p != NULL)
  {
   i=i+p->GetSalary();
   p=p->GetNext();
   n++;
  }
  a=i/n;
  return a;
 }

这是大二时候做的一个简单的课程设计,又需要的同学可以拿来借鉴,个人认为,对于初学者帮助还是蛮大的。

有需要源码的同学:http://download.csdn.net/detail/l450741881/9440907



分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1136255
帖子:227251
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP