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

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

SalaryManagement(C++)

介绍:

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

设计:

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

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

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

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

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

说明:

扫描二维码关注公众号,回复: 5736672 查看本文章

(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



 

猜你喜欢

转载自blog.csdn.net/l450741881/article/details/50714597
今日推荐