职工工资管理系统.docx
- 文档编号:24562793
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:20
- 大小:25.74KB
职工工资管理系统.docx
《职工工资管理系统.docx》由会员分享,可在线阅读,更多相关《职工工资管理系统.docx(20页珍藏版)》请在冰豆网上搜索。
职工工资管理系统
目录
一、问题描述……………………………………………………P3
二、基本要求……………………………………………………P3
三、算法说明……………………………………………………P3
四、模块划分……………………………………………………P4
五、各函数模块功能……………………………………………P4
六、体会与建议…………………………………………………P5
七、参考文献……………………………………………………P5
八、流程图…………………………………………………………P6
九、源代码…………………………………………………………P6
一、【问题描述】职工工资管理程序设计
二、【基本要求】
1.设计简单的菜单,能够进行系统功能选择。
2.实现信息的录入功能。
3.在已有信息的基础上添加新的记录。
4.删除指定编号的记录。
5.修改指定编号的记录
6.实现信息的浏览功能
7.按编号查询功能
8.按工资总额排序功能
三、【算法说明】
*delete()删除结点――设计了两个函数:
一个是查找函数,实现按职工编号查询地功能:
一个是删除查找到的记录。
Step1:
首先输入要删除记录的编号,输入后调用查找函数,根据编号顺序查找结点,利用字符串比较函数strcmp(no,p->no)进行比较:
1)若两字符串相等,函数返回值为0非运算为真,说明找到返回指向该结点的指针
2)若两字符串不相等,函数返回值为1或-1非运算为假,继续后移指针查找
3)若找遍所有结点也没有找到结点,则输出没有找到信息,返回空指针
Step2:
双链表只需要一个临时指针指向要删除的结点,指针的修改分两种情况:
1)被删除结点是头结点,则修改头指针First=p->next。
若头指针不为空,将头结点的前趋设为空,First->prior=NULL若头指针为空,说明是链表中唯一的结点,则删除后链表为空,修改尾指针Last=NULL
2)被删除结点不是头结点,将该记录的前趋指针的后继指向被删除结点的后继
*save()保存记录到文件
Step1:
定义一个指向文件的指针输入要保存的磁盘文件名:
1)若输入的是绝对路径,则文件保存到指定位置
2)若只给文件名,则文件保存在TurboC默认的路径下
Step2:
确定文件的打开方式fopen(outfile,”wb”),为输出打开一个二进制文件,若没有此文件则建立:
若文件打不开,则退出程序
Step3:
否则选择一种写文件方式fwrite(p,sizeof(SALARY),1,fp),写入一个结构体数据块,即一条记录,对整条记录进行处理
四、【模块划分】
本程序划分为11个函数,分别为:
1:
main()2:
menu_select()3:
init()4:
list()
5:
delete()6:
search()7:
insert()8:
save()
9.load()10:
welcome()11:
inputs()
五、.各函数模块功能
<1>main()主函数――主函数是程序的入口,采用模块化设计。
首先声明必要的变量,然后作一无限循环程序,循环体为一个开关语句,该语句的条件值是通过调用主菜单函数得到的返回值,根据该值调用相应的各函数功能,同时设置一个出口,即当返回值为一定条件时运行exit(0)函数结束程序,以免造成死循环。
<2>menu_select()主菜单显示――制作一个单边框的窗口,光标默认定位在第一项菜单上,用光标的上下移动即可选中所需选项,利用函数bioskey()识别按了什么键,根据光标停留在窗口的函数换算成对应的菜单项,作为菜单函数的返回值。
根据个人喜好设置文本颜色背景颜色以及选中菜单项的背景颜色。
程序最后恢复原窗口,以保证其他函数在原窗口输出的正常显示,返回主函数。
<3>welcome()欢迎界面――屏幕显示输出“WELCOMETODATA!
!
!
”
<4>load()从文件中读取记录――按照文件读写要求,先定义一个指向文件的指针,输入要读入数据的磁盘文件名,然后确定文件的打开方式。
如果打不开,则退出程序;否则,选择读文件方式fopen(infile,”rb”),打开一个二进制文件,为读方式,从文件头开始,当文件没有结束时,用feof(fp)判断,将记录按照fread(p,sizeof(SALARY),1,fp)方式读入内存,直到文件尾。
<5>list()显示双链表――对双链表的访问采取顺序访问的方法,定义指向SALARY结构体的临时变量p,初值为双链表的头指针First,输出一条记录后,指针后移p=p->next,直到p指针值为空,则所有记录输出完毕。
若从尾指针开始,则将p的初值设为尾指针Last,输出记录数据后,将指针前移一个记录p=p->prior即可。
<6>insert()插入结点――插入结点需要输入插入位置和表结点信息。
插入位置的确定通过输入结点的编号进行定位,新结点的信息通过申请空间存放,指针info所指,先将新结点的后继指针和前趋指针位都赋为空,将新结点插在指定结点之前。
从头指针h开始,循环移动指针p先查找指定结点。
<7>delete()删除结点――首先输入要删除记录的编号,输入后调用查找函数,根据编号顺序查找结点,利用字符串比较函数strcmp(no,p->no)进行比较;删除函数在得到查找函数返回的指针后,判断如果该指针不为空,则删除该结点,再跟情况进行相应的指针修改,最后释放该结点所占用的空间。
<8>search()查找结点――从头指针开始顺序查找,成功则将结点的指针作参数调用输出函数,显示该指针所指记录的信息:
失败,显示没有找到。
<9>save()保存记录到文件――从链表的头指针开始,顺序将记录写入文件,直到所有记录写完,标志就是移动指针为空。
如果想倒排保存文件,则从尾指针开始,逐个向前移动指针。
<10>inputs()输入――输入编号、姓名、基本工资,控制字符串长度,并调用复制函数。
_六、【体会与建议】
通过此次课程设计,我知道了自己许多的不足,了解了C语言方面许多知识,知道了一些自定义函数,了解了C语言一些循环结构和算法。
虽然课程设计非常复杂,但确实学到了一些C语言方面的知识。
。
七、【参考文献(资料)】
1.苏小红等.C语言大学实用教程.电子工业出版社.2004
2.谭浩强.C语言程序设计教程.高等教育出版社.1998
3.崔武子.C程序设计辅导与实训.清华大学出版社.2004
八、流程图
九、源代码
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
/****变量定义****/
typedefstructz1/*定义数据结构*/
{
charno[11];/*编号*/
charname[15];/*姓名*/
floatjbgz;/*基本工资*/
structz1*prior;/*前趋指针*/
structz1*next;/*后继指针*/
}SALARY;/*结构体类型名*/
structz1*First;/*双链表头指针*/
structz1*Last;/*双链表尾指针*/
/*****函数原型*****/
voidlist();/*显示所有数据*/
voiddelete();/*删除*/
voidsearch();/*查找*/
voidsave();/*保存文件*/
voidload();/*读取文件*/
voidinsert();/*插入*/
voidprint(SALARY*p);/*输出单条记录*/
voidwelcome(void);
floatfax(floatx);/*计算税金*/
intmenu_select();/*主菜单*/
/*****主函数开始******/
main()
{
inti;
intgd=VGA,gm=VGAHI;
initgraph(&gd,&gm,"");
welcome();
for(;;)
{
switch(menu_select())/*调用菜单函数返回一个整数值*/
{
case0:
load();break;/*读取文件*/
case1:
list();break;/*显示所有数据*/
case2:
insert();break;/*插入记录*/
case3:
delete();break;/*删除记录*/
case4:
search();break;/*查找职工信息数据*/
case5:
save();break;/*保存文件*/
case6:
exit(0);/*退出*/
}
}
}
/*菜单函数,函数返回值为整型,代表所选的菜单项*/
menu_select()
{
char*f[]={/*定义菜单字符串数组*/
"**************MENU**************",/*菜单的标题行*/
"0.Loaddatafromthefile",/*读取文件*/
"1.List",/*显示所有数据*/
"2.Insertrecordtolist",/*插入记录*/
"3.Deletearecordtolist",/*删除记录*/
"4.Searchrecordonname",/*查找记录*/
"5.Savedatatothefile",/*保存文件*/
"6.Quit"};/*退出*/
chars[80];
inti;
intkey=0;/*记录所按键值*/
intc=0;
gotoxy(1,25);/*移动光标*/
printf("Pressanykeyentermenu......\n");/*按任意键进入主菜单*/
getch();
clrscr();/*清屏*/
textcolor(GREEN);/*设置文本颜色为蓝色*/
gotoxy(10,2);
putch(0xda);/*输出左上角边框┏*/
for(i=1;i<44;i++)
putch(0xc4);/*输出上边框水平线*/
putch(0xbf);/*输出右上角边框┓*/
for(i=3;i<22;i++)/*输出左右两边在垂直线*/
{
gotoxy(10,i);putch(0xb3);
gotoxy(54,i);putch(0xb3);
}
gotoxy(10,22);putch(0xc0);/*输出左下角边框┗*/
for(i=1;i<44;i++)
putch(0xc4);/*输出下边框水平线*/
putch(0xd9);/*输出右下角边框┛*/
window(11,3,53,21);/*制作显示菜单的窗口,大小根据极单条数设计*/
clrscr();/*清屏*/
for(i=0;i<8;i++)
{
gotoxy(10,i+1);
cprintf("%s",f[i]);/*输出菜单项数组*/
}
i=1;
gotoxy(10,2);/*设置默认选项在第一项*/
textbackground(BLUE);/*设置背景颜色为浅绿*/
cprintf("%s",f[i]);/*输出菜单项,表示选中*/
gotoxy(10,2);/*移动光标到菜单的第一项*/
while(key!
=13)/*所按键不是回键时*/
{
while(bioskey
(1)==0);/*查询是否按下了一个键*/
key=bioskey(0);/*返回下一个在键盘按下的键*/
key=key&0xff?
key&0xff:
key>>8;/*对所按的键进行判断*/
gotoxy(10,i+1);
textbackground(RED);/*设置背景颜色为蓝色*/
cprintf("%s",f[i]);/*输出菜单项*/
if(key==72)i=i==1?
7:
i-1;/*如果按向上光标键,则i减1;如果已到第一行再上移,则到最后一行*/
if(key==80)i=i==7?
1:
i+1;/*如果按向下光标键,则i加1,如果已到最后一行再下移,则到第一行*/
gotoxy(10,i+1);/*光标移动i的下一项*/
textbackground(YELLOW);/*将背景颜色设为黄色*/
cprintf("%s",f[i]);/*输出菜单项*/
c=i-1;/*给代表菜单选项的整数赋值*/
}
textbackground(BLACK);/*设置背景颜色为黑色*/
window(1,1,80,25);/*恢复原窗口大小*/
returnc;
}/*返回代表菜单选项的整数值*/
voidwelcome(void)
{
chartext[30]="WelcometoData!
!
!
";
setbkcolor(BLUE);/*设置背景*/
cleardevice();
settextstyle(4,0,8);
setcolor(RED);
outtextxy(20,200,text);
getch();
closegraph();
}
/*****初始化函数*****/
voidinit()
{
First=NULL;
Last=NULL;
}
inputs(char*s,intcount)
{charp[255];
do{
scanf("%s",p);
if(strlen(p)>count)printf("\ntoolong!
\n");/*进入长度校验,超过count值重输入*/
}while(strlen(p)>count);
strcpy(s,p);/*将输入的字符串拷贝到字符串S中*/
}
SALARY*find(char*no)/****按编号查找记录******/
{SALARY*p;/*定义移动指针*/
p=First;
while(p)/*当P不为空时*/
{if(!
strcmp(no,p->no))
returnp;/*比较相等,查找成功,返回指针0*/
p=p->next;/*不相等指针后移*/
}
printf("notfound\n");
returnNULL;/*返回空指针*/
}
voidprint(SALARY*p)
{if(p)/*如果指针不为空,则显示信息*/
{clrscr();
printf("\n\n\n");
printf("****************SALARY****************\n");
printf("|no|name|jbgz|\n");
printf("|----------|---------------|---------|\n");
printf("|%-10s|%-15s|%9.2f|\n",p->no,p->name,p->jbgz);/*输出结点信息*/
printf("*****************End******************\n");
}
}
voidlist()/****显示链表****/
{
inti=0,n;/*记录输出行数*/
SALARY*p;/*定义移动指针*/
clrscr();/*清屏*/
p=First;/*从头指针开始*/
while(i%10==0&&p!
=NULL)/*外循环控制换页*/
{
i=0;/*从记录一页的输出行数*/
clrscr();
printf("\n\n\n");
printf("*****************SALARY***************\n");/*输入大标题*/
printf("|no|name|jbgz|\n");/*输入字段标题*/
printf("|----------|---------------|---------|\n");/*输出水平线*/
while(p!
=NULL)/*当p不为空时*/
{
printf("|%-10s|%-15s|%9.2f|\n",p->no,p->name,p->jbgz);
p=p->next;/*指针后移*/
i++;/*输出行数加1*/
if(i%10==0)
break;/*如果满10行,跳出内循环*/
}
printf("****************End*******************\n");
printf("Pressanykeytocontinue......\n");/*输出一页暂停一下,按任意键继续*/
getch();/*返回到外循环,准备下一页的输出*/
}
}
voiddelete()/*****删除结点*****/
{
SALARY*p;/*定义临时变量,p指向要删除结点p*/
chars[11];/*要删除结点的编号*/
clrscr();
printf("Pleasedeletedno\n");
scanf("%s",s);/*输入要删除的职工编号*/
if((p=find(s))!
=NULL)/*调用查找函数,如果找到进行下面的处理*/
{
if(First==p)
{
First=p->next;/*将头指针指向其后继结点*/
if(First)/*如果头指针不空*/
First->prior=NULL;/*将头结点的前趋没为空*/
else
Last=NULL;/*否则头尾都为空*/
}
else/*删除的不是第一个结点*/
{
p->prior->next=p->next;/*p的前趋的后继指向p原来的后继*/
if(p!
=Last)/*如果p不是最后一个结点*/
p->next->prior=p->prior;/*p后继的前趋指向p原来的前趋*/
else
Last=p->prior;
}
free(p);/*删除结点后,释放空间*/
printf("\nHavedeleted%sSALARY\n",s);
printf("Don'tforgetsave\n");
}
}
voidsearch()/****按姓名查找结点*****/
{SALARY*p;
chars[15];/*保存姓名*/
clrscr();
printf("Pleaseenternameforsearch\n");
scanf("%s",s);/*输入要查找人的姓名*/
p=First;/*移动指针从头指针开始*/
while(strcmp(p->name,s)&&p!
=NULL)/*进行比较判断*/
p=p->next;/*没找到,指针后移继续查找*/
if(p==NULL)/*指针为空,说明没有找到*/
printf("\nList%sSALARY\n",s);/*显示没有找到的信息*/
else
{printf("\n\n");
print(p);/*查找成功,调用输出函出输出指针p所指的记录*/
}
}
voidinsert()/***插入结点****/
{SALARY*p,*info;/*infor的新结点,p为新结点的后继*/
chars[11];/*保存查找的姓名*/
floattemp;/*临时变量*/
clrscr();
printf("Pleaseenterlocationbeforetheno\n");/*提示在哪个结点之前插入*/
scanf("%s",s);/*输入指定结点的编号*/
printf("\nPleasenewrecord\n");/*提示输入记录*/
clrscr();
gotoxy(1,3);/*定位光标,按表格形式输入新结点信息*/
printf("*************gongziguanli*************");
gotoxy(1,5);
printf("|------------------------------------|");
gotoxy(1,6);
printf("|no|name|jbgz|");
gotoxy(1,7);
printf("|----------|----------------|--------|");
info=(SALARY*)malloc(sizeof(SALARY));/*申请空间*/
if(!
info)
{printf("\nOutofmemory");/*如果没有得到空间,内存溢出*/
exit(0);
}
info->next=NULL;/*新结点的后继为空*/
info->prior=NULL;/*新结点的前趋为空*/
gotoxy(1,8);printf("|");
gotoxy(12,8);printf("|");
gotoxy(29,8);printf("|");
gotoxy(38,8);printf("|");
gotoxy(2,8);
inputs(info->no,10);/*输入新结点的编号,并校验*/
gotoxy(13,8);
inputs(info->name,14);/*输入新结点的姓名,并校验*/
gotoxy(30,8);
scanf("%f",&temp);
info->jbgz=temp;/*给基本工资字段赋值*/
printf("|----------|----------------|--------|");
p=First;
while(strcmp(p->no,s)&&p!
=NULL)/*查找结点确定插入位置*/
p=p->next;/*指针后移,继续查找*/
if(p==NULL)/*如果p为空*/
if(p==First)/*如果p为头指针,说明链表为空*/
{First=info;/*新结点为头指针*/
First->prior=NULL;/*头结点的前趋为空*/
Last=info;/*惟一结点,尾指针
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 职工工资 管理 系统