您的位置:首页 > 其它

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

2016-02-22 08:15 344 查看
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/944
4000
0907
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: