程序分析报告_第1页
程序分析报告_第2页
程序分析报告_第3页
程序分析报告_第4页
程序分析报告_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第PAGE1页共22页《管理信息系统》课程设计报告设计题目简单的职工管理系统专业工程管理班级082班姓名许睿龙学号04108217完成日期2011年12月31日

目录1.系统分析………………22.系统设计………………43.系统实施………………64.总结…………………85.参考文献………………9附录程序源代码…………9简单的职工管理系统一、系统分析1.需求分析1.1需求分析1.1.1系统功能对单位的职工进行管理,包括创建职工信息、插入、删除、查找、排序、修改等功能。1.1.2系统意义该系统的应用范围比较广泛,我设计的系统主要使用线性表对职工的相关信息进行管理,用C++语音进行编程,包含了管理职工信息常进行的操作:创建、查找、插入、排序、修改、删除等,从而实现了对职工信息的管理。1.2可行性分析1.2.1设计一个菜单,通过菜单选择实现相应的操作。对于输入的原始信息,使用线性表进行存储。这样的好处是,可以随时增加内容,也容易将职工信息删除、修改等操作。由键盘输入职工对象,以文件方式保存。程序执行时先将文件读入内存。对职工对象中的姓名按字典顺序进行排序,对排序后的职工对象进行增、删、查询、修改、排序等操作。需显示原始信息时,也通过直接显示链表信息的方法实现。这几种数据的显示均通过一个显示函数完成。1.3软件结构1.3.1系统模块划分1.3.1功能模块程序除了主函数之外,函数还定义了另外九个函数:1.信息创建函数:LinkCreate(LinkHead);2.修改函数:LinkModify(LinkHead);3.删除函数:LinkDel(LinkHead)4.查找函数:LinkSearch_Unique(LinkHead);boolSearch(LinkHead);5.文件保存函数:voidSave_ByFile(LinkHead,fstream&ofile);6.代码排序函数:LinkSort(LinkHead);7.输出函数:voidDisplay_List(LinkHead);LinkDisplay(LinkHead);voidDisplay_Node(LinkpNode);8."姓名"按字典顺序排序函数:LinkSortName(LinkHead);9.插入函数:LinkInsert(LinkHead);10.释放链表:voidRelease(LinkHead);菜单设计如下:1.载入信息2.修改信息3.删除信息4.信息查询5.信息保存6.代码按升序排列7.信息显示8.姓名按字典升序排9.插入信息0.退出系统流程图如下:控制菜单↓创建职工信息↓信息保存↓信息的排序↙↓↓↘信息的插入信息的删除信息的修改信息的查询↘↓↙信息的输出1.3.2相关数据表2-3职工信息表列名数据类型长度可否为空职工代码intNotnull职工姓名stringNotnull职工出生年份intNotnull职工性别int Notnull职工职务intNotnull职工部门intNotnull职工工资unsignedintNotnull二、系统设计2.1数据结构与算法描述2.1.1数据结构:structEmployee{//声明职工的结构作为链表节点。//数据域 intm_Code; stringm_Name;intm_Year; intm_Sex; intm_Post; intm_Department; unsignedintm_Wage; //链表节点的指针域 structEmployee*Next;};typedefstructEmployeeNode;typedefNode*Link;2.1.2算法描述:程序除了主函数之外,函数还定义了另外九个函数:1.职工信息链表的建立:首先创建一个带头结点的空链表:(1)生成一个新的结点;(2)用前插法添加数据;(3)while语句实现建表过程,用一指针指向新生成的接点,读入一个通讯者数据至新接点的数据域,将新接点链到尾接点之后,使尾指针指向新接点,结束建表提示(N\Y)。2.修改:检索某个职工对象,对其某些相关信息进行修改,按提示输入职工代码,调用查找函数,如果找到则返回要找的结点的前驱,之后进行修改,反之,显示没找到此职工的记录,无法修改。3.通讯记录的删除:先输入职工的代码,再调用查找函数,查到要删除的接点,删除接点即可。4.在职工信息表中查找指定结点:首先输入要查找的通讯者的部门和姓名,从表头顺序访问表中结点。成功则返回指向查找到的通讯者信息的接点。失败,返回。5.载入文件。6.按职工代码进行升序排列:数据结点数少于两个则不用排序,否则依次比较进行升序排列。7.链表的输出:将第一个结点指针赋给一个指针变量Ptr,然后用Ptr向后扫描,直至表尾,Ptr为空为止。8.对职工对象中的"姓名"按字典顺序进行升序排列:数据结点数少于两个则不用排序,否则对姓名字段进行比较,进行升序排列。9.职工信息的插入:链表接点的插入,将一个职工数据结点按其姓名的字典序插入有序职工信息表的相应位置,以保证职工信息表的有序性。插入接点的思想是:使用两个指针P1P2分别指向当前刚访问过的接点和下一个待访问的接点,循环顺序查找链表,寻找插入接点的位置,P1指向待插入位置的前一个接点。职工信息管理职工信息管理信息创建待查信息信息修改添加数据创建空链表信息删除信息排序信息插入查询函数调用删除结点输入待删信息输入新信息信息显示姓名字典序排按代码排序信息排序查询函数调用查询函数调用图3-1总体结构设计框图图3-1总体结构设计框图三、系统实施3.1调试体会3.1.1测试结果与分析1.载入职工信息,选择相应的菜单项进行相关操作,选择菜单项6,排序结果如图4-1:图4-12.选择菜单项2,对信息进行修改:如图4-2图4-2显示结果如图4-3:图4-33.插入一条信息,操作如图4-4:图4-4显示如图4-5:图4-55.查询刚才添加的信息,显示结果如图4-6:图4-66.删除刚才添加的信息,操作如图4-7:图4-7信息显示如图4-3。7.退出程序,操作0。四、总结该程序虽然设计目标明确,但牵涉到的函数比较多,代码也相对较长,初开始把所有代码都输完后,编辑后出现许多错误,一时无从下手,虽不是第一次做这么大的程序,自己还是有些迷茫许多错不知怎么改,经过老师和同学的帮助,自己课上及课下多次调试,慢慢地学会了改错,在此过程中,我不断地翻阅课本,对一些概念有了更深的了解,也学会了许多,最终把参考书上的程序调试了出来。这时才发现,书中代码还是有很大缺陷的,在此基础上我修改了很大一部分代码,之后,我加入了自己的代码,又加入了几个的函数,经过一翻努力,也调试了出来。该程序的拓展空间很大,但由于时间紧,没来得急做更大的改造,只是在时间允许的条件下,做了自己能做的。以后有时间我还会继续做,争取使该程序更加完善。总之,做过该程序后,我的感触很深,虽是短短的一段时间我却学到了许多以前不知道的东西,由于该程序覆盖面比较广,也进一步加深了我对课本内容的理解。五、参考文献苏仕华等.《数据结构课程设计》.北京:机械工业出版社,2005.5.附录程序源代码#include<string>#include<iostream>#include<fstream>#include<iomanip>#include<memory.h>#include<stdio.h>#include<conio.h>#include<stdlib.h>usingnamespacestd;;structEmployee{//声明职工的结构作为链表节点。//数据域 unsignedintm_Code; stringm_Name;unsignedintm_Year; unsignedintm_Sex; unsignedintm_Post; unsignedintm_Department; unsignedintm_Wage; //链表节点的指针域 structEmployee*Next;};typedefstructEmployeeNode;typedefNode*Link;//函数声明LinkCreate(LinkHead);voidRelease(LinkHead);boolSearch(LinkHead);LinkSearch_Unique(LinkHead);LinkDisplay(LinkHead);voidDisplay_List(LinkHead);voidDisplay_Node(LinkpNode);LinkModify(LinkHead);LinkDel(LinkHead);voidSave_ByFile(LinkHead,fstream&ofile);LinkSort(LinkHead);LinkInsert(LinkHead);LinkSortName(LinkHead);//函数实现LinkCreate(LinkHead){//创建一个带头节点的空链表。 Head=(Link)newNode; if(!Head) { cout<<"分配内存失败!"<<endl; returnNULL; } Head->m_Code=0; Head->m_Name=""; Head->m_Year=0; Head->m_Sex=0; Head->m_Post=0; Head->m_Department=0; Head->m_Wage=0; Head->Next=NULL; returnHead;}voidRelease(LinkHead){//释放链表。 Linkptr;//声明一个操作用的指针。 while(Head!=NULL) { ptr=Head; Head=Head->Next; deleteptr;//释放节点资源。 }}LinkInsert(LinkHead)//插入一个职工的相关信息{ intn; LinkpNew,p1,p2;//声明一个新节点。 p1=Head;p2=p1->Next; charagain; fstreamiofile; intcode,year,sex,post,department; stringname; unsignedintwage; do { pNew=(Link)newNode; //数据域。 cout<<"请输入职工代码:"; cin>>code; cout<<endl<<"请输入职工姓名:"; cin>>name; cout<<endl<<"请输入职工出生年份:"; cin>>year; while(year<1900||year>2000) { cout<<"请输入正确的出生年份。"<<endl; cin.clear(); fflush(stdin); cin>>year; } cout<<endl<<"请输入职工性别:"<<"1--男2--女"<<endl; cin>>sex; while(sex<1||sex>2) { cout<<"请输入正确的性别。"<<"1--男2--女"<<endl; cin.clear(); fflush(stdin); cin>>sex; } cout<<endl<<"请输入职工职称:"<<"11--助理漫画师12--漫画师13--编辑14--知名编辑"<<endl; cin>>post; while(post<11||post>14) { cout<<"请输入正确的职称代码。"<<"11--助理漫画师12--漫画师13--编辑14--知名编辑"<<endl; cin.clear(); fflush(stdin); cin>>post; } cout<<endl<<"请输入职工部门:"<<"21--集英社22--小学馆23--讲谈社"<<endl; cin>>department; while(department<21||department>23) { cout<<"请输入正确的部门代码"<<"21--集英社22--小学馆23--讲谈社"<<endl; cin.clear(); fflush(stdin); cin>>department; } cout<<endl<<"请输入职工工资:"; cin>>wage; while(cin.fail()) { cout<<"请输入正确的工资数据。"<<endl; cin.clear(); fflush(stdin); cin>>wage; } cout<<endl; pNew->m_Code=code; pNew->m_Name=name; pNew->m_Year=year; pNew->m_Sex=sex; pNew->m_Post=post; pNew->m_Department=department; pNew->m_Wage=wage; //指针域。 while(p2!=NULL&&(p2->m_Name<pNew->m_Name)) { p1=p2; p2=p2->Next; } p1->Next=pNew; pNew->Next=p2; n++; cout<<"数据插入成功!返回(输入N)"<<endl; cin>>again; }while(again=='Y'||again=='y'); returnHead; }boolSearch(LinkHead){//查询同时满足"姓名"和"部门"的职工信息。 Linkptr; intdepartment,code; ptr=Head->Next; cout<<endl<<"请输入职工部门:"<<"21--集英社22--小学馆23--讲谈社"<<endl; cin>>department; while(department<21||department>23) { cout<<"请输入正确的部门代码"<<"21--集英社22--小学馆23--讲谈社"<<endl; cin.clear(); fflush(stdin); cin>>department; } cout<<endl<<"请输入职工代码:"; cin>>code; cout<<endl<<"查询结果"<<endl; while(ptr) { if((ptr->m_Department==department)&&(ptr->m_Code==code)) { Display_Node(ptr);//打印满足条件的节点。 returntrue; } ptr=ptr->Next;//查询下一节点。 } cout<<"无此职工的信息。"<<endl; returnfalse;}LinkSearch_Unique_Front(LinkHead){//查询满足"职工代码"的职工信息(职工代码必需唯一)。 Linkptr; intcode; ptr=Head; cout<<"请输入职工代码:"; cin>>code; cout<<endl<<"查询结果"<<endl; while(ptr->Next) { if(ptr->Next->m_Code==code){ returnptr;//注意,是返回的查询到的节点的直接前趋节点。 } ptr=ptr->Next;//查询下一节点。 } cout<<"该职工不存在!"<<endl; returnptr;}voidDisplay_List(LinkHead){ Linkptr; ptr=Head->Next; cout<<"================所有职工信息=================="<<endl; if(ptr==NULL) { cout<<"没有信息!"<<endl; } while(ptr) { Display_Node(ptr); ptr=ptr->Next; }}LinkDisplay(LinkHead){LinkpNew;//声明一个新节点。 intn=6; charstr[11]; FILE*fp; intsex,post,department,code,year,wage;stringname;if((fp=fopen("iofile.txt","rt"))==NULL) { printf("\n没有文件!"); getchar(); exit(1); } for(inti=0;i<n;i++) { pNew=(Link)newNode; fread(str,10,1,fp); str[10]=0; code=atoi(str); fread(str,10,1,fp);name=str; fread(str,10,1,fp);year=atoi(str); fread(str,10,1,fp);sex=atoi(str); fread(str,10,1,fp);post=atoi(str); fread(str,10,1,fp);department=atoi(str); fread(str,10,1,fp); wage=atoi(str); //cout<<code<<""<<name<<""<<year<<""<<sex<<""<<post<<""<<department<<post<<""<<wage<<endl;// pNew->m_Code=code; pNew->m_Name=name; pNew->m_Year=year; pNew->m_Sex=sex; pNew->m_Post=post; pNew->m_Department=department; pNew->m_Wage=wage; //指针域。 pNew->Next=Head->Next; Head->Next=pNew;fread(str,1,1,fp);Display_Node(pNew); } returnHead;}voidDisplay_Node(LinkpNode){//在标准输出设备上输出。 cout<<setw(10)<<left<<pNode->m_Code <<setw(10)<<left<<pNode->m_Name <<setw(10)<<left<<pNode->m_Year <<setw(10)<<left<<pNode->m_Sex <<setw(10)<<left<<pNode->m_Post <<setw(10)<<left<<pNode->m_Department <<setw(10)<<left<<pNode->m_Wage<<endl;//setw(10)表示占10个字符位置。}LinkModify(LinkHead){//修改单一个节点。 Linkptr; fstreamiofile; intcode,year,sex,post,department; stringname; unsignedintwage;ptr=Search_Unique_Front(Head); if(ptr->Next) { cout<<"你现在可以修改此职工的信息了"<<endl; //数据域。 cout<<"请输入职工代码:"; cin>>code; cout<<endl<<"请输入职工姓名:"; cin>>name; cout<<endl<<"请输入职工出生年份:"; cin>>year; while(year<1900||year>2000) { cout<<"请输入正确的出生年份。"<<endl; cin.clear(); fflush(stdin); cin>>year; } cout<<endl<<"请输入职工性别:"<<"1--男2--女"<<endl; cin>>sex; while(sex<1||sex>2) { cout<<"请输入正确的性别。"<<"1--男2--女"<<endl; cin.clear(); fflush(stdin); cin>>sex; } cout<<endl<<"请输入职工职称:"<<"11--助理漫画师12--漫画师13--编辑14--知名编辑"<<endl; cin>>post; while(post<11||post>14) { cout<<"请输入正确的职称代码。"<<"11--助理漫画师12--漫画师13--编辑14--知名编辑"<<endl; cin.clear(); fflush(stdin); cin>>post; } cout<<endl<<"请输入职工部门:"<<"21--集英社22--小学馆23--讲谈社"<<endl; cin>>department; while(department<21||department>23) { cout<<"请输入正确的部门代码"<<"21--集英社22--小学馆23--讲谈社"<<endl; cin.clear(); fflush(stdin); cin>>department; } cout<<endl<<"请输入职工工资:"; cin>>wage; while(cin.fail()) { cout<<"请输入正确的工资数据。"<<endl; cin.clear(); fflush(stdin); cin>>wage; } cout<<endl; ptr->Next->m_Code=code;//因ptr是前趋节点,所以要用ptr->Next; ptr->Next->m_Name=name; ptr->Next->m_Year=year; ptr->Next->m_Sex=sex; ptr->Next->m_Post=post; ptr->Next->m_Department=department; ptr->Next->m_Wage=wage; cout<<"修改成功!"<<endl; } else cout<<"没找到此职工的记录,无法修改。"<<endl; returnHead;}LinkDel(LinkHead){ Linkptr; fstreamiofile; Linkptr_front; ptr_front=Search_Unique_Front(Head); ptr=ptr_front->Next; if(ptr) { ptr_front->Next=ptr->Next; deleteptr;//删除此节点。 cout<<"成功删除信息!"<<endl; } else cout<<"没找到此职工的记录,无法删除。"<<endl; returnHead;}voidSave_ByFile(LinkHead,fstream&ofile){ LinkpNode; pNode=Head->Next; ofile.clear();//清除文件结束状态。 while(pNode) { ofile<<setw(10)<<left<<pNode->m_Code <<setw(10)<<left<<pNode->m_Name <<setw(10)<<left<<pNode->m_Year <<setw(10)<<left<<pNode->m_Sex <<setw(10)<<left<<pNode->m_Post <<setw(10)<<left<<pNode->m_Department <<setw(10)<<left<<pNode->m_Wage<<endl;//setw(10)表示占10个字符位置。 pNode=pNode->Next; } cout<<"数据文件保存成功!"<<endl;}LinkSort(LinkHead){//创建的是带头节点的链表。用直接插入法。 if((Head->Next==NULL)||(Head->Next->Next==NULL))//此步条件判断非常有价值。 { cout<<"数据节点数少于2个,不用排序!"<<endl; returnHead; } //第二步; Linkptr; Linkptr_F; Linkptr_N; ptr=Head->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_Code<ptr_F->Next->m_Code) { ptr->Next=ptr_F->Next; ptr_F->Next=ptr; break; }//if else { 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; Display_List(Head); returnHead;}LinkSortName(LinkHead){//创建的是带头节点的链表。用直接插入法。 if((Head->Next==NULL)||(Head->Next->Next==NULL))//此步条件判断非常有价值。 { cout<<"数据节点数少于2个,不用排序!"<<endl; returnHead; } //第二步; Linkptr; Linkptr_F; Linkptr_N; ptr=Head->Next->Next;//ptr指向第二个结点 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_Name<ptr_F->Next->m_Name) { ptr->Next=ptr_F->Next; ptr_F->Next=ptr; break; }//if else { ptr_F=ptr_F->Next; } }//while(ptr_F->Next) if(ptr_F->Next==NULL)//第一个结点值为空 { ptr->Next=ptr_F->Next; ptr_F->Next=ptr;//表示插到有序链表的最后面了

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论