C语言实习职工工资信息管理系统.docx
《C语言实习职工工资信息管理系统.docx》由会员分享,可在线阅读,更多相关《C语言实习职工工资信息管理系统.docx(46页珍藏版)》请在冰豆网上搜索。
C语言实习职工工资信息管理系统
江西师范大学
本科生课程论文封面
课程名称C语言课程设计
类别:
C.本科生
组长:
黄金峰
组员:
谢熊飞吴云清王伟林梦婷
日期:
2014年7月7日
课程设计评语
对课程论文的评语:
平时成绩:
课程论文成绩:
总成绩:
评阅人签名:
注:
1、无评阅人签名成绩无效;
2、必须用钢笔或圆珠笔批阅,用铅笔阅卷无效;
3、如有平时成绩,必须在上面评分表中标出,并计算入总成绩。
一.课程论文题目
职工工资信息管理系统
【要求】
该系统能够实现工资信息管理.系统包括录入,浏览,查询,统计等功能.其中录入功能要求能够添加新的工资信息到文件;浏览功能要求能按照工资卡号,姓名分类浏览,提供分屏显示;有排序功能,排序后按照工资卡号升序或实发工资降序输出;查询功能要求能够按照工资卡号,姓名查询;统计功能要求能够按照月份累计统计某职工在某时间段实发工资总金额。
【提示】
1、文件中一行数据对应一个职工工资信息。
2、工资信息的数据结构采用结构体数组,一个数组元素对应一条工资单记录。
3、工资单信息包括工资卡号、姓名、月份、应发工资、税费、电费、税金、实发工资等。
4、实发工资=应发工资—税费—电费—税金,其中税金计算方法为:
(1)应发工资<800元,税金=0
(2)800<应发工资<1400元,税金=(应发工资—800)*5%
(3)应发工资>1400元,税金=(应发工资—1400)*10%
二.程序设计思路
1、设计思路
(1)根据题目要求,应该把职工工资信息用结构体形式输入,在定义一个全局变量和文件指针进行整个程序的运行,然后把职工工资信息送到文件中,所以应该提供一个结构体和文件的输入输出等操作;
(2)在程序中需实现职工工资浏览、查询、统计等功能的操作,所以需要建立相应的功能模块来实现;
(3)另外还需要提供键盘式选择菜单实现功能,在运行时达到所要的目的。
2、总体设计
整个系统可以分为信息输入、信息新增、信息浏览、信息排序和信息查询五个主要模块。
3、详细设计
(1)工资信息采用结构体数组:
structlist
{
intnum;//工资卡号
charname[20];//姓名
intmonth;//月份
intsalary1;//应发工资
intwater;//水费
intelectrisity;//电费
floatfax;//税金
floatsalary2;//实发工资
}list[N];//list[N]中每个数组元素对应一个职工工资信息
(2)输入模块
按照工资卡号、姓名、月份、应发工资、水费、电费的顺序输入信息,税金和实发工资根据输入的信息进行计算得到,这些信息被录入到文件中。
文件操作函数:
fopen,fwrite,fclose.
税金的计算:
if(应发工资<=800)
税金=0;
elseif(应发工资>800&&应发工资<=1400)
税金=(应发工资-800)*5%;
elseif(应发工资>1400)
税金=(应发工资-1400)*10%;
实发工资=应发工资-水费-电费-税金。
(3)新增模块
增加新的职工工资信息,从键盘输入并逐条写到原来的输入文件中,采用追加而不是覆盖的方式(以“ab”方式打开文件)。
(4)浏览模块
调用排序模块的排序功能,可以浏览排序后的所有职工信息。
(5)排序模块
排序模块提供菜单选择,实现按照工资卡号升序、实发工资升序排序。
排序方法可以选择冒泡排序、插入排序、选择排序等,本系统用的是冒泡排序。
(6)查询模块
实现按照工资卡号和姓名的查询,采用基本的查找方法即可。
三.功能模块图
四.数据结构设计
系统用将职工各项信息以结构体类型structlist来定义,它包括num,name[20],month,salary1,water,electricity,fax,salaly2等不同类型的数据项,同时定义了结构体数组,包括N个数组元素,对应N个职工,每一个元素用来存放一个职工的数据;每个职工的信息以结构体方式从内存和磁盘文件中进行存储和导出。
以结构体方式来整合职工的不同信息,将不同的数据组合成一个有机整体,非常方便程序的调用。
五.算法设计
1、主函数
主函数一般设计比较简单,只提供输入、处理和输出部分的函数调用。
各功能模块用菜单方式选择。
[流程图]
N
Y
#include
#include
#include
#include
#defineN50
voidmain()/***************主函数***************/
{
voidmenu();/*声明菜单函数*/
menu();/*调用菜单函数*/
}
voidmenu()/***************菜单函数***************/
{
voidenter();
voidadd();
voidbrowse();
voidsearch();
voidorder();
intn,w1;
do
{
puts("\t\t*********************MENU*************************\n\n");
puts("\t\t\t1.Enter");
puts("\t\t\t2.Add");
puts("\t\t\t3.browseall");
puts("\t\t\t4.Search");
puts("\t\t\t5.Order");
puts("\t\t\t6.Exit");
puts("\n\n\t\t*************************************************\n");
printf("Choiceyournumber(1-6):
[]\b\b");
scanf("%d",&n);
if(n<1||n>6)/*对选择数字作判断*/
{
w1=1;
getchar();
}
elsew1=0;
}
while(w1==1);
switch(n)/*选择功能*/
{
case1:
enter();break;/*输入模块*/
case2:
add();break;/*追加模块*/
case3:
browse();break;/*浏览模块*/
case4:
search();break;/*查找模块*/
case5:
order();break;/*排序模块*/
case6:
exit(0);
}
}
2、各功能模块设计
(1)输入模块
[数据结构]
把职工的卡号、月份应发工资、水费、电费、税金、实发工资作为结构体成员,如果存放若干个职工信息就用结构体数组。
structlist
{
intnum;
charname[20];
intmonth;
intsalary1;
intwater;
intelectrisity;
floatfax;
floatsalary2;
}list[N];/*list[N]中每个数组元素对应一个职工*/
[流程图]
1
2
/***************输入模块***************/
voidenter()/*输入模块*/
{
voidprintf_back();
voidsave(intn);
voidinput(inti);
inti,n;
printf("howmanyworkers(0-%d)?
:
",N-1);
scanf("%d",&n);
printf("\nenterdatenow\n\n");
for(i=0;i{
printf("\ninput%dthworkerrecord.\n",i+1);
input(i);/*调用输入函数*/
}
if(i!
=0)save(n);/*调用保存函数*/
printf_back();/*一个任务结束时让用户选择是浏览还是返回*/
}
⑵追加模块
[需求分析]
该模块的功能是用户需要增加新的职工记录,请从键盘输入并逐条写到原来的输入文件中是追加不是覆盖.
[流程图]
1
2
[程序]
/***************追加模块***************/
voidadd()/*追加模块*/
{
voidprintf_back();
inti,n,m,k;
intload();
voidsave(intn);
voidinput(inti);
FILE*fp;
n=load();
printf("howmanyworkersareyouwanttoadd(0-%d)?
:
",N-1-n);
scanf("%d",&m);/*输入要追加的个数*/
k=m+n;
for(i=n+1;i<=k;i++)
{
printf("\ninput%dthworkersrecord.\n",i-n);
input(i);/*调用输入函数*/
}
fp=fopen("workers.txt","ab")/*以ab方式打开文件,追加保存*/;
for(i=n+1;i<=k;i++)/*输出到文件*/
fwrite(&list[i],sizeof(structlist),1,fp);
fclose(fp);
printf_back();/*一个任务结束时让用户选择是浏览还是返回*/
}
⑶浏览模块
[需求分析]
该模块的功能是显示所有职工记录工资信息.
[流程图]
[程序]
/***************浏览(全部)模块***************/
voidbrowse()/*浏览模块*/
{
voidprintf_one(inti);
voidprintf_face();
intload();
voidmenu();
inti,n;
n=load();/*加载记录*/
printf_face();/*调用显示数据结构项目函数*/
for(i=0;i{
if((i!
=0)&&(i%10==0))/*目的是分屏显示*/
{printf("\n\npressanykeytocontiune...");
getch();
puts("\n\n");}
printf_one(i);/*调用显示一个记录的函数*/
printf("\n");
}
printf("\tthereare%drecord.\n",n);
printf("\npassanykeytoback...");
getch();/*按任意键*/
menu();
}
⑷查找模块
[需求分析]
该模块的功能是根据输入的职工姓名和卡号查找对应的记录.
[流程图]
N
Y
12
1
2
[程序]
/***************查找函数***************/
voidsearch()/*查找模块*/
{
intn,w1;
do
{
puts("\t\t\t1.searchbyname");
puts("\t\t\t2.searchbynum");
scanf("%d",&n);
if(n<1||n>2)/*对选择数字作判断*/
{
w1=1;
getchar();
}
elsew1=0;
}
while(w1==1);
switch(n)
{
voidsearch_1();
voidsearch_2();
case1:
search_1();break;
case2:
search_2();break;
}
}
voidsearch_1()/*按姓名查找*/
{
intload();
voidprintf_face();
voidmenu();
voidprintf_one(inti);
inti,n,k,w1=1,w2,w3,w4;
structlists;
n=load();
do
{
do
{
k=-1;
printf("\n\nenternamethatyouwanttosearch!
name:
");
scanf("%s",s.name);
printf_face();/*调用显示数据结构项目函数*/
for(i=0;iif(strcmp(s.name,list[i].name)==0)
{
k=i;/*找到数据*/
printf_one(k);break;/*调用显示一个记录的函数*/
}
if(k==-1)
{
printf("\n\nNO.exit!
please");
printf("\n\nareyouagain?
\n\t1).again2).NOandback[]\b\b");
scanf("%d",&w1);
if(w1==2)break;
}
}
while(k==-1&&w1==1);/*如果w1不等于1这直接返回*/
w4=0;w3=0;
if(k!
=-1)/*k不等于-1表示已找到,如果找到则选择操作*/
{
printf("successful");
printf("\n\nwhatdoyouwanttodo?
\n\t1).searchanother2).back[]\b\b");
scanf("%d",&w2);
}
}
while(w2==1);
menu();
}
voidsearch_2()/*按卡号查找*/
{
intload();
voidprintf_face();
voidmenu();
voidprintf_one(inti);
structlists;
inti,n,k,w1=1,w2,w3,w4;
n=load();
do
{
do
{
k=-1;
printf("\n\nenternumthatyouwanttosearch!
num:
");
scanf("%d",&s.num);
printf_face();/*调用显示数据结构项目函数*/
for(i=0;iif(s.num==list[i].num)
{
k=i;/*找到数据*/
printf_one(k);break;/*调用显示一个记录的函数*/
}
if(k==-1)
{
printf("\n\nNO.exit!
please");
printf("\n\nareyouagain?
\n\t1).again2).NOandback[]\b\b");
scanf("%d",&w1);
if(w1==2)break;
}
}
while(k==-1&&w1==1);/*如果w1不等于1这直接返回*/
w4=0;w3=0;
if(k!
=-1)/*k不等于-1表示已找到,如果找到则选择操作*/
{
printf("\nsuccessful");
printf("\n\nwhatdoyouwanttodo?
\n\t1).searchanother2).back[]\b\b");
scanf("%d",&w2);
}
}
while(w2==1);
menu();
}
⑸排序模块
[需求分析]
该模块的功能是将职工记录按照一定顺序排序.
[流程图]
N
Y
12
1
2
/***************排序模块***************/
voidorder()/*排序模块*/
{
intw1,n;
voidorder_1();
voidorder_2();
do
{
puts("\t\t\t1.orderbynum");
puts("\t\t\t2.orderbysalary");
scanf("%d",&n);
if(n<1||n>2)/*对选择数字作判断*/
{
w1=1;
getchar();
}
elsew1=0;
}
while(w1==1);
switch(n)
{
case1:
order_1();break;
case2:
order_2();break;
}
}
voidorder_1()/*卡号升序排*/
{
intload();
voidprintf_back();
voidsave(inti);
inti,j,n,k;
voidbrowse();
structlists;
n=load();
for(i=0;i{
k=i;
for(j=i+1;jif(list[j].nums=list[i];
list[i]=list[k];
list[k]=s;
}
save(n);
browse();
puts("\n\n");
printf_back();
}
voidorder_2()/*工资降序排*/
{
intload();
voidprintf_back();
voidsave(inti);
inti,j,n,k;
structlists;
n=load();
for(i=0;i{
k=i;
for(j=i+1;jif(list[k].salary2s=list[i];list[i]=list[k];list[k]=s;
}
save(n);
browse();
puts("\n\n");
printf_back();
}
六、程序代码
(每个函数都要有功能说明)
#include
#include
#include
#include
#defineN50
voidmain()
{
voidmenu();
menu();
}
voidmenu()//主菜单函数
{
voidenter();
voidadd();
voidbrowse();
voidsearch();
voidorder();
intn,w1;
do
{
puts("\t\t*********************MENU*************************\n\n");
puts("\t\t\t1.Enter");
puts("\t\t\t2.Add");
puts("\t\t\t3.browseall");
puts("\t\t\t4.Search");
puts("\t\t\t5.Order");
puts("\t\t\t6.Exit");
puts("\n\n\t\t*************************************************\n");
printf("Choiceyournumber(1-6):
[]\b\b");
scanf("%d",&n);
if(n<1||n>6)/*对选择的数字进行判断*/
{
w1=1;
getchar();
}
elsew1=0;
}
while(w1==1);
switch(n)
{
case1:
enter();break;/*输入模块*/
case2:
add();break;/*新增模块*/
case3:
browse();break;/*浏览模块*/
case4:
search();break;/*查找模块*/
case5:
order();break;/*排序模块*/
case6:
exit(0);/*退出模块*/
}
}
structlist//结构体定义工资信息
{
intnum;//工资卡号
charname[20];//姓名
intmonth;//月份
intsalary1;//应发工资
intwater;//水费
intelectrisity;//电费
floatfax;//税金
floatsalary2;//实发工资
}list[N];//list[N]中每个数组元素对应一个职工工资信息
voidenter()//输入模块函数
{
voidprintf_back();
voidsave(intn);
voidinput(inti);
inti,n;
printf("howmanyworkers(1-%d)?
:
",N-1);
scanf("%d",&n);//输入职工数目
printf("\nenterdatenow\n\n");
for(i=0;i{
printf("\ninput%dthstudentrecord.\n",i+1);
input(i);//调用职工信息输入函数
}
if(i!
=0)save(n);//储存职工信息
printf_back();//执行返回函数
}
voidadd()//新增模