《数据结构与算法》工资管理系统综合实验报告1319.docx
沈阳理工大学应用技术学院数据结构构与算法法综合实验报报告课程名称:数据结结构与算算法综综合实验验专 业:计计算机科科学与技技术班级学号: 11132211116 姓 名: 王王娇 指导教师:孙承福 成 绩:完成日期: 20112 年月日一、实验题题目工资管理系系统二、实验时时间地时间:20012/6/110地点点:5006ATTA机室室三、实验目目的1.理解解线性表表的定义义、线性性表的顺顺序存储储结构和和链式存存储结构构。2.理解线线性表的的逻辑结结构特征征3.深入掌掌握线性性表的两两种存储储方法,即即顺序表表和链式式表。体体会这两两种存储储结构之之间的差差异。44.重点掌掌握线性性表和链链表上各各种基本本运算的的实现。5.综合运用线性表解决一些复杂的实际问题。四、实验内内容(一)、功功能关系系介绍1添加功能能,通过过它可以以添加新新的员工工信息,非非常方便便,输入入1即可可进入添添加页面面,添加加完以后后,输入入4保存存。2查询功能能,通过过它可以以查询是是否有这这个员工工,他可可以通过过两种方方式进行行查询,一一是idd号查询询,二是是姓名查查询。3删除功能能,通过过它可以以删除离离开的员员工,它它也可以以通过两两种方式式进行删删除,一一是通过过id删删除,二二是通过过姓名删删除。6修改功能能,通过过它可以以修改员员工信息息,譬如如电话,工工资等,可可输入iid号进进行修改改,修改改完以后后返回主主页面输输入4进进行保存存。5插入功能能,与添添加功能能有区别别,它可可选择性性的插入入,随意意插,他他也是添添加新的的员工,非非常方便便,返回回主页面面,输入入4保存存。4保存功能能,它可可保存添添加,插插入和修修改的员员工信息息。7显示功能能,通过过它可以以显示所所有员工工的详细细信息。0返回功能能,通过过它可返返回主页页面,进进行其他他操作。(二)、采采用数据据结构该员工工资资管理系系统采用用了单链链表的建建立,输输入,插插入,查查找,删删除,输输出等功功能(三)、语语言工具具C语言编程程五、预习内内容(一)、单单链表分分线性单单链表和和静态的的单链表表。线性单链表表是用一一组不连连续的存存储单元元来存放放线性表表中的数数据,因因此链表表中结点点的逻辑辑次序和和物理次次序不一一定相同同。为了了正确的的表示结结点间的的逻辑关关系,在在存储线线、性表表时,存存储每个个数据元元素值的的同时,还还要存储储指示其其后继结结点的地地址信息息,这两两部分信信息组成成的存储储映像称称为结点点。一个结点有有两个域域组成:数据域域和指针针域。 1)、创创建单链链表:1、扦插法法建表2、尾插法法建表 2)、在在单链表表中查找找给定的的元素:1、按每个个元素的的定位序序号查找找2、按值查查找(二)、单单链表的的长度刻意采用“数数”结点点的方法法求出单单链表的的长度,用用指针pp依次指指向各个个结点,从从第一个个元素开开始”数数“,一一直”数数“到最最后一个个结点(pp->nnextt=NUULL)。单单链表插插入操作作在单链链表L中中第i个个位置插插入一个个数据元元素e,首首先找到到单链表表中的第第i-11个结点点,然后后申请一一个新的的结点由由指针ss指示,ss结点数数据域为为e。修修改第-1个结结点的指指针使其其指向ss,然后后使s结结点的指指针域指指向原第第i个结结点。(三)、单单链表的的删除注意:删除除算法中中的循环环条件(pp-neext!NULLL)&&&(kk<i-1)与与前插算算法中的的循环条条件(pp-neext!NULLL)&&&(kk<i-1)不不同,因因为前插插时的插插入位置置多一个个向表尾尾插入。1、开辟一一块连续续空间,初初始化为为空闲静静态链表表。2、空闲链链上的结结点分配配。3、空闲链链上的回回收分配配。4、静态单单链表结结点的分分配与释释放六、算法描描述(流流程图与与说明)(一)、详详细描述述工资管理系系统(要要求)该系统能够够实现工工资管理理。系统统包括录录入、游游览、查查询、统统计等功功能。其其中录入入功能要要求能够够添加新新的工资资信息到到文件;游览功功能要求求能按照照工资卡卡号、姓姓名分类类游览,提提供分屏屏显示;有排序序功能,排排序后按按照工资资卡号升升序或实实发工资资降序输输出;查查询功能能要求能能够按照照工资卡卡号、姓姓名查询询;统计计功能要要求能够够按照月月份累计计统计某某职工在在某时间间段实发发工资总总金额。(提提示)(1)文件件中一行行数据对对应一个个职工工工资信息息。(2)工资资信息的的数据结结构采用用结构体体数据,一一个数组组元素对对应一条条工资单单记录。(3)工资资单信息息包括工工资卡号号、姓名名、月份份、应发发工资、水水费、电电费、税税金、实实发工资资等。(4)实发发工资=应发工工资-水水费-电电费-税税金,其其中税金金计算方方法为: 1)、 应应发工资资应发工工资8800元元,税金金=0 2)、8000应应发工资资14400元元,税金金=(应应发工资资-8000)*5% 3)、应发发工资14000元,税税金=(应应发工资资-14400)*10%该系统分:菜单函函数、查查询函数数、添加加函数、删删除函数数、显示示函数、修修改函数数、保存存函数、插插入函数数、和主主函数九九个模块块。菜单函数的的主要显显示的是是主菜单单,你可可以通过过菜单函函数选择择你要选选择的模模块,选选择你要要执行的的方法,菜菜单函数数共有八八个选择择,在007之之间你人人选择一一个,就就会进入入到相应应的模块块。选择1带你你进入添添加模块块;选择2带你你进入查查询模块块;选择3带你你 进入入删除模模块;选择4带你你进入保保存模块块;选择5带你你进入插插入模块块;选择6带你你进入修修改模块块;选择7带你你进入显显示函数数;选择0带你你返回菜菜单函数数;员工的信息息包括职职工卡号号、员工工id、员员工姓名名、性别别、部门门、技术术职称编编号、电电话、基基本工资资、职务务工资、应应发工资资、实发发工资、税税金、补补助。(二)、数数据结构构的采用用添加模块和和插入模模块都运运用到单单链表的的输入和和插入,查查询模块块运用到到了单链链表的查查找,删删除模块块运用到到了单链链表的删删除,保保存模块块,修改改模块,返返回模块块还有显显示模块块都运用用到了单单链表的的输入和和输出(三)、算算法的描描述本系统一开开始就运运用了结结构体类类型,定定义了一一个结构构体类型型变量wworkker,来定义义员工的的各种信信息,还还定义了了一个数数据节点点,用于于创建单单链表。菜单函数:显示功功能总页页面,用用cprrinttf()程序输输出,ssysttem("clls")功能是是清屏,清清除所有有显示的的信息,定位函数:Nodde *loccatee(Liink m,ccharr fiind,ccharr faangsshi) ,m为为链表,ffindd,faangsshi为为两个数数组,利利用sttrcmmp(ffanggshii,"iid")程序,如如果sttrcmmp()=00,表示示利用iid完成成查询、删删除或修修改,本本程序主主要是完完成用IId或nnamee方式选选择查询询、删除除或修该该查询函数:chaaxunn(Liink m),完成是是否又该该工人的的查询,如如果m的的指针域域为空,表表示没有有工人的的记录,否否则通过过id或或namme查询询,调用用laccatee()函函数,如如果laacatte()的值不不为空,输输入员工工信息,按按任意键键结束。添加函数:addd(Liink m),若m的的指针域域不为空空,继续续输入数数值,申申请节点点,用节节点存放放输入数数值,若若职工卡卡号输入入0,返返回主页页面,否否则继续续输入删除函数:delletee(Liink m),r若mm的指针针域为空空,表示示没有记记录,通通过调用用laccatee()确确定用哪哪一种方方式进行行删除,若若找到则则执行删删除,否否则没有有该记录录。修改函数:moddifyy(Liink m),若若m的指指针域为为空,表表示没有有记录,用用gett()输输入idd,用iid得到到想要修修改的数数据,修修改完显显示修改改成功,否否则显示示失败。显示函数:xiaanshhi(LLinkk m)若m的的指针域域为空,表表示没有有记录,显显示所有有员工的的信息。插入函数:inssertt(Liink m)申申请新节节点,若若节点为为空,则则没有插插入记录录,用gget()输入入插入的的数据,从从第一个个节点开开始,到到显示插插入成功功,若重重复插入入则返回回,否则则继续插插入。保存函数;savve(LLinkk m)用用fp=foppen("d:hhelllo.ttxt"","wwb");语句句创建一一个放在在d盘下下的文件件,若文文件为空空则不能能打开,用用p节点点之向mm的指针针域,若若p不为为空,用用fwrritee(p,sizzeoff(Noode),1,fp)写入文文件,保保存,这些功能主主要用数数据结构构的单链链表完成成的,用用得到的的是c语语言的知知识。(四)、系系统功能能模块图图2查询模块根据姓名查询屏幕输出工资管理系统4保存模块7显示模块0退出从文件读入根据id号查询从键盘输入6修改模块1添加模块3删除模块5插入模块根据姓名删除根据id号删除询根据id号插入图 6.11 系统统功能模模块图(五)、系系统功能能模块图图开始Y编译运行有/错NMain函数menu函数choose=0Choos!=0退出调用各个功能函数(choosse=?)连接执行查询修改保存插入退出显示删除添加错误 输入正确图 6.22 系统统流程模块块图(六)、函函数流程程图Np=NULLprintf("无法申请记忆空间!n");exit(0);Yprintf("职工编号:");gets(p->data.gzkh);NYNode *p,*r,*s;char numstr20;r=mr->next!=NULLYr=r->next;mYp=(Node *)malloc(sizeof(Node);Nstrcmp(p->data.gzkh,"0")=0退出键盘输入p->data.yfgz<800税金为0YNNp->data.yfgz<=140000税金=(应发工资-1400)*0.1p->next=NULL; r->next=p;r=p;退出NY税金=(应发工资-800)*0.05N图 6.33addd()函数数流程图图判断表中是否有数据没有记录返回输入“1”通过id删除,输入“2”通过姓名删除Choose=1输入已存在的id号调用locate()函数Choose=2输入已存在的姓名调用locate()函数P!=Nullr=mr-next!=pr=r-nextr-next=p-next退出NYNYNYN图 6.44delletee()函函数流程程图FILE *fp;Node *p;int count=0文件fp打开读取fp=Null无法打开文件返回YNp=m->next 指针下移P!=nullY写入文件 count+NCount>0保存成功无新数据更新YN图 6.55savve()函函数流程程图输入要在第几个数的后面插入申请结点 newinfoNewinfo=null根据提示键盘输入插入信息没有记录返回YNNewinfo->data.yfgz<800税金=0YNewinfo->data.yfgz<1400N税金=(应发工资-800)*0.05税金=(应发工资-1400)*0.1Yp=m->nextmStrcmp(p->data.id,find)=0)Ynewinfo->next=p->next; p->next=newinfo Yp=p->next退出NN图 6.66inssertt()函函数流程程图税金=(应发工资-800)*0.05m->next=null输入你想要修改的id号,调用locate()无记录返回PStrcpy(p->data.id,find)复制Y根据提示键盘输入插入信息Newinfo->data.yfgz<800税金=0YNewinfo->data.yfgz<1400N税金=(应发工资-1400)*0.1Y退出N无法修改N图 6.77 moodiffy()函函数流程程图P=m-nextP=null无记录返回YPY输出语句p=p->next;N退出N图 6.88 xxiannshii()函函数流程程图Node *rstrcmp(fangshi,”id”)=0)r=m->nextYrstrcmp(r->data.id,find)=0Y返回Nreturn r; Ystrcmp(fangshi,”name”)=0)r=m->nextrstrcmp(r->data.name,find)=0返回return r; YNYNNY返回Nr=r-nextr=r->nextN图 6.99 llocaate()函函数流程程图七、运行结结果(抓抓图)与与分析7.1主界界面执行成功之之后,首首先显示示主菜单单,如图图7.11: 图7.117.2输入入添加函函数模块块实现选择”1”你你将进入入添加模块块,在添添加模块块里你可可以执行行对员工工的姓名名,职工工卡号等等的添加加,如图图7.22:图7.27.3输入入查询函数数模块实实现选择”2”你你将进入入查询模块块,一是是通过员员工的iid号查查询员工工的信息息,还可可以通过过员工的的姓名进进行查询询。例如如:进入入主菜单单,你首首先选择择的是“2”,进入入查询模模块,然然后你可可以选择择通过iid或者者是姓名名进行员员工信息息查询,选选择“1”,通过过id查查询,选选择“2”通过姓姓名查询询,如果果你选择择“2“,然后后输入iid号001,之之后按回回车键,就就会显示示一行你你要查询询的这个个员工的的信息,如如图7.3:图7.37.4输入入删除函数数模块实实现选择“3”你将你你进入删删除模块块,你可可以通过过 idd号和员员工的姓姓名进行行删除,方方法雷同同,如图图7.44图7.47.5输入入保存函数数模块实实现输入“4”进行文文件的保保存,保保存的路路径是""d:heelloo.txxt","wbb",如如图7.5:图7.57.6输入入插入函数数模块实实现输入“5”你将进进入插入入模块,你可以以选择要要插入的的位置,是是第一个个数据后后面还是是第几个个数据后后面,选选择之后后即可进进行信息息的录入入,如果果在职工工卡号后后输入00,则返返回主页页面,否否则继续续插入方方法跟添添加雷同同,如图图7.66:图7.67.7输入入修改函数数模块实实现输入“6”,你将将进入修修改界面面,你可可以先选选择你要要修改的的员工的的id,之之后你可可以选择择你要修修改的信信息,修修改之后后你会用用到一个个模块,保保存模块块,如图图7.77 图7.77.8输入入显示函数数模块实实现输入“7”你将进进入显示示模块。显显示模块块主要的的功能就就是显示示信息。执执行完其其他操作作之后你你可以通通过显示示信息显显示出来来,如图图7.88图7.87.9输入入退出函数数模块实实现输入“0”,退出出界面,如如图7.9图7.9八、源程序序代码#inclludee<sttdioo.h>>#inclludee<sttdliib.hh>#inclludee<sttrinng.hh>#inclludee<coonioo.h>>/#inncluude <syysteem.hh>int ssaveeflaag=00;/标志一一下,定定义一个个标志变变量,用用到的时时候再找找typeddef strructt woorkeer/定义一一个sttrucct wworkker,相相当于jjavaa的一个个类 chhar gzkkh220; /*职职工卡号号*/ chhar id20; /*id号号*/ chhar namme220; /*姓名*/ chhar sexx; /*性别*/ /intt ggl; /*工工龄*/ chhar depparttmennt220; /*部部门*/ chhar levvel10; /*技技术职称称*/ chhar jsbbh220; /*技技术职称称编号*/ chhar phoone20; flloatt jbbgz; /*基基本工资资*/ flloatt zwwgz; /*职职务工资资*/ flloatt yffgz; /*应应发工资资*/ flloatt sffgz; /*实实发工资资*/ flloatt taax; flloatt bzz; /*补补助*/;typeddef strructt noode strructt woorkeer ddataa; /结结构体wworkk类型的的变量ddataa strructt noode *nexxt; /结构构体noote类类型的指指针变量量,变量量名为nnexttNodee,*LLinkk; /nnotee类型的的指针变变量menu() /*菜菜单函数数*/ syysteem(""clss"); / texxtcoolorr(122); /gottoxyy(100,5); cpprinntf(" 王娇的的工资管管理系统统:nn"); /gottoxyy(100,8); cpprinntf("* 菜单单 *n""); /gottoxyy(100,9); cpprinntf("* 1 添加加 2 查询 *n"); /gottoxyy(100,100); cpprinntf("* 3 删除除 4 保存 *n"); /gottoxyy(100,111); cpprinntf("* 5 插入入 6 修改 *n"); /gottoxyy(100,122); cpprinntf("* 7 显示示 0 退出 *n"); /gottoxyy(100,133); cpprinntf("*n"); /*定位位函数*/Node *loocatte(LLinkk m,chaar ffindd,chaar ffanggshii) Noode *r; iff(sttrcmmp(ffanggshii,"iid")=00) /*按按照idd查询*/ r=m->>nexxt; whhilee(r) iff(sttrcmmp(rr->ddataa.idd,fiind)=00) reeturrn rr; r=r->>nexxt; ellse if(strrcmpp(faangsshi,"naame"")=0) r=m->>nexxt; whhilee(r) iff(sttrcmmp(rr->ddataa.naame,finnd)=0) reeturrn rr; r=r->>nexxt; /*查询函函数*/chaxuun(LLinkk m) innt cchooose; chhar inpputddataa200; /*存放查查询的内内容*/ Noode *p; iff(mm->nnextt)=NULLL) syysteem(""clss"); prrinttf(""n没没有该员员工的信信息!n"); geetchhar(); reeturrn; syysteem(""clss"); prrinttf(""1 通过过id查查询 2 通通过姓名名查询n"); /选选择1通通过idd查询,选选择2,通通过naame查查询 prrinttf(""请输入入 11/2n""); sccanff("%d",&chhoosse);gettchaar(); iff(chhoosse=1) prrinttf(""请输入入数据!n""); sccanff("%s",&innputtdatta);gettchaar(); p=loccatee(m,inpputddataa,"iid"); iff(p) priintff("工工资卡号号:=%4s 姓名:=%44s 实发工工资:=%4ff 税务务:=%4f 基本工工资:=%4ffn"",p->daata.gzkkh,pp->ddataa.naame,p->>datta.ssfgzz,p->daata.taxx,p->daata.jbggz); /priintff("%4s%4s%4f%4f%4fn",p->>datta.ggzkhh,p->daata.namme,pp->ddataa.sffgz,p->>datta.ttax,p->>datta.ssfgzz); prrinttf(""按任意意键继续续!nn"); geetchhar(); ellse prrinttf(""无法找找到!n"); geetchhar(); ellse if(chooosee=22) prrinttf(""请输入入数据!n""); sccanff("%s",&innputtdatta);gettchaar(); p=loccatee(m,inpputddataa,"nnamee"); iff(p!=NUULL) pprinntf("工资资卡号:=%44s 姓姓名:=%4ss 应应发工资资:=%4f 税务:=%44f 实实发工资资:=%4fn", p->>datta.ggzkhh,p->daata.namme,pp->ddataa.sffgz,p->>datta.ttax,p->>datta.jjbgzz); /priintff("%s%ss%f%f%ffn"",p->daata.gzkkh,pp->ddataa.naame,p->>datta.ssfgzz,p->daata.taxx,p->daata.sfggz); prrinttf(""按任意意键继续续!nn"); geetchhar(); ellse prrinttf(""无法找找到!n"); geetchhar(); /*添加加函数*/add(LLinkk m) NNodee *pp,*rr,*ss; ccharr nuumsttr220; rr=m; wwhille(rr->nnextt!=NNULLL) r=rr->nnextt; wwhille(mm) pp=(NNodee *)malllocc(siizeoof(NNodee);/申申请结点点 iif(pp=NNULLL) pprinntf("无法法申请记记忆空间间!nn"); eexitt(0); pprinntf("职工工编号:"); ggetss(p->daata.gzkkh); iif(sstrccmp(p->>datta.ggzkhh,"00")=0) bbreaak; pprinntf("idd号:""); ggetss(p->daata.id); pprinntf("姓名名:"); ggetss(p->daata.namme); pprinntf("性别别:"); / ggetss(p->daata.sexx); pp->ddataa.seex=ggetccharr(); ggetccharr(); pprinntf("部门门:"); ggetccharr(); ggetss(p->daata.depparttmennt); pprinntf("技术术职称:"); ggetss(p->daata.levvel); pprinntf("技术术职称编编号:""); ggetss(p->daata.jsbbh); pprinntf("电话话:"); ggetss(p->daata.phoone); pprinntf("基本本工资:"); ggetss(nuumsttr); pp->ddataa.jbbgz=atoof(nnumsstr); pprinntf("职务务工资:"); ggetss(nuumsttr); pp->ddataa.zwwgz=atoof(nnumsstr); pprinntf("补助助:"); ggetss(nuumsttr); pp->ddataa.bzz=attof(nummstrr); pp->ddataa.yffgz=p->>datta.jjbgzz+p->daata.zwggz+pp->ddataa.bzz; /应应发工资资=基本本工资+职务工工资+补补助; iif(pp->ddataa.yffgz<<8000) p->>datta.ttax=0; /如如果应发发工资<<8000 那么么税金为为0, eelsee iff(p->daata.yfggz<=14000) p->>datta.ttax=(p->daata.yfggz-8800)*0.05; /如如果应发发工资大大余8000小于于14000税金金=(应应发工资资-8000)*0.005 eelsee p->>datta.ttax=(p->daata.yfggz-114000)*00.1; /如如果应发发工资大大于14400税税金=(应应发工资资-14400)*0.11 pp->ddataa.sffgz=p->>datta.jjbgzz+p->daata.zwggz+pp->ddataa.bzz-(pp->ddataa.taax);/实实发工资资=基本本工资+职务工工资+补补助-税税金; pp->nnextt=NUULL; rr->nnextt=p; rr=p; ssaveeflaag=11; /*删除函函数*/delette(LLinkk m) innt cchooose; Noode *p,*r; chhar finnd220; iff(m->neext=NUULL) ssysttem("clls"); pprinntf("没有有记录!n""); ggetccharr(); rretuurn; syysteem(""clss"); prrinttf("" 1 通过过id删删除 2 通过姓姓名删除除 nn");/选选择1,通通过idd删除,选选择2通通过naame删删除 prrinttf(""请输入入1或22:nn"); sccanff("%d",&chhoosse);gettchaar(); iff(chhoosse=1) pprinntf("请输输入已存存在的iid号!n""); sscannf(""%s"",fiind);geetchhar(); pp=loocatte(mm,fiind,"idd"); iif(pp!=NNULLL) rr=m; wwhille(rr->nnextt!=pp) rr=r->neext; rr->nnextt=p->neext; ffreee(p); pprinntf("d删删除成功功!nn"); ggetccharr(); ssaveeflaag=11; eelsee pprinntf("无法法找到iid号!n""); ggetccharr(); ellse if(chooosee=22)