




已阅读5页,还剩23页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
武汉理工大学数据结构课程设计说明书题 目: 工资管理程序的设计与实现初始条件:理论:学习了数据结构课程,掌握了基本的数据结构和常用的算法;实践:计算机技术系实验室提供计算机及软件开发环境。要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1、系统应具备的功能:(1)管理员可以对员工的信息进行输入、修改和删除;(2)管理人员可以对员工的工资按各种条件进行查询、统计、排序;(3)打印职工工资单;(4)员工只能对自己的工资单进行查询。2、数据结构设计;3、主要算法设计;4、编程及上机实现;5、撰写课程设计报告,包括:(1)设计题目;(2)摘要和关键字(中文和英文);(3)正文,包括引言、需求分析、数据结构设计、算法设计、程序实现及测试、不足之处、设计体会等;(4)结束语;(5)参考文献。时间安排: 2007年7月2日7日 (第18周)7月2日 查阅资料7月3日 系统设计,数据结构设计,算法设计7月4日-5日 编程并上机调试7月6日 撰写报告7月7日 验收程序,提交设计报告书。 指导教师签名: 2007年7月2日系主任(或责任教师)签名: 2007年7月2日28工资管理程序的设计与实现摘要:该程序主要部分有:输入员工的编号,姓名,基本工资等信息;全部或单条显示员工的信息;计算实发工资;插入,删除或追加记录,并能进行保存;退出等。关键字:工资管理,双链表0.引言 随着经济的高速发展,越来越多的公司建立起来了,伴随着这一现象,工资的管理也成了企业管理者所面临的一大问题,因此,必须有一个简洁方便的系统来解决这一问题。在这次课程设计中,我设计了一个小小的工资管理系统,该系统能方便的进行输入,计算,并且能按各种方式排序,查询,必要时还可以进行插入,删除等功能。这个系统简单便捷,基本能满足工资管理的各种要求,必将会受到各大企业管理者的青睐。1需求分析该系统可以实现的功能具体如下:(1)员工信息的输入,查询;(2)插入或删除信息;(3)计算实发工资;(4)文件的保存。2数据结构设计2.1 结构体定义2.1.1员工信息节点定义typedef struct char no11; /*编号*/ char name15; /*姓名*/ float jbgz; /*基本工资*/ float koukuan; /*扣款*/ float yfgz; /*应发工资*/ float shuijin; /*税金*/ float sfgz; /*实发工资*/ elemtype;2.1.2双链表定义typedef structElemType data;Struct DulNode *prior;Struct DulNode *next;DulNode;3.算法设计3.1主函数模块Void main() 调用菜单函数返回一个整数值; 0:初始化 1:输入数据创建双链表 2:显示所有数据 3:单条显示数据 4:计算实发工资 5:查找职工数据信息 6:删除记录 7:插入记录 8:追加记录 9: 保存文件 10: 按实发工资升序排序 11: 按职工号索引 12:退出 3.2初始化函数模块Void init()双链表头指针为空;双链表尾指针为空;3.3双链表创建模块void create() if(头指针不为空) 调用初始化函数; P等于First for(;) if(flag等于1) 跳出; 清屏;确定坐档(1,3); 输出 *gongziguanli* ; 确定坐标(1,4); 输出 -Enter end- 确定坐标(1,5); 输出|-| 确定坐标(1,6); 输出| no | name | jbgz | for(;) 坐标(1,7+x); 输出|-|-|-| info=(SALARY *)malloc(sizeof(SALARY); if(没有得到空间) 输出out of memory 退出程序; 新结点的后继为空; 新结点的前驱为空; 输出数据间的分割线; 确定坐标(2,8+x) 输入编号不超过10 info-no,10; if(第一个编号为) Flag等于1; 退出程序; 确定坐标为:(13,8+x); 输入(info-name,14); 确定坐标(30,8+x); 接受输入工资变量; 初始扣款为0,待计算工资时输入; 初始实发工资为0,待计算工资时计算; 初始税金为0,待计算工资时计算; 初始应发工资为0,待计算工资时计算; if(P为空) 头指针和尾指针; 头指针的前驱是空; 尾指针的后继是空; Else 新结点的后继指向原来的头结点 新结点的前驱指向原来的头结点的前驱; 原来结点的前驱指向新结点; 新结点变为p结点,暂时的头结点; 新结点变为头结点; 确定坐标(1,8+x); if(i%9等于0) 退出; 确定坐标(1,8+x); 输出|-|-|-|3.4按编号查找记录模块Salary *find(char*no) 定义移动指针; 头指针指向p; 当p不为空时 比较相等,返回指针; 比较不相等,不相等指针后移 否则,输出没有找到; 返回空指针;3.5删除节点模块Void delete() 定义临时变量p,指向要删除的节点; 输入要删除职工的编号; 调用查找函数,如果找到; 如果是第一个节点 将头指针指向其后继节点; 如果头指针不为空 将头指针的前驱设为空; 否则头尾均为空;否则 P前驱的后继指向p原来的后继; 如果p不是最后个节点 P后继的前驱指向p原来的前驱; 否则修改指针为p的前驱;释放空间;3.6主要技术说明4.程序实现4.1所有函数void init(); /*初始化*/void create(); /*创建链表*/void calc(); /*计算应发工资*/void delete(); /*删除*/void search(); /*查找*/void save(); /*保存文件*/void insert(); /*插入*/void append(); /*追加*/void sort(); /*排序*/void index(); /*索引*/void list(); /*显示所有数据*/void print(SALARY *p); /*输出单条记录*/void display(); /*随意逐条显示*/float fax(float x); /*计算税金*/int menu_select(); /*主菜单*/4.2主要方法代码实现4.2.1主函数main() int i; clrscr(); for(;) switch(menu_select() /*调用菜单函数返回一个整数值*/ case 0:init();break; /*初始化*/ case 1:create();break; /*输入数据创建双链表*/ case 2:list();break; /*显示所有数据*/ case 3:display();break; /*单条显示*/ case 4:calc();break; /*计算实发工资*/ case 5:search();break; /*查找职工信息数据*/ case 6:delete();break; /*删除记录*/ case 7:insert();break; /*插入记录*/ case 8:append();break; /*追加记录*/ case 9:save();break; /*保存文件*/ case 10:sort();break; /*按实发工资升序排序*/ case 11:index();break; /*按职工号索引*/ case 12:exit(0); /*退出*/ 4.2.2菜单函数menu_select() char *f= /*定义菜单字符串数组*/ *MENU*, /*菜单的标题行*/ 0. init list, /*初始化双链表*/ 1. Enter list, /*输入数据,创建双链表*/ 2. List all n, /*显示所有记录*/ 3. Display record by step, /*显示单条记录*/ 4. Calc the salary, /*计算实发工资*/ 5. Search record on name, /*查找记录*/ 6. Delete a record, /*删除记录*/ 7. Insert record to list, /*插入记录*/ 8. Append record to file, /*追加记录*/ 9. Save data to the file, /*保存文件*/ 10. Sort on sfgz, /*排序*/ 11. Index on number, /*索引*/ 12. Quit ; /*退出*/ char s80; int i; int key=0; /*记录所压键值*/ int c=0; gotoxy(1,25); /*移动光标*/ printf(press any key enter menu.n);/*压任意键进入主菜单*/ getch(); clrscr(); /*清屏*/ textcolor(YELLOW); /*设置文本颜色为黄色*/ textbackground(BLUE); /*设置背景颜色为兰色*/ gotoxy(10,2); putch(0xda); /*输出左上角边框*/ for(i=1;i44;i+) putch(0xc4); /*输出上边框水平线*/ putch(0xbf); /*输出右上角边框 */ for(i=3;i22;i+)/*输出左右两边的垂直线*/ gotoxy(10,i);putch(0xb3); gotoxy(54,i);putch(0xb3); gotoxy(10,22);putch(0xc0); /*输出左上角边框*/ for(i=1;i44;i+) putch(0xc4); /*输出下边框水平线*/ putch(0xd9); /*输出右下角边框*/ window(11,3,53,21); /* 制作显示菜单的窗口,大小根据菜单条数设计*/ clrscr(); /*清屏*/ for(i=0;i8; /*对所压的键进行判断*/ gotoxy(10,i+1); textbackground(BLUE);/*设置背景颜色为蓝色*/ cprintf(%s,fi); /*输出菜单项*/ if(key=72) i=i=1?17:i-1; /*如压向上光标键,i减1,如已到第一行再上移,则到最后一行*/ if(key=80)i=i=17?1:i+1; /*如压向下光标键,i加1,如已到最后一行再下移,则到第一行*/ gotoxy(10,i+1); /*光标移动i的下一项*/ textbackground(LIGHTGREEN); /*将背景颜色设为浅绿*/ cprintf(%s,fi); /*输出菜单项*/ c=i-1; /*给代表菜单选项的整数赋值*/ textbackground(BLACK); /*设置背景颜色为黑色*/ window(1,1,80,25); /*恢复原窗口大小*/ return c; /*返回代表菜单选项的整数值*/4.2.3初始化函数void init() First=NULL; Last=NULL;4.2.4输入数据,创建双链表void create() int x; /*记录行坐标*/ int i; /*记录输入记录数*/ int flag=0; /*做结束标记*/ float temp; /*定义临时变量*/ SALARY *info,*p; /*定义临时变量*/ if(First!=NULL) init();/*如果头指针为空,调用初始化函数*/ p=First; /*从头指针开始*/ for(;) if(flag=1) break; /*如果flag=1,结束输入*/ i=0; x=0; /*确定移动的行坐标*/ clrscr(); /*清屏*/ gotoxy(1,3); printf(*gongziguanli*);/*输出标题*/ gotoxy(1,4); printf( -Enter end-);/*提示输入结束*/ gotoxy(1,5); printf(|-|);/*输出表格的起始线*/ gotoxy(1,6); printf(| no | name | jbgz |);/*输出字段标题,注意空格数*/ for(;) gotoxy(1,7+x); printf(|-|-|-|);/*输出表格的水平线*/ info=(SALARY *)malloc(sizeof(SALARY);/*申请一个记录空间*/ if(!info) printf(nout of memory);/*如没有得到空间,输出内存溢出信息*/ exit(0);/*退出程序*/ info-next=NULL;/*新结点的后继为空*/ info-prior=NULL;/*新结点的前驱为空*/ gotoxy(1,8+x);printf(|); /*输出数据间的分割线*/ gotoxy(12,8+x);printf(|); gotoxy(29,8+x);printf(|); gotoxy(38,8+x);printf(|); gotoxy(2,8+x);/*光标到输入编号位置*/ inputs(info-no,10);/*输入编号,并验证长度不超过10*/ if(info-no0=) flag=1; break; /*编号首字符为结束输入*/ gotoxy(13,8+x); /*光标到输入姓名位置*/ inputs(info-name,14); /*输入姓名,并验证长度不超过14*/ gotoxy(30,8+x); /*光标到输入基本工资位置*/ scanf(%f,&temp); /*输入基本工资到临时变量*/ info-jbgz=temp; /*基本工资赋值*/ info-koukuan=0; /*初始扣款为0,待计算工资时输入*/ info-sfgz=0; /*初始实发工资为0,待计算工资时计算*/ info-shuijin=0; /*初始税金为0,待计算工资时计算*/ info-yfgz=0; /*初始应发工资为0,待计算工资时计算*/ if(p=NULL)/*如果p为空,说明输入的是第一个结点*/ First=Last=info;/*头指针和尾指针*/ First-prior=NULL; /*头指针的前驱是空*/ Last-next=NULL; /*尾指针的后继是空*/ else /*插入的结点不是第一结点,则插入在头结点之前*/ info-next=p;/*新结点的后继指向原来的头结点*/ info-prior=p-prior;/*新结点的前驱指向原来的头结点的前驱*/ p-prior=info;/*原来结点的前驱指向新结点*/ p=info; /*新结点变为p结点,暂时的头结点*/ First=info; /*新结点变为头结点*/ x+=2; /*因为水平线,将光标下移两行*/ gotoxy(1,8+x); i+; /*输入记录数加1*/ if(i%9=0) break; /*输入9个记录,换一页输入*/ gotoxy(1,8+x); printf(|-|-|-|);/*输出结尾水平线*/*字符串输入和验证函数*/inputs(char *s, int count) char p255; do scanf(%s,p);/*输入字符串*/ if(strlen(p)count)printf(n too long! n);/*进行长度校验,超过count值重输入*/ while(strlen(p)count); strcpy(s,p); /*将输入的字符串拷贝到字符串s中*/4.2.5单条显示记录void display() int ch; /*菜单选项字符*/ SALARY *p; /*定义临时指针*/ clrscr(); /*清屏*/ p=First; /*从头指针开始*/ if(p=NULL) /*指针为空,即链表为空,返回主函数*/ printf(record is empty!n); return; else print(p); /*调用输出函数显示头结点信息*/ for(;) /*循环开始*/ printf(nn0. Quit 1. Prior 2. Next 3. First 4.Last nn);/*菜单项Quit退出 Prior前驱 Next后继 First第一条 Last最后一条*/ printf(nplease select 04:); /*提示输入菜单选项04*/ scanf(%d,&ch); /*输入菜单选项04*/ if(ch=0) break; /*如果选项为0,退出*/ switch(ch) /*开关语句根据选项字符判断*/ case 1:p=p-prior;if(p=NULL)p=First;break; /*指向前驱,没有前驱指向第一个*/ case 2:p=p-next;if(p=NULL) p=Last;break; /*指向后继,没有后继指向最后一个*/ case 3:p=First;break; /*指向第一个结点*/ case 4:p=Last;break; /*指向最后一个结点*/ print(p); /*调用输出函数显示指针所指结点信息*/ 4.2.6计算实发工资void calc() int x; /*行坐标*/ int i=0; /*记录数*/ float temp; /*临时变量扣款*/ SALARY *p; /*移动指针*/ clrscr(); /*清屏*/ p=First; /*从头指针开始*/ while(p!=NULL) /*当p不为空时,也就是有记录时,外循环控制换页*/ x=0; clrscr(); gotoxy(1,3); printf(*gongziguanli*); /*输出标题*/ gotoxy(1,5); printf(|-|); gotoxy(1,6);/*下面输出字段标题*/ printf(| no | name | jbgz | koukuan | yfgz |shuijin | sfgz |); while(p!=NULL) /*当p不为空时,也就是有记录时,内循环控制处理9条*/ gotoxy(1,7+x); printf(|-|-|-|-|-|-|-|); gotoxy(1,8+x);printf(|); gotoxy(12,8+x);printf(|); gotoxy(29,8+x);printf(|); gotoxy(38,8+x);printf(|); gotoxy(49,8+x);printf(|); gotoxy(58,8+x);printf(|); gotoxy(67,8+x);printf(|); gotoxy(76,8+x);printf(|); gotoxy(2,8+x); printf(%-10s,p-no); /*输出编号*/ gotoxy(13,8+x); printf(%-15s,p-name); /*输出姓名*/ gotoxy(30,8+x); printf(%.2f,p-jbgz); /*输出基本工资*/ gotoxy(39,8+x); scanf(%f,&temp); /*输入扣款*/ p-koukuan=temp; /*扣款字段赋值*/ p-yfgz=p-jbgz-p-koukuan; /*计算应发工资=基本工资-扣款*/ gotoxy(50,8+x); printf(%.2f,p-yfgz); /*输出应发工资*/ gotoxy(59,8+x); p-shuijin=(p-yfgz-1000)*fax(p-yfgz); /*否则按税率计算税金*/ printf(%.2f,p-shuijin); /*输出税金*/ gotoxy(68,8+x); p-sfgz=p-yfgz-p-shuijin; /*计算实发工资*/ printf(%-8.2f,p-sfgz); /*输出实发工资*/ x+=2; /*行坐标下移两行*/ i+; /*记录数加1*/ if(i%9=0)break; /*记录数超过9条,跳出内循环*/ p=p-next; /*指针后移,处理下一条*/ gotoxy(1,7+x); printf(|-|-|-|-|-|-|-|n); /*输出结束行*/ printf(Press any key congtinue.n); getch(); 4.2.7按编号查找记录SALARY *find(char *no) SALARY *p; /*定义移动指针*/ p=First; /*从头指针开始*/ while(p) /*当p不为空时*/ if(!strcmp(no,p-no) return p; /*比较相等,查找成功,返回指针*/ p=p-next; /*不相等指针后移*/ printf(not foundn); /*没有找到*/ return NULL; /*返回为空指针*/4.2.8删除节点void delete() SALARY *p; /*定义临时变量,p指向要删除的结点p*/ char s11; /*要删除结点的编号*/ clrscr(); /*清屏*/ printf(please deleted non); /*提示输入信息*/ 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;/*如p是最后一个结点,修改尾指针为p的前驱*/ free(p); /*删除结点后,不要忘记释放空间*/ printf(n have deleted %s SALARYn,s); printf(Dont forget saven); 4.2.9插入节点void insert() SALARY *p,*info; /* info为新结点,p为新结点的后继*/ char s11; /*保存查找的姓名*/ float temp; /*临时变量*/ clrscr(); /*清屏*/ printf(please enter location before the non); /*提示输入在哪个结点之前插入*/ scanf(%s,s); /*输入指定结点的编号*/ printf(nplease new recordn); /*提示输入记录*/ 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(nout of memory); /*如没有得到空间,内存溢出*/ 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; /*给基本工资字段赋值*/ info-koukuan=0; /*扣款初始为0*/ info-yfgz=0; /*应发工资初始为0*/ info-shuijin=0; /*税金初始为0*/ info-sfgz=0; /*实发工资初始为0*/ 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=First; /*唯一结点,尾指针等于头指针*/ else /*新结点插在尾部*/ Last-next=info; info-prior=Last; Last=info; /*尾指针指向新结点*/ else if(p=First) /*p不为空,但p为头指针,新结点插在第一个结点位置*/ info-prior=NULL; /*新结点的前驱为空*/ info-next=p; /*新结点的后继为p*/ p-prior=info; /*p的前驱是新结点*/ First=info; /*修改头指针指向新结点*/ else /*新结点插入在中间某一个位置p之前*/ info-next=p; /*新结点的后继是p*/ info-prior= p-prior; /*新结点的前驱是p的前驱*/ p-prior-next=info; /*p的前驱的后继是新结点*/ p-prior=info; /*p的前驱是新结点*/ printf(nnn -have inserted %s SALARY-n,info-name); printf(n-Dont forget save-n); /*提醒调用保存文件存盘*/4.2.10索引void index() SALARY *p,*q,*t,*h1; /*定义临时指针*/ clrscr();/*清屏*/ printf(nn start index.nn); /*显示开始索引*/ h1=First-next; /*将原表的头指针所指的下一个结点作头指针*/ First-next=NULL; /*第一个结点为新表的头结点*/ Last=First; /*
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 心理部长面试题目及答案
- 校考素描线性题目及答案
- 小学语文课文中的思想感情理解策略指导教案
- 雪中的蓝色玫瑰750字(9篇)
- 夏媛媛的夏天800字10篇范文
- 读我要做个好孩子有感350字13篇
- 老师谢谢您250字10篇
- 纪念白求恩余映潮课件
- 小说人物塑造手法探究教学教案
- 2025年审计师考试审计职业道德与法律责任试卷
- 地面工程基础知识概要课件
- 胖东来运营经理培训课件
- 村两委内部管理制度
- 供电公司信访管理制度
- 木工入场安全教育试卷(含答案)
- 工业管道的定期检查与维护措施
- 林业发展“十五五”发展规划
- 工厂厂规厂纪管理制度
- 2025全球翻译行业发展报告
- T/CCS 025-2023煤矿防爆锂电池车辆动力电源充电安全技术要求
- 贴膜安装服务合同协议书
评论
0/150
提交评论