(一) 需求和规格说明

设计某单位职工工资管理系统,功能如下:

对于每位职工存储以下信息:职工编号、基本工资、津贴、岗位津贴、应发数、个人所得税、应扣数、实发数。个人所得税计算方法设为:工资少于2000元的部分为0,2000—3000元部分为5%,3000—4000部分为10%,4000—5000部分为15%,5000元以上部分为20%。

要求:

① 创建存储职工工资信息的存储文件;

② 添加某职工的工资信息;

③添加某职工的工资信息;

④ 修改某职工的部分工资信息(当月开始增加或减少某些项工资或扣款数变化);

⑤ 输出指定编号职工的工资信息(查询用)

⑥ 输出全体职工的工资信息(发工资用)。

该程序,主要是存储职工的工资情况,并便于相应的人员进行读取职工信息,有利于有效的对职工工资进行管理。

(二) 设计

(1)设计思想:根据上述需求,设计链表来存储信息,再将信息存入文件中,根据需求设计多个函数,进行实现不同的功能,如创建存储职工工资信息的存储文件,添加某职工的工资信息,添加某职工的工资信息,修改某职工的部分工资信息,输出指定编号职工的工资信息,输出全体职工的工资信息。

(2)设计表示:根据上述需求,设计一个链表linkedList,然后写出实现链表的基本操作,新建链表,初始化链表,添加链表元素,删除链表元素,输出特定链表元素,输出全部链表元素。

在该实验中,由于存储的单个数据较多,所以说,新建了一个结构体Staff,在结点中存放结构体和指向下一个结构体的指针。

表头函数,在linkedlist.h中写了一个输出表头的函数,在该函数中使用了setw函数,使输出的字符所占的间隔更加合理,美观。

个人所得税函数huilv(double x),传入一个工资数值,就会对应传出一个个人所需要缴纳的个人所得税。

菜单界面函数,简单的说,就是输出用户操作提示,使用户知道按数字几,就会产生什么样的效果。

打印链表中的元素函数,传入链表的头节点,进行遍历链表,并输出链表中的元素信息。

计算链表中元素个数函数CalList(node*L),遍历链表,sum++;当遍历结束时,返回sum。

文件保存函数SaveStaff(node *L),新建并打开文件D:\\Staff.txt,遍历链表,并将文件信息存储在Staff.txt中,遍历结束后,关闭文件。

读取文件函数ReadList(node* L),先打开文件Staff.txt,依次遍历链表进行存入职工信息数据。

在主函数中,while(true)死循环,输入数字,由switch进入不同的函数,进行不同的操作。

(3)主要函数接口:

表头函数,个人所得税函数,菜单界面函数,打印链表元素函数,计算链表个数函数,文件保存函数,读取文件函数。

(三) 用户手册

程序运行时,首先提示输入数字,进行不同的操作

对于退出系统,按0

对于创建存储职工工资信息,按1,然后输入你要创建的职工个数,再输入姓名(string),编号(int),基本工资(int),岗位津贴(int)

对于导入职工的工资信息,按2 ,就是将Staff.txt中的信息读入到链表中,

对于添加某职工的工资信息,按3,头插发创建新的职工信息,并要求你输入所要输入的信息。

对于删除某职工的工资信息,按4,然后输入你要删除职工信息的编号

对于修改某职工的部分工资信息,按5,然后输入你要修改信息的职工编号,回车后,输入基本工资,津贴,岗位津贴的修改值。

对于输出指定编号职工的工资信息,按6,然后输入你要输出信息的职工编号。

对于输出全体职工的工资信息,按7,然后就会输出全部的职工信息。

(四) 调试及测试

在写链表基本操作时,遇到0x00007FF7DA88BD67 处有未经处理的异常问题,在上网查阅资料后,知道时指针指向有误导致的错误。在文件存储部分,一开始无法存储进文件中,经学习文件的读取与写入后,写出了正确的代码。

(五) 运行实例:

菜单:

创建职工信息:

读取文件信息:

添加职工信息:

删除职工信息:

修改职工信息:

输出特定的职工信息:

输出全部的职工信息:

(六)进一步改进

(1在一开始时,个人所得税计算出现错误,进查阅资料后得知,个人所得税的详细计算方法,得出精确的计算结果。

(2)在设计链表的数据存入文件中,无法在保存的Staff.txt文件中查阅信息,需要进一步改进。

(七)心得体会

课程设计是计算机科学与技术专业学生的集中实践性环节之一,是学习“数据结构与算法”理论和实验课程后进行的一次全面的综合练习。在这次课程设计当中,我了解到了我的不足,如算法的不完善、不细心和耐心不是很好等等。不细心的我在调试程序时,老是因为某个书写错误导致错误;对这些错误,我不得不花大量的时间去更正,并且还要重复检查是否出现雷同的错误而导致程序不能运行。但是通过这次课程设计,我的这些缺点有些改善。我在写新的程序时,首先要考虑的深入一点、仔细一点,这样要修改程序的时间就会少很多。并且也不会因为自己不细心而导致的浪费时间的情况出现。

linkedList.h头文件

#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<iomanip>
using namespace std;
typedef struct Staff
{char name[20];//职工姓名int cgbh;//职工编号int jbgz;//基本工资int jt;//津贴int gwjt;//岗位津贴int wfs;//应发数int grsds;//个人所得税int yks;//应扣数int sfs;//实发数
}Staff;typedef struct node
{Staff st;//职工struct node* next;//指向下一个节点
}node;//node* head = NULL;//头节点,且为空
//输出函数····表头
void printhead()
{std::cout << std::left << std::setw(12) << "姓名"<< std::setw(12) << "编号"<< std::setw(12) << "基本工资"<< std::setw(12) << "津贴"<< std::setw(12) << "岗位津贴"<< std::setw(12) << "应发数"<< std::setw(12) << "个人所得税"<< std::setw(12) << "应扣数"<< std::setw(12) << "实发数" << endl;}double huilv(double x)
{if (x < 3000){return x * 0.03;}else if (x < 12000){return 90 + (x - 3000) * 0.10;}else if (x < 25000){return 90 + 900 + (x - 12000) * 0.20;}else if (x < 35000){return 90 + 900 + 2600 + (x - 25000) * 0.25;}else if (x < 55000){return 90 + 900 + 2600 + 2500 + (x - 35000) * 0.30;}else if (x < 80000){return 90 + 900 + 2600 + 2500 + 6000 + (x - 55000) * 0.35;}else{return 90 + 900 + 2600 + 2500 + 6000 + 8750 + (x - 80000) * 0.45;}
}
//菜单界面
void printMeno()
{//cout << "--------------------------------------------------------------" << endl;cout << "-------------------欢迎使用职工管理系统-----------------------" << endl;cout << "              0、退出系统 " << endl;cout << "              1、创建存储职工工资信息 " << endl;cout << "              2、导入职工的工资信息" << endl;cout << "              3、添加某职工的工资信息  " << endl;cout << "              4、删除某职工的工资信息  " << endl;cout << "              5、修改某职工的部分工资信息  " << endl;cout << "              6、输出指定编号职工的工资信息 " << endl;cout << "              7、输出全体职工的工资信息 " << endl;cout << "--------------------------------------------------------------" << endl;cout << "请输入你的选择:";
} //链表初始化
void creatList(node*&L)
{L = new node();L->next = NULL;
}//头插建立链表
void InputStaff(node*L)
{int n = 0;node* pL = L;//创建新节点node* p = (node*)malloc(sizeof(node));cout << "请输入你要输入的人数:";cin >> n;for (int i = 0; i < n; i++){node* p = new node;cout << "请输入职工的姓名:" << endl;cin >> p->st.name;cout << "请输入职工的编号:" << endl;cin >> p->st.cgbh;cout << "请输入职工的基本工资:" << endl;cin >> p->st.jbgz;;cout << "请输入职工的津贴:" << endl;cin >> p->st.jt;cout << "请输入职工的岗位津贴:" << endl;cin >> p->st.gwjt;//cout << "请输入职工的应发数:" << endl;//cin >> p->st.wfs;p->st.wfs = p->st.jbgz + p->st.jt + p->st.gwjt;//cout << "请输入职工的个人所得税:" << endl;//cin >> p->st.grsds;p->st.grsds = huilv(p->st.wfs);//cout << "请输入职工的应扣数:" << endl;//cin >> p->st.yks;p->st.yks = p->st.grsds;//p->st.yks = p->st.wfs - p->st.grsds;//cout << "请输入职工的实发数:" << endl;//cin >> p->st.sfs;p->st.sfs = p->st.wfs - p->st.grsds ;p->next = NULL;pL->next = p;pL = pL->next;}
}//头插新建一个结点
void Addone(node* L)
{node* pL = L;//创建新节点node* p = new node;cout << "请输入职工的姓名:" << endl;cin >> p->st.name;cout << "请输入职工的编号:" << endl;cin >> p->st.cgbh;cout << "请输入职工的基本工资:" << endl;cin >> p->st.jbgz;;cout << "请输入职工的津贴:" << endl;cin >> p->st.jt;cout << "请输入职工的岗位津贴:" << endl;cin >> p->st.gwjt;//cout << "请输入职工的应发数:" << endl;//cin >> p->st.wfs;p->st.wfs = p->st.jbgz + p->st.jt + p->st.gwjt;//cout << "请输入职工的个人所得税:" << endl;//cin >> p->st.grsds;p->st.grsds = huilv(p->st.wfs);/*cout << "请输入职工的应扣数:" << endl;cin >> p->st.yks;*/p->st.yks = p->st.grsds;//p->st.yks = p->st.wfs - p->st.grsds;//cout << "请输入职工的实发数:" << endl;//cin >> p->st.sfs;//p->st.sfs = p->st.wfs - p->st.grsds - p->st.yks;p->st.sfs = p->st.wfs - p->st.yks;p->next = pL->next;pL->next = p;//pL = pL->next;}
//打印链表
void ourprint(node* L)
{printhead();node* p;p = L->next;while (p!= NULL){std::cout<<std::left<<std::setw(12) << p->st.name << std::setw(12)<< p->st.cgbh << std::setw(12)<< p->st.jbgz << std::setw(12)<< p->st.jt << std::setw(12)<< p->st.gwjt << std::setw(12)<< p->st.wfs << std::setw(12)<< p->st.grsds << std::setw(12)<< p->st.yks << std::setw(12)<< p->st.sfs << endl;p = p->next;}//cout << "共有";//CalList(L);//cout << "人" << endl;
}//计算链表中元素个数
int CalList(node* L)
{int sum = 0;node* p;p = L->next;while (p != NULL){sum++;p = p->next;}return sum;
}//保存职工信息
void SaveStaff(node *L)
{//打开文件FILE* fp = fopen("D:\\Staff.txt", "w");if (fp == NULL){cout << "文件打开失败" << endl;return;}//遍历链表node *p = L->next;while (p != NULL){fwrite(&p->st, 1, sizeof(Staff), fp);p = p->next;}//关闭文件fclose(fp);cout << "数据保存成功" << endl;
}//读取职工信息文件
void ReadList(node* L)
{node* pL;pL = L;//打开文件FILE* fp = fopen("D:\\Staff.txt", "r");if (fp == NULL){cout << "文件打开失败" << endl;return;}//读文件Staff st;while (fread(&st, 1, sizeof(Staff), fp)){node* p = new node;p->next = NULL;memcpy(p, &st, sizeof(Staff));//头插法p->next = NULL;pL->next = p;pL = pL->next;}cout << "文件保存成功" << endl;
}//删除职工
void DeleteList(node* p) {int delNum;cout << "请输入你要删除的职工编号:" << endl;cin >> delNum;node* pre = p, * q = p->next, * r;while (q) {if (q->st.cgbh == delNum) {r = q;//r指向待删除节点q = q->next;//pre->next = q;//删除节点free(r);//释放节点}else {pre = q;q = q->next;}}cout << "该职工信息删除成功" << endl;cout << "其余职工信息保存成功" << endl;
}//修改职工信息
void ChangeList(node* L)
{int ch = 0;cout << "请输入你要修改信息的职工编号" << endl;cin >> ch;node* p;p = L;if (p == NULL){cout << "未找到该职工信息" << endl;}while (p != NULL){if (p->st.cgbh == ch){cout << "请输入基本工资、津贴、岗位津贴" << endl;scanf("%d %d %d", &p->st.jbgz, &p->st.jt, &p->st.gwjt);p->st.wfs = p->st.jbgz + p->st.jt + p->st.gwjt;p->st.grsds = huilv(p->st.wfs);p->st.yks = p->st.grsds;p->st.sfs = p->st.wfs - p->st.yks;cout << "修改成功" << endl;}p = p->next;}
}void Specialprint(node* L)
{int ch = 0;cout << "请输入你要输出职工信息的编号" << endl;cin >> ch;node* p;p = L;if (p == NULL){cout << "未找到该职工信息" << endl;}printhead();while (p != NULL){if (p->st.cgbh == ch){std::cout << std::left << std::setw(12)<< p->st.name << std::setw(12)<< p->st.cgbh << std::setw(12)<< p->st.jbgz << std::setw(12)<< p->st.jt << std::setw(12)<< p->st.gwjt << std::setw(12)<< p->st.wfs << std::setw(12)<< p->st.grsds << std::setw(12)<< p->st.yks << std::setw(12)<< p->st.sfs << endl;}p = p->next;}
}

主程序

#include"linkedList.h"
int main()
{node* L;creatList(L);int select = 0;while (true){printMeno();cout << "请输入你的选择:";cin >> select;switch (select){case 0:system("pause");return 0;case 1:InputStaff(L);SaveStaff(L);system("pause");system("cls");break;case 2:ReadList(L);system("pause");system("cls");break;case 3:Addone(L);SaveStaff(L);system("pause");system("cls");break;case 4:DeleteList(L);SaveStaff(L);system("pause");system("cls");break;case 5:ChangeList(L);SaveStaff(L);system("pause");system("cls");break;case 6:Specialprint(L);system("pause");system("cls");break;case 7:ourprint(L);system("pause");system("cls");break;default :cout << "输入错误,请重新输入:";system("pause");system("cls");}}return 0;
}

15. 简单工资管理系统设计相关推荐

  1. 【java毕业设计】基于javaEE+原生servlet+tomcat的教师工资管理系统设计与实现(毕业论文+程序源码)——教师工资管理系统

    基于javaEE+原生servlet+tomcat的教师工资管理系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于javaEE+原生servlet+tomcat的教师工资管理系统设计与实 ...

  2. 【附源码】计算机毕业设计java员工工资管理系统设计与实现

    项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...

  3. 计算机代码设计-基于ssm的员工工资管理系统-人事工资管理系统设计-企业工资管理系统代码

    计算机代码设计-基于ssm的员工工资管理系统-人事工资管理系统设计-企业工资管理系统代码 注意:该项目只展示部分功能,如需了解,评论区咨询即可. 1.开发环境 开发语言:Java 后台:SSM(Spr ...

  4. 工资管理系统设计与实现

    第一章 引 言 1.1.开发背景 随着计算机技术的不断发展,计算机作为知识经济时代的产物,已被广泛应用于社会各个行业和领域.随着我国国企改革的深入和社会主义市场经济的日趋繁荣,导致各企业间的竞争日益激 ...

  5. java 数据库工资管理系统设计_数据库课程设计—企业工资管理系统(java版完整代码)...

    数据库课程设计-企业工资管理系统(java版完整代码) 数 据 库 课 程 设 计 报 告2016年 5月 20日 目 录企业工资管理系统姓 名 王 素 文班 级 软 133学 号 139074224 ...

  6. python工资管理系统课程设计_高校教师绩效工资管理系统设计开发,源码下载

    大家好,我是全微毕设团队的创始人,本团队擅长JAVA(SSM,SSH,SPRINGBOOT).PYTHON.PHP.C#.安卓等多项技术. 今天将为大家分析一个高校教师绩效工资管理系统(高校教师绩效工 ...

  7. php简单学生管理系统设计与实现,基于PHP的学生成绩管理系统的设计与实现.doc...

    基于PHP的学生成绩管理系统的设计与实现.doc 基于PHP的学生成绩管理系统的设计与实现 摘 要: 我国高等职业教育迎来了蓬勃发展的新局面,各院校招生规模不断扩大,学校的教学管理负担越来越重.为了提 ...

  8. 高校教师绩效工资管理系统设计开发,源码下载

    大家好,我是全微毕设团队的创始人,本团队擅长JAVA(SSM,SSH,SPRINGBOOT).PYTHON.PHP.C#.安卓等多项技术. 今天将为大家分析一个高校教师绩效工资管理系统(高校教师绩效工 ...

  9. 基于JAVA的员工工资管理系统设计与实现

    开发工具(eclipse/idea/vscode等): 数据库(sqlite/mysql/sqlserver等): 功能模块(请用文字描述,至少200字):

最新文章

  1. sed linux 命令
  2. 《网站设计 开发 维护 推广 从入门到精通》—— 2.3 页面设计创意思维
  3. DNS是如何工作—Vecloud微云
  4. Composer帮你轻松管理PHP包 autoload
  5. python与pexpect实现ssh操作
  6. Android BUG调试相关方法整理
  7. #333. 【NOIP2017】宝藏
  8. 【转】uni-app在手持PDA上的激光扫码完美解决方案
  9. Android Multimedia框架总结(二十)MediaCodec状态周期及Codec与输入/输出Buffer过程(附实例)
  10. vs2017远程编译linux教程,Visual Studio 2017 远程编译调试 Linux 上已存在的通过 Samba 共享的 CMake 工程...
  11. Java如何实现原子操作
  12. 服务器启动socket服务报错 java.net.BindException:Cannot assign requested address
  13. 自定义SeekBar 带文字
  14. 【SLF4j】使用日志组件SLF4j写系统日志
  15. 胡睿:感谢清华大学计算机系的朱仲涛老师
  16. python中列表概念_详解python列表
  17. 《机器学习实战》——朴素贝叶斯
  18. 两台W7系统的电脑,A电脑可以ping通B电脑,B电脑ping不通A电脑。
  19. 43000张图片和5项原则:用数据科学方法评选十大最火表情包
  20. House Carpenter

热门文章

  1. idm+安卓版怎么改中文
  2. 【UML】例析UML类图的几种关系
  3. C语言进阶之自定义类型:结构体,枚举,联合
  4. 20年没堵上股权漏洞,万科沦落到靠安邦搭救,王石也是心大
  5. win10安全中心(win10安全中心怎么关闭)
  6. Word 给论文加不带编号的脚注并保证分栏的正文内容不受影响,以及在word中如何分栏和分节?
  7. Android中级工程师面试总结
  8. idea自动下载gradle失败解决方案
  9. 用uglifyjs压缩JS js压缩 混淆
  10. 深度剖析UglifyJS