C语言课程设计报告职工工资信息管理系统Word格式.docx
《C语言课程设计报告职工工资信息管理系统Word格式.docx》由会员分享,可在线阅读,更多相关《C语言课程设计报告职工工资信息管理系统Word格式.docx(27页珍藏版)》请在冰豆网上搜索。
浏览功能要求能够按照工资卡号、姓名分类浏览;
有排序功能,排序后按照工资卡号升序或实发工资降序输出;
查询功能要求能够按照工资卡号、姓名查询。
【提示】
1、文件中一行数据对应一个职工工资信息
2、工资信息的数据结构采用结构体数组,一个数组元素对应一条工资单记录。
3、工资单信息包括工资卡号、姓名、月份、应发工资、税费、电费、税金、实发工资等
4、实发工资=应发工资—税费—电费—税金,其中税金计算方法为:
(1)应发工资<
800元,税金=0
(2)800<
应发工资<
1400元,税金=(应发工资—800)*5%
(3)应发工资>
1400元,税金=(应发工资—1400)*10%
2.程序设计思路
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%;
1400)
税金=(应发工资-1400)*10%;
实发工资=应发工资-水费-电费-税金。
(3)新增模块
增加新的职工工资信息,从键盘输入并逐条写到原来的输入文件中,采用追加而不是覆盖的方式(以”ab”方式打开文件)。
(4)浏览模块
调用排序模块的排序功能,可以浏览排序后的所有职工信息。
(5)排序模块
排序模块提供菜单选择,实现按照工资卡号升序、实发工资升序排序。
排序方法可以选择冒泡排序、插入排序、选择排序等,本系统用的是冒泡排序。
(6)查询模块
实现按照工资卡号和姓名的查询,采用基本的查找方法即可。
3.功能模块图
4.数据结构设计
系统用将职工各项信息以结构体类型structlist来定义,它包括num,name[20],month,salary1,water,electricity,fax,salaly2等不同类型的数据项,同时定义了结构体数组,包括N个数组元素,对应N个职工,每一个元素用来存放一个职工的数据;
每个职工的信息以结构体方式从内存和磁盘文件中进行存储和导出。
以结构体方式来整合职工的不同信息,将不同的数据组合成一个有机整体,非常方便程序的调用。
5.算法设计
1.主函数提供输入、处理和输出部分的函数调用,各功能模块采用菜单方式选择。
N
Y
2.添加模块
1
2
2.新增模块
3.浏览模块
4.排序模块
Y
12
5.查询模块
12
6.程序代码
(每个函数都要有功能说明)
#include<
stdio.h>
string.h>
conio.h>
stdlib.h>
#defineN50
voidmain()
voidmenu();
menu();
}
voidmenu()//主菜单函数
voidenter();
voidadd();
voidbrowse();
voidsearch();
voidorder();
intn,w1;
do
{
puts("
\t\t*********************MENU*************************\n\n"
);
\t\t\t1.Enter"
\t\t\t2.Add"
\t\t\t3.browseall"
\t\t\t4.Search"
\t\t\t5.Order"
\t\t\t6.Exit"
\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();
/*新增模块*/
case3:
browse();
/*浏览模块*/
case4:
search();
/*查找模块*/
case5:
order();
/*排序模块*/
case6:
exit(0);
/*退出模块*/
structlist//结构体定义工资信息
intnum;
//姓名
//电费
floatfax;
//税金
voidenter()//输入模块函数
voidprintf_back();
voidsave(intn);
voidinput(inti);
inti,n;
howmanyworkers(1-%d)?
:
"
N-1);
//输入职工数目
\nenterdatenow\n\n"
for(i=0;
i<
n;
i++)//输入职工各项信息
\ninput%dthstudentrecord.\n"
i+1);
input(i);
//调用职工信息输入函数
if(i!
=0)save(n);
//储存职工信息
printf_back();
//执行返回函数
voidadd()//新增模块函数
{
inti,n,m,k;
intload();
FILE*fp;
//定义文件指针变量
n=load();
//导出文件信息,得到返回值
howmanyworkersareyouwanttoadd(0-%d)?
N-1-n);
m);
//输入新增职工数目
k=m+n;
//总职工数=新增职工数+已有职工数
for(i=n+1;
=k;
i++)//输入新增职工信息
\ninput%dthworkersrecord.\n"
i-n+2);
//调用职工信息输入函数
fp=fopen("
workers.txt"
"
ab"
//以追加形式打开文件
i++)
fwrite(&
list[i],sizeof(structlist),1,fp);
//将内存中的职工信息输出到磁盘文件中
save(n);
//储存输入信息
fclose(fp);
//关闭文件
voidbrowse()//浏览模块函数
voidprintf_one(inti);
voidprintf_face();
printf_face();
if((i!
=0)&
(i%10==0))//以10个职工为一组输出
{printf("
\n\npassanykeytocontinue..."
getch();
\n\n"
printf_one(i);
//输出各职工信息
printf("
\n"
\tthereare%drecode.\n"
n);
\npassanykeytoback.."
//返回主菜单
voidsearch()//查询模块函数
{
\t\t\t1.searchbyname"
//按姓名查询
\t\t\t2.searchbynum"
//按工资卡号查询
if(n<
2)
voidsearch_1();
voidsearch_2();
search_1();
search_2();
voidsearch_1()//按姓名查询
inti,n,k,w1=1,w2,w3,w4;
structlists;
k=-1;
\n\nenternamethatyouwanttosearch!
name:
%s"
s.name);
//输入要查找的姓名
//输出职工信息项目
if(strcmp(s.name,list[i].name)==0)//查询出与输入姓名相同的职工的信息
k=i;
printf_one(k);
//输出查询结果并中断,说明只能输出查到的第一个数据
if(k==-1)//如果没有查出信息则执行如下选择菜单
\n\nNO.exit!
please"
\n\nareyouagain?
\n\t1).again2).NOandback[]\b\b"
w1);
if(w1==2)break;
while(k==-1&
w1==1);
//选择1继续循环执行查询
w4=0;
w3=0;
if(k!
=-1)
successful"
\n\nwhatdoyouwanttodo?
\n\t1).searchanother2).back[]\b\b"
//选择查找下一个数据或返回
w2);
while(w2==1);
//选择1循环执行查询下一个数据
voidsearch_2()//按工资卡号查询
\n\nenternumthatyouwanttosearch!
num:
s.num);
//输入要查找的工资卡号
//输出职工信息项目
if(s.num==list[i].num)//查询出与输入工资卡号相同的职工的信息
printf_one(k);
if(k==-1)//如果没有查出信息则执行如下选择菜单
//选择1继续循环执行查询
w4=0;
while(w2==1);
//选择1循环执行查询下一个数据
voidorder()//排序功能模块函数
{intw1,n;
voidorder_1();
voidorder_2();
\t\t\t1.orderbynum"
//按工资卡号排序
\t\t\t2.orderbysalary2"
//按实发工资排序
order_1();
order_2();
voidorder_1()//按工资卡号升序排序
voidsave(inti);
inti,j,n;
voidbrowse();
structlists;
n-1;
i++)//冒泡排序法,按职工工资卡号升序排列出职工信息
{for(j=i+1;
j<
j++)
{if(list[j].num<
list[i].num)
s=list[j];
list[j]=list[i];
list[i]=s;
save(n);
//储存排序后的信息
browse();
//显示排序后的信息
voidorder_2()//按实发工资升序排序
i++)//冒泡排序法,按实发工资升序排列出职工信息
{if(list[i].salary2<
list[j].salary2)
list[j]=list[i];
list[i]=s;
voidsave(intn)//储存函数
inti;
wb"
//以只写方式打开文件
}
intload()//导出文件信息
rb"
//以只读方式打开文件
!
feof(fp);
fread(&
//读出磁盘文件中的职工信息
return(i-1);
//返回数值i-1
voidinput(inti)//职工信息输入函数
floatsalary2(inti);
floatfax(inti);
No.:
list[i].num);
name:
list[i].name);
month:
list[i].month);
salary1:
list[i].salary1);
water:
list[i].water);
electricity:
list[i].electri