一个简单的工资管理程序(大二,无界面)
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退出系统
类的封装:
1)添加记录
有需要源码的同学:http://download.csdn.net/detail/l450741881/944
4000
0907
介绍:
这是一个员工工资管理程序。工资管理的数据文件中存储有员工姓名和工资,该程序可以录入、显示、修改、删除、查找员工姓名和工资,和求平均值。
设计:
(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
相关文章推荐
- 同一TextView上内容的不同显示
- spojDistinct Substrings【后缀数组 不重复子串】
- DexExpress skins
- WP学习记录
- hdu 4997 Biconnected
- C++输入两个数,输出两个数之间的整数
- 莞草加工品
- Http报头Accept与Content-Type的差别
- 寒假第七周 2.22 --- 2.28
- Web安全測试二步走
- SQL Server代理(9/12):理解作业和安全
- 一个存在三年的内核 bug 引发大量的容器系统出现网络故障
- 一个存在三年的内核 bug 引发大量的容器系统出现网络故障
- UVa 227, Puzzle
- mian( )函数查找(Windows下逆向分析)
- 《Linux优化之安全最小化6个思想》
- 第11期《梦想,一直在路上》2016年2月刊
- Android 使用android-support-multidex解决Dex超出方法数的限制问题,让你的应用不再爆棚
- OSChina 周一乱弹 ——取经之路才刚刚开始
- 同步异步5:任务提交中的同步异步