职工信息管理.docx
- 文档编号:8049791
- 上传时间:2023-01-28
- 格式:DOCX
- 页数:36
- 大小:490.82KB
职工信息管理.docx
《职工信息管理.docx》由会员分享,可在线阅读,更多相关《职工信息管理.docx(36页珍藏版)》请在冰豆网上搜索。
职工信息管理
《标准C语言程序设计》上机报告
实验十综合设计(职工工资信息管理)
专业:
电子信息工程
班级:
电信1103
学号:
u5211314
姓名:
曹操
完成日期:
2012/7/8
综合设计实验
——职工工资信息管理
一、实验目的:
1、进一步熟悉开发环境,掌握编译、连接和调试的技巧;
2、综合运用数组、指针、函数和文件,通过综合设计掌握数组、结构体、指针和函数之间的相互关系,掌握函数参数传递,理解“传值”、“传指针”和“传引用”
3、熟悉具有复杂需求的大程序设计过程和注意事项(参见上机实践训练教程P98)
二、实验内容:
【题目描述】
编写程序实现单位职工工资信息管理。
包含各种基本数据的录入、修改、删除、插入、查询、统计(应发工资=基本工资+职务工资+各种补助,实发工资=应发工资-水电费-公积金)
【基本功能】:
(1)添加功能:
添加一个职工的基本信息,包括工资卡号、身份证号、姓名、基本工资、职务工资、各种补助、应发工资、水电费、公积金、实发工资等
(2)删除功能:
能够对一个职工的信息进行删除,例如按姓名进行删除
(3)显示功能:
显示所有职工的主要信息包括工资卡号、身份证号、姓名、基本工资、职务工资、各种补助、应发工资、水电费、公积金、实发工资等
(4)查找功能:
根据你键入的职工姓名,显示其详细信息(注:
在main内显示查找到的职工信息!
)
(5)修改功能:
根据你键入的职工姓名,对该职工工资信息进行修改。
(6)排序功能:
对职工的信息按照实发工资进行排序(不得选用直接选择法,可以使用交换法、设标签的选择法、快速排序法等)。
【题目要求】
(1)按照分析、设计、编码、调试和测试的软件开发过程完成这个应用程序;
(2)职工工资信息应该包含:
工资卡号、身份证号、姓名、基本工资、职务工资、各种补助、应发工资、水电费、公积金、实发工资等;
(3)为各项操作功能设计一个菜单(可选)。
应用程序运行后,先显示这个菜单,然后用户通过菜单项选择希望进行的操作项目。
(4)不使用C++的string类型来存放字符串
(5)函数接口参数设计允许使用C++引用类型
(6)建议使用动态堆内存分配,达到高效利用内存目的(本要求适合提高水平的同学,不做严格要求)
注:
1、第3条要求设计一个菜单,此项不做严格要求,如果不使用菜单作为输出提示,程序运行时严格按照下面流程执行:
添加10个职工基本信息显示刚添加的10个职工信息删除指定职工信息显示删除后所有职工信息查找特定职工信息(按姓名模糊查找,如所有王姓职工)显示结果模糊查找信息按照工资降序排序显示排序后信息根据键入的特定职工姓名,查找并修改其工资信息按照工资降序重新排序显示最新排序信息。
注:
2、如果存在多种显示方式,可以设计重载函数
【输入要求】
应用程序运行后,在屏幕上显示一个菜单。
用户可以根据需求,选定相应的操作项目。
进入每个操作后,根据应用程序的提示信息,从键盘输入相应的信息。
也可以直接按照【题目要求】的注1执行顺序严格执行,要求提供友好的提示信息。
【输出要求】
(1)应用程序运行后,要在屏幕上显示一个菜单;或按照规定执行顺序给出明确的执行提示信息。
(2)要求用户输入数据时,除了给出清晰、明确的提示信息,包括输入的数据内容、格式及结束方式等。
如:
“请输入10位职工基本信息”、“请输入待删除的职工姓名”、“正在对职工工资进行降序排序”等等
【提示】
设计一个结构体类型和一维数组,用来保存职工工资登记信息。
如果不采用结构体,则将使用多个一维或二维数组来存储职工基本信息数据,排序时采用“联动”模式。
【评分标准】
1、按模块化要求进行系统设计,在main模块中调用所设计的各个模块。
2、不使用外部存储类型变量
3、给出各函数模块的接口参数设计(即原型说明)并说明理由;
4、给出主要的数据类型或数据结构的设计;
5、绘制模块分解图
6、按规范撰写报告
7、至少完成添加、删除、精确查找、排序和所需显示功能
满足以上基本要求得70%分值,采用结构体/给出菜单显示、完成全部功能最高得100%分值
三、实验步骤:
1、总体设计
下图为基本模块调用图(简略版)
以下十个功能函数作用及其流程图:
main函数:
实现的是程序界面的设计和各功能函数的调用。
流程图如下所示:
add函数:
主要是实现程序员工数据的实时录入。
流程图如下所示:
remove函数:
主要实现删除某职工信息。
流程图如下所示:
display_all函数:
显示所有职工信息。
流程图如下所示:
find函数:
通过姓名或者姓氏查找对应员工信息并输出该信息。
流程图如下所示:
search函数:
通过姓名或者姓氏查找对应员工信息。
流程图如下所示:
sort函数:
实现按照实际工资的大小以逆序排列所有职工信息。
流程图如下所示:
input函数:
输入某职工信息。
流程图如下所示:
free_all函数:
回收所有占用的堆空间。
流程图如下所示:
showone函数:
输出某职工的信息。
流程图如下所示:
showmenu函数:
显示各功能函数对应键值。
流程图如下所示:
selectmenu函数:
提供菜单选择。
流程图如下所示:
free_all函数:
回收所有占用的堆空间。
流程图如下所示:
流程图说明:
定义结构体指针的同时均初始化为NULL;
各功能函数所用到的head均为函数接口结构体指针;
由于种种原因详细伪代码未能补上,请见谅。
2、数据描述及模块接口参数设计
structEmployee//定义Employee结构体,并初始化,作为每名员工的信息载体
{
charname[10];//姓名
charwagecard[15];//工资卡号
charID[20];//身份证号
floatbasewage;//基本工资
floatdutywage;//职位工资
floatallowance;//津贴
floatutilities;//水电费
floataccfund;//公积金
floatsendwage;//应发工资
floatfactwage;//实发工资
structEmployee*next;//增加节点
};
typedefstructEmployeeEmp;//为方便另取Epm
下面为函数原型说明
voidshowmenu();//显示主菜单选项
voidinput(Emp*p);//输入某职工信息,通过函数接口指针P确定信息保存位置
voidadd(Emp*head);//添加员工信息,通过接口head指针实现
voidremove(Emp*head);//删除员工信息,通过接口传输指针头
voiddisplay_all(Emp*head);//显示所有员工信息,通过接口传输指针头
Emp*search(Emp*head);//按姓名查找员工,通过接口传输指针头
voidmodify(Emp*head);//修改某员工信息,通过接口传输指针头
voidfind(Emp*head);//查找员工并显示其信息
voidsort(Emp*head);//按实际工资对所有员工逆序排列
voidshowone(Emp*p);//显示某员工信息
voidfree_all(Emp*head);//释放所有内存,以退出程序
voidselectmenu(Emp*head);//主菜单选择
说明:
设置结构体指针为head的函数,均是需由接口传进头指针的位置,以便于头指针与节点构成完整循环链对所需信息进行搜素记录。
另外,在add函数中head指针分配堆空间后,堆空间地址也传回了主调函数。
3、完整程序清单
My.h
#include
#include
#include
structEmployee//定义Employee结构体,并初始化
{
charname[10];//姓名
charwagecard[15];//工资卡号
charID[20];//身份证号
floatbasewage;//基本工资
floatdutywage;//职位工资
floatallowance;//津贴
floatutilities;//水电费
floataccfund;//公积金
floatsendwage;//应发工资
floatfactwage;//实发工资
structEmployee*next;
};
typedefstructEmployeeEmp;//为方便另取Epm
voidshowmenu();//显示主菜单
voidinput(Emp*p);//输入某职工信息
voidadd(Emp*head);//添加员工信息
voidremove(Emp*head);//删除员工信息
voiddisplay_all(Emp*head);//显示所有员工信息
Emp*search(Emp*head);//按姓名查找员工
voidmodify(Emp*head);//修改某员工信息
voidfind(Emp*head);//查找员工并显示其信息
voidsort(Emp*head);//按实际工资对所有员工逆序排列
voidshowone(Emp*p);//显示某员工信息
voidfree_all(Emp*head);//释放所有内存,以退出程序
voidselectmenu(Emp*head);//主菜单选择
main.cpp
/************************************************
**
*职工工资信息管理*
**
*************************************************/
#include"my.h"
intmain()
{
Emp*head=NULL;
selectmenu(head);
return0;
}
按实际工资对所有职工排序.cpp
/*对所有员工按实际工资逆序排序*/
#include"my.h"
voidsort(Emp*head)
{
printf("***************进入对员工信息排序菜单*******************\n");
Emp*p1=NULL,*p2=NULL,*flag=NULL;
Emptemp;
if(head==NULL)
printf("对不起,职工工资管理系统中无任何数据!
\n");
else
{
for(p2=head->next;p2->next!
=NULL;p2=p2->next)//通过设置标签的方法排序
{
flag=p2;//设置标签
for(p1=p2->next;p1!
=NULL;p1=p1->next)
{
if(flag->factwage
flag=p1;//记录该次遍历中指向最大值的指针
}
if(flag!
=p2)//交换指针所指内容,但保持节点不变
{
temp=*flag;
*flag=*p2;
*p2=temp;
p2->next=flag->next;
flag->next=temp.next;
}
}
printf("排序已完成。
\n");
}
printf("重新排序请按6,返回主菜单请按7,退出程序请按0,清除屏显请按8.\n");
selectmenu(head);
}
删除、修改某员工信息.cpp
/*删除某员工信息*/
#include"my.h"
voidremove(Emp*head)
{
printf("****************进入删除员工信息菜单*******************\n");
Emp*isfound=search(head),*p=NULL,*temp=NULL;
if(isfound==NULL)
printf("对不起,未找到该职工!
\n");
else
{
printf("所要删除职工的信息:
\n");
showone(isfound);
for(p=head;p->next!
=isfound;p=p->next);//找到需要删除指针位置,令指向该指针的节点越过
//该指针指向下一个指针
temp=p->next;//同时释放所要删除的指针所指空间
p->next=p->next->next;
free(temp);
printf("该信息已删除。
\n");
}
printf("继续删除请按2,返回主菜单请按7,退出程序请按0,清除屏显请按8.\n");
selectmenu(head);
}
/*修改功能某员工信息*/
voidmodify(Emp*head)
{
printf("****************进入修改员工信息菜单********************\n");
Emp*isfound=search(head);
if(isfound==NULL)
printf("对不起,未找到该职工!
\n");
else
{
printf("所需修改的职工原信息为:
\n");
showone(isfound);
printf("请输入修改后员工信息:
\n");
input(isfound);
printf("员工信息修改完毕.\n");
}
printf("继续修改请按5,返回主菜单请按7,退出程序请按0,清除屏显请按8.\n");
selectmenu(head);
}
释放所有内存.cpp
/*释放所有内存*/
#include"my.h"
voidfree_all(Emp*head)
{
Emp*p=head,*temp=NULL;
for(;p!
=NULL;)
{
temp=p;
p=p->next;
free(temp);
}
printf("所有内存已释放。
\n");
printf("**************************************\n");
printf("*谢谢使用,再见!
*\n");
printf("**************************************\n");
}
输入、添加、查找某员工信息.cpp
/*输入某员工信息*/
#include"my.h"
voidinput(Emp*p)
{
printf("请按提示输入职工信息:
\n");
printf("员工姓名:
");
scanf("%s",p->name);
printf("工资卡号:
");
scanf("%s",p->wagecard);
printf("身份证号:
");
scanf("%s",p->ID);
printf("基本工资:
");
scanf("%f",&p->basewage);
printf("职位工资:
");
scanf("%f",&p->dutywage);
printf("津贴:
");
scanf("%f",&p->allowance);
printf("水电费:
");
scanf("%f",&p->utilities);
printf("公积金:
");
scanf("%f",&p->accfund);
p->sendwage=p->basewage+p->dutywage+p->allowance;//计算应发工资
p->factwage=p->sendwage-p->utilities-p->accfund;//计算实际工资
}
/*添加某员工信息*/
voidadd(Emp*head)
{
printf("***************进入添加员工信息菜单*******************\n");
Emp*addition=NULL,*last=NULL;
if((addition=(Emp*)malloc(sizeof(Emp)))==NULL)//给将要添加的员工信息分配内存
{
printf("堆内存不够!
");
exit(0);
}
input(addition);//输入该职工信息
addition->next=NULL;//设置下一指针节点位NULL
if(head==NULL)//若头指针为空说明还未
{
if((head=(Emp*)malloc(sizeof(Emp)))==NULL)
{
printf("堆内存不够!
");
exit(0);
}
elsehead->next=addition;
}
else
{
for(last=head;last->next!
=NULL;last=last->next);//找到已给定职工链表的最后节点
last->next=addition;//将新指针域该最后节点连接
}
printf("员工录入操作完毕.\n");
printf("继续添加请按1,返回主菜单请按7,退出程序请按0,清除屏显请按8。
\n");
selectmenu(head);
}
/*按姓名或姓氏查找某员工*/
Emp*search(Emp*head)
{
Emp*p=NULL;
charname[20];
intchoose;
if(head==NULL)
{
printf("职工工资管理中无任何数据!
");
returnNULL;
}
else
{
while
(1)
{
printf("请选择查找方式:
\n1.姓名准确查找法\n2.姓氏模糊查找法\n");
scanf("%d",&choose);//选择查找法
if(choose==1)
{
printf("请输入所需对象的姓名:
\n");
scanf("%s",name);
for(p=head->next;p!
=NULL;p=p->next)//姓名准确查找法
{
if(strcmp(p->name,name)==0)
returnp;
}
break;
}
elseif(choose==2)
{
printf("请输入所需对象的姓氏:
\n");
scanf("%s",name);
for(p=head->next;p!
=NULL;p=p->next)//姓氏模糊查找法
{
if(p->name[0]==name[0])
showone(p);
}
break;
}
elseprintf("输入错误!
请重新选择。
");
}
}
returnNULL;//若以上两种方法未准确找到所需信息,返回NULL
}
/*查找某一员工信息*/
voidfind(Emp*head)
{
printf("***************进入对员工信息查询菜单*******************\n");
Emp*isfind=search(head);//找到与给定信息相符的职工指针结点
if(isfind==NULL)
printf("对不起,未找到该职工!
\n");//通过返回值是否为NULL,确定是否找到所需信息
else
{
printf("找到该用户:
\n");
showone(isfind);//输出该职工信息
}
printf("继续查找请按4,返回主菜单请按7,退出程序请按0,清除屏显请按8。
\n");
selectmenu(head);
}
显示某员工信息、所有员工信息.cpp
/*显示某员工信息*/
#include"my.h"
voidshowone(Emp*p)
{
printf("姓名:
%s\n",p->name);
printf("工资卡号:
%s\n",p->wagecard);
printf("身份证号:
%s\n",p->ID);
printf("基本工资:
%.1f\n",p->basewage);
printf("职位工资:
%.1f\n",p->dutywage);
printf("津贴:
%.1f\n",p->allowance);
printf("水电费:
%.1f\n",p->utilities);
printf("公积金:
%.1f\n",p->accfund);
printf("应发工资:
%.1f\n",p->sendwage);
printf("实发工资:
%.1f\n",p->factwage);
}
/*显示所有员工信息*/
voiddisplay_all(Emp*head)
{
printf("********************进入显示所有员工信息菜单*************************\n");
Emp*p=NULL;
if(head==NULL)
{
printf("对不起,职工工资管理系统中无任何数据!
\n");
}
else
{
printf("姓名工资卡号身份证号基本工资职位工资津贴水电费公积金应发工资实发工资\n");
printf("--------------------------------------------------------------------------------\n");
for(p=head->next;p!
=NULL;p=p->next)//通过结点指针遍历输出所有职工信息
{
printf("%-7s%-9s%-9s%-9.1f%-9.1f%-7.1f%-7.1f%-7.1f%-9.1f%-9.1f",p->name,p->wagecard,p->ID,
p->basewage,p->dutywage,p->allowance,p->utilities,p->accfund,p->sendwage,p->factwage);
printf("\n");
}
}
printf("重新显示请按3,返回主菜单请按7,退出程序请按0,清除屏显请按8.\n");
selectmenu(head);
}
主菜单显示与选择.cpp
/*主菜单显示*/
#include"my.h"
voidshow
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 职工 信息管理