C语言课程设计单项链表实现工资管理系统.docx
《C语言课程设计单项链表实现工资管理系统.docx》由会员分享,可在线阅读,更多相关《C语言课程设计单项链表实现工资管理系统.docx(40页珍藏版)》请在冰豆网上搜索。
C语言课程设计单项链表实现工资管理系统
高级语言(C语言)课程设计说明书
起止日期:
2012年07月2日至2012年07月14日
题目
工资管理系统
学生姓名
班级
学号
成绩
通信与信息工程学院
一.课程设计要求
课程设计系统组成及模块功能:
工资管理程序主要完成对职工的工资信息录入,然后进行排序,统计,查询,计算税金等功能操作。
具体要求如下:
1.职工录入工资信息包括:
编号,姓名,基本工资,扣款,应发工资,税金,实发工资
2.程序主菜单如下:
"**************MENU*************",/*菜单的标题行*/
0.initlist/*初始化单链表*/
1.Enterlist/*输入数据,创建单链表*/
2.Listall/*显示所有记录*/
3.Calcthesalary/*计算实发工资*/
4.Searchrecordonname/*查找职工信息数据*/
5.Deletearecord/*删除记录*/
6.Sortonsfgz/*按实发工资升序排序*/
7.Computerticketnumber/*计算所需票面数*/
8.Totalonnumber/*分类合计*/
9.Quit/*退出*/
3.要求定义如下函数,对应菜单功能
/******函数原型*********/
voidinit();/*单链表初始化*/
voidcreate();/*创建单链表,输入数据*/
voidcalc();/*计算实发工资*/
voiddelete();/*删除*/
voidsearch();/*查找*/
voidcomputer();/*计算所需各种票面张数*/
voidsort();/*排序*/
voidlist();/*显示所有数据*/
voidprint(SALARY*p);/*输出单条记录*/
floatfax(floatx);/*计算税金*/
voidtotal();/*分类合计*/
intmenu_select();/*主菜单*/
二.程序的功能设计
此工资管理系统主要利用链表实现,由如下八个功能模块实现
1、输入模块。
主要完成输入工资信息的工作,并存入链表中。
2、输出模块。
主要完成对所有工人信息的输出。
3、修改模块。
主要完成对职工信息的修改工作。
4、插入模块。
主要完成对职工信息的插入工作。
5、查询模块。
主要完成对某个职工信息的查询工作。
6、删除模块。
主要完成对某退休或离职职工信息的删除。
7、排序模块。
主要完成对所有职工按实发工资进行的升序或降序排列。
8、保存模块。
主要完成对已经输入和修改或删除的保存文件。
9、退出。
退出系统
三.程序的数据结构
本程序运用结构体、单项链表等数据结构。
职工信息结构体如下:
structworker//定义数据结构//
{
charno[11];//编号//
charname[15];//姓名//
charxb[10];//性别//
doublejbgz;//基本工资//
doublekoukuan;//扣款//
doubleyfgz;//应发工资//
doubleshuijin;//税金//
doublesfgz;//实发工资//
charpost[10];//职位//
structworker*next;
};
typedefstructworkerSTU;//结构体类型名///
四、程序的函数设计
1.函数的功能描述
intmenu_select(void);//主菜单//
STU*append(STU*head);//添加记录//
STU*appendNode(STU*head);
voidlist(STU*head);//显示所有数据//
STU*modify(STU*head);//修改职工记录//
STU*modifyNode(STU*head);
void*search(STU*head);//查询职工信息//
void*no(STU*head);//编号查询//
void*name(STU*head);//姓名查询//
STU*dele(STU*head);//删除职工信息//
STU*deleNode(STU*head,chark[11]);
void*save(STU*head);//保存文件//
STU*insert(STU*head);//插入职工信息//
STU*tax(STU*head);//计算税金//
STU*calc(STU*head);//计算应发工资//
STU*total(STU*head);//计算实发工资//
STU*sort(STU*head);//对职工信息进行排序//
STU*insort(STU*head);//升序函数//
STU*desort(STU*head);//降序函数//
void*index(STU*head);//分类统计//
void*index1(STU*head);
void*index2(STU*head);
void*index3(STU*head);
void*index4(STU*head);
intuser_ID();//登录账户函数//
STU表示结构体类型名
Head表示链表的头结点
2.、函数的调用关系
voidmain()
{intch;
chara;
STU*head=NULL;
system("color02");//背景色/前景色的设置(0黑色、1蓝色、2绿色、3浅绿色、4红色、5紫色、6黄色、7白色、8灰色、9淡紫色、A淡绿色、B淡浅绿色、C淡红色、D淡紫色、E淡黄色、F亮白色)//
a=getchar();
while(!
a);
system("cls");
user_ID();
while
(1)
{
ch=menu_select();
switch(ch)
{
case1:
head=append(head);
break;//制作工资表//
case2:
list(head);
break;//输出所有的职工的信息//
case3:
head=modify(head);
break;//修改职工信息//
case4:
head=insert(head);
break;//插入职工信息//
case5:
search(head);
break;//查询职工信息//
case6:
head=dele(head);
break;//删除职工信息//
case7:
head=sort(head);
break;//对职工信息进行排序//
case8:
save(head);
break;//保存文件//
case9:
index(head);
break;//分类统计//
case0:
exit(0);//退出//
default:
printf("Inputerror!
\n");
break;
}
}
五、程序源代码
#include
#include
#include
#include
#include
#include
structworker//定义数据结构//
{
charno[11];//编号//
charname[15];//姓名//
charxb[10];//性别//
doublejbgz;//基本工资//
doublekoukuan;//扣款//
doubleyfgz;//应发工资//
doubleshuijin;//税金//
doublesfgz;//实发工资//
charpost[10];//职位//
structworker*next;
};
typedefstructworkerSTU;//结构体类型名//
/******函数原型*********/
intmenu_select(void);//主菜单//
STU*append(STU*head);//添加记录//
STU*appendNode(STU*head);
voidlist(STU*head);//显示所有数据//
STU*modify(STU*head);//修改职工记录//
STU*modifyNode(STU*head);
void*search(STU*head);//查询职工信息//
void*no(STU*head);//编号查询//
void*name(STU*head);//姓名查询//
STU*dele(STU*head);//删除职工信息//
STU*deleNode(STU*head,chark[11]);
STU*insert(STU*head);//插入职工信息//
STU*tax(STU*head);//计算税金//
STU*calc(STU*head);//计算应发工资//
STU*total(STU*head);//计算实发工资//
STU*sort(STU*head);//对职工信息进行排序//
STU*insort(STU*head);//升序函数//
STU*desort(STU*head);//降序函数//
voidindex(STU*head);//分类统计//
voidindex1(STU*head);
voidindex2(STU*head);
voidindex3(STU*head);
voidindex4(STU*head);
intuser_ID();//登录账户函数//
voidmain()
{intch;
chara;
STU*head=NULL;
system("color02");//背景色/前景色的设置(0黑色、1蓝色、2绿色、3浅绿色、4红色、5紫色、6黄色、7白色、8灰色、9淡紫色、A淡绿色、B淡浅绿色、C淡红色、D淡紫色、E淡黄色、F亮白色)//
printf("&****&****&****&****&****&****&****&\n");
printf("**欢迎使用工资管理系统**\n");
printf("************************************\n");
printf("**************************表头***************************\n");
printf("**********@@@实验名称:
工资管理系统**********\n");
printf("**********@@@学校:
西安科技大学**********\n");
printf("**********@@@姓名:
张帝**********\n");
printf("**********@@@学号:
1107050415**********\n");
printf("**********@@@专业:
电子信息工程**********\n");
printf("*********************************************************\n");
printf("&&&&&&&&&&&&********按任意键继续********&&&&&&&&&&&&&&&&&\n");
a=getchar();
while(!
a);
system("cls");
user_ID();
while
(1)
{
ch=menu_select();
switch(ch)
{
case1:
head=append(head);
break;//制作工资表//
case2:
list(head);
break;//输出所有的职工的信息//
case3:
head=modify(head);
break;//修改职工信息//
case4:
head=insert(head);
break;//插入职工信息//
case5:
search(head);
break;//查询职工信息//
case6:
head=dele(head);
break;//删除职工信息//
case7:
head=sort(head);
break;//对职工信息进行排序//
case8:
index(head);
break;//分类统计//
case0:
exit(0);//退出//
default:
printf("Inputerror!
\n");
break;
}
}
}
intmenu_select(void)
{intch;
printf("&*************主菜单*************************&\n");
printf("*1.制作工资表*\n");
printf("*2.输出所有的职工的信息*\n");
printf("*3.修改职工的信息*\n");
printf("*4.插入职工信息*\n");
printf("*5.查询职工的信息*\n");
printf("*6.删除职工的信息*\n");
printf("*7.对职工信息进行排序*\n");
printf("*8.分类统计*\n");
printf("*0.退出*\n");
printf("&********************************************&\n");
printf("请输入你的选择:
");
scanf("%d",&ch);
returnch;
}
STU*append(STU*head)
{charc;
system("cls");
do{head=appendNode(head);//向链表末尾添加一个节点//
printf("确认添加新纪录请按Y/y!
");
printf("其他键视为不添加!
\n");
printf("你想添加一个新的记录吗(Y/N)?
");
scanf("%c",&c);
}while(c=='Y'||c=='y');
system("cls");
returnhead;
}
STU*appendNode(STU*head)
{
STU*p=NULL;
STU*pr=head;
p=(STU*)malloc(sizeof(STU));//为新添加的节点申请内存//
if(p==NULL)//若申请内存失败,则输出错误信息,退出程序//
{
printf("Noenoughmemorytoalloc");
exit(0);
}
if(head==NULL)//若原链表为空,则将新建节点置为首节点//
{
head=p;
}
else
{
while(pr->next!
=NULL)//若未到表尾,则继续移动指针pr,直到pr指向表尾//
{
pr=pr->next;
}
pr->next=p;//将新建节点添加到链表的末尾//
}
pr=p;//让pr指向新建节点//
printf("输入职工的编号:
");
scanf("%s",p->no);
printf("输入职工的姓名:
");
scanf("%s",p->name);
printf("输入职工的性别:
");
scanf("%s",p->xb);
printf("输入职工的职位:
");
scanf("%s",p->post);
printf("输入职工的月基本工资:
");
scanf("%lf",&p->jbgz);
printf("输入职工的月扣款数:
");
scanf("%lf",&p->koukuan);
p->sfgz=0;//初始实发工资为0//
p->shuijin=0;//初始税金为0//
p->yfgz=0;//初始应发工资为0//
pr->next=NULL;//将新建节点置为表尾//
returnhead;
}
voidlist(STU*head)
{
STU*p=head;
system("cls");
if(p==NULL)
printf("工资表为空请重新输入!
!
\n");
else
{head=calc(head);
head=tax(head);
head=total(head);
printf("*************************************工资表*******************\n");
printf("编号\t姓名\t性别\t职位\t基本工资\t扣款\t应发工资\t实发工资");
while(p!
=NULL)
{printf("%s\t%s\t%s\t%s\t%.2lf\t%.2lf\t%.2lf\t%.2lf\n",p->no,p->name,p->xb,p->post,p->jbgz,p->koukuan,p->yfgz,p->sfgz);
p=p->next;}
}
}
STU*modify(STU*head)
{
charc;
STU*p=NULL;
STU*q=head;
system("cls");
do{p=modifyNode(head);
printf("继续修改请按Y/y!
");
printf("其他键视为不修改!
\n");
printf("你想继续修改记录吗(Y/N)?
");
scanf("%c",&c);
}while(c=='Y'||c=='y');
returnhead;
}
STU*modifyNode(STU*head)
{inti,j;
chark[11];
STU*p=NULL;
STU*q=head;
system("cls");
if(q==NULL)
{printf("工资表为空请重新输入!
!
\n");
returnhead;}
printf("请输入你想修改的职工的编号:
");
scanf("%s",k);
while(q&&strcmp(q->no,k)!
=0)//做比较判断//
q=q->next;//没找到,指针后移继续查找//
if(q==NULL)//指针为空,说明没有找到//
{printf("Notfound!
\n");
returnhead;
}
else
{printf("编号\t姓名\t性别\t职位\t基本工资\t扣款\t应发工资\t实发工资");
printf("%s\t%s\t%s\t%s\t%.2lf\t%.2lf\t%.2lf\t%.2lf\n",q->no,q->name,q->xb,q->post,q->jbgz,q->koukuan,q->yfgz,q->sfgz);
printf("按1修改职工编号\n");
printf("按2修改职工姓名\n");
printf("按3修改职工性别\n");
printf("按4修改职工职位\n");
printf("按5修改职工基本工资\n");
printf("按6修改职工扣款数\n");
printf("请输入要修改的列名:
");
scanf("%d",&i);
switch(i)
{case1:
system("cls");
printf("请输入修改后的职工编号:
");
scanf("%s",q->no);
system("cls");
printf("\n\n是否继续修改?
\n");
printf("是请输入1\n");
printf("否请输入2\n");
printf("你的选择:
");
scanf("%d",&j);
switch(j)
{
case1:
p=modifyNode(head);break;
case2:
system("cls");break;
default:
printf("Inputerror!
\n");
break;
}
break;
case2:
system("cls");
printf("请输入修改后的职工姓名:
");
scanf("%s",q->name);
system("cls");
printf("\n\n是否继续修改?
\n");
printf("是请输入1\n");
printf("否请输入2\n");
printf("你的选择:
");
scanf("%d",&j);
switch(j)
{
case1:
modifyNode(head);break;
case2:
system("cls");break;
default:
printf("Inputerror!
\n");
break;
}
break;
case3:
system("cls");
printf("请输入修改后的职工性别:
");
scanf("%s",q->xb);
system("cls");
printf("\n\n是否继续修改?
\n");
printf("是请输入1\n");
printf("否请输入2\n");
printf("你的选择:
");
scanf("%d",&j);
switch(j)
{
case1:
modifyNode(head);break;
case2:
system("cls");break;
default:
printf("Inputerror!
\n");
break;
}
break;
case4:
system("cls");
printf("请输入修改后的职工职位:
");
sc