C语言课程设计单项链表实现工资管理系统.doc
高级语言(C语言)课程设计说明书起止日期: 2012 年 07 月 2 日 至 2012 年 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 no11; /编号/ char name15; /姓名/ char xb10; /性别/ double jbgz; /基本工资/ double koukuan; /扣款/ double yfgz; /应发工资/ double shuijin; /税金/ double sfgz; /实发工资/ char post10; /职位/ 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 k11);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 no11; /编号/ char name15; /姓名/ char xb10; /性别/ double jbgz; /基本工资/ double koukuan; /扣款/ double yfgz; /应发工资/ double shuijin; /税金/ double sfgz; /实发工资/ char post10; /职位/ struct worker *next; typedef struct 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 k11);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"); dohead=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("%st%st%st%st%.2lf t%.2lft%.2lf t%.2lfn",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"); dop=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 k11; 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("%st%st%st%st%.2lf t%.2lft%.2lft%.2lfn",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("nn是否继续修改?n"); printf("是请输入1n"); printf("否请输入2n"); 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("nn是否继续修改?n"); printf("是请输入1n"); printf("否请输入2n"); 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("nn是否继续修改?n"); printf("是请输入1n"); printf("否请输入2n"); 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("nn是否继续修改?n"); printf("是请输入1n"); printf("否请输入2n"); 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("nn是否继续修改?n"); printf("是请输入1n"); printf("否请输入2n"); 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("nn是否继续修改?n"); printf("是请输入1n"); printf("否请输入2n"); 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("nnnnnn"); 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 k11; 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("%st%st%st%st%.2lf t%.2lft%.2lft%.2lfn",q->no,q->name,q->xb,q->post,q->jbgz,q->koukuan,q->yfgz,q->sfgz); return NULL;void *name(STU *head)char k15; 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("%st%st%st%st%.2lf t%.2lft%.2lft%.2lfn",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 k11; 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)?"); s