版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/l450741881/article/details/50714597
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