工资管理系统设计论文Word格式文档下载.docx

上传人:b****3 文档编号:7845412 上传时间:2023-05-09 格式:DOCX 页数:42 大小:189.56KB
下载 相关 举报
工资管理系统设计论文Word格式文档下载.docx_第1页
第1页 / 共42页
工资管理系统设计论文Word格式文档下载.docx_第2页
第2页 / 共42页
工资管理系统设计论文Word格式文档下载.docx_第3页
第3页 / 共42页
工资管理系统设计论文Word格式文档下载.docx_第4页
第4页 / 共42页
工资管理系统设计论文Word格式文档下载.docx_第5页
第5页 / 共42页
工资管理系统设计论文Word格式文档下载.docx_第6页
第6页 / 共42页
工资管理系统设计论文Word格式文档下载.docx_第7页
第7页 / 共42页
工资管理系统设计论文Word格式文档下载.docx_第8页
第8页 / 共42页
工资管理系统设计论文Word格式文档下载.docx_第9页
第9页 / 共42页
工资管理系统设计论文Word格式文档下载.docx_第10页
第10页 / 共42页
工资管理系统设计论文Word格式文档下载.docx_第11页
第11页 / 共42页
工资管理系统设计论文Word格式文档下载.docx_第12页
第12页 / 共42页
工资管理系统设计论文Word格式文档下载.docx_第13页
第13页 / 共42页
工资管理系统设计论文Word格式文档下载.docx_第14页
第14页 / 共42页
工资管理系统设计论文Word格式文档下载.docx_第15页
第15页 / 共42页
工资管理系统设计论文Word格式文档下载.docx_第16页
第16页 / 共42页
工资管理系统设计论文Word格式文档下载.docx_第17页
第17页 / 共42页
工资管理系统设计论文Word格式文档下载.docx_第18页
第18页 / 共42页
工资管理系统设计论文Word格式文档下载.docx_第19页
第19页 / 共42页
工资管理系统设计论文Word格式文档下载.docx_第20页
第20页 / 共42页
亲,该文档总共42页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

工资管理系统设计论文Word格式文档下载.docx

《工资管理系统设计论文Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《工资管理系统设计论文Word格式文档下载.docx(42页珍藏版)》请在冰点文库上搜索。

工资管理系统设计论文Word格式文档下载.docx

输入记录模块主要实现将数据存入数组中。

当从数据文件中读出记录时,它调用fread(&

gz[count],sizeof(ZGGZ),1,fg)文件读取函数,执行一次从文件中读取一条工资记录信息存入某个数组元素中德操作,并且这个操作在main()中调用执行,即在工资管理系统进入显示菜单界面时,该操作已经执行了。

假设该文件中没有数据,系统会提示数组为空,没有任何记录可操作,此时,用户应选择1,调用Add()函数,进行记录的输入,即完成在数组中添加元素的操作。

查询记录模块主要实现在数组中按职工编号或查找满足相关条件记录。

在查询函数Qur〔〕中,为了遵循模块化编程原则,我们将数组中进行的记录定位操作设计成了一个单独函数intLocate(ZGGZtp[],charfindmess[],charnameornum[]),参数findmess[]保存要查找的具体内容,nameornum[]保存要查找的字段〔职位字符串类型的num或者name〕,假设找到该记录,则返回指向该记录的数组元素的下标,否则;

返回一个—1的值。

更新记录模块主要实现对记录的修改、删除、插入和排序操作。

因为记录是以数组的结构形式储存的,所以这些操作都在数组中完成。

下面分别介绍着4个功能模块。

1)修改记录

修改记录的操作需要对数组中目标元素的数域中的值进行修改,他分两步完成。

第一步,输入要修改的职员编号,输入后调用定位函数Locate〔〕在数组中逐个对职员编号字段的值进行比较,直到找到该职员的编号记录;

第二步,假设找到该记录,则修改除职工编号之外的各字段的值,并将存盘标记变量savegflag置1,表示已经对记录进行了修改,但还未执行存盘操作。

2)删除记录

删除记录操作完成删除指定职员编号或的记录,他也分两步完成。

第一步,输入要修改的职员编号,输入后调用定位函数Locate〔〕在数组中逐个对职员编号字段的值进行比较,直到找到该职员的编号记录,并返回指向该记录的数组元素下标;

第二步,假设找到该记录,则从该记录所在元素的后续元素起,依次向前移一个元素位置,有值的数组元素个数减1.

3)插入记录

插入记录操作完成在指定职工编号的随后位置插入新的记录。

搜先,他要求用户输入某个职工的职工编号,新的记录将插入在该记录之后;

然后,提示用户数输入一条新的记录的信息,这些信息保存在心结构体类型的数组元素的个字段中;

最后,将该元素插入已经确认的位置的职工编号之后。

它的具体插入执行过程如图7.3所示,新的元素B1准备插入至已有5个元素的数组中,插入位置为元素A2之后。

具体过程为:

先调用Locate〔〕函数找到A2在数组中的下标,从A4开始,往后移动,至A2停止移动,然后再原A3的位置插入元素B1.

4)排序记录

冒泡排序法属于内部排序中的一种,这是运用数据值比较后,一句判断规则对数据位置进行交换以到达排序的目的。

针对数组结构的特点,这里采用这种排序法莱实现按实发工资字段的值从高到底对记录进行排序。

冒泡排序法的基本思想为:

将相邻的两个数组远足的实发工资字段的值进行比较,假设左边的值小于右边的值,则将此两个元素的值进行交换;

假设左边的值大于右边的值,则此两个值的位置不变。

右边的值继续和下一个值做比较,重复此动作,直到比较到最后一个值。

用伪代码描述如下:

插入B1

A0

A1

A2

A3

A4

插入B1前

B1

插入B1后

图7.3数据中插入记录示意图

if(左边的值<

右边的值)then

此两个元素的位置互换;

else/*左边的值>

=右边的值*/

此两个元素的位置不变:

右边的元素继续和下一个元素比较;

如图7.4所示,假设共有个ZGGZ结构数组元素gz【0】至gz【n-1】,其具体比较过程如下。

第一轮:

从gz【0】比到gz【n-1】,实发工资字段值最小的元素存放在gz【n-1】中。

第二轮:

从gz【0】比到gz【n-2】,实发工资字段值最小的元素存放在gz【n-2】中。

```````

第n-1轮:

从gz【0】比到gz【1】,实发工资字段值最小的元素存放在gz【1】中。

gz[n]

gz[0]

gz[1]

gz[2]

``````

gz[n-2]

gz[n-1]

图7.4数组中对记录

因为是按实发工资的降序排序,所以每进行一轮比较都会以交换位置的方式将该轮的最小者移向数据的尾端。

冒泡排序法的优点是,假设数组元素已有部分排好序,则使用冒泡排序法可以快速地完成排序。

其缺点则是会反复扫描数据,比较相邻的两个元素,速度不快且没有效率。

它属于稳定排序法。

该模块的实现比较简单,它主要通过依次读取数组中元素的数据域中的实发工资的值进行比较判断的形式,完成工资在各个等级的人数统计。

当把记录输出至文件时,调用fwrite(&

tp[i],sizeof(ZGGZ),1,fp)函数,将数组元素tp[i]中各字段的值,写入文件指针fp所指的文件;

当把记录输出至屏幕时,调用voidDisp()函数,将数组中存储的记录信息以表格的形式在屏幕上打印出来。

图7.2主控函数执行流程图

7.3.2数据结构设计

本程序定义了结构体emplee,用于存放职工的基本信息和工资信息。

typedefstructemployee/*标记为employee*/

{

charnum[10];

charname[15];

floatjbgz;

floatjj;

floatkk;

floatyfgz;

floatsk;

floatsfgz;

}ZGGZ;

其他字段的含义如下。

·

num[10]:

保存职工编号。

name[10]:

保存职工。

·

jbgz:

保存职工基本工资。

jj:

保存职工奖金。

kk:

保存职工扣款。

yfgz:

保存职工应发工资。

sk:

保存职工税款。

sfgz:

保存职工实发工资。

7.3.3函数功能描述

1〕printheader()

函数原型:

voidprintheader()

printheader()函数用于在以表格形式显示出记录时,打印输出表头信息。

2〕printdata()

voidprintada(ZGGZpp)

函数用于在以表格形式显示的方法,打印输出单个数组元素pp中的记录消息。

3)Disp()

voidDisp(ZGGZtp[],intn)

Disp()函数用于显示tp数组中存储的n条记录,内容为employee结构中定义的内容。

4〕numberinput()

floatnumberinput(char*notice)

numberinput()函数用于输入数值型数据,notice用于保存printf()中输出的提示消息。

5〕Stringinput()

函数原型:

voidStringinput(char*t,intlens,char*notice)

164

Stringinput()函数用于输入字符串,并进行字符串长度验证〔长度<

lens〕,t用于保存输的字符串,因为是以指针形式传递的,所以t相当于该函数的返回值notice用于保存printf()中输出的提示信息。

6)Locate()

intLocate(ZGGZtp[],intn,charfindmess[],charnameornum[[])

Locate()函数用于定位数组重符合要求的元素,并返回该数组元素下标值。

参数findmess[]保存要查找的具体内容,nameornum[]保存按什么字段在数组tp中查找。

7)Add()

intAdd(ZGGZtp[],intn)

Add()函数用于在数组tp中增加工资记录元素,并返回数组中的当前记录。

并显示出来。

8)Qur()

voidQur(ZGGZtp[],intn)

Qur()函数用于在数组tp中按职工编号或查找满足条件的记录,并显示出来。

9)Del()

intDel(ZGGZtp[],intn)

Del()函数用于现在数组tp中找到满足条件的记录,然后删除记录。

10)Modify()

voidModify(ZGGZtp],intn)

Modify函数用于在数组tp中修改记录元素。

11)Inser()

Insert(ZGGZtp[]intn)

Insert函数用于在数组tp中插入记录,并返回数组中的当前记录数。

12)Tongji()

voidTongji(ZGGZtp[]intn)

Tongji()函数用于在数组tp中完成记录的统计工作,统计该公司职工工资的整体分布情况。

13)Sort()

voidSort(ZGGZtp[],intn)

Sort()函数用于在数组tp中完成利用冒泡排序算法实现数组的按实发工资字段的降序排序。

14)Save()

voidSave(ZGGZtp[]intn)

Save()函数用于将保存职工工资的数组tp中的n个元素写入磁盘的数据文件中。

15)主函数main()

main()是整个工资管理系统控制部分。

7.4程序实现

7.4.1源码分析

包括加载头文件,定义结构体,常量和变量,并对它们进行初始化工作。

#include"

stdio.h"

/*标准输入输出函数库*/

#include"

stdlib.h"

/*标准函数库*/

string.h"

/*字符串函数库*/

conio.h"

/*屏幕操作函数库*/

#defineHEADER1"

-------------------------------ZGGZ----------------------------------------\n"

#defineHEADER2"

|number|name|jbgz|jj|kk|yfgz|sk|sfgz|\n"

#defineHEADER3"

|--------|-----------|--------|--------|--------|--------|--------|--------|\n"

#defineFORMAT"

|%-8s|%-10s|%8.2f|%8.2f|%8.2f|%8.2f|%8.2f|%8.2f|\n"

#defineDATAp->

num,p->

name,p->

jbgz,p->

jj,p->

kk,p->

yfgz,p->

sk,p->

sfgz

#defineEND"

----------------------------------------------------------------------------\n"

#defineN60

intsaveflag=0;

/*是否需要存盘的标志变量*/

/*定义与职工有关的数据结构*/

charnum[10];

/*职工编号*/

charname[15];

/*职工*/

floatjbgz;

/*基本工资*/

/*奖金*/

/*扣款*/

/*应发工资*/

/*税款*/

/*实发工资*/

2.主函数main()

main()函数主要实现了对整个程序的运行控制,以及相关功能模块的调用。

详细分析可参考图7.2。

voidmain()

ZGGZgz[N];

/*定义ZGGZ结构体*/

FILE*fp;

/*文件指针*/

intselect;

/*保存选择结果变量*/

charch;

/*保存(y,Y,n,N)*/

intcount=0;

/*保存文件中的记录条数〔或元素个数〕*/

fp=fopen("

C:

\\zggz"

"

ab+"

);

/*以追加方式打开二进制文件c:

\zggz,可读可写,假设此文件不存在,会创建此文件*/

if(fp==NULL)

{

printf("

\n=====>

cannotopenfile!

\n"

exit(0);

}

while(!

feof(fp))

if(fread(&

gz[count],sizeof(ZGGZ),1,fp)==1)/*一次从文件中读取一条职工工资记录*/

count++;

}

fclose(fp);

/*关闭文件*/

printf("

\n==>

openfilesucess,thetotalrecordsnumberis:

%d.\n"

count);

getchar();

menu();

while

(1)

system("

cls"

menu();

\nPleaseEnteryourchoice(0~9):

"

/*显示提示信息*/

scanf("

%d"

&

select);

if(select==0)

if(saveflag==1)/*假设对数组的数据有修改且未进行存盘操作,则此标志为1*/

{getchar();

Whethersavethemodifiedrecordtofile?

(y/n):

%c"

ch);

if(ch=='

y'

||ch=='

Y'

Save(gz,count);

\n===>

thankyouforuseness!

getchar();

break;

switch(select)

case1:

count=Add(gz,count);

break;

/*增加职工工资记录*/

case2:

count=Del(gz,count);

/*删除职工工资记录*/

case3:

Qur(gz,count);

/*查询职工工资记录*/

case4:

Modify(gz,count);

/*修改职工工资记录*/

case5:

count=Insert(gz,count);

/*插入职工工资记录*/

case6:

Tongji(gz,count);

/*统计职工工资记录*/

case7:

Sort(gz,count);

/*排序职工工资记录*/

case8:

Save(gz,count);

/*保存职工工资记录*/

case9:

system("

Disp(gz,count);

/*显示职工工资记录*/

default:

Wrong();

/*按键有误,必须为数值0-9*/

用户进入工资管理系统时,需要显示主菜单,提示用户进行选择,完成相应任务。

此代码被main()函数调用。

voidmenu()/*主菜单*/

/*调用DOS命令,清屏.与clrscr()功能相同*/

textcolor(10);

/*在文本模式中选择新的字符颜色*/

gotoxy(10,5);

/*在文本窗口中设置光标*/

cprintf("

TheEmployee'

SalaryManagementSystem\n"

gotoxy(10,8);

*************************Menu********************************\n"

gotoxy(10,9);

*1inputrecord2deleterecord*\n"

gotoxy(10,10);

*3searchrecord4modifyrecord*\n"

gotoxy(10,11);

*5insertrecord6countrecord*\n"

gotoxy(10,12);

*7sortreord8saverecord*\n"

gotoxy(10,13);

*9displayrecord0quitsystem*\n"

gotoxy(10,14);

*************************************************************\n"

/*cprintf()送格式化输出至文本窗口屏幕中*/

由于记录显示操作经常进行,所以我们将这部分由独立的函数来实现,以减少代码的重复。

过程如下。

(1)调用Disp(ZGGZtp[],intn)函数,它将显示从数组tp第一个元素开始的n条

记录。

(2)调用printdata(ZGGZpp)函数,它将显示数组元素pp中的记录信息。

voidprintheader()/*格式化输出表头*/

printf(HEADER1);

printf(HEADER2);

printf(HEADER3);

voidprintdata(ZGGZpp)/*格式化输出表中数据*/

ZGGZ*p;

p=&

pp;

printf(FORMAT,DATA);

voidDisp(ZGGZtp[],intn)/*显示数组tp[]中存储的记录,内容为employee结构中定义的内容*/

inti;

if(n==0)/*表示没有职工工资记录*/

Notemployeerecord!

return;

\n\n"

printheader();

/*输出表格头部*/

i=0;

while(i<

n)/*逐条输出数组中存储的职工信息*/

printdata(tp[i]);

i++;

voidWrong()/*输出按键错误信息*/

\n\n\n\n\n***********Error:

inputhaswrong!

pressanykeytocontinue**********\n"

voidNofind()/*输出未查找此职工的信息*/

Notfindthisemployeerecord!

用户进入工资管理系统时,在对某个记录进行处理前,需要按照条件找到这条记录,Locate()函数完成了记录定位的功能。

这里可以按照职工编号或职工进行记录查找定位。

/*************************************************************

作用:

用于定位数组中符合要求的记录,并返回保存该记录的数组元素下标值

参数:

findmess[]保存要查找的具体内容;

nameornum[]保存按什么在数组中查找;

**************************************************************/

intLocate(ZGGZtp[],intn,charfindmess[],charnameornum[])

inti=0;

if(strcmp(nameornum,"

num"

)==0)/*按职工编号查询*/

while(i<

n)

if(strcmp(tp[i].num,findmess)==0)/*假设找到findmess值的职工编号*/

returni;

elseif(strcmp(nameornum,"

name"

)=

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2