c语言课程设计报告 职工工资管理系统



《c语言课程设计报告 职工工资管理系统》由会员分享,可在线阅读,更多相关《c语言课程设计报告 职工工资管理系统(30页珍藏版)》请在装配图网上搜索。
1、课程设计报告 课程设计报告 题目:职工工资管理系统 设计者: 专业班级:_学号:— 指导教师: 所属院系: 2011年6月29日 .设计需求说明 一、职工工资管理系统功能设计要求 1. 输入记录:将每一个职工的姓名、ID号以及基本工资、职务工资、岗位津贴、医疗保险、公积金的数据作为一个记录。•该软件能建立一个新的数据文件或给已建立好的数据文件增加记录。 2. 显示记录:根据用户提供的记录或者根据职工姓名显示一个或几个职工的各项工资和平均工资。 3. 修改记录:可以对数据文件的任意记录的数据进行修改并在修改前后对记录内容进行显示。 4.查找记录:可以对数据文件的任意记录
2、的数据进行查找并在查找前后对记录内容进行显示。 5.删除记录:可删除数据文件中的任一记录。 6.恢复记录:能恢复被删除的任一记录。 7.统计:(A)计算各项工资平均工资及总工资,(B)・统计符合指定条件(如职工工资前三项之和在2000元以上、2000~1500元、1500~1000元)以内的工资职工人数及占总职工人数的百分比O(C)按字符表格形式打印全部职工工资信息表及平均工资(•包括各项总的平均工资)。 8.保存数据文件功能。 9.打开数据文件功能。 经过逐层逐块、不断细化、求精过程,编写程序并进行测试、验证,可以逐 个模块地分开调试,并通过文件包含或用工程文件的形式进行逐步联
3、合调 试。程序运行结果如下表所示(记录个数至少8个)。 7 二.模块设计分析 系统功能模块图 工作程序分析 ① 输入:输入职工工资资料通过结构体的数组来进行操作,先头定义数组em[],先输入需要输入的职工人数m,然后进入循环,每次循环将各项输入结构体数组对应项的对应成员中,当循环次数等于人数时,完成全部员工的资料输入,退出循环。同时将数据储存在ckerk_list文件中并自动保
4、存至磁盘。 注:如首次使用,尚未输入数据,请先输入数据。输入的数据将自动保存。再次选择输入功能时原数据将被覆盖。 ② 保存:将输入的资料存入磁盘 读取文件clerk_list,若文件不存在,打印“打开失败并退出。若存在,则通过循环语句将输入到结构体数组的数据逐个输入磁盘。 ③ 读取:读取磁盘中的资料 打开文件clerk_list,若文件不存在,打印“打开失败”并退出。若存在,读取文件中的数据,并返回职工人数。 ④ 显示:显示职工工资资料 先通过读取函数的返回值确定职工人数m,再通过循环将员工工资资料逐个打印,当循环次数达到m时退出循环。其中总工资由程序计算,总工资=基本工资+职务
5、工资+津贴-医疗保险-公积金 ⑤ 删除:删除某员工的资料打印员工资料并提示输入要删除职工的姓名,输入后若该职工不存在则打印“查无此 人”;若存在,则显示该职工资料并询问是否确定删除。若确定,则删除。删除时,通过对比输入的姓名与资料中的姓名做对比从而确定要删除的项i,从第i项开始,将后一项的各成员的值赋给前一项各对应的成员,完成对第i项的删除。 ⑥ 添加:添加新的员工资料而不覆盖原有资料 打印原有职工资料,询问要添加的职工人数并询问是否确定添加。逐个逐项输入员工信息,之后程序计算其总工资。完成后显示“添加成功”,打印新的员工资料并自动保存。添加的方法为:定义一个相同类型的结构体数组,将原
6、有项复制后增添新的项,并保存新的数组。 ⑦ 查找:按ID好查询与按姓名查找员工资料 根据提示输入要查询的ID号或姓名,程序通过循环语句将输入的数字与以保存的结构体数组中的数据对比,若相同,则打印“已找到”及该员工的资料;当循环次数等于人数时结束循环,若至结束循环时也没有找到相同的,则打印“查无此人”。 ⑧ 修改:修改特定员工的特定资料打印员工信息并提示输入要修改资料的职工姓名。按提示确定要修改,确定要修改 的项目,输入要修改成的结果并将该结果赋给对应项的对应成员,完成对特定职工特定项目的修改。 ⑨ 统计通过循环对结构体数组中的每一项经行统计,计算工资总额为,将工资总额除以人 数计算
7、出平均工资。根据每名职工的资料计算基本工资、职务工资、津贴之和在1000-1500圆1500-2000圆2000圆以上的员工占总员工的百分比。
三.源程序代码(附各部分解释)
#include
8、gjj; /公积金/ inttotal; //总工资 }em[100]; voidmenu(); voidinput(); voidsave(int); voiddisplay(); voiddel(); voidadd(); voidsearch(); voidsearch_num(); voidsearch_name(); voidmodify(); voidsta(); voidstart();/*定义各函数*/voidstart()//开始界面 { system("cls");〃清屏 system("color1E");//设置文字颜色为黄色背
9、景色蓝色printf("\n\n\n\n\n\n"); printf( It T#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J* printf( It T#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#
10、J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J* 欢迎使用 工资管理系统 11A printf( *****************************"); 11 ’#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J
11、*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J* printf("\t\t\t\t制作:\n"); printf("\t\t\t\t2011年6月\n\n\n\n"); printf("\t\t\t***按任意键进入***\n"); } voidmenu()//菜单界面 system("cls"); system("color1F"); printf("***菜单***\n\n"); printf(">>>>>>>>>>>>>>>>>>>>>>>>> 输入 \n\n"); printf(">>>>>>>>>>>>>>>>>>>>>>>>> 显
12、示 \n\n"); printf(">>>>>>>>>>>>>>>>>>>>>>>>> 查找 \n\n"); printf(">>>>>>>>>>>>>>>>>>>>>>>>> 删除 \n\n"); printf(">>>>>>>>>>>>>>>>>>>>>>>>> 添加 \n\n"); printf(">>>>>>>>>>>>>>>>>>>>>>>>> 修改 \n\n"); printf(">>>>>>>>>>>>>>>>>>>>>>>>> 统计 \n\n"); printf(">>>>>>>>>>>>>>>>>>>>>>>>> 退出 \n\n");
13、
printf("说明:*如首次使用尚未输入数据请先输入数据\n
*输入的数据将自动保
存\n
*再次选择输入功能时原数据将被覆盖\n\n");
voidinput()/*录入函数*/
{
inti,m;
system("cls");
printf("职工人数(l--100):\n");
scanf("%d",&m);
for(i=0;i 14、rintf("请输入基本工资:");scanf("%d",&em[i].jbgz);
printf(“请输入职务工资:");
scanf("%d",&em[i].zwgz);
printf("请输入津贴:");
scanf("%d",&em[i].jt);
printf(“请输入医疗保险:");
scanf("%d",&em[i].yb);
printf("请输入公积金:“);
scanf("%d",&em[i].gjj);
em[i].total=((em[i].jbgz)+(em[i].zwgz)+(em[i].jt)-(em[i].yb)-(em[i].gjj));〃计 15、算总工资
printf("\n");〃计算总工资
}
printf("\n创建完毕!\n");
save(m);//保存职工人数m
}
voidsave(intm)/*保存文件函数*/
{
inti;
FILE*fp;〃声明fp是指针,用来指向FILE类型的对象
if((fp=fopen("clerk_list","wb"))==NULL)//打开职工列表文件为空
{
printf("打开失败\n");
exit(0);
}
for(i=0;i 16、lerk),l,fp)!=l)〃写入数据块&em[i]:是要输出数据的地址
sizeof(structclerk):获取一个单体的长度1:数据项的个数fp:目标文件指针
printf(“文件读写错误\n");
10
fclose(fp);//缓冲区内最后剩余的数据输出到磁盘文件中,并释放文件指针和有关的缓冲区
}
intload()/*导入函数int型*/
{
FILE*fp;
inti=0;
if((fp=fopen("clerk_list","rb"))==NULL)
{
printf("cannotopenfile\n");
exit(0);
}
els 17、e
{
do
{
fread(&em[i],sizeof(structclerk),1,fp);//读取i++;
}
while(feof(fp)==0);//检测流上的文件结束符
}
fclose(fp);
return(i-l);//返回人数
}
voiddisplay()/*浏览函数*/
{
inti,sum=0;
intm=load();
system("cls");
总工资
%-8d
printf(“职工号姓名基本工资职务工资津贴医疗保险公积金
\n");
for(i=0;i 18、%-6d%-6s%-8d%-8d%-8d%-8d%-8d
",em[i].num,em[i].name,em[i].jbgz,em[i].zwgz,em[i].jt,em[i].yb,em[i].gjj,em[i].total);
sum+=em[i].total;〃计算员工总工资之和
}
printf("\n\n职工平均工资为:%d\n",sum/m);
}
voiddel()/*删除函数*/
{
intm=load();
inti,j,n,t,button;charname[20];
printf("\n原来的职工信息:\n");display();//显示删除前的员工 19、信息printf("\n");
printf(“按姓名删除:\n");
scanf("%s",name);
for(button=l,i=0;button&&ivm;i++)〃主函数中确定button=l时各函数才可以被调用
{
if(strcmp(em[i].name,name)==O)〃按员工姓名查找到某员工并调出其资料
{
printf("\n此人原始记录为:\n");〃显示选定员工的信息
printf("职工号姓名基本工资职务工资津贴医疗保险公积金
总工资\n");
printf("\n%-6d%-6s%-8d%-8d%-8d%-8d%-8d%-8d
",em[i 20、].num,em[i].name,em[i].jbgz,em[i].zwgz,em[i].jt,em[i].yb,em[i].gjj,em[i].total);
printf("\n确定删除请按1,不删除请按0\n");
scanf("%d",&n);
if(n==1)
{
for(j=i;jvm-1;j++)〃从第i项开始将后一项的各成员的值赋给前一项各对
应的成员完成对第i项的删除
{
strcpy(em[j].name,em[j+1].name);
em[j].num=em[j+1].num;
em[j].jbgz=em[j+1].jbgz;
em[j].zwgz= 21、em[j+1].zwgz;
em[j].jt=em[j+1].jt;
em[j].yb=em[j+1].yb;
em[j].gjj=em[j+1].gjj;
em[j].total=em[j+1].total;
}
.button=0;
}
}
if(!button)//button==0表明删除已完成
m=m-1;//总员工数减少一人
else
printf("\n查无此人!\n");
printf("\n删除后的所有职工信息:\n");
save(m);//调用保存函数
display();//调用浏览函数
printf("\n继续删除请按1,不再删除请按0 22、\n");scanf("%d",&t);
switch(t)
{
case1:del();break;
case0:break;default:break;
}
}
voidadd()/*添加函数*/
{
FILE*fp;
intn;
intcount=0;
inti;
intm=load();
printf("\n原来的职工信息:\n");
display();
printf("\n");
fp=fopen("emploee_list","a");
printf("请输入想增加的职工数:\n");〃确定要加入的职工数nscanf("%d",&n);
fo 23、r(i=m;iv(m+n);i++)〃添加n名员工的信息
{
printf("\n请输入新增加职工的信息:\n");
printf("请输入职工号:");
scanf("%d",&em[i].num);
printf("\n");
printf("请输入姓名:");
scanf("%s",em[i].name);
getchar();
printf("请输入基本工资:");
scanf("\t%d",&em[i].jbgz);
printf("请输入职务工资:");
scanf("%d",&em[i].zwgz);
printf("请输入津贴:");
scanf(" 24、%d",&em[i].jt);
printf("请输入医疗保险:");
scanf("\t%d",&em[i].yb);
printf("请输入公积金:“);
scanf("%d",&em[i].gjj);
em[i].total=(em[i].jbgz+em[i].zwgz+em[i].jt-em[i].yb-em[i].gjj);//计算该员工总工资
printf("\n");
count=count+1;
printf("已增加的人数:\n");
printf("%d\n",count);
}
printf("\n添加成功\n");
m=m+count;〃将新添加 25、员工的人数加到总员工人数中
printf("\n增加后的所有职工信息:\n");
printf("\n");
save(m);
display。;//显示添加后的信息
fclose(fp);
}
voidsearch。/*查询函数*/
{
intt,button;
system("cls");〃清屏
do
{
printf("\n按1按工号查询\n按2按姓名查询\n按3回主菜单\n");
scanf("%d",&t);
if(t>=1&&t<=3)
{
button=1;
break;
}
else
16
{
button=0;
printf 26、("输入错误");
}
}
while(button==0);〃回到查询选择项
while(button==1)
{
switch(t)//选择查询方式
{
casel:printf("按工号查询\n");search_num();break;case2:printf("按姓名查询\n");search_name();break;case3:main();break;
default:break;
}
}
}
voidsearch_num()//按职工号查询
{
inta;
inti,t;
intm=load();
printf("请输入要查找的职工号:\n 27、");
scanf("%d",&a);
for(i=0;i 28、tf("返回查询函数请按1,继续查询职工号请按2\n");scanf("%d",&t);
switch(t)
{
case1:search();break;
case2:break;default:break;
}
}
voidsearch_name()
{
charname[30];
inti,t;
intm=load();
printf("请输入姓名:\n");
scanf("%s",name);
for(i=0;i 29、tf("职工号姓名基本工资职务工资津贴医疗保险公积金总工
资\n");
printf("\n%-6d%-6s%-8d%-8d%-8d%-8d%-8d%-8d
",em[i].num,em[i].name,em[i].jbgz,em[i].zwgz,em[i].jt,em[i].yb,em[i].gjj,em[i].total);
}
if(i==m)
printf("\n\n");
printf("\n");
printf("返回查询菜单请按1,继续查询姓名请按2\n");
scanf("%d",&t);
switch(t)
{
case1:search();break 30、;
case2:break;
default:break;
}
}
voidmodify()/*修改函数*/
{
intnum;
charname[20];
intjbgz;
intzwgz;
intjt;
intyb;
intgjj;
intb,c,i,n,t,button;
intm=load();
system("cls");
printf("\n原来的职工信息:\n");
display();
printf("\n");
printf("请输入要修改的职工的姓名:\n");
scanf("%s",name);
for(button=1,i=0 31、;button&&i 32、
if(n==1)
{
printf("\n需要进行修改的选项\n1.职工号2.姓名3.基本工资4.
职务工资5•津贴6•医疗保险7•公积金8•返回上层\n");
printf("请选择序号l-8:\n");
scanf("%d",&c);
if(c>8||c 33、1:printf("职工号改为:");
scanf("%d",&num);
em[i-1].num=num;
break;
case2:printf("姓名改为:");
scanf("%s",name);
strcpy(em[i-1].name,name);break;
case3:printf("基本工资改为:");
getchar();scanf("%d",&jbgz);
em[i-1].jbgz=jbgz;
em[i-1].total=(em[i-1].jbgz+em[i-1].zwgz+em[i-1].jt-em[i-1].yb-
30
em[i-1].gj 34、j);
break;
case4:printf("职务工资改为:");
scanf("%d",&zwgz);
em[i-1].zwgz=zwgz;
em[i-1].gjj);
em[i-1].gjj);
em[i-1].gjj);
em[i-1].total=(em[i-1].jbgz+
em[i-1].zwgz
+
em[i-1].jt-
break;
case5:printf("津贴改为:");scanf("%d",&jt);
em[i-1].jt=jt;
em[i-1].total=(em[i-1].jbgz+
em[i-1].zwgz
+
em[i- 35、1].jt-
break;
case6:printf("医疗保险改为:")scanf("%d",&yb);
em[i-1].yb=yb;
em[i-1].total=(em[i-1].jbgz+
em[i-1].zwgz
+
em[i-1].jt-
break;
case7:printf("公积金改为:");scanf("%d",&gjj);
em[i-1].gjj=gjj;
em[i-1].total=(em[i-1].jbgz+
em[i-1].zwgz
+
em[i-1].jt-
em[i-1].yb-
em[i-1].yb-
em[i-1].yb- 36、
em[i-1].yb-
em[i-1].gjj);
break;
case8:modify();
break;
printf("\n");
printf("\n\n确定修改请按1;重新修改请按2:\n");scanf("%d",&b);
}
while(b==2);
printf("\n修改后的所有职工信息:\n");
printf("\n");
save 37、(m);
display();
printf("\n按1继续修改,不再修改请按0\n");
scanf("%d",&t);
switch(t)
{
case1:modify();break;
case0:break;default:break;
}
}
voidsta()〃统计函数
{
inti;
intsum=0;
inta=0,b=0,c=0;
intm=load();
system("cls");〃清屏函数
for(i=0;i 38、&em[i].total>=1000)
{a++;}if(em[i].total>1500&&em[i].total<=2000)
{b++;}if(em[i].total>2000)
{c++;}
}
printf("\n\n工资总额为:%d\n",sum);
printf(“平均工资为:%d\n",sum/m);
printf("\n基本工资、职务工资、津贴之和\n");
printf("在1000-1500圆的员工占总员工的百分之%d\n",a*100/m);printf("在1500-2000圆的员工占总员工的百分之%d\n",b*100/m);printf("在200 39、0圆以上的员工占总员工的百分之%d\n",c*100/m);printf("\n\n按任意键继续");
getch();
menu();
}
voidmain()//主函数
{
intn,button;
chara;
start();
getch();
menu();
do
{
printf("功能选择(l--8):\n");
scanf("%d",&n);
if(n>=l&&n<=7)
{
button=l;
break;
}
else
{
button=0;
printf("您输入有误,请重新选择!");
}
}
while(button 40、==0);
while(button==l)
{
switch(n)
{
casel:input();break;
case2:display();break;
case3:search();break;
case4:del();break;
case5:add();break;
case6:modify();break;
case7:sta();break;
case8:exit(0);break;default:break;
}
getchar();
printf("\n");
printf(“按任意键继续\n");
getch();
system("c 41、ls");/*清屏*/menu();/*调用菜单函数*/printf("功能选择(l--8):\n");scanf("%d",&n);printf("\n");
}
}
运行结果及截图
欢迎画面
菜单
*运+柔单***
帰塗洌:豫邀溯耀逡〉沁1输典鬱浓遴渺沦魏孰沙液液》:》迸淨2.显示遽漆滲燿逾塗瘫泼》沁3.查找殘邈殘腕奚裁疥瓏愛.》蠻凶澎■抿4删除遊》邈妙淨卷》塗渺识汐Q:》址淨5添仙'瘩'塗沁鑒渝沁瞬护澤6•修改竭'逸決:耀瀝沁邈加沁7统计鼻第邈迫粹遐遽浊话遐戈》溢泮s退出说明:*如首次便用尚未输典数拐请先输瓜数据
否则使用其他功能时系统讲自动退出癖俞;\的数据将自动保存
42、
犒次选痒$俞盘劝能旳煤数据将被覆盖
功能选择(l-8'i:
输入功能
iH±A^(i-ioQk醫输知D号:1淸输认姓名:込清输人基本工资:'1200诸输典职务工'230清输人津贴:0请谕兀医疗保险:田请输廣公•积金:189
1青输茄E号:2诸输人姓容:bbb淸输入基本工资:'.■2500请输入职务工资:旳。[青输臭津贴:400请输衣医疗保险:57请输阚公积金:600-谙输XjD号:脊
显示功能
[D运
1凰;"
.宙
总丄员
1
aaa
12OQ
'250
■0
59
139
11S2
2
t.t.t.
25OQ
SOO
400-
43、
57
600
SO43
.5:
ccc
17OQ
■0
0-
C:a.
170:0
机工平均工资再:
1S75
慘任意键继续
统计功能
工资总额为:WS0.2
平対工资为:-2160
呈本工资、职务工资、津贴之印^1000-150&:[1的员工占总员工的百疔立側■■^150Q-2000圆的员工占总员工的百井之如P2000圆叹上的员工占总员工的百分之40
按任賁键继续,
删除功能
as基本工资一职芬工资se医疗保险公积金…总工资
1aaa
1200
230
2bbb
2500
S00
44、
3ccc
1700
0
识工平均工资対:
1975
安姓名删除:
jbb
比人原始记录为:
[口号姓窖
基本工资
职务工资
2bbb
2E00
800
涌定删除请按4不删除请按o
0
59
189
1182
400
57
600
3043
0
0
0
1700
津贴
医疗保险
公积金
总工资
400
57
600
3043
添加功能
修改功能
it输真婪修改的职工的姓名:
:id 45、d
比人原始记录为:
!D号姓名基本工资职务工资津贴医疗保险公■积金总工资
4ddd1400345.34565734510SS
涌罡按1;不修■改请按0
1
尊要进行修改的选项
1.1D号2■姓名3•基本工资4■职箸工资氐津贴&医疗保险人公积金盼返回上层iS选择序号1-出
2
妊名改対:遇
确定修政请按1;重新修改请按2:
心得体会
通过这两周的c语言课程设计,我加深了对c语言程序设计的理解,使自己的操作更加熟练,发现了自己的不足,为自己今后的继续学习指明了方向。在这次课程设计中,我巩固所了学过的知识,能用汇编语言熟练地运用顺序、选择、循环三大结构,进一步掌握结构体数组的使用,文件函数的使用,掌握了子程序的定义及调用。并在调试过程中不断发现与改正错误,完善算法,改进用户体验等等。调试索然繁琐而艰苦,但极大的促进了我编程能力的提高。
由于自己目前能力有限,该程序还有诸多不足,感谢指正。感谢老师的悉心教导与细致的帮助。虽然C语言的课程与课程设计都已结束,但通过这次课程设计我也发现了差距,并将在未来努力学习,积极实践,使自己能真正的掌握运用c语言。
参考文献
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。