职工工资管理系统.docx

上传人:b****9 文档编号:25709781 上传时间:2023-06-11 格式:DOCX 页数:48 大小:355.57KB
下载 相关 举报
职工工资管理系统.docx_第1页
第1页 / 共48页
职工工资管理系统.docx_第2页
第2页 / 共48页
职工工资管理系统.docx_第3页
第3页 / 共48页
职工工资管理系统.docx_第4页
第4页 / 共48页
职工工资管理系统.docx_第5页
第5页 / 共48页
点击查看更多>>
下载资源
资源描述

职工工资管理系统.docx

《职工工资管理系统.docx》由会员分享,可在线阅读,更多相关《职工工资管理系统.docx(48页珍藏版)》请在冰豆网上搜索。

职工工资管理系统.docx

职工工资管理系统

《C语言》课程设计报告

 

学生姓名:

*****

学号:

****

******

*****

学院:

****

班级:

****

题目:

职工工资管理系统

 

指导教师:

****职称:

****

********

********

 

2012年06月30日

目录

目录……………………………………………………………………………I

一、选题背景…………………………………………………………………1

1.1背景…………………………………………………………………1

1.2方案论证…………………………………………………………….1

二、算法设计…………………………………………………………………2

2.1系统总体设计………………………………………………………2

2.2函数及功能说明……………………………………………………2

三、程序设计及功能说明……………………………………………………3

3.1信息存取模块………………………………………………………3

3.1.1储存模块………………………………………………………3

3.1.2读取模块……………………………………………………….3

3.2工资级别模块………………………………………………………3

3.2.1信息级别分类………………………………………………..3

3.2.2查找相同级别信息…………………………………………….3

3.3工资排序及求平均值和工资总和………………………………..3

3.4删除、插入及修改信息………………………………………3

3.4.1删除信息模板………………………………………………..3

3.4.2插入信息模板…………………………………………………3

3.4.3修改信息模版………………………………………………….3

四、结果分析…………..……………………………………………………4

4.1标题…………………………………………………………………4

4.1.1标题…………………………………………………………4

五、总结及心得体会…..……………………………………………………5

参考文献…………….…..……………………………………………………6

源程序………………..…..……………………………………………………7

一、选题背景

1.1背景标题(黑体小三)

随着社会的发展,企业的规模不断增大,职工的信息愈见复杂,手工的处理已无法满足信息的查询和调用。

因此有必要用计算机对此进行管理。

结合本学期所学C语言知识及老师的要求,经过实际的操作和设计,我们小组建立了能够录入信息,保存文件,根据工资进行排序等功能的职工工资管理系统,具体设计及功能如下。

 

1.2方案论证标题(黑体小三)

1.我们小组选用动态链表开辟空间来输入职工信息,它和数组相比,它的优越性在于开辟的是动态空间,可动态进行存储分配,根据需要开辟内存空间,减少内存的浪费使用。

2.我们要在屏幕上显示员工的基本信息,并要将工资按顺序排列,且给工资分等级,可以查出相同等级的信息。

3.对总体员工的工资进行求和,并计算出平均值,这方便于管理者的统计。

4.对于一个工资管理系统,要有灵活性,要可以实现对信息的删除功能,信息插入功能,及信息修改功能。

5.对以上信息的操作要做保存,因此要使用文件的存取功能,将所有信息保存在文件里。

二、算法设计

2.1系统总体设计(黑体小三)

图1-1

2.2函数及功能说明

2.2.1函数说明

各个函数及说明如下:

sum(*p)计算工资总额和平均值

scale(*p)判断工资等级

find(*p)查找相同工资等级的职工信息

comp(*p)工资排序输出职工名单

save(*p)对结果进行存储

read()读出信息

print(*p)输出函数

del(*p)删除职工信息

insert(*p)插入职工信息

update(*p)更新信息

menu()菜单,对接下来的操作进行选择

end()退出系统

2.2.2函数设计及流程图

输入界面信息及提示

输入职工信息

while(p1->age!

=0)

n=0,n++

n==1

p1=head

p2->next=p1

p2=p1

开辟新空间输入信息

p2-next=NULL

图1-1构建链表

p=head

输入文件名

不能打开文件

终止

while(p!

=NULL)

每次输出一个数据

输出“filewriteerror”

p=p->next

关闭文件

 

 

图1-2保存文件

 

输入打开文件名

打开一个二进制文件

给p一个新地址

head=p

while(p!

=NULL)

读文件

输出信息

p=p->next==NULL

开辟新地址给p->next

P=p->next

关闭文件

返回head

图1-3读出函数

 

P1=head

While(p1!

=NULL)

P1->salary>600

m=4

m=(int)(p1->salary/1500)

m不同时,p1->level值不同

p1=p1->next

图1-4工资级别函数

 

P1=head

P0=worker

Head=NULL

 

Head=p0

p0->next=NULL

While(p0->salary>p1->salary)&&(p1->next!

=NULL)

P2=p2

P1=p1->next

P0->

salary<=p1->salary

p2->next=p0

p0->next=p1

head

==p1

head=p0

p2->next=p0

p0->next=p1

n=n+1

图1-5增加信息

 

登陆界面

输入m

M=1

Head=read()

菜单界面

输入m,选择菜单

多分支选择语句

图1-6菜单界面

 

输入要进行修改的职工工号num

P1=head

While(p1!

=NULL)

 

Num==p1->num

K=k+1

输入修改的信息

P1->next=NULL

调用工资等级函数

调用按工资排序函数

k=0

输出

“无此文件请重新输入“

自归调用

图1-7修改函数

 

While(p0->next!

=NULL)

P1=p0->next

While(p1!

=NULL)

p0->salary>p1->salary

交换*p0*p1及p0->next与p1->next

P1=p1->next

P0=p0->next

图1-8按工资值排序

Sum=0

While(p!

=NULL)

sum=sum+p->salary

p=p->next

aver=sum/n

输出sum,aver

图1-9求和及平均值

 

提示是否退出系统

输入字符choice

Choice==y

退出

Choice==n

返回菜单

图1-10退出

P=head

Head!

=NULL

输出信息

P=p->next

While(p!

=NULL)

图1-11输出信息

 

P=head

输入查询等级

While(p!

=NULL)

'A'>a[0]||a[0]>'E'

a[0]==p->level

K++

输出信息

P=p->next

K==0

输出“无此等信息”

图1-12查找工资为某一等级的职工

 

p=head

Head=NULL

 

输出“链表为空”

 

While(num!

=p1->num&&p1->next!

=NULL)

 

P2=p1

P1=p1->next

Num-p1->num

 

输出“没有此员工”

P1=

head

Head=p1->next

P2->next=p1->next

n=n-1

图1-13删除信息

2.2.2公式说明(黑体小三)

……(行距:

固定值20磅;字体:

正文宋体小四号字;文中英文用新罗马体小四号字;)

在sum(*p)中求和公式及平均值公式分别如下所示:

(2.2)

注:

sum为工资总和,

->salary为每名职工工资,n为职工人数,aver为系统平均工资。

三、程序及功能说明

3.1信息存取模块

3.1.1储存模块

储存的函数save()是将信息以结构体的方式存入二进制文件中,存入时可以验证文件是否可以打开并给予提示。

voidsave(structwork*head)//定义储存文件函数save(structwork*head)

{

FILE*fp;//FILE为系统结构体,定义指向文件的指针

structwork*p;//定义*p为结构体指针

charfile[20];//定义file[20]为字符型数组

p=head;

printf("\n\n\t");

printf("输入储存文件名:

\n");//输出命令

printf("\t");

scanf("%s",file);//输入文件名

if((fp=fopen(file,"ab+"))==NULL)//若用ab+方式打开的file文件为空

{

printf("cantnotopenfile\n");

exit(0);//终止正在执行的文件

}

while(p!

=NULL)

{

if(fwrite(p,sizeof(structwork),1,fp)!

=1)

//从fp指向的地址输出,每次写一个数据,所写字节数为LEN,输出数据地址为p

printf("filewriteerror\n");

p=p->next;}//将p下一地址赋给p

fclose(fp);//关闭文件,使文件指针不指向该文件

}

3.1.2读取模块

读取的函数read()是将信息从二进制文件中读取,同时开辟一新的空间,将读到的信息赋给它;临时开辟空间可防止破坏系统的其他程序,同时可以节省内存空间,实现双优的局面。

structwork*read()//定义读出函数*read()

{

structwork*head,*p;//定义*head,*p为结构体

FILE*fp;//定义*fp指向文件的指针

doublesum=0,aver=0;//定义浮点型变量sum,aver

charfile[8];

n=0;

printf("\n\t\t");

printf("输入打开文件名:

\n");

printf("\t\t");

scanf("%s",file);

fp=fopen(file,"rb+");//为读写打开一个二进制文件

p=(structwork*)malloc(LEN);

head=p;

printf("工号姓名性别出生年月年龄婚姻状况家庭住址职称工资值工资级别\n");

while(p!

=NULL)

{

fread(p,LEN,1,fp);

//从fp指向的地址读入,每次读一个数据,所读字节数为LEN,存储到数据地址为p的文件中

n=n+1;

printf("%-5g%-6s%-4s%-10s%-3d%-8s%-20s%-8s%-7.2f%-2c\n",

p->num,p->name,p->sex,p->birthday,p->age,p->marr,p->address,p->title,p->salary,p->level);

if(p->next==NULL)p=NULL;

//若p->next为空,则p指向NULL

else

{

p->next=(structwork*)malloc(sizeof(structwork));

//开辟一个的地址给p

p=p->next;//将p->next地址给p

}

}

fclose(fp);//关闭文件

return(head);//返回head

}

3.2工资级别模块

3.2.1工资级别分类

scale(*p)函数是将工资以1500元为一个等级进行分类,分为A~E五个等级:

A等级为6000元以上;

B等级为4500~6000元;

C等级为3000~4500元;

D等级为1500~3000元;

E等级为0~1500元。

并将每条信息的工资划分等级。

voidscale(structwork*head)//定义工资级别函数scale(structwork*head)

{

structwork*p1;//定义*p1为结构体类型

intm;//定义m为整形

p1=head;//将head的地址给p1

while(p1!

=NULL)

{

if(p1->salary>6000)//若p1->salary>6000

m=4;//将4赋给m

else

m=(int)(p1->salary/1500);//对p1->salary/1500的值进行强制类型转换

switch(m)//多分支选择结构

{

case0:

p1->level='E';break;

case1:

p1->level='D';break;

case2:

p1->level='C';break;

case3:

p1->level='B';break;

case4:

p1->level='A';break;//满足该条件,跳出循环

}

p1=p1->next;//将p->next地址给p

}

}

3.2.2查找相同级别信息

find(*p)函数是输入一个等级(如:

A),则函数可进行查找与它相同等级的信息,同时可以输出信息内容。

其函数可以实现对输入的内容进行判断是否合法,若不合法会弹出提示信息,进行重新输入;其次,可以成功验证信息是否存在。

voidfind(structwork*head)//定义查找相同等级函数find(structwork*head)

{

structwork*p;

chara[1];

intk=0;//定义k控制信息是否在

p=head;

printf("\n\n\t\t*请输入查询等级:

");

scanf("%s",&a);

while(p!

=NULL)

{

if('A'>a[0]||a[0]>'E')//判断a是否满足条件

{

printf("\t\t*工资等级为A~E!

输入工资等级错误!

请重新输入:

");

scanf("%s",&a);

continue;//continue语句

}

else

{

if(a[0]==p->level)//判断输入等级是否存在

{

printf("工号姓名性别出生年月年龄婚姻状况家庭住址职称工资值工资级别\n");

k++;

printf("%-5g%-6s%-4s%-10s%-3d%-8s%-20s%-8s%-7.2f%-2c\n",

p->num,p->name,p->sex,p->birthday,p->age,p->marr,p->address,p->title,p->salary,p->level);

}

p=p->next;

}

}

if(k==0)//若k=0,则等级无此信息

{

printf("\t\t无此等级信息!

\n");

}

}

3.3工资排序及求平均值和工资总和

工资排序函数cmp()对工资从小到大的按顺序排列,其排列是对链表进行重新排列,故在改变结点的内容的同时要改变节点中next所指向的地址,故其可以将链表重新排列。

structwork*comp(structwork*p)//定义比较函数comp(structwork*p)

{

structworkt,*p2;//定义t为结构体类型

structwork*p0,*p1;//定义*p0,*p2,*p1为结构体类型指针

p0=p;//将p地址给p0

while(p0->next!

=NULL)

{

p1=p0->next;

while(p1!

=NULL)

{

if(p0->salary>p1->salary)//比较大小

{

t=*p1;

*p1=*p0;

*p0=t;//交换结构体类型指针的内容

p2=p1->next;

p1->next=p0->next;

p0->next=p2;//交换结构体类型的地址

}

p1=p1->next;

}

p0=p0->next;

}

return(p);//将p的值返回

}

voidsum(structwork*p)//定义求和及平均值函数sum(structwork*p)

{

floatsum,aver;

sum=0;

while(p!

=NULL)

{

sum=sum+p->salary;//对sum进行累加求和

p=p->next;

}

aver=sum/n;//求平均数

printf("\n\n\t\t职工工资总额为:

%10.2f元\n\t\t平均工资为:

%7.2f元\n\n\n",sum,aver);

}

3.4删除及插入信息

3.4.1删除信息模板

删除信息函数del()应用链表知识,进行查找用户希望删除的信息,可以一次删除多条信息,以输入0作为控制点,并调用输出函数将其结果输出,同时将其保存在用户定义下的文件中。

structwork*del(structwork*head,floatnum)//定义del()函数

{

structwork*p1,*p2;//定义结构体指针变量*p1,*p2

p1=head;//将头指针给p1

if(head==NULL)//判断是否为空

{printf("\n链表为空!

");

return(head);}//返回头指针

while(num!

=p1->num&&p1->next!

=NULL)

//输入值不是p1指向的数且p1下一结点地址不为空时

{p2=p1;p1=p1->next;}//将p1地址给p2,p1向下移一位

if(num==p1->num)//判断num是否p1所指的num

{if(p1==head)//若p1是否指向头指针

head=p1->next;//将p1下一结点地址给head

else

p2->next=p1->next;

//将p1下一结点地址给p2下一结点地址

n=n-1;}//计算结点个数

else

printf("\t\t%g没有此员工!

\n",num);//输出指示

return(head);}//返回头指针

3.4.2插入信息模板

插入信息函数insert()同样应用链表的知识,进行对顺序已排好的文件插入新职工信息,可同时插入多条信息;对每一新输入的信息进行分化等级,然后调用输出函数输出全部信息,并将结果存入新文件中。

structwork*insert(structwork*head,structwork*worker)//定义*insert()函数

{

structwork*p0,*p1,*p2;//定义结构体指针变量*p0,*p1,*p2

p1=head;//将头指针给p1

p0=worker;//将worker地址给p0

if(head==NULL)//判断是否为空

{

head=p0;p0->next=NULL;//p0地址给head,p0指向空地址

}

else

{

while((p0->salary>p1->salary)&&(p1->next!

=NULL))

{

p2=p1;//将p1地址给p2

p1=p1->next;}//p1下移一位

if(p0->salary<=p1->salary)//p0指向salary是否小于等于p1指向的salary

{

if(head==p1)head=p0;//若头指针为p1地址则将p0地址给head

elsep2->next=p0;//将p0地址给p2指向的下一结点

p0->next=p1;//p0的下一结点为p1指向的结点

}

else

{

p1->next=p0;//将p0的地址给p1指向的下一结点

p0->next=NULL;}//p0下一节点指向为空

}

n=n+1;

return(head);//返回头指针

}

3.4.3修改信息模板

修改信息函数update()是先对修改的信息进行查询,在重新输入信息,调用划分等级函数划分等级,再调用插入函数将其重排,将其结果输出,最后保存文件。

structwork*update(structwork*head)//定义修改函数update()

{

floatnum;

structwork*p1;

intk=0;

printf("\t\t请输入要修改的职工的工号:

");

scanf("%g",&num);

p1=head;

while(p1!

=NULL)

{

if(num==p1->nu

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

当前位置:首页 > 外语学习 > 其它语言学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1