职工工资信息管理系统.docx
- 文档编号:2000270
- 上传时间:2023-05-02
- 格式:DOCX
- 页数:19
- 大小:20.01KB
职工工资信息管理系统.docx
《职工工资信息管理系统.docx》由会员分享,可在线阅读,更多相关《职工工资信息管理系统.docx(19页珍藏版)》请在冰点文库上搜索。
职工工资信息管理系统
摘要
运用计算机语言设计职工工资信息管理系统的系统软件,通过设计此次大作业,加深对本课程基本知识的理解,提高综合运用知识的能力;掌握本课程的主要内容、工程设计或撰写小论文的步骤和方法;以提高学生独立分析问题、解决问题的能力,逐步增强实际工程训练。
该系统能够实现工资信息管理系统包括录入、新增、浏览、查询和排序等功能。
其中录入功能要求能够添加新的工资信息到文件;新增功能要求能够新增职工信息到文件;浏览功能要求能够按照工资卡号、姓名分类浏览;有排序功能,排序后按照工资卡号升序或实发工资降序输出;查询功能要求能够按照工资卡号、姓名查询。
关键字:
计算机语言设计,系统软件,工资信息管理,功能
职工工资管理系统
1.设计思路
(1)根据题目要求,应该把职工工资信息用结构体形式输入,在定义一个全局变量和文件指针进行整个程序的运行,然后把职工工资信息送到文件中,所以应该提供一个结构体和文件的输入输出等操作;
(2)在程序中需实现职工工资浏览、查询、统计等功能的操作,所以需要建立相应的功能模块来实现;
(3)另外还需要提供键盘式选择菜单实现功能,在运行时达到所要的目的。
2.数据结构设计
系统用将职工各项信息以结构体类型structlist来定义,它包括num,name[20],month,salary1,water,electricity,fax,salaly2等不同类型的数据项,同时定义了结构体数组,包括N个数组元素,对应N个职工,每一个元素用来存放一个职工的数据;每个职工的信息以结构体方式从内存和磁盘文件中进行存储和导出。
以结构体方式来整合职工的不同信息,将不同的数据组合成一个有机整体,非常方便程序的调用。
3.功能模块图
4.算法设计
1.主函数提供输入、处理和输出部分的函数调用,各功能模块采用菜单方式选择。
2.添加模块
3.新增模块
4.浏览模块
5.排序模块
6.查询模块
7.程序代码
(每个函数都要有功能说明)
#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()//新增模块函数 { 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+2); input(i);//调用职工信息输入函数 } fp=fopen("workers.txt","ab");//以追加形式打开文件 for(i=n+1;i<=k;i++) fwrite(&list[i],sizeof(structlist),1,fp);//将内存中的职工信息输出到磁盘文件中 save(n);//储存输入信息 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))//以10个职工为一组输出 {printf("\n\npassanykeytocontinue..."); getch(); puts("\n\n");} printf_one(i);//输出各职工信息 printf("\n"); } printf("\tthereare%drecode.\n",n); printf("\npassanykeytoback.."); getch(); menu();//返回主菜单 } 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;i if(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);//选择1继续循环执行查询 w4=0;w3=0; if(k! =-1) { printf("successful"); printf("\n\nwhatdoyouwanttodo? \n\t1).searchanother2).back[]\b\b");//选择查找下一个数据或返回 scanf("%d",&w2); } } while(w2==1);//选择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;i if(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);//选择1继续循环执行查询 w4=0;w3=0; if(k! =-1) { printf("successful"); printf("\n\nwhatdoyouwanttodo? \n\t1).searchanother2).back[]\b\b"); scanf("%d",&w2); } } while(w2==1);//选择1循环执行查询下一个数据 menu(); } voidorder()//排序功能模块函数 {intw1,n; voidorder_1(); voidorder_2(); do { puts("\t\t\t1.orderbynum");//按工资卡号排序 puts("\t\t\t2.orderbysalary2");//按实发工资排序 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; voidbrowse(); structlists; n=load(); for(i=0;i {for(j=i+1;j {if(list[j].num s=list[j]; list[j]=list[i]; list[i]=s; } } save(n);//储存排序后的信息 browse();//显示排序后的信息 puts("\n\n"); printf_back();//执行返回函数 } voidorder_2()//按实发工资升序排序 { intload(); voidprintf_back(); voidsave(inti); inti,j,n; structlists; voidbrowse(); n=load(); for(i=0;i {for(j=i+1;j {if(list[i].salary2 s=list[j];list[j]=list[i];list[i]=s; } } save(n);//储存排序后的信息 browse();//显示排序后的信息 puts("\n\n"); printf_back();//执行返回函数 } voidsave(intn)//储存函数 { FILE*fp; inti; fp=fopen("workers.txt","wb");//以只写方式打开文件 for(i=0;i fwrite(&list[i],sizeof(structlist),1,fp);//将内存中的职工信息输出到磁盘文件中 fclose(fp);//关闭文件 } intload()//导出文件信息 { FILE*fp; inti; fp=fopen("workers.txt","rb");//以只读方式打开文件 for(i=0;! feof(fp);i++) fread(&list[i],sizeof(structlist),1,fp);//读出磁盘文件中的职工信息 fclose(fp);//关闭文件 return(i-1);//返回数值i-1 } voidinput(inti)//职工信息输入函数 { floatsalary2(inti); floatfax(inti); printf("No.: "); scanf("%d",&list[i].num); printf("name: "); scanf("%s",list[i].name); printf("month: "); scanf("%d",&list[i].month); printf("salary1: "); scanf("%d",&list[i].salary1); printf("water: "); scanf("%d",&list[i].water); printf("electricity: "); scanf("%d",&list[i].electrisity); fax(i);//计算税金 salary2(i);//计算实发工资 } floatfax(inti)//税金计算函数 { if(list[i].salary1<800)list[i].fax=0; elseif(list[i].salary1<1400) list[i].fax=(((list[i].salary1-800)*5/100)); elselist[i].fax=(((list[i].salary1-1400)/10)); returnlist[i].fax; } floatsalary2(inti)//实发工资计算函数 { list[i].salary2=(list[i].salary1-list[i].water-list[i].electrisity-list[i].fax); returnlist[i].salary2; } voidprintf_back()//返回函数 { intw; voidmenu(); voidbrowse(); printf("\n\n\tsuccessful! "); printf("whatdoyouwanttodo? \n\n\t1).browseallnow\t2).back: []\b\b");//菜单选择浏览职工信息或返回主菜单 scanf("%d",&w); if(w==1)browse();//输入1选择浏览职工信息 elsemenu();//输入2返回主菜单 } voidprintf_one(inti)//单个职工信息输出函数 { printf("%9d",list[i].num); printf("%9s",list[i].name); printf("%9d",list[i].month); printf("%9d",list[i].salary1); printf("%9d",list[i].water); printf("%9d",list[i].electrisity); printf("%9.2f",list[i].fax); printf("%9.2f",list[i].salary2); } voidprintf_face()//职工信息项目 { printf("\n\tNo.namemonthsalary1waterelectrisityfaxsalary2\n"); } 5.编程中遇到的困难及解决方法 遇到最大的问题是所有程序代码编完放在一起后,虽然能够成功运行,但使用时如果职工人数发生变化,会导致文件后部出现乱码。 若要使每次运行都正常,必须在人数改变后退出程序,修改宏定义的值。 这样很不方便,不能够连续运行。 为解决这一大问题,最后我想到了定义一个全局指针变量,用来追踪最新的人数。 特别是添加这个会导致人数变化的函数中,全局指针变量起了很大作用。 经过一边修改一边调试,最终可以成功的串联整个函数,在连续运行时,总能根据最新的人数调用各个函数。 另外在串联所有函数时,调试提示出错: 有几个函数“redefinition;differentbasictypes”解决: 在函数名前加void指明类型。 整个程序代码是分块书写的,每个函数都可以独立运行。 只有输入函数查询菜单函数写得很顺利,一次性就能够成功运行,其他函数在调试过程中或多或少都出现了问题。 比如,浏览函数display()遇到的问题虽然不大,但解决起来很麻烦。 理想的运行结果是美观整齐。 即下面的职工信息分别与第一个printf输出的中文项目提示对齐。 解决方法: 不断修改空格个数,不断运行察看效果。 又如,添加函数add()遇到的问题是用printf输入新职工信息后,保存到文件里面,发现原有的信息不见了。 解决: 文件打开方式改用"a"追加写入。 6.总结心得及良好建议 经过一学期的C语言学习,我们掌握了C语言的基础知识,能够读懂别人用c语言设计的程序。 平时的程序设计大多是以填空的形式出现,虽然有所接触,但都不完全。 而这一周的课程设计,却让我们完完全全用自己学到的知识编写一个完整的体统程序。 这是一个新的挑战,也是一种新的学习。 C语言是一个有序的学习,学了最基本的替换,然后扩展到循环、嵌套,条例很清楚,不是一个零散的知识,不过通过实践我也知道了自己的不足,存在很多的问题,比如懒惰和依赖心理。 初步接触C语言的时候,觉得甚是无聊,通过实践,摆脱了那种似懂非懂的状态! 希望以后还会有更多类似的实践课程,在有限的大学时间学到更多的实用技能,为以后的工作打下良好基础。 7.参考文献 《C程序设计》谭浩强 《C程序设计课程设计》刘振安
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 职工工资 信息 管理 系统
![提示](https://static.bingdoc.com/images/bang_tan.gif)