基于C++的通讯录系统的设计与实现
Go to file
Proditio dc0e358c91 Initial commit 2021-10-19 06:45:58 +08:00
src Initial commit 2021-10-19 06:45:58 +08:00
LICENSE Initial commit 2021-10-18 22:47:03 +00:00
README.md Initial commit 2021-10-19 06:45:58 +08:00

README.md

基于C++的通讯录系统的设计与实现

一 需求分析

通讯录系统可帮助使用者管理归纳通讯录名单,达到添加,删除,修改,保存等需求。

二 系统设计

2.1 功能模块设计

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

如下图所示:

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

1、添加成员模块

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

2、修改成员模块

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

3、删除成员模块

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

4、搜索查看成员模块

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

2.2 系统架构设计

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

具体类之间的耦合关系见下图:

类的关系设计如下图所示:

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

  • class Person; 提供基本的数据存储结构

  • classContactInterface; 提供主函数菜单策略选择方法。是Contact类的一个接口MainStrategy的调用者

  • classContactInit; 提供初始化程序所需函数。同样是Contact类的一个接口

  • classContact; 具体实现了两个接口的方法。MainStrategy的决策者。同时面向调用者main.cpp。但注意Contact不提供任何public方法。需要通过两个接口调用

  • classCheckInterface; 提供检查函数

  • classMainStrategy; Strategy Patten设计模式。同时包含子类公用的方法

  • classMainNewMenu; class MainDelMenu; class MainMdfMenu; **分别override **doMainStrategy()函数,实现新建,删除,修改功能

  • classMainVewMenuInterface; **override **doMainStrategy()函数ViewStrategy的调用者

  • classMainVewMenu; ViewStrategy的决策者

  • class ViewStrategy; StrategyPatten

  • classViewAllMenu; class ViewExactMenu;

**class ViewFuzzyMenu; class ViewCategoryMenu; **分别override **doViewStrategy()**函数,实现所有查找,精确查找,模糊查找,按类查找功能。

三 系统实现

3.1 系统实现流程

通讯录系统实现流程如下图所示:

3.2 类的实现

系统包含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<string> 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();
};

四 系统测试

4.1 登录界面

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

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

4.2 添加联系人

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

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

4.3 删除联系人

在主界面输入2可删除成员

如我们希望删除2数据则键入2

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

4.4 修改联系人

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

键入1 可修改第一个人的信息,并按照需求修改信息:

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

4.4 搜索联系人

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

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

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

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

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

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

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

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

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

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