基于C++实现(控制台)通讯录系统【100010546】

您所在的位置:网站首页 退出view模式 基于C++实现(控制台)通讯录系统【100010546】

基于C++实现(控制台)通讯录系统【100010546】

2023-06-18 01:18| 来源: 网络整理| 查看: 265

大类基础课程大型实验

实验题目 通讯录系统

大型实验的内容

​ 通讯录系统可帮助使用者管理归纳通讯录名单,达到添加,删除,修改,保存等需求。要求使用学习过的 C/C++ 程序设计的知识完成通讯录系统的设计与实现。

实验课题分析(主要的模块功能、流程图)

通讯录系统的主要功能

​ 通讯录主要功能为:添加通讯录成员,修改成员,删除成员,按需求搜索查看成员,保存为文档。

在这里插入图片描述

系统各模块的功能具体描述为:

添加成员模块

​ 提供界面让使用者输入希望加入的通讯录成员的各类信息(姓名,电话,住址, QQ,邮箱等),并检查格式是否有误。若格式无误,则将该通讯录信息通过二进制文件方式储存在./contact 文件目录下。

修改成员模块

使用者可以重写已有的通讯录成员,增加或删除除姓名以外的各个信息。一条通 讯录成员可以拥有多个电话号码或 QQ。

删除成员模块

使用者可以选择某个不希望继续使用的通讯录成员并删除他们。

搜索查看成员模块

使用者通过各种方式查询已添加的通讯录成员,并决定是否修改或删除它们。提 供的方法有:精准查询,模糊查询,按分类查询等。

系统分析及设计

系统开发使用 Template Method 设计模式和 Strategy Patten 两种设计模式,较好的封装所需函数,使得主程序入口开发环节只需关注 Contact.h 头文件即可实现。具体类之间的耦合关系见下图:

(注:由于程序更新迭代较快,具体程序实现详情请在项目中查看。该图只呈现一个大致的走向。)

系统的实现

类的编写

系统工程名为:contacts。包含类:Person, Contact, ContactInterface, ContactInit 等

具体类结构声明如下:

Person 类:

class Person { Public: char name[MAXNAME]; char sex; char tel[MAXTEL]; char addr[MAXADDR]; char zip[MAXZIP]; char mail[MAXMAIL]; char qq[MAXQQ]; char category[MAXCTGY]; Person(); ~Person(); };

ContactInterface 类

class CheckInterface { public: bool check(Person&, const bool _check_repe) const; bool check_exact(const Person&, const string) const; virtual ~CheckInterface() {}; private: vector part_tq(const Person&, const char* const) const; };

ContactInit 类

class ContactInit { public: virtual int refresh() const = 0; virtual void welcome() const= 0; virtual ~ContactInit() {}; };

Contact 类

class Contact : public ContactInterface, public ContactInit { private: MainStrategy* setMainStrategy(int); public: Contact(); ~Contact(); int refresh() const; void welcome() const; };

MainStrategy 类

class MainStrategy : public CheckInterface { public: MainStrategy(); virtual ~MainStrategy(); virtual int doMainStrategy() = 0; protected: void printAll() const; void print_prsn(const Person&, const string, bool) const; bool delete_prsn(Person&) const; int modify_prsn(Person&) const; //Way to modify a spefic Person member, with 0->success, -1->fail };

MainViewMenuInterface 类

class MainVewMenuInterface : public MainStrategy { public: private: ViewStrategy* viewStrategy; virtual ViewStrategy* setViewStrategy(int) = 0; virtual int view(Person* v_Person) const; public: MainVewMenuInterface(); virtual ~MainVewMenuInterface(); virtual int doMainStrategy(); };

(注:由于程序涉及类过多,在此只列举少数几个。更多类定义请在项目中查看。)

类的关系设计

各类的具体功能和说明如下:

class Person; 提供基本的数据存储结构。 class ContactInterface; 提供主函数菜单,策略选择方法。是Contact类的一个接口,MainStrategy的调用者。 class ContactInit; 提供初始化程序所需函数。同样是Contact类的一个接口。 class Contact; 具体实现了两个接口的方法。MainStrategy的决策者。同时面向调用者(main.cpp)。但注意Contact不提供任何public方法。需要通过两个接口调用。 class CheckInterface; 提供检查函数。 class MainStrategy; Strategy Patten设计模式。同时包含子类公用的方法。 class MainNewMenu; class MainDelMenu; class MainMdfMenu; 分别override doMainStrategy()函数,实现新建,删除,修改功能。 class MainVewMenuInterface; override doMainStrategy()函数,ViewStrategy的调用者。 class MainVewMenu; ViewStrategy的决策者。 class ViewStrategy; Strategy Patten。 class ViewAllMenu; class ViewExactMenu; class ViewFuzzyMenu; class ViewCategoryMenu; 分别override doViewStrategy()函数,实现所有查找,精确查找,模糊查找,按类查找功能。

通讯录实现流程图:

交互界面以及登录菜单的实现

系统运行开始的界面如图所示:

图 5 开始登录界面

主要通过选择结构和循环结构实现界面的前进和后退。例如,第一个登录界面出现 5 个选择:1.新建,2.删除,3.修改,4.浏览,5.退出

实验调试、测试、运行记录及分析

​ 系统在调试测试过程中遇到若干问题,不过经过仔细反复的检查已经消除各种漏洞。

主要的测试经过如下:

在开始界面输入“1”即添加新的成员:

若显示 Information Entry Success! 则录入数据成功。若显示 Information Error! 则录入数据失败。如图则因为在电话(TEL)中出现了中文字符。随后将返回主界面。

在主界面输入 2

可删除成员:

如我们希望删除(2)数据,则键入 2:

就可以得到(2)的详细数据。输入 y/n 即可选择是否删除该成员。随后程序将返回主界面。

在主界面下输入 3 可以修改已有的成员:我们希望修改刚刚加入的成员(1)的电话号码,同时加入他所有常用的 QQ 号码:

键入 1, 并按照需求修改信息:

确认无误后即可修改信息。随后返回主界面

输入 4 即可按需求分类查看搜索成员:

键入 1 进行精准匹配,该模式下只匹配名字:如输入“严恩伟”后匹配信息如图:

随后可以根据自身需求选择 1-3 选项。此处不再演示。

在 view 模式下键入 2 进行模糊匹配,该模式匹配名字,电话,地址。只要出现匹配字符即给与显示。如输入“181”后显示:

选择 1-3 即可进入其详细页面。此处不再演示。

在 view 模式下键入 3 进行分类(category)匹配。该模式会列出所有的分类,并可根据用户选择的分类进行罗列(其中未设置的分类被标记为 Unset):

根据提示选择 1-2 即可进入相应页面。选择 0 即可退出。

在 view 模式下键入 4 进行全局匹配。该模式会列出所有的成员:

在 view 模式下键入 5 退出 view 模式。

在主菜单中键入 5 退出程序。

实验总结(优点、不足、收获及体会)

在设计项目的过程中,优秀的框架构建比函数代码更为重要。在项目制作过程中,若最初的框架有缺陷,很容易陷入到重构的环节,耗时巨大。优秀的框架应该要做到分离库文件(类)和主程序,功能函数之间依赖程度低。在项目制作的过程中,最初并没有设计抽象类作为接口。逐渐发现 Contact 类变得臃肿而不可理解,因此使用接口等方式将各职分细化。

面向接口的编程。编程的同时应该逐渐养成一种时间观,即,这个项目在未来是否会有增加/删减的工作。如果有,则应该通过抽象类作为接口使部分核心控制代码得到很好的复用。项目设计过程中使用了 Template Patten 和 Strategy Patten 两种设计模式,使代码复用性得到了增强。

日后维护如何添加/删除功能:项目的架构使日后维护该工程,添加或删除功能变得十分方便。如在主菜单(View 子菜单)中添加新的功能 Test:1.创建类 MainTestMenu.h(ViewTestMenu.h)并继承 MainStrategy.h(ViewStrategy.h),在纯虚函数 doMainStrategy()[doViewStrategy()]中实现该功能。如有必要可将该功能的具体实现部分放置在 MainStrategy(ViewStrategy)的 protected 方法中以供其他平级类成员调用。2.在 Contact::Contact()[MainVewMenu::MainVewMenu()]构造函数中将 MainFunctionsNum(ViewFunctionsNum)加一。3.在 Contact::setMainStrategy()[MainVewMenu::setViewStrategy()]中新加一行 case n: return new MainTestMenu()[ViewTestMenu()]。4.修改主菜单界面:修改文件.\io\MainMenu.io(.\io\ViewMenu.io)。即可添加功能。

少用全局函数。经量减少将变量的作用域范围扩大到整个文件范围,甚至在其他文件中通过 extern 调用。如果有,也应详细标明其作用。因为此类变量对理解整个程序项目而言相当不利。它可以被到处修改,导致程序可读性变差。通过函数参数传递是一个很好的解决方案。

多使用 const 修饰。可以有效防止不应该被修改的参数被无疑篡改。同时在函数中使用 const 可以增强函数的可理解性。明确哪些符号是变量,哪些符号是常量。在类中对不会影响私有数据的函数声明为 const,让其可服务于实例化为常量的对象。

因为程序在最初架构时就以 char[]作为储存信息的基本单元,导致程序对中文的支持程度不高(如不能按照中文进行排序等)。而如果中途重构为 wchar_t[]的基本单元则会大大加大工作量。

♻️ 资源

在这里插入图片描述

大小: 1.06MB ➡️ 资源下载:https://download.csdn.net/download/s1t16/87400398



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3