客户信息管理系统精品文档20页.doc
如有侵权,请联系网站删除,仅供学习与交流客户信息管理系统【精品文档】第 19 页湖南第一师范学院信息科学与工程学院课程设计报告所 属 专 业: 计算机科学与技术 课 程 名 称: C+课程设计 课程设计名称: 客户信息管理系统 学 号: _14403090102_姓 名: 李碧秋 指 导 教 师: 杨恒伏 伍智平 2015年 12 月湖南第一师范学院课程设计任务书2015 -2016 学年第 1学期院(部) 信息科学与工程学院 专业 计算机科学与技术 班级 14计科1班 课程名称: C+课程设计 设计题目: 客户信息管理系统 完成期限:自 2015 年 12 月 28 日至 2016 年 1 月 8 日共 2 周目的及任务1.掌握面向对象程序设计语言2.C+的基本语法3.掌握C+面向对象设计的思想4.掌握VC+6.0与DEV C+开发工具的使用5.运用标准C+规范设计应用程序6.遵循软件过程的各个环节进行系统分析、设计、实现、集成、测试,并相应给出软件规格说明书等文档。进度安排起止日期工作内容2015.12.28选题,系统背景调查与文献资料收集,实验平台构建2015.12.292015.12.31系统需求分析、系统概要设计、类的设计2016.1.12016.1.4系统详细设计与编码实现2016.1.52016.1.8系统测试与完善、文档整理与课程设计报告撰写主要参考资料1郑莉, 董渊, 何江舟著. C+语言程序设计(第4版)(清华大学出版社, 2010.72(美)梅因等著, 金名等译. 数据结构与面向对象程序设计(C+版)(第4版). 清华大学出版社, 2012.53梅险, 曲蔚, 孙建业编. C/C+程序设计案例教程实验与实训指导. 高等教育出版社, 2014.3指导教师(签字): 年 月 日教研室主任(签字): 年 月 日目 录1. 客户信息系统概述4 1.1 基本要求4 1.2 主要功能4 1.3 设计方法5 1.4 系统开发的目的52. 总体设计52.1 系统功能模块52.2 系统总体框架62.3 类的分类表72.4 系统关键算法流程图83. 系统运行报告.134. 系统评价154.1 系统的特点154.2 系统的缺点154.3 将来可能提出的要求155. 系统调试出现的问题156. 总结167致谢.168. 参考文献169. 源程序17 客户信息管理系统设计报告1. 客户管理系统概述该系统主要处理客户的相关信息。客户信息主要包括:客户编号、客户名称、所在地区、联系方式等内容。地区信息主要包括:编号、名称等内容。完成以下的操作:客户信息、地区信息的录入、修改、删除和查询。1.1 基本要求 程序运行结果正确,操作方便,界面美观,逻辑层次清楚,程序结构合理,文档规范清晰。1.2 主要功能 要求: 1)添加功能:能够对客户和地区信息进行添加。 2) 显示功能:能够对客户和地区信息进行输出,如未找到,显示出相应的提 示信息,如找到,则显示相应信息。 3) 删除功能:能够对客户和地区信息进行删除,如未找到,显示出相应的提示信息。 4)查找功能:能够按编号对客户和地区信息进行查找,如未找到,显示出相应的提示信息。 5)修改功能:能够按编号对客户和地区信息进行修改,如未找到,显示出相应的提示信息。 6)保存功能:能够把客户和地区信息保存为文件。7)读取功能:可将保存在文件中的人员信息读入到当前系统中,供用户使用。1.3 设计方法1)应用系统分析,建立该系统的功能模块框图以及界面的组织和设计;2)分析系统中的各个实体与他们之间的关系;3)根据问题描述,设计系统的类层次;4)完成类层次中各个类的描述;5)完成类中各个成员函数的定义;6)完成系统的应用模块;7)功能调试。1.4 系统开发的目的 1. 熟练掌握C+语言的基本知识和技能; 2. 基本掌握面向对象程序设计的基本思路和方法; 3. 利用所学的基本知识和技能,解决简单的面向对象程序设计问题; 4. 设计一个含有最基本功能的客户信息管理系统。2. 总体设计2.1 系统功能模块 根据问题描述和要求,系统要求能够按编号显示、查找、增加、删除和保存客户、地区的信息,确定程序至少应该具备如下功能:“录入客户和地区信息、”“查询客户和地区信息”、“增加客户和地区信息”、“删除客户和地区信息”、“修改客户和地区信息”、“输出客户和地区信息”、“数据存盘”基本模块。 系统既然具有“数据存盘”功能客户数据可以保存到磁盘文件,那么也就意味着可以从磁盘文件读出客户数据,所以系统增加了“客户数据装入”模块,以方便用户使用、避免数据重复录入,并定义客户数据文件名:Xinxi.dat。 考虑到根据编号查找人员信息功能在“删除客户和地区”、“修改客户和地区”“输出客户和地区信息”、等模块都使用,所以可以考虑设置为一个模块。 如下图:删除信息修改信息查找Find输出信息管理员添加信息查找信息保存信息 2.2 系统总体框架 使用面向对象的程序设计思想进行分析,整个系统涉及两大类信息和操作,客户、地区。所以系统涉及四个大类:信息类Xinxi(基类)、客户类customer(继承类)、地区类area(继承类)、管理类(友元类)。系统的总体框架就是管理类的定义,主函数中定义一个管理对象,循环显示主菜单并根据用户选择调用管理类的成员函数。 (1)信息类Xinxi:考虑系统操作的客户信息的数量具有不确定性,所以考虑使用链表保存、处理客户信息。因为客户和地区信息都包括了地区编码和地区名称,所以信息类包含私有数据成员:编号No1、名称Name1、指针域next以及类别Duty,Duty用来区分是客户信息还是地区信息,并且考虑到客户和地区信息的输入输出,信息类需要定义公共成员函数以便供客户类和地区类继承使用。 (2)地区类area:地区类是信息类的公共继承类,继承了信息类的数据成员和成员函数,所以地区类不需要再定义其他数据成员和成员函数。 (3)客户类customer:客户类是信息类的继承类,客户类包括的信息除了地区编码和地区名称还包括客户本身的编码,名称及联系方式,所以客户类里需要另外定义数据成员客户编码No2、客户名称Name1、联系方式num. (4)管理类manger:管理类是信息类的友元类,以便访问信息类的私有数据成员和成员函数,在管理类中分别定义添加信息,删除信息,输出信息,查找信息,保存信息,修改信息等函数。2.3 类的层次图类名信息类(基类)Xinxi数据成员No1,Name1,Duty,next成员函数Input,Output类名地区类(继承类)area数据成员No1,Name1,Duty,next成员函数Input,Output类名客户类(继承类)customer数据成员No1,Name1,Duty,next,No2,Name2成员函数Input,Output类名管理类(友元类)manger数据成员 Xinxi *PL成员函数 Clear() manger() Delete() Save() Print() Search() Modify() Load() 1.Xinxi 类的No1-地区编号,Name1-地区名称,Duty-信息类别,next-指向下一个客户和地区的信息;Xinxi类的Input(),Output()定义为纯虚函数分别表示输入和输出信息,由于定义纯虚函数,所以Xinxi是抽象类,具体输入,输出信息由派生类完成。 2.各个派生的类,包含本类对象特有的数据,继承基类共同的数据。 3.友元类定义各个函数: void Add(); /添加void Delete(); /删除void Modify(); /修改void Search(); /查找void Print(); /输出void Save(); /存盘void Load(); /装入 void Clear();其中: (1)Clear()用于清除人员链表所有结点。 (2)Add(),Delete(),Modify(),Print(),Search(),Save(),Load()分别表示系统各个功能模块:增加信息,删除信息,修改修改,输出信息,查询信息,数据存盘,数据装入。2.4 系统关键算法流程图 开始(1)主函数流程 创建管理对象 显示菜单 接受输入 根据输入进行操作 输出 结束(2)manger:Add() 开始 选择输入类别输入数据,创立新结点结点加入链表结束 开始(3) manger:Delete() 选择删除类别 查找要删除结点结点存在提示未找到链表删除结点 结束 开始(4) manger:Modify选择修改类别 查找结点结点存在修改结点提示未找到结束(5) manger:Save() 开始打开数据文件遍历链表保存数据 关闭文件打开数据文件保存数据文件关闭文件结束开始选择输出类型(6) manger:Print()查找结点结点存在提示未找到输出信息结束 开始(7) manger:Search() 选择查找类别查找结点 结点存在 提示未找到 输出信息 结束开始(8) manger:Load()打开文件读取基础数据关闭文件打开文件读取每一条记录文件未结束根据人员类型创立结点链表加入结点关闭文件读取下面一行记录 关闭文件结束3.系统运行报告(1)管理界面(2)输入信息(3)输出信息(4)删除信息(5)修改信息(6)查找信息(7)信息存盘4系统评价 本部分具体从三方面阐述:优点、缺点以及将来可能提出的要求。4.1 系统的特点 1.流程符合客户管理系统的基本要求。 2.操作简单、方便。 3.系统扩充容易。由于资料有限,有很多地方还需要更好的完善。4.2 系统的缺点 1.界面不太美观、友好,输出和查找时数据和对应的信息没有对齐显示,查看时不太方便。 2.同时输入客户信息和地区信息时,不能同时输出查看,只能查看首先录 入的信息;同时输入多个地区信息时不能全部保存,只能显示第一次输入的信息;当输入客户信息而没输入地区信息时,查看地区信息时并不会提示没有信息,而是将客户信息输出。总之,只能实现客户信息和地区信息的分别输入和显示。 3.文件保存功能没有实现,打开文件时没有任何记录。4.3 将来可能提出的要求 1.要求界面更加完美 ,阅读起来方便易懂。 2.要求客户信息和地区信息可以结合在一起,实现同时输入、同时保存、同时输出。 5.系统调试出现的问题 1.编译程序时没有显示任何错误,但是执行时系统会出现程序停止运行的情况,我认为是系统没有为我在删除函数里定义的指针q开辟空间,如下:Xinxi q;q=p;delete q;p=p->next;然后我换了另外一种方法,如下:p2->next=p1->next; /连接delete p1;cout<<"正确删除!n" 2.程序编译时会出现没有主函数的错误,原因是括号没有正确匹配。 3.程序运行时出现无限循环,是因为输出函数没有终止语句break.6. 总结在这次课程设计中我终收获颇多,让我对编程有了新的认识,平时很少上机,总是在看程序,满足于看懂程序,因此离自己会编程序还有一段差距, 这次课程设计虽然老师给了参考模板,但是这只是一种思路,需要我们根据自己的问题完善程序,这使得我不得不自己写,看了几遍程序,基本理解了编程的方法,虽然一开始出现了很多错误,但是经过多次分析与修改,最后完成了程序要求。其次,在编程之前一定要思考,给自己规划好步骤,我在第一周编程时没有认真阅读问题要求,以为只要对客户信息进行操作,在第二周我已经编好程序准备写设计报告时才发现自己看错了,所以星期二下午和星期三我又在之前的基础上重新编了这个程序,导致设计报告写的有些仓促,所以,我们在编程之前一定要认真阅读题目,分析设计要求,理清思路,这样后面编程时才能顺利进行。所以这次的课程设计让我用了一个相对比较集中的时间去练习我的编程,特别是自己的动手能力,加深了对类和对象的理解,提高了自己分析问题、运用所学知识解决问题的能力,并培养了基本的设计技能。7致谢在这次课程设计中,老师和同学们给了我很大的帮助,在此表示衷心的感谢和诚挚的谢意。 8. 参考文献 1. 1谭浩强. C+面向对象程序设计(第2版第二版)M. 清华大学出版 社,2014. 2. 1彭召意,朱艳辉,周玉. C+面向对象程序设计课程的实践教学研究J. 计 算机教育, 2015, (5): 151-1549. 源程序#include<fstream.h>#include<string.h>class Xinxi protected: int No1; /编号char Name120; /名称int Duty;Xinxi *next; /指针域public: Xinxi ()next=0; /指针域设置为空virtual Xinxi() virtual void Input()=0; /从键盘输入数据 virtual void Input(ifstream& ifs)=0; /从文件输入信息 virtual void Output()=0; /向屏幕输出信息 virtual void Output(ofstream& ofs)=0; /向文件输出信息friend class manger;class customer: public Xinxi /客户继承类class area: public Xinxi /地区继承类class manger /管理员private: Xinxi *PL;void Clear();int manger:Find(int ID,Xinxi *p1,Xinxi *p2);public:manger(); /构造manger(); /析构void Add(); /添加void Delete(); /删除void Modify(); /修改void Search(); /查找void Print(); /输出void Save(); /存盘void Load(); /装入manger:manger() /构造(创建一个头结点的链表)customer *p=new customer;PL=p;cout<< "自动装入数据.n"Load();manger:manger() /析构函数(仅保留一个头结点)Xinxi *p=PL;while(p)PL=p->next; delete p; p=PL;void manger:Add() cout<<"n*增加信息*n" Xinxi *p =PL; while(p->next)p=p->next; int ch; cout<<"选择信息类别1-地区信息,2-客户信息:" cin>>ch; /创建新结点,录入数据,连接到链表 area *ar; customer *cu; switch(ch) case 1: ar=new area; ar->Input(); p->next=ar; break; case 2: cu=new customer; cu->Input();/*p->next=cu; break; default: return;void manger:Clear() Xinxi *p=PL->next; while(p) PL->next=p->next; delete p; p=PL->next;int manger:Find(int ID,Xinxi *p1,Xinxi *p2)*p1=PL->next;*p2=PL;while(*p1)if(*p1)->No1=ID)break; /找到else*p2=*p1; /继续查找*p1=(*p1)->next;return *p1?1:0;void manger:Delete() cout<<"n*删除信息*n" int No; Xinxi *p1,*p2; Xinxi *p=PL->next; int ch; cout<<"输入删除的类型0-地区信息,1-客户信息:" cin>>ch; cout<<"编号:" cin>>No;switch(ch) case 0: if(!Find(No,&p1,&p2) cout<<"对不起,您需要的地区信息没有找到!n" else p2->next=p1->next; /连接 delete p1; cout<<"正确删除!n" break; case 1: if(!Find(No,&p1,&p2) cout<<"对不起,您需要的客户信息没有找到!n" else p2->next=p1->next; /连接 delete p1; cout<<"正确删除!n" break; default: return;void manger:Modify()cout<<"n*修改信息*n"int No;int ch;Xinxi *p1,*p2; Xinxi *p=PL; cout<<"输入修改的类型0-地区信息,1-客户信息:"cin>>ch;cout<<"编号:"cin>>No;while(p->next)switch(ch) case 0: if(!Find(No,&p1,&p2) cout<<"对不起,您需要的地区信息没有找到!n" else p1->Output(); /输出原来地区信息 p1->Input(); /输入新的地区信息 cout<<"地区信息修改完成!n" break; case 1: if(!Find(No,&p1,&p2) cout<<"对不起,您需要的客户信息没有找到!n" else p1->Output(); /输出原来客户信息 p1->Input(); /输入新的客户信息 cout<<"客户信息修改完成!n" break; default: return; p=p->next;void manger:Print() cout<<"n*输出信息*n" int No; int ch; Xinxi *p1,*p2; Xinxi *p=PL->next; cout<<"输入输出的类型0-地区信息,1-客户信息:" cin>>ch; cout<<"编号:" cin>>No; switch(ch) case 0: if(!Find(No,&p1,&p2) cout<<"对不起,您需要的地区信息没有找到!n" else cout<<"n* 地区信息表 *n" cout<<" 地区编号 地区名称n" p->Output(); p=p->next; cout<<"正确输出!n" break; case 1: if(!Find(No,&p1,&p2) cout<<"对不起,您需要的客户信息没有找到!n" else cout<<"n* 地区信息表 *n" cout<<" 客户编号 客户名称 联系方式 地区编号 地区名称 n" p->Output(); p=p->next; cout<<"正确输出!n" break; default: return;void manger:Save()ofstream f("Xinxi.dat",ios:out);/打开文件/遍历输出文件Xinxi *p=PL->next;while(p) p->Output(f);p=p->next;f.close(); /关闭文件cout<<"信息已经保存在Xinxi.dat.n"void manger:Load() char buf81; /临时空间 int Duty; Xinxi *p2; /新建结点的指针 long t; /读写位置 /清除现有结点 Clear(); ifstream f("Xinxi.dat",ios:in); /打开文件 Xinxi *p=PL; /建立结点,读数据while(1)t=f.tellg();f>>buf>>buf>>Duty;if(f)switch(Duty) case 0:p2=new area;break; case 1:p2=new customer;break; default:f.close();return;p->next=p2;/创立新结点p=p->next;f.seekg(t);p->Input(f); break;f.close(); /关闭文件void manger:Search() cout<<"n*查找信息*n" int No; Xinxi *p1,*p2; Xinxi *p=PL->next; int ch; cout<<"输入查找的类型0-地区信息,1-客户信息:" cin>>ch;cout<<"编号:"cin>>No;switch(ch) case 0: if(!Find(No,&p1,&p2) cout<<"对不起,您需要的地区信息没有找到!n" else cout<<"n* 地区信息表 *n" cout<<" 地区编号 地区名称n" p->Output(); p=p->next; cout<<"正确查找!n" break; case 1: if(!Find(No,&p1,&p2) cout<<"对不起,您需要的客户信息没有找到!n" else cout<<"n* 客户信息表 *n" cout<<"客户编号 客户名称 联系方式 地区编号 地区名称n" p->Output(); p=p->next; break; default: return;void main () char ch; manger man; ch=1;docout<<"1-录入信息n"cout<<"2-删除信息n"cout<<"3-修改信息n"cout<<"4-查找信息n"cout<<"5-输出信息n"cout<<"6-数据存盘n"cout<<"7-数据装入n"cout<<"8-退出t请选择(1-8):" cin>>ch;switch(ch)case'1':man.Add(); break;case'2':man.Delete(); break;case'3':man.Modify(); break;case'4':man.Search(); break;case'5':man.Print(); break;case'6':man.Save(); break;case'7':man.Load(); break;while(ch!='8');