职工工资信息管理系统Word文件下载.docx
《职工工资信息管理系统Word文件下载.docx》由会员分享,可在线阅读,更多相关《职工工资信息管理系统Word文件下载.docx(19页珍藏版)》请在冰点文库上搜索。
#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;
//工资卡号
charname[20];
//姓名
intmonth;
//月份
intsalary1;
//应发工资
intwater;
//水费
intelectrisity;
//电费
floatfax;
//税金
floatsalary2;
//实发工资
}list[N];
//list[N]中每个数组元素对应一个职工工资信息
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].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;
\n\n\tsuccessful!
whatdoyouwanttodo?
\n\n\t1).browseallnow\t2).back:
[]\b\b"
//菜单选择浏览职工信息或返回主菜单
w);
if(w==1)browse();
//输入1选择浏览职工信息
elsemenu();
//输入2返回主菜单
voidprintf_one(inti)//单个职工信息输出函数
%9d"
list[i].num);
%9s"
list[i].month);
list[i].salary1);
list[i].water);
list[i].electrisity);
%9.2f"
list[i].fax);
list[i].salary2);
voidprintf_face()//职工信息项目
\n\tNo.namemonthsalary1waterelectrisityfaxsalary2\n"
5.编程中遇到的困难及解决方法
遇到最大的问题是所有程序代码编完放在一起后,虽然能够成功运行,但使用时如果职工人数发生变化,会导致文件后部出现乱码。
若要使每次运行都正常,必须在人数改变后退出程序,修改宏定义的值。
这样很不方便,不能够连续运行。
为解决这一大问题,最后我想到了定义一个全局指针变量,用来追踪最新的人数。
特别是添加这个会导致人数变化的函数中,全局指针变量起了很大作用。
经过一边修改一边调试,最终可以成功的串联整个函数,在连续运行时,总能根据最新的人数调用各个函数。
另外在串联所有函数时,调试提示出错:
有几个函数“redefinition;
differentbasictypes”解决:
在函数名前加void指明类型。
整个程序代码是分块书写的,每个函数都可以独立运行。
只有输入函数查询菜单函数写得很顺利,一次性就能够成功运行,其他函数在调试过程中或多或少都出现了问题。
比如,浏览函数display()遇到的问题虽然不大,但解决起来很麻烦。
理想的运行结果是美观整齐。
即下面的职工信息分别与第一个printf输出的中文项目提示对齐。
解决方法:
不断修改空格个数,不断运行察看效果。
又如,添加函数add()遇到的问题是用printf输入新职工信息后,保存到文件里面,发现原有的信息不见了。
解决:
文件打开方式改用"
a"
追加写入。
6.总结心得及良好建议
经过一学期的C语言学习,我们掌握了C语言的基础知识,能够读懂别人用c语言设计的程序。
平时的程序设计大多是以填空的形式出现,虽然有所接触,但都不完全。
而这一周的课程设计,却让我们完完全全用自己学到的知识编写一个完整的体统程序。
这是一个新的挑战,也是一种新的学习。
C语言是一个有序的学习,学了最基本的替换,然后扩展到循环、嵌套,条例很清楚,不是一个零散的知识,不过通过实践我也知道了自己的不足,存在很多的问题,比如懒惰和依赖心理。
初步接触C语言的时候,觉得甚是无聊,通过实践,摆脱了那种似懂非懂的状态!
希望以后还会有更多类似的实践课程,在有限的大学时间学到更多的实用技能,为以后的工作打下良好基础。
7.参考文献
《C程序设计》谭浩强
《C程序设计课程设计》刘振安