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