1、精选优质文档-倾情为你奉上课程设计任务书学 院信息学院专 业计算机科学与技术学 生 姓 名学 号题 目工资管理系统内容及要求:内容:(列出相应题目)工资管理:自己建立数据文件(提示可建立:职工、工资级别、职工工资)完成:数据录入查询(如:职工的平均工资查询、某一级别人员的平均工资查询)插入、删除、修改排序(将职工姓名按工资额度进行)等功能。要求:1.设计数据结构,存储结构;2.在Turboc或兼容环境完成上述题目的代码编写与调试;3.程序运行界面交互性好;4.给出两组测试数据。任务交付:1.程序源代码;2课程设计论文及电子文档。进度安排:本课程设计时间为16、17教学周。其中包含设计、代码调试
2、课程设计论文撰写几个阶段。第1周 查找资料、完成初步设计、代码设计与初步调试;第2周 调试、测试、验收、课程设计论文撰写、答辩。指导教师(签字):年 月 日学院院长(签字):年 月 日目 录1、功能需求分析及初步设计(1)在该部分中叙述整体功能及每个模块的功能要求。(2)所设计文件 在C盘下定义“file.dat”文件,将职工信息写入其中。2、概要设计(1)程序中使用的存储结构设计说明struct Employee /声明职工的结构作为链表节点。 int m_Code; /职工代码 char m_Name20; /职工姓名 unsigned int m_Wage; /职工工资 int m_l
3、evel; /工资级别 struct Employee* Next; /链表节点的指针域; (2)每个部分的算法设计说明。1、整体算法流程图2、Add(Head);函数算法流程图3、Modify(Head)函数算法流程图;4、Del(Head);函数的算法流程图5、Search(Head)函数算法流程图;6、Sort(Head);函数算法流程图7、Display_List(Head);函数算法流程图3、详细设计(1)运行界面截图主界面(菜单选项)图3-1-1职工注册界面(已经注册过两个,此界面为第三个职工注册)图3-1-2信息修改界面(修改代码为22222的职工信息)图3-1-3信息删除界面(
4、删除代码为11111的职工信息)图3-1-4信息查询界面(查询姓名为ww的职工信息)图3-1-5排序界面(按工资从高到低排序)图3-1-6信息显示界面(显示所有职工信息)图3-1-7退出系统界面图3-1-8(2)相应算法实现的源程序(有注解说明)1、职工注册void Add(Link Head) /前插法添加数据。 Link pNew; / 声明一个新节点。 char again; char name20;int code,level; unsigned int wage; do system(cls); coutt*用户注册系统*nendl;pNew=(Link)new Node; /数据域
5、 cout请输入第n+1个人的信息nendlendl; coutcode;Clear(code);coutendlname; coutendlwage;sum+=wage;n+;while(cin.fail() cout请输入正确的工资数据。wage; coutendllevel;Clear(level);while(4=level|level=0)cout工资等级输入错误!endl;coutlevel;switch(level)case 1:sum1+=wage;n1+=1;break;case 2:sum2+=wage;n2+=1;break;case 3:sum3+=wage;n3+=
6、1;break;coutm_Code=code; strcpy(pNew-m_Name,name); pNew-m_Wage=wage;pNew-m_level=level;/指针域。 pNew-Next=Head-Next; Head-Next=pNew; cout数据添加成功!是否继续添加?(Y/N)again; while(again=Y|again=y); system (pause);system(cls); 2、信息修改void Modify(Link Head) / 修改单一个节点。 system(cls);coutt*信息修改系统*nNext; coutendlcode;Cle
7、ar(code);while(ptr) if(ptr-m_Code=code) coutendlt=查询结果=endl;couttttsetw(10)left代码setw(10)left姓名 setw(10)left工资 setw(10)left级别endl;coutt=endl;Display_Node(ptr); /打印满足条件的节点。coutendlm_Wage;n-=1;switch(ptr-m_level)case 1:sum1-=ptr-m_Wage;n1-=1;break;case 2:sum2-=ptr-m_Wage;n2-=1;break;case 3:sum3-=ptr-m
8、Wage;n3-=1;break;int level; unsigned int wage; if(ptr) coutt=你现在可以修改此职工的信息了!=endl; /数据域。 coutcode; coutendlname; coutendlwage; sum+=wage;n+;while(cin.fail() cout请输入正确的工资数据。wage; coutendllevel;Clear(level);while(4=level|level=0)cout工资等级输入错误!endl;coutlevel;switch(level)case 1:sum1+=wage;n1+=1;break;c
9、ase 2:sum2+=wage;n2+=1;break;case 3:sum3+=wage;n3+=1;break;coutm_Code=code; strcpy(ptr-m_Name,name); ptr-m_Wage=wage;ptr-m_level=level;cout恭喜你,修改信息成功!Next; /查询下一节点。if(ptr=NULL)cout没找到此职工的记录,无法修改。endl; system (pause); system(cls); 3、信息删除Link Search_Unique_Front(Link Head) /查询满足“职工代码“的职工信息(职工代码必需唯一)。
10、Link ptr; int code; ptr=Head; coutcode;Clear(code);coutendlt=查询结果=endl;couttttsetw(10)left代码setw(10)left姓名 setw(10)left工资setw(10)left级别endl;coutt=Next-m_Code=code) Display_Node(ptr-Next);/打印满足条件的节点。 return ptr; /注意,是返回的查询到的节点的直接前趋节点。 ptr=ptr-Next; /查询下一节点。 return ptr; void Del(Link Head) system(cls)
11、coutt*信息删除系统*nNext-m_Wage; n-=1; switch(ptr_front-Next-m_level) case 1: sum1-=ptr_front-Next-m_Wage; n1-=1;break; case 2: sum2-=ptr_front-Next-m_Wage; n2-=1;break; case 3: sum3-=ptr_front-Next-m_Wage; n3-=1;break;ptr=ptr_front-Next;ptr_front-Next=ptr_front-Next-Next;delete ptr; /删除此节点。cout恭喜你,删除信息成
12、功!。endl;elsecout没找到此职工的记录,无法删除。endl; system (pause);system(cls);4、信息查询bool Search(Link Head) system(cls);coutt*用户查询系统*nendl;cout选择查询方式:1、查询职工信息 2、按职工的平均工资查询n;cout 3、按某一级别人员的平均工资查询i;if(i=1)Link ptr; char name20; ptr=Head-Next; coutendlname; coutendlt=查询结果=endl;couttttsetw(10)left代码setw(10)left姓名 setw
13、10)left工资setw(10)left级别endl;coutt=m_Name,name)=0) Display_Node(ptr); /打印满足条件的节点。coutendlNext; /查询下一节点。 cout无此职工的信息。endl;coutendlendl;system (pause); system(cls); return false;else if(i=2)double aver1;aver1=sum/n;cout职工总数为 :nendl;cout所有职工的工资总数为:sumendl;cout所有职工的平均工资为 :aver1endl;coutendlendl;system (
14、pause); system(cls); return true;else if(i=3)double aver2;coutlevel;Clear(level); coutendl;switch(level)case 1:aver2=sum1/n1;cout工资级别为 level 职工总数为 :n1endl; cout所有工资级别为 level 职工的工资总数为:sum1endl; break;case 2:aver2=sum2/n2;cout工资级别为 level 职工总数为 :n2endl; cout所有工资级别为 level 职工的工资总数为:sum2endl;break;case 3:
15、aver2=sum3/n3;cout工资级别为 level 职工总数为 :n2endl; cout所有工资级别为 level 职工的工资总数为:sum2endl;break;coutn工资级别为 level 的员工的平均工资为:aver2endl;coutendlendl;system (pause); system(cls); return true;elsecout选择错误,将返回主菜单!;coutendlendl;system(pause);system(cls);return true;5、工资排序Link Sort(Link Head) /创建带头节点的链表。用直接插入法。 syst
16、em(cls);coutt*工资排行系统*nNext=NULL)|(Head-Next-Next=NULL) /此步条件判断非常有价值。 cout数据节点数少于2个,不用排序!Next-Next; ptr_F=Head; Head-Next-Next=NULL; /到此,分成了两个链表。 /第三步。 while(ptr) ptr_N=ptr-Next; ptr_F=Head; /ptr_F的归位。 while(ptr_F-Next) if(ptr-m_Wageptr_F-Next-m_Wage) ptr-Next=ptr_F-Next; ptr_F-Next=ptr; break; /if e
17、lse ptr_F=ptr_F-Next; /while(ptr_F-Next) if(ptr_F-Next=NULL) ptr-Next=ptr_F-Next; ptr_F-Next=ptr; /表示插到有序链表的最后面了。 ptr=ptr_N; /归位,准备下一次排序。 /while(ptr) cout从高到低,排序成功!endl; system (pause);system(cls);return Head;6、信息显示void Display_List(Link Head) system(cls);coutt*信息显示系统*nNext; coutt=所有职工信息=endl;couttt
18、tsetw(10)left代码setw(10)left姓名 setw(10)left工资setw(10)left级别endl;coutt=Next; coutt=endl;system (pause);system(cls);4、测试数据及结果分析(1)测试数据,测试输出的结果,时间复杂度分析输入如下的测试数据:图4-1-1输出结果下图所示:图4-1-2时间复杂度为O(n),即此例为O(2)。(2)每个模块设计和调试时存在问题的思考 1、在删除模块,要删除某个节点,就要把此节点指向下一结点的地址赋给指向此节点的指针,可是如果,直接找到要删除的节点,就得不到指向他打指针。所以我找到的是要删除的节
19、点的前一个节点。这样就解决了问题。 2、在文件操作模块,一开始文件只能保存,却读不出来。后来发现,文件读取过程中需要分配一个结构体大小的存储空间,用以存放读出的数据。然后,用了一个Link pNode=new Node;解决了此问题。(3)算法的改进设想。 1、职工代码应该各不相同,所以可以改进当输入职工代码重复时,提示输入错误,并要求重新输入。2、职工代码有可能是0开头,如,这里的代码定义为int型,使等价于。所以可以改进把代码定义为数组,这样就可以避免此类问题了。3、职工工资级别不应该人工设定,而应根据职工工资自动设定。所以可以在此做改进。5、课设总结在本次课程设计当中,我的课题是设计“工
20、资管理系统”的仿真软件。通过设计任务书中的要求以及介绍,大致确定了主要运用的知识要点是:线性表、查找表的逻辑结构、存储结构,掌握查找、排序等基本运算,以及课本中提及的其他相关算法。通过此次课设设计又将所学的C语言知识巩固个一遍,几乎所有的知识都用到了如:基本的变量,重要的语句,函数等最主要的是加深了对函数、指针、结构体以及文件的认识和理解,学会了更好的应用这些知识来写出一个预期的程序,收获很大。 经过自己的一番努力以及指导老师的悉心指导,终于完成了此方针软件的设计,通过这次课程设计,我基本了解并且学习了如何分析研究数据对象的特性、数据的组织方法、如何选取合适的数据逻辑结构和存储结构。这对以后的
21、学习都有着很大的帮助。这次课设的题目不是很难,但是要做到功能的全面和严谨是非常不容易的一件事。虽然在老师的指导下完成了这次课设,但是自己还需做更多的类似的题目来提高自己。参考文献1. 书名数据结构(C语言版) 作者 严蔚敏,吴伟民 出版社 清华大学出社2. 书名面向对象程序设计(C+语言) 作者 李爱华,程磊 出版社 清华大学出版社附录程序代码#include #include #include #include #include #include #include #include double sum,sum1,sum2,sum3;int n,n1,n2,n3;using namespac
22、e std; struct Employee /声明职工的结构作为链表节点。 /-数据域- int m_Code; char m_Name20; unsigned int m_Wage;int m_level; /链表节点的指针域- struct Employee* Next; ; typedef struct Employee Node; typedef Node* Link; Link Create() /创建空链表。Link Head;Head=new Node; if(!Head) cout分配内存失败!m_Code=0; strcpy(Head-m_Name,0); Head-m_W
23、age=0;Head-m_level=0;Head-Next=NULL; return Head; void Release(Link Head) /释放链表。 Link ptr;while(Head!=NULL) ptr=Head; Head=Head-Next; delete ptr; void Display_Node(Link pNode) couttttsetw(10)leftm_Code setw(10)leftm_Name setw(10)leftm_Wagesetw(10)leftm_levelendl;void Clear(int &f1)/输入错误是清空输入流while(c
24、in.fail() coutf1; void Add(Link Head) /前插法添加数据。 Link pNew; / 声明一个新节点。 char again; char name20;int code,level; unsigned int wage; do system(cls); coutt*用户注册系统*nendl;pNew=(Link)new Node; /数据域。 cout请输入第n+1个人的信息nendlendl; coutcode; coutendlname; coutendlwage;sum+=wage;n+;while(cin.fail() cout请输入正确的工资数据。
25、wage; coutendllevel;Clear(level);while(4=level|level=0)cout工资等级输入错误!endl;coutlevel;switch(level)case 1:sum1+=wage;n1+=1;break;case 2:sum2+=wage;n2+=1;break;case 3:sum3+=wage;n3+=1;break;coutm_Code=code; strcpy(pNew-m_Name,name); pNew-m_Wage=wage;pNew-m_level=level; pNew-Next=Head-Next; Head-Next=pNe
26、w; cout数据添加成功!是否继续添加?(Y/N)again; while(again=Y|again=y); system (pause);system(cls); bool Search(Link Head) /查询满足姓名的职工信息。 system(cls);coutt*用户查询系统*nendl;cout选择查询方式:1、查询职工信息 2、按职工的平均工资查询n;cout 3、按某一级别人员的平均工资查询i;if(i=1)Link ptr; char name20; ptr=Head-Next; coutendlname; coutendlt=查询结果=endl;couttttsetw
27、10)left代码setw(10)left姓名 setw(10)left工资setw(10)left级别endl;coutt=m_Name,name)=0) Display_Node(ptr); /打印满足条件的节点。coutendlNext; /查询下一节点。 cout无此职工的信息。endl;coutendlendl;system (pause); system(cls); return false;else if(i=2)double aver1;aver1=sum/n;cout职工总数为 :nendl;cout所有职工的工资总数为:sumendl;cout所有职工的平均工资为 :aver1endl;coutendlendl;system (pause); system(cls); return true;else if(i=3)dou