C++入门练习(补发)---通讯录管理系统

一、问题重述

     编写一个简易的通讯录管理系统,其中联系人的信息包括联系人姓名、性别、年龄、电话号码、家庭住址,需要实现包含添加联系人、显示联系人、查找联系人、删除联系人以及清空联系人等功能......

二、问题分析与实现思想

1、需求:编写一个能够添加、显示、查看、删除以及清空联系人的通讯录管理系统

2、分析

  2-1 大致分析

      1)编写通讯录管理系统 ---> 首先我们可以想到制作用户友好的界面并增强可读性

      2)联系人的信息需要包括 姓名、性别、年龄、电话号码、家庭住址等

      2)多个功能实现 ---> 多功能实现,可采用模块化思想,利用函数包装各项功能

  2-2 编码分析

       对整个管理系统以及联系人的相关操作,我们可以将这个通讯录抽象成一个数据类型 --> 采用结构体构建通讯录类型,而其中的联系人相关信息我们可以看做成一个个的数据元素,其中每一个数据元素中包括了name、age、phone、address等多个数据项,通过数组的方式存放联系人的信息。

       依此分析,我们不妨采用线性表的模式实现通讯录管理系统,并利用线性表的基本操作实现联系人的增删改查等功能......本次实现,我们仅采用顺序表的方式实现此次编码。

2-3 思路表述

  大致思想如下:

      1、抽象出一个通讯录的结构类型AddressBook,其中包括存放联系人的数组,以及记录联系人个数的变量m_size。其中,利用#define MAX 定义一个常量,对数组的大小利用MAX进行初始化,便于整个代码的维护,增强可拓展性,单独记录表长,便于后续编码更加方便;

      2、定义一个存放联系人信息的结构体类型contactman,其中包含联系人的姓名name、性别sex、年龄age、电话号码phone、家庭住址address;编码如下:

struct contactman  //定义联系人结构体
{
	string name;
	string sex;
	int age;
	long long phone;
	string adress;
};

struct AddressBook  //通讯录结构体  便于维护,增强可拓展性
{
	struct contactman Array[MAX];
	int m_size;
};

3、因为一个完整的管理系统功能繁多,为保证各个功能结构清晰,便于维护,方便拓展,我们采用分而治之模块化思想,将各个功能分别利用函数打包;对于一个管理系统,站在用户角度思考的话,我们首先要为用户提供一个友好、可读性强的界面,让用户进入即可了解到这个程序是干嘛的,有哪些功能,如何打开或者关闭,含有相关的文字描述,使得用户更加愿意使用它。

1)实现 主界面展示 showmenu();

我们可以先去收集相关资料并发挥我们的想象力,了解前人的界面展示方法,加以借鉴并编码出自己独特的用户开始界面吧! 现在,我们利用showmenu()函数包装一个界面函数,用于初次进入程序时显示的画面,相关代码如下:

void showmenu()  //定义主页面函数
{
	cout << "       <--欢迎来到通讯录管理系统-->         " << endl;
	cout << "**Welcome to AdsressBook ManagementSystem!**\n" << endl;
	cout << "       ***************************          " << endl;
	cout << "       ****** 1、添加联系人 ******          " << endl;
	cout << "       ****** 2、显示联系人 ******          " << endl;
	cout << "       ****** 3、修改联系人 ******          " << endl;
	cout << "       ****** 4、删除联系人 ******			 " << endl;
	cout << "       ****** 5、查找联系人 ******			 " << endl;
	cout << "       ****** 6、清空联系人 ******			 " << endl;
	cout << "       ****** 0、退出通讯录 ******			 " << endl;
	cout << "       ***************************			 " << endl;
	cout << "\n请按0-6数字键选择相应功能:";
}

       现在,我们编写了一个如上所示的menu菜单,根据菜单,我们一个有一种很明显的流程感、控制分支的感觉,让我们想想:为实现每输一个相应的数进去便跳转至相应的功能模块去的话,咱可以使用 if-else 语句、Switch语句去实现,对吧,其次,如果我们使用if语句,那实现这么多功能的话势必要使用多个if语句去担起整个框架,对于算法的复杂度也是一个考验;而恰好,Switch语句是一个绝佳的选择!他不用进行多次判断,只是当符合相应数字时调至那一块去执行,因此在这里,我们使用Switch语句实现多功能的跳转执行。

:使用Switch语句时,我们最好每使用一次case语句就break;一下,避免出现重复输出或其他意外事件,便于代码执行和时间的节省。

oh!现在,就到了正式编写功能函数的时刻了!在编写之前,我们必然是需要有一个“通讯录”吧?因此,我们要在main()函数中先定义一个通讯录,为方便编写,就简单叫做abs吧。

综上所述,关于主函数中的粗略编码如下:

int main()
{
	int select = 0;
	AddressBook abs;  //定义一个自己的通讯录
	abs.m_size = 0;  //初始化通讯录中联系人的人数
	while (true)
	{
		showmenu();    //显示主界面
		cin >> select;
		cout << "\n";
		switch (select)
		{
			case 1:    //添加联系人
				
				break;
			case 2:    //显示
				
				break;
			case 3:    //修改	
					
				break;
			case 4:    //删除
				
				break;
			case 5:    //查找
				
				break;
			case 6:    //清空
				
				break;
			case 0:    //退出
				
				cout << "****** 欢迎下次使用!******" << endl;
				
				return 0;
				break;
			default:
				cout << "输入有误!请重新输入" << endl;
				
				
				break;
		}
	}
	system("pause");
	return 0;
}

2)实现 添加联系人函数 Addperson(struct AddressBook* abs)

    关于添加联系人函数的构建,首先我们要思考以下几个问题:

    1、添加的初始条件是什么?

    2、在能够添加的情况下,需要做哪些操作去实现添加操作?

       带着这两个问题,我们来实现此代码:  既然要添加,那么一定要有空间去加。因此,添加前的最初始的问题就是:我是否有位置添加,我的通讯录是否有空间,换句话说,首先,我们要判断以下我们的通讯录的大小是否为满(数组大小m_size是否小于MAX),如果大于最大空间,则说明已满,我们给用户一个提示,然后返回;相反,小于最大空间时即可继续添加联系人。

       好,第一个问题咱解决了,第二个问题,如何去添加呢?要添加,首先要有I/O操作吧,去给用户输入提示和提供输入,其次输入的信息放到哪里,显然,要放进通讯录中的数组中,要想实现函数传数组参,必然要利用地址传递,故我们设定形参为通讯录类型的指针变量abs,既然时指针,那么函数中输入的信息放入其中时就得注意格式问题了,因为涉及到了数组、指针以及结构体的调用,故一定要注意调用格式,避免语法错误,即abs->array[abs->m_size].name的形式,依次类推,我们可以写出输入年龄、性别、电话号码、家庭住址的格式:abs->array[abs->m_size].age、Array[abs->m_size].sex、Array[abs->m_size].phone、Array[abs->m_size].address,这样,我们大致的添加就完成了,这个时候一定要注意!!!每添加一个联系人信息表示多占用了一个空间,而前面我们单独定义了一个记录大小的变量m_size,因此每添加完一个人就要刷新一下数组大小,即abs->m_size++;这样就添加成功了!最后可以给用户一句提示语,表示添加成功,更加友好!

       具体代码实现如下:

void Addperson(struct AddressBook* abs)  //定义添加联系人函数
{
	if (abs->m_size >= MAX)
	{
		cout << "通讯录已满,无法添加!" << endl;
	}
	else
	{
		string name;
		//姓名
		cout << "请输入姓名:";
		cin >> name;
		abs->Array[abs->m_size].name = name;

		//性别
		string sex;
		cout << "请输入性别(男/女):";
		while (true)
		{
			cin >> sex;
			if (sex == "男" || sex == "女")
			{
				abs->Array[abs->m_size].sex = sex;
				break;
			}
			cout << "输入有误,请重新输入!"<<endl;			
		}

		//年龄
		int age;
		cout << "请输入年龄:";
		cin >> age;
		abs->Array[abs->m_size].age = age;
		
		//联系电话
		long long phone;
		cout << "请输入电话号码:";
		cin >> phone;
		abs->Array[abs->m_size].phone = phone;
		 
		//联系地址
		string address;
		cout << "请输入地址:";
		cin >> address;
		abs->Array[abs->m_size].adress = address;
		
		//更新通讯录联系人的人数
		abs->m_size++;

		cout << "添加成功!" << endl;
	}
	system("pause");  //暂停
	system("cls");   //清屏操作
}

3)实现显示联系人 Display(struct AddressBook* abs);

  在前面添加联系人的基础上,我们大致应该有一个理解和想法了,首先,我们还是思考几个问题:

    1、要能够显示联系人,首先我们需要什么初始条件?

    2、如何显示出前面添加的联系人信息?以什么方式?

带着这两个问题,我们来探索构建思路:

   首先,要能显示联系人,咱应该要存在联系人,换句话说,在显示之前,我们得先判断记录数组大小的m_size是否不为0,即若m_size为0,则说明此时不存在联系人,即不用显示,为给用户友好,我们只需输出一句相应的提示即可;相反,若大小不为0,则我们就可以执行显示的语句了。

   那么,第二,如何显示,很简单,直接打印输出每一个内存单元的信息即可(此时需要利用循环结构),为增强可读性,我们可以在输出前加一点提示语,便于用户阅读。

最终此块代码实现如下:

void Display(struct AddressBook* abs)  //定义显示联系人函数
{
	int i;
	if (abs->m_size == 0)
	{
		cout << "暂未添加任何联系人!\n" << endl;
	}
	else
	{
		cout << "下面是您添加的所有联系人:\n" << endl;
		for (i = 0; i < (abs->m_size); i++)
		{
			cout << "姓名:"
				<< abs->Array[i].name
				<< "\t性别:" << abs->Array[i].sex
				<< "\t年龄:" << abs->Array[i].age
				<< "\t    联系电话:" << abs->Array[i].phone
				<< "\t    家庭地址:" << abs->Array[i].adress << endl;
		}
	}
	
	system("pause");
	system("cls");
}

4)实现 修改联系人信息 Modify(struct AddressBook* abs) 

  如果大家是跟着我的思路一步一步到这的,想必大家应该也有了一定的思路了。同样,我们带着问题去构建代码思路:

 1、要修改联系人信息,首先初始条件是什么?

 2、要实现修改信息,应该怎么做,要注意些什么?

带着这两个问题,我们来构建具体思路:

       第一,要想修改信息,最开始也是判断是否有联系人(判断方法可参见上面几次实现),再想别的。

      然后确定有联系人以后呢,必然会有所针对性,换句话说,我们会锁定某一位联系人,因此,具体的说,如果想要修改他(她),首先要判断他是否存在,因此,初始条件是用户想要修改的联系人是存在的。

      那么,如何实现呢,现在我们假设输入联系人的姓名,然后首先就是要判断是否有这个人,因为联系人的信息是存放在数组里面的,所以我们很容易想到利用循环遍历整个数组中联系人的名字,如果找到了相应的名字,那么我们返回一个数值,提示机器确实有这个人,然后继续执行修改的语句,若不存在,则返回其他值;因为修改的时候我们需要有这个人所在的位置信息,所以我们可以让前面判断是否存在的语句的返回值为该联系人所在位置,也就是他的下标。

       同时,要是我们时不时的纵观全局的话,我们是可以发现在后续的删除和查找功能中也需要先利用这一方式判断是否存在该联系人,然后再做下一步执行,故而,我们可以将判断联系人是否存在打包成一个函数进行调用。(其中我们要传入联系人姓名以及该数组)

        判断某联系人是否存在的函数代码,实现如下:

int testPersonExit(struct AddressBook* abs,string ModifyPerson)  //检测联系人是否存在
{
	int i;
	for (i = 0; i < (abs->m_size); i++)
	{
		if (abs->Array[i].name == ModifyPerson)
		{
			//若存在联系人则flag等于联系人下标
			return i;
		}
	}
	return -1;
}

       第二,如何修改联系人信息呢,我们有了联系人所在位置,想修改,如何做,对于顺序表的修改逻辑,我们可以直接利用赋值操作实现数据的修改,属于是逻辑上的覆盖式修改了信息。因此代码的实现只需利用简单的输入即可实现。(定义一个要修改的信息,并输入给他然后将这个信息赋值给存放至数组的信息,直接覆盖掉原来的信息实现数据的修改。)

  具体代码实现如下:

void Modify(struct AddressBook* abs)    //定义修改函数
{
	string ModifyName,M0difySex,ModifyAddress;
	int ModifyAge = 0;
	long long ModifyPhone = 0;
	if (abs->m_size == 0)
	{
		cout << "无法修改,通讯录暂无联系人信息!" << endl;
	}
	else
	{
		cout << "请输入姓名:";
		cin >> ModifyName;
		int ret = testPersonExit(abs, ModifyName);
		if (ret != -1)
		{
			//姓名
			abs->Array[ret].name = ModifyName;
			//性别
			cout << "请输入性别(男/女):";
			cin >> M0difySex;
			abs->Array[ret].sex = M0difySex;
			//年龄
			cout << "请输入年龄:";
			cin >> ModifyAge;
			abs->Array[ret].age = ModifyAge;
			//联系电话
			cout << "请输入电话号码:";
			cin >> ModifyPhone;
			abs->Array[ret].phone = ModifyPhone;
			//联系地址
			cout << "请输入地址:";
			cin >> ModifyAddress;
			abs->Array[ret].adress = ModifyAddress;

			cout << "\n修改成功!" << endl;
		}
		else
		{
			cout << "该联系人不存在!" << endl;
		}
	}
	
	system("pause");
	system("cls");
}

5)实现 删除联系人 DeletePerson(struct AddressBook* abs) ;

    同上步骤,判断通讯录中是否有联系人,然后判断是否存在我们想删的那个联系人,如果有,则继续实现删除功能。

   如何实现删除功能呢,上一个修改功能的实现时,我们提到过通过赋值操作来覆盖原来的信息进而实现修改,那么由此类推,我们同样可以在删除操作上实现:在我们找到想要删除的联系人所在位置下标以后,从此下标起,将后面的信息位置下标依次赋值然后前移,进而实现此数据的覆盖式删除,理解如下图所示:

代码实现如下:

void DeletePerson(struct AddressBook* abs)  //定义删除函数
{
	if (abs->m_size == 0)
	{
		cout << "无法删除,通讯录暂无联系人信息!" << endl;
	}
	else
	{
		string DeleteName;
		cout << "请输入您想删除的联系人:" << endl;
		cin >> DeleteName;
		int ret = testPersonExit(abs, DeleteName);  //检测是否存在
	
		if (ret != -1)
		{
			int i;
			for (i = ret; i < abs->m_size; i++)
			{
				abs->Array[i] = abs->Array[i + 1];
				abs->m_size--;                       //将数据前移(赋值操作)覆盖需要删除项即可
			}
			cout << "删除成功!" << endl;
		}
		else
		{
			cout << "该联系人不存在!" << endl;
		}
	}
	system("pause");
	system("cls");
}

6)实现 查找联系人 SearchPerson(struct AddressBook* abs) ;

   要实现查找,无非时重复前面几步基础操作:

     1、判断通讯录中是否有联系人;

     2、判断联系人中是否存在我需查找的联系人;

     3、实现查找的功能去打印输出相应的联系人;

其中,前两步都是前面功能实现使用多次的代码思路,我这里就不再赘述;关于查找的打印输出也很简单,就是将找到的下标对应的信息直接按顺序打印输出即可。

具体代码实现如下:

void SearchPerson(struct AddressBook* abs)  //定义查找联系人函数
{
	if (abs->m_size == 0)
	{
		cout << "无法查找,通讯录暂无联系人信息!" << endl;
	}
	else
	{
		string SearchName;
		cout << "请输入您想查找的联系人:"<<endl;
		cin >> SearchName;
		int ret = testPersonExit(abs, SearchName);
		if (ret != -1)
		{
			cout << "查找成功!" << endl;
			cout << "姓名:"<< abs->Array[ret].name
				<< "\t性别:" << abs->Array[ret].sex
				<< "\t年龄:" << abs->Array[ret].age
				<< "\t    联系电话:" << abs->Array[ret].phone
				<< "\t    家庭地址:" << abs->Array[ret].adress << endl;
		}
		else
		{
		cout << "该联系人不存在!" << endl;
		}

	}
	system("pause");
	system("cls");
}

7)实现清空通讯录功能  ClearPerson(struct AddressBook* abs);

要实现清空通讯录,首先看是否有联系人,与前面一样,然后在利用逻辑上的清空实现物理上的清空,换句话说,直接将数组的大小变成0,即使得用户无法访问到任何元素,即实现了清空的功能。  同时,因为清空通讯录对于用户来说是一个需要谨慎再谨慎的事情,因此,我们在设计清空的时候可以多留点心眼,利用一些提示让用户在想清空的时候多想一下,纠缠一下,这样使得你的通讯录更加丰富,健壮。

具体代码实现如下:

void ClearPerson(struct AddressBook* abs)
{
	if (abs->m_size == 0)
	{
		cout << "通讯录空白,暂无联系人信息!" << endl;
	}
	else
	{
		int select = 0;
		cout << "您的通讯录中可能含很多重要联系人,您真的要清空通讯录吗?" << endl;
		cout << "确定删除[输1]/再考虑一下[输其他数字]:" << endl;
		cin >> select;
		if (select == 1)
		{
			abs->m_size = 0;    //逻辑上清空
			cout << "通讯录已清空!" << endl;
		}
		cout << "已退出清空选项" << endl;
	}
	system("pause");
	system("cls");
}

至此,该通讯录所有的功能全部实现!!!

2-4 代码的综合和润色

我们实现了所有功能,最后将他们写好函数声明,然后将各个功能填充至Switch语句中的相应位置,并且适当增加用户提示,使得整个代码的可读性更强。

全部的代码实现放在了最后。

三、函数API及功能陈述

在该程序中所定义和调用的函数如下:

1. void showmenu()
   - 功能:显示主菜单界面。
   - 参数:无。

2. void Addperson(struct AddressBook* abs)
   - 功能:添加联系人到通讯录。
   - 参数:abs - 指向通讯录结构体的指针。

3. void Display(struct AddressBook* abs)
   - 功能:显示所有联系人。
   - 参数:abs - 指向通讯录结构体的指针。

4. int testPersonExit(struct AddressBook* abs,string ModifyPerson)
   - 功能:检测联系人是否存在。
   - 参数:abs - 指向通讯录结构体的指针,`ModifyPerson` - 待检测的联系人姓名。

5. void Modify(struct AddressBook* abs)
   - 功能:修改指定联系人的信息。
   - 参数:abs - 指向通讯录结构体的指针。

6. void DeletePerson(struct AddressBook* abs)
   - 功能:删除指定联系人。
   - 参数:abs - 指向通讯录结构体的指针。

7. void SearchPerson(struct AddressBook* abs)
   - 功能:查找指定联系人。
   - 参数:abs - 指向通讯录结构体的指针。

8. void ClearPerson(struct AddressBook* abs)
   - 功能:清空通讯录中的所有联系人。
   - 参数:abs - 指向通讯录结构体的指针。

9.系统函数

system("pause");    系统暂停

 system("cls");   清屏操作

这些函数通过对通讯录结构体的操作实现了对通讯录的管理功能,包括添加、显示、修改、删除、查找和清空联系人等操作。其中借助暂停和清屏操作,使得用户的界面体验更加舒适简洁,可读性更强。

四、最终代码实现

/*简易版通讯录管理系统*/
#include<iostream>
#include<string>
#define MAX 1000

using namespace std;

struct contactman  //定义联系人结构体
{
	string name;
	string sex;
	int age;
	long long phone;
	string adress;
};

struct AddressBook  //通讯录结构体  便于维护,增强可拓展性
{
	struct contactman Array[MAX];
	int m_size;
};

void showmenu(); //主界面函数声明
void Addperson(struct AddressBook* abs);   //添加联系人函数声明
void Display(struct AddressBook* abs);		//显示联系人函数声明
int testPersonExit(struct AddressBook* abs,string ModifyPerson);    //检测联系人是否存在函数声明
void Modify(struct AddressBook* abs);  //修改联系人函数声明
void DeletePerson(struct AddressBook* abs);  //删除联系人函数声明
void SearchPerson(struct AddressBook* abs);    //查找联系人函数声明
void ClearPerson(struct AddressBook* abs);    //清空联系人函数声明

int main()
{
	int select = 0;
	AddressBook abs;  //定义一个自己的通讯录
	abs.m_size = 0;  //初始化通讯录中联系人的人数
	while (true)
	{
		showmenu();    //显示主界面
		cin >> select;
		cout << "\n";
		switch (select)
		{
			case 1:    //添加联系人
				Addperson(&abs);   //调用添加函数
				break;
			case 2:    //显示
				Display(&abs);  //调用显示函数
				break;
			case 3:    //修改	
				Modify(&abs);    //修改联系人	
				break;
			case 4:    //删除
				DeletePerson(&abs);  //调用删除函数
				break;
			case 5:    //查找
				SearchPerson(&abs);  //调用查找函数
				break;
			case 6:    //清空
				ClearPerson(&abs);  //调用清空函数
				break;
			case 0:    //退出
				system("cls");
				cout << "****** 欢迎下次使用!******" << endl;
				system("pause");
				return 0;
				break;
			default:
				cout << "输入有误!请重新输入" << endl;
				system("pause");
				system("cls");
				break;
		}
	}
	system("pause");
	return 0;
}


void showmenu()  //定义主页面函数
{
	cout << "       <--欢迎来到通讯录管理系统-->         " << endl;
	cout << "**Welcome to AdsressBook ManagementSystem!**\n" << endl;
	cout << "       ***************************          " << endl;
	cout << "       ****** 1、添加联系人 ******          " << endl;
	cout << "       ****** 2、显示联系人 ******          " << endl;
	cout << "       ****** 3、修改联系人 ******          " << endl;
	cout << "       ****** 4、删除联系人 ******			 " << endl;
	cout << "       ****** 5、查找联系人 ******			 " << endl;
	cout << "       ****** 6、清空联系人 ******			 " << endl;
	cout << "       ****** 0、退出通讯录 ******			 " << endl;
	cout << "       ***************************			 " << endl;
	cout << "\n请按0-6数字键选择相应功能:";
}

void Addperson(struct AddressBook* abs)  //定义添加联系人函数
{
	if (abs->m_size >= MAX)
	{
		cout << "通讯录已满,无法添加!" << endl;
	}
	else
	{
		string name;
		//姓名
		cout << "请输入姓名:";
		cin >> name;
		abs->Array[abs->m_size].name = name;

		//性别
		string sex;
		cout << "请输入性别(男/女):";
		while (true)
		{
			cin >> sex;
			if (sex == "男" || sex == "女")
			{
				abs->Array[abs->m_size].sex = sex;
				break;
			}
			cout << "输入有误,请重新输入!"<<endl;			
		}

		//年龄
		int age;
		cout << "请输入年龄:";
		cin >> age;
		abs->Array[abs->m_size].age = age;
		
		//联系电话
		long long phone;
		cout << "请输入电话号码:";
		cin >> phone;
		abs->Array[abs->m_size].phone = phone;
		 
		//联系地址
		string address;
		cout << "请输入地址:";
		cin >> address;
		abs->Array[abs->m_size].adress = address;
		
		//更新通讯录联系人的人数
		abs->m_size++;

		cout << "添加成功!" << endl;
	}
	system("pause");  //暂停
	system("cls");   //清屏操作
}

void Display(struct AddressBook* abs)  //定义显示联系人函数
{
	int i;
	if (abs->m_size == 0)
	{
		cout << "暂未添加任何联系人!\n" << endl;
	}
	else
	{
		cout << "下面是您添加的所有联系人:\n" << endl;
		for (i = 0; i < (abs->m_size); i++)
		{
			cout << "姓名:"
				<< abs->Array[i].name
				<< "\t性别:" << abs->Array[i].sex
				<< "\t年龄:" << abs->Array[i].age
				<< "\t    联系电话:" << abs->Array[i].phone
				<< "\t    家庭地址:" << abs->Array[i].adress << endl;
		}
	}
	
	system("pause");
	system("cls");
}

int testPersonExit(struct AddressBook* abs,string ModifyPerson)  //检测联系人是否存在
{
	int i;
	for (i = 0; i < (abs->m_size); i++)
	{
		if (abs->Array[i].name == ModifyPerson)
		{
			//若存在联系人则flag等于联系人下标
			return i;
		}
	}
	return -1;
}

void Modify(struct AddressBook* abs)    //定义修改函数
{
	string ModifyName,M0difySex,ModifyAddress;
	int ModifyAge = 0;
	long long ModifyPhone = 0;
	if (abs->m_size == 0)
	{
		cout << "无法修改,通讯录暂无联系人信息!" << endl;
	}
	else
	{
		cout << "请输入姓名:";
		cin >> ModifyName;
		int ret = testPersonExit(abs, ModifyName);
		if (ret != -1)
		{
			//姓名
			abs->Array[ret].name = ModifyName;
			//性别
			cout << "请输入性别(男/女):";
			cin >> M0difySex;
			abs->Array[ret].sex = M0difySex;
			//年龄
			cout << "请输入年龄:";
			cin >> ModifyAge;
			abs->Array[ret].age = ModifyAge;
			//联系电话
			cout << "请输入电话号码:";
			cin >> ModifyPhone;
			abs->Array[ret].phone = ModifyPhone;
			//联系地址
			cout << "请输入地址:";
			cin >> ModifyAddress;
			abs->Array[ret].adress = ModifyAddress;

			cout << "\n修改成功!" << endl;
		}
		else
		{
			cout << "该联系人不存在!" << endl;
		}
	}
	
	system("pause");
	system("cls");
}

void DeletePerson(struct AddressBook* abs)  //定义删除函数
{
	if (abs->m_size == 0)
	{
		cout << "无法删除,通讯录暂无联系人信息!" << endl;
	}
	else
	{
		string DeleteName;
		cout << "请输入您想删除的联系人:" << endl;
		cin >> DeleteName;
		int ret = testPersonExit(abs, DeleteName);  //检测是否存在
	
		if (ret != -1)
		{
			int i;
			for (i = ret; i < abs->m_size; i++)
			{
				abs->Array[i] = abs->Array[i + 1];
				abs->m_size--;                       //将数据前移(赋值操作)覆盖需要删除项即可
			}
			cout << "删除成功!" << endl;
		}
		else
		{
			cout << "该联系人不存在!" << endl;
		}
	}
	system("pause");
	system("cls");
}

void SearchPerson(struct AddressBook* abs)  //定义查找联系人函数
{
	if (abs->m_size == 0)
	{
		cout << "无法查找,通讯录暂无联系人信息!" << endl;
	}
	else
	{
		string SearchName;
		cout << "请输入您想查找的联系人:"<<endl;
		cin >> SearchName;
		int ret = testPersonExit(abs, SearchName);
		if (ret != -1)
		{
			cout << "查找成功!" << endl;
			cout << "姓名:"<< abs->Array[ret].name
				<< "\t性别:" << abs->Array[ret].sex
				<< "\t年龄:" << abs->Array[ret].age
				<< "\t    联系电话:" << abs->Array[ret].phone
				<< "\t    家庭地址:" << abs->Array[ret].adress << endl;
		}
		else
		{
		cout << "该联系人不存在!" << endl;
		}

	}
	system("pause");
	system("cls");
}

void ClearPerson(struct AddressBook* abs)
{
	if (abs->m_size == 0)
	{
		cout << "通讯录空白,暂无联系人信息!" << endl;
	}
	else
	{
		int select = 0;
		cout << "您的通讯录中可能含很多重要联系人,您真的要清空通讯录吗?" << endl;
		cout << "确定删除[输1]/再考虑一下[输其他数字]:" << endl;
		cin >> select;
		if (select == 1)
		{
			abs->m_size = 0;    //逻辑上清空
			cout << "通讯录已清空!" << endl;
		}
		cout << "已退出清空选项" << endl;
	}
	system("pause");
	system("cls");
}

  • 53
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值