资源描述
C语言课程设计单项链表实现工资管理系统优质资料
(可以直接使用,可编辑 优质资料,欢迎下载)
高级语言(C语言)课程设计说明书
起止日期: 2021年07月2日 至 2021年07月14日
题目
工资管理系统
学生姓名
班级
学号
成绩
通信与信息工程学院
一. 课程设计要求
课程设计系统组成及模块功能:工资管理程序主要完成对职工的工资信息录入,然后进行排序,统计,查询,计算税金等功能操作。
具体要求如下:
1. 职工录入工资信息包括:编号,姓名,基本工资,扣款,应发工资,税金,实发工资
2.程序主菜单如下:
"**************MENU*************", /*菜单的标题行*/
0. init list /*初始化单链表*/
1. Enter list /*输入数据,创建单链表*/
2. List all /*显示所有记录*/
3. Calc the salary /*计算实发工资*/
4. Search record on name /*查找职工信息数据*/
5. Delete a record /*删除记录*/
6. Sort on sfgz /*按实发工资升序排序*/
7. Computer ticket number /*计算所需票面数*/
8. Total on number /*分类合计*/
9. Quit /*退出*/
3. 要求定义如下函数,对应菜单功能
/******函数原型*********/
void init(); /*单链表初始化*/
void create(); /*创建单链表,输入数据*/
void calc(); /*计算实发工资*/
void delete(); /*删除*/
void search(); /*查找*/
void computer(); /*计算所需各种票面张数*/
void sort(); /*排序*/
void list(); /*显示所有数据*/
void print(SALARY *p); /*输出单条记录*/
float fax(float x); /*计算税金*/
void total(); /*分类合计*/
int menu_select(); /*主菜单*/
二. 程序的功能设计
此工资管理系统主要利用链表实现,由如下八个功能模块实现
1、输入模块。主要完成输入工资信息的工作,并存入链表中。
2、输出模块。主要完成对所有工人信息的输出。
3、修改模块。主要完成对职工信息的修改工作。
4、插入模块。主要完成对职工信息的插入工作。
5、查询模块。主要完成对某个职工信息的查询工作。
6、删除模块。主要完成对某退休或离职职工信息的删除。
7、排序模块。主要完成对所有职工按实发工资进行的升序或降序排列。
8、保存模块。主要完成对已经输入和修改或删除的保存文件。
9、退出。 退出系统
三. 程序的数据结构
本程序运用结构体、单项链表等数据结构。
职工信息结构体如下:
struct worker //定义数据结构//
{
char no[11]; //编号//
char name[15]; //姓名//
char xb[10]; //性别//
double jbgz; //基本工资//
double koukuan; //扣款//
double yfgz; //应发工资//
double shuijin; //税金//
double sfgz; //实发工资//
char post[10]; //职位//
struct worker *next;
};
typedef struct worker STU;//结构体类型名///
四、程序的函数设计
1. 函数的功能描述
int menu_select(void); //主菜单//
STU *append(STU *head); //添加记录//
STU *appendNode(STU *head);
void list(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, char k[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);
int user_ID(); //登录账户函数//
STU 表示结构体类型名
Head 表示链表的头结点
2. 、函数的调用关系
void main()
{ int ch;
char a;
STU *head = NULL;
system("color 02");//背景色/前景色的设置(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)
{
case 1:
head=append(head);
break; //制作工资表//
case 2:
list(head);
break; //输出所有的职工的信息 //
case 3:
head=modify(head);
break; //修改职工信息//
case 4:
head=insert(head);
break; //插入职工信息//
case 5:
search(head);
break; //查询职工信息//
case 6:
head=dele(head);
break;//删除职工信息//
case 7:
head=sort(head);
break; //对职工信息进行排序//
case 8:
save(head);
break; //保存文件//
case 9:
index(head);
break; //分类统计//
case 0:
exit(0); //退出//
default:printf("Input error!\n");
break;
}
}
五、程序源代码
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#include<memory.h>
#include<windows.h>
struct worker //定义数据结构//
{
char no[11]; //编号//
char name[15]; //姓名//
char xb[10]; //性别//
double jbgz; //基本工资//
double koukuan; //扣款//
double yfgz; //应发工资//
double shuijin; //税金//
double sfgz; //实发工资//
char post[10];//职位//
struct worker *next;
};
typedefstruct worker STU;//结构体类型名//
/******函数原型*********/
int menu_select(void); //主菜单//
STU *append(STU *head); //添加记录//
STU *appendNode(STU *head);
void list(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, char k[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); //降序函数//
void index(STU *head); //分类统计//
void index1(STU *head);
void index2(STU *head);
void index3(STU *head);
void index4(STU *head);
int user_ID(); //登录账户函数//
void main()
{int ch;
char a;
STU *head = NULL;
system("color 02");//背景色/前景色的设置(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)
{
case 1:
head=append(head);
break; //制作工资表//
case 2:
list(head);
break; //输出所有的职工的信息 //
case 3:
head=modify(head);
break; //修改职工信息//
case 4:
head=insert(head);
break; //插入职工信息//
case 5:
search(head);
break; //查询职工信息//
case 6:
head=dele(head);
break;//删除职工信息//
case 7:
head=sort(head);
break; //对职工信息进行排序//
case 8:
index(head);
break; //分类统计//
case 0:
exit(0); //退出//
default:printf("Input error!\n");
break;
}
}
}
int menu_select(void)
{int ch;
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);
return ch;
}
STU *append(STU *head)
{char c;
system("cls");
do{head=appendNode(head); //向链表末尾添加一个节点//
printf("确认添加新纪录请按Y/y! ");
printf("其他键视为不添加!\n");
printf("你想添加一个新的记录吗(Y/N)?");
scanf(" %c",&c);
}while (c=='Y'|| c=='y');
system("cls");
return head;
}
STU *appendNode(STU *head)
{
STU *p = NULL;
STU *pr = head;
p=(STU *)malloc(sizeof(STU)); //为新添加的节点申请内存//
if (p == NULL) //若申请内存失败,则输出错误信息,退出程序//
{
printf("No enough memory to alloc");
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; //将新建节点置为表尾//
return head;
}
void list(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)
{
char c;
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');
return head;
}
STU *modifyNode(STU *head)
{int i,j;
char k[11];
STU *p=NULL;
STU *q=head;
system("cls");
if(q==NULL)
{printf("工资表为空请重新输入!!\n");
return head;}
printf("请输入你想修改的职工的编号:");
scanf("%s",k);
while(q&&strcmp(q->no,k)!=0) //做比较判断//
q=q->next; //没找到,指针后移继续查找//
if(q==NULL) //指针为空,说明没有找到//
{printf("Not found!\n");
return head;
}
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)
{case 1: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)
{
case 1:p=modifyNode(head);break;
case 2:system("cls");break;
default:printf("Input error!\n");
break;
}
break;
case 2: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)
{
case 1:modifyNode(head);break;
case 2:system("cls");break;
default:printf("Input error!\n");
break;
}
break;
case 3: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)
{
case 1:modifyNode(head);break;
case 2:system("cls");break;
default:printf("Input error!\n");
break;
}
break;
case 4:system("cls");
printf("请输入修改后的职工职位:");
scanf("%s",q->post);
system("cls");
printf("\n\n是否继续修改?\n");
printf("是请输入1\n");
printf("否请输入2\n");
printf("你的选择:");
scanf("%d",&j);
switch(j)
{
case 1:modifyNode(head);break;
case 2:system("cls");break;
default:printf("Input error!\n");
break;
}
break;
case 5:system("cls");
printf("请输入修改后的职工基本工资:");
scanf("%lf", &q->jbgz);
system("cls");
printf("\n\n是否继续修改?\n");
printf("是请输入1\n");
printf("否请输入2\n");
printf("你的选择:");
scanf("%d",&j);
switch(j)
{
case 1:modifyNode(head);break;
case 2:system("cls");break;
default:printf("Input error!\n");
break;
}
break;
case 6:system("cls");
printf("请输入修改后的扣款数:");
scanf("%lf",&q->koukuan);
system("cls");
printf("\n\n是否继续修改?\n");
printf("是请输入1\n");
printf("否请输入2\n");
printf("你的选择:");
scanf("%d",&j);
switch(j)
{
case 1:modifyNode(head);break;
case 2:system("cls");break;
default:printf("Input error!\n");
break;
}
default:printf("Input error!\n");
break;
}
}
return p;
}
void*search(STU *head)
{int a;
system("cls");
printf("\n\n\n\n\n\n");
printf("*********查询菜单*************\n");
printf("* 1按职工的编号查询 *\n");
printf("* 2按职工的姓名查询 *\n");
printf("******************************\n");
printf("请按数字键选择:");
scanf("%d",&a);
switch(a)
{
case 1:no(head); break;
case 2:name(head);break;
default:printf("Input error!\n");
break;
}
return NULL;
}
void*no(STU *head)
{char k[11];
STU *q=head;
system("cls");
if(q==NULL)
{printf("工资表为空请重新输入!!\n");
return head;}
printf("请输入你想查找的职工的编号:");
scanf("%s",k);
while(q&&strcmp(q->no,k)!=0) //做比较判断//
q=q->next; //没找到,指针后移继续查找//
if(q==NULL) //指针为空,说明没有找到//
{printf("Not found!\n");
return NULL;
}
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);
}
return NULL;
}
void*name(STU *head)
{char k[15];
STU *q=head;
system("cls");
if(q==NULL)
{printf("工资表为空请重新输入!!\n");
return head;}
printf("请输入你想查找的职工的姓名:");
scanf("%s",k);
while(q&&strcmp(q->name,k)!=0) //做比较判断//
q=q->next; //没找到,指针后移继续查找//
if(q==NULL) //指针为空,说明没有找到//
{printf("Not found!\n");
return NULL;}
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);
}
return NULL;
}
STU *dele(STU *head)
{
int i = 0;
char k[11];
char c;
system("cls");
do{
printf("请输入你想删除的记录编号:");
scanf("%s",k);
head=deleNode(head,k); //删除编号为k的工人信息//
list(head); //显示当前链表中的各节点信息//
printf("删除请按Y/y!!\n");
printf("按其它键视为不删除!!\n");
printf("确认继续删除职工信息(Y/N)?");
scanf(" %c",&c); /*%c前面有一个空格*/
i++;
}while (c=='Y'|| c=='y');
return head;
}
STU *deleNode(STU *head, char k[11])
{
STU *p = head, *pr = head;
if (head == NULL) //链表为空,没有节点,无法删除节点//
{
printf("链表为空!\n");
return(head);
}
while (strcmp(p->no,k)&&p->next!= NULL)//若没找到节点且未到表尾,则继续找//
{
pr = p;
p = p->next;
}
if (strcmp(p->no,k)==0) //若找到节点,则删除该节点//
{
if (p == head) //若待删节点为首节点,则让head指向第2个节点//
{
head = p->next;
}
else//若待删节点非首节点,则将前一节点指针指向当前节点的下一节点//
{
pr->next = p->next;
}
free(p); /*释放为已删除节点分配的内存*/
}
else/*没有找到待删除节点*/
{
printf("该职工不存在!\n");
}
return head; /*返回删除节点后的链表的头节点指针*/
}
STU *insert(STU *head)
{char s[11];
STU *
展开阅读全文