资源描述
湖南第一师范学院信息科学与工程学院
课程设计报告
所 属 专 业:计算机科学与技术
课 程 名 称: 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.29-2015。12.31
系统需求分析、系统概要设计、类的设计
2016.1。1—2016。1。4
系统详细设计与编码实现
2016。1.5—2016.1.8
系统测试与完善、文档整理与课程设计报告撰写
主要参考资料
[1]郑莉, 董渊, 何江舟著。 C++语言程序设计(第4版)(清华大学出版社, 2010.7
[2](美)梅因等著, 金名等译。 数据结构与面向对象程序设计(C++版)(第4版)。 清华大学出版社, 2012。5
[3]梅险, 曲蔚, 孙建业编。 C/C++程序设计案例教程实验与实训指导. 高等教育出版社, 2014。3
指导教师(签字): 年 月 日
教研室主任(签字): 年 月 日
目 录
1。 客户信息系统概述4
1。1 基本要求4
1。2 主要功能4
1.3 设计方法5
1。4 系统开发的目的5
2.总体设计5
2。1 系统功能模块5
2。2 系统总体框架6
2。3 类的分类表7
2。4 系统关键算法流程图8
3。 系统运行报告..。。。...。。。。.....。。。。.。。。。。。..。。。。.。。。.。。.。。。。。。。。.。。。。。.....。。。...。.。..。。...。。.。..。。.。.。。。。。。..。。.13
4. 系统评价15
4。1 系统的特点15
4。2 系统的缺点15
4。3 将来可能提出的要求15
5。 系统调试出现的问题15
6. 总结16
7.致谢。.。。。..。..。。。.。。。。.。。.。..。。..。。。。。。。..。。.。。。。。.。。。.。。。。...。..。。...。。。。。.。。。。。。.。.。。。。.。。.。。...。.。...。。。.。.。.。。。。。。....。。。。。。。。.。..。。。。..。。。。16
8。 参考文献16
9。 源程序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—154
9. 源程序
//////////////////////////////////////////////////////////////////////////
#include〈fstream.h〉
#include〈string.h〉
class Xinxi
{protected:
int No1; //编号
char Name1[20]; //名称
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 buf[81]; //临时空间
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;
do
{
cout<〈”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');
}
22
展开阅读全文