C++通讯录管理系统

24 篇文章 0 订阅

1.写头文件和main框架

#include<iostream>
#include<string>
using namespace std;

int main()
{

  system("pause");
  return 0;
}

2.搭建大体框架,显示菜单和根据用户输入的选项执行对应命令,为了语言的简洁,此处选用了switch...case,也可以用if...else

先来创建一个显示菜单的函数,showmenu,无返回值用void

void showmenu()
{
	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;
}

main函数里的选择,因为要反复在屏幕中出现,所以创建了只有break能解开的死循环while(true),或者while(1)//正数  也是可以的

switch...case 限制用户输出功能范围超出范围则返回default内容,提示用户

顺便实现退出通讯录的功能

int main()
{
	int select = 0;//创建用户选择输入的量
	//创建通讯录结构体变量

	while (true)
	{
		showmenu();//调用展示菜单的函数
		cin >> select;//用户输入的选项
		switch (select)
		{
		case 1://01.添加联系人
			break;
		case 2://02.显示联系人
			break;
		case 3://03.删除联系人
		{
			break;
		}
		case 4://04.查找联系人
			break;
		case 5:// 05.修改联系人
			break;
		case 6://06.清空联系人
			break;
		case 0://0.退出通讯录
			system("pause");
			return 0;//实现真正的退出
		default:
			cout << "超出范围啦!" << endl;
			cout << "请重新输入0——6的整数哦" << endl;
			break;
		}
		
	}
	
}

2.创建通讯录人员和通讯录整个大框架的结构体,我们拟创建一个容量为1000个人的通讯录

#define MAX 1000//宏定义通讯里容量

//添加联系人
//1.设计联系人结构体
struct person
{
	string p_name;//联系人姓名
	int p_sex{};//性别,1,男,2,女
	int p_age{};//年龄
	string p_phone;//电话号码为一个11位数的数组
	string p_address;//联系人住址
};

//2.设计通讯录结构体
struct adressbooks
{
	//通讯录中保存的联系人的数组
	struct person personArr[MAX];
	//通讯录中当前联系人的个数
	int p_size;//而不是struct person p_size;  只是单纯地记录整数
};

3.在main中创建相应变量,方便以后访问,并且将当前通讯录人数初始化为0

    //创建通讯录结构体变量
	struct adressbooks abs;//不用值传递,要用地址改实参
	abs.p_size = 0;//初始化当前人数为0

4.思考一下,我们应该使用函数的值传递还是地址传递,值传递是不会改变实参的,也就是说,如果使用值传递,则我们switch...case中的后续输出以及abs不会的到改变,相当于白忙活,所以我们在创建接下来的需要用到的函数的时候要使用值传递

第一个功能,添加联系人函数封装及代码如下,带注释,这里不做过多赘述

void addPerson(adressbooks * abs)
{
	if (abs->p_size < MAX)
	{
		string name;
		cout << "请输入联系人姓名:" << endl;
		cin >> name;
		abs->personArr[abs->p_size].p_name = name;

		int sex;
		cout << "请输入联系人性别:1---男,2---女" << endl;
		while (true)
		{
			cin >> sex;
			if (sex == 1 || sex == 2)
			{
				abs->personArr[abs->p_size].p_sex = sex;
				break;
			}
			else
			{
				cout << "性别输入有误,请重新输入" << endl;
			}
		}
		int age;
		cout << "请输入联系人年龄" << endl;
		cin >> age;
		abs->personArr[abs->p_size].p_age = age;

		string phoneArr;
		cout << "请输入联系人电话" << endl;
		cin >> phoneArr;
		abs->personArr[abs->p_size].p_phone = phoneArr;
		//用循环限制用户输入的数组长度,出现左值错误,故注释掉
		//int p_len = end(phoneArr) - begin(phoneArr);
		//while (true)//限制用户输入
		//{
		//	cin >> phoneArr[phoneMAX];
		//	if(p_len ==3||p_len==11)
		//	{
		//		abs->personArr[abs->p_size].p_phone[phoneMAX] = phoneArr[phoneMAX];
		//		break;
		//	}
		//	else
		//	{
		//		cout << "输入有误,请重新输入!" << endl;
		//	}
		//}

		string address;
		cout << "请输入联系人地址" << endl;
		cin >> address;
		abs->personArr[abs->p_size].p_address = address;

		abs->p_size++;
		cout << "添加成功" << endl;
	}
	else
	{
		cout << "联系人已满,请删除部分联系人后再执行此操作!" << endl;
	}
	system("pause");
	system("cls");
	//注意语句,不要包含在while里面否则会陷入死循环,这种还不容易被发现
}

调用

            case 1://01.添加联系人
			addPerson(&abs);//利用地址传递在函数的形参中修饰实参
			break;

5.显示联系人功能函数封装及调用

void showPerson(adressbooks*abs)
{
	if (abs->p_size == 0)
	{
		cout << "联系人为空,要先添加联系人才能执行此操作哦" << endl;
	}
	else
	{
		for (int i = 0; i < abs->p_size; i++)
		{
			cout << "姓名:" << abs->personArr[i].p_name << endl;
			cout << "性别:" << (abs->personArr[i].p_sex == 1 ? "男" : "女") << endl;
			cout << "年龄:" << abs->personArr[i].p_age << endl;
			cout << "电话:" << abs->personArr[i].p_phone << endl;
			cout << "地址:" << abs->personArr[i].p_address << endl;
		}
	}
	system("pause");
	system("cls");
}
            case 2://02.显示联系人
			showPerson(&abs);
			break;

6.接下来的查找,删除,修改功能,都有一个基础,就是是不是能找到这个人,如果能找到,就返回被查找人所在的位置,否则就要返回一个值,一般用-1

因为有返回值所以,封装此函数的时候不能用无返回值的void

//判断联系人,中转函数
int isExist(adressbooks*person, string name)
{
	for (int i = 0; i < person->p_size; i++)
	{
		if (person->personArr[i].p_name == name)
		{
			return i;//返回被检索的人所在位置
		}
	}
	return -1;//否则返回-1
}

7.删除联系人函数封装及调用

//删除联系人
void deletePerson(adressbooks*person)
{
	string name;
	cout << "请输入您要删除的联系人的姓名!" << endl;
	cin >> name;
	int exist = isExist(person, name);
	if (exist != -1)//如果isExit返回值不是-1,也就是能找到该联系人
	{
		for (int i = exist; i < person->p_size; i++)
		{
			{
				person->personArr[i] = person->personArr[i + 1];
			}
		}
		(person->p_size)--;//内存减一
		cout << "删除成功!" << endl;
	}
	else
	{
		cout << "没有这个人!" << endl;
	}
	system("pause");
	system("cls");
}

调用

            case 3://03.删除联系人
			deletePerson(&abs);
			break;

8.查找联系人

void findPerson(adressbooks*abs)
{
	string  name;
	cout << "请输入您要查找的联系人姓名:" << endl;
	cin >> name;
	int exist = isExist(abs,name);
	if (exist != -1)
	{
		cout << "该联系人信息如下:" << endl;
		cout << "姓名:" << abs->personArr[exist].p_name << "  "
		     << "性别:" << (abs->personArr[exist].p_sex==1?"男":"女")<< "  "
		     << "年龄:" << abs->personArr[exist].p_age << "  "
		     << "电话:" << abs->personArr[exist].p_phone<<"  "
		     << "地址:" << abs->personArr[exist].p_address << endl;
	}
	else
	{
		cout <<  "没有找到该联系人!" << endl;
	}
	system("pause");
	system("cls");
}

调用

            case 4://04.查找联系人
			findPerson(&abs);
			break;

9.修改联系人

函数

void mosifyPerson(adressbooks*abs)
{
	string name;
	cout << "请输入您要修改的联系人的姓名:  ";
	cin >> name;
	int exist = isExist(abs, name);
	if (exist != -1)
	{
		string mosifyName;
		cout << "请输入您修改后的联系人姓名:";
		cin >> mosifyName;
		abs->personArr[abs->p_size].p_name = mosifyName;

		while (true)//性别输入,循环,限制用户输入,1,2,男女
		{
			int mosifySex;
			cout << "请输入您修改后的联系人性别" << "1--男,2--女" << "  ";
			cin >> mosifySex;
			if (mosifySex == 1 || mosifySex == 2)
			{
				abs->personArr[abs->p_size].p_sex = mosifySex;
			}
			else
			{
				cout << "输入有误,请重新输入!" << endl;
			}
		}
		int mosifyAge;
		cout << "请输入您修改后的联系人年龄:" << "  ";
		cin >> mosifyAge;
		abs->personArr[abs->p_size].p_age = mosifyAge;

		string mosifyPhone;
		cout << "请输入您修改后的联系人电话:" << "  ";
		cin >> mosifyPhone;
		abs->personArr[abs->p_size].p_phone = mosifyPhone;

		string mosifyAddress;
		cout << "请输入您修改后的联系人地址:" << "  ";
		cin >> mosifyAddress;
		abs->personArr[abs->p_size].p_address = mosifyAddress;
	}
	else
	{
		cout << "未找到需要修改的联系人" << endl;
	}
	system("pause");
	system("cls");
}

调用

            case 5:// 05.修改联系人
 			mosifyPerson(&abs);
			break;

10.清空通讯录

函数封装

//清空联系人
void emptyPerson(adressbooks*abs)
{
	string ensure;
	cout << "您确定要清空所有联系人么,此操作不可逆,如需清空,请输入“我同意”三个字执行" << endl;
	cin >> ensure;
	if (ensure == "我同意")
	{
		abs->p_size = 0;
		cout << "联系人已清空!" << endl;
	}
	else
	{
		cout << "您撤销了清空联系人操作!" << endl;
	}
	system("pause");
	system("cls");//清空子选项内容,main菜单不清空
}

调用

            case 6://06.清空联系人
			emptyPerson(&abs);
			break;

至此,通讯录管理系统所有功能已封装完毕,最后一步就是执行啦,执行结果如下

 所有代码如下,当然也可以把所有函数放在一个.h的头文件里,这样主程序就会非常清爽

#include<iostream>
#include<string>
using namespace std;

#define MAX 1000//宏定义一个最大添加人数为1000的通讯录内存量,不用分号,否则报错
#define phoneMAX 12//宏定义电话号码最大长度

//菜单界面
void showmenu()
{
	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;
}

//添加联系人
//1.设计联系人结构体
struct person
{
	string p_name;//联系人姓名
	int p_sex{};//性别,1,男,2,女
	int p_age{};//年龄
	string p_phone;//电话号码为一个11位数的数组
	string p_address;//联系人住址
};

//2.设计通讯录结构体
struct adressbooks
{
	//通讯录中保存的联系人的数组
	struct person personArr[MAX];
	//通讯录中当前联系人的个数
	int p_size;//而不是struct person p_size;  只是单纯地记录整数
};

//3.main函数中创建通讯录
//4.封装添加联系人函数
void addPerson(adressbooks * abs)
{
	if (abs->p_size < MAX)
	{
		string name;
		cout << "请输入联系人姓名:" << endl;
		cin >> name;
		abs->personArr[abs->p_size].p_name = name;

		int sex;
		cout << "请输入联系人性别:1---男,2---女" << endl;
		while (true)
		{
			cin >> sex;
			if (sex == 1 || sex == 2)
			{
				abs->personArr[abs->p_size].p_sex = sex;
				break;
			}
			else
			{
				cout << "性别输入有误,请重新输入" << endl;
			}
		}
		int age;
		cout << "请输入联系人年龄" << endl;
		cin >> age;
		abs->personArr[abs->p_size].p_age = age;

		string phoneArr;
		cout << "请输入联系人电话" << endl;
		cin >> phoneArr;
		abs->personArr[abs->p_size].p_phone = phoneArr;
		//用循环限制用户输入的数组长度,出现左值错误,故注释掉
		//int p_len = end(phoneArr) - begin(phoneArr);
		//while (true)//限制用户输入
		//{
		//	cin >> phoneArr[phoneMAX];
		//	if(p_len ==3||p_len==11)
		//	{
		//		abs->personArr[abs->p_size].p_phone[phoneMAX] = phoneArr[phoneMAX];
		//		break;
		//	}
		//	else
		//	{
		//		cout << "输入有误,请重新输入!" << endl;
		//	}
		//}

		string address;
		cout << "请输入联系人地址" << endl;
		cin >> address;
		abs->personArr[abs->p_size].p_address = address;

		abs->p_size++;
		cout << "添加成功" << endl;
	}
	else
	{
		cout << "联系人已满,请删除部分联系人后再执行此操作!" << endl;
	}
	system("pause");
	system("cls");
	//注意语句,不要包含在while里面否则会陷入死循环,这种还不容易被发现
}
//显示联系人
void showPerson(adressbooks*abs)
{
	if (abs->p_size == 0)
	{
		cout << "联系人为空,要先添加联系人才能执行此操作哦" << endl;
	}
	else
	{
		for (int i = 0; i < abs->p_size; i++)
		{
			cout << "姓名:" << abs->personArr[i].p_name << endl;
			cout << "性别:" << (abs->personArr[i].p_sex == 1 ? "男" : "女") << endl;
			cout << "年龄:" << abs->personArr[i].p_age << endl;
			cout << "电话:" << abs->personArr[i].p_phone << endl;
			cout << "地址:" << abs->personArr[i].p_address << endl;
		}
	}
	system("pause");
	system("cls");
}
//判断联系人,中转函数
int isExist(adressbooks*person, string name)
{
	for (int i = 0; i < person->p_size; i++)
	{
		if (person->personArr[i].p_name == name)
		{
			return i;//返回被检索的人所在位置
		}
	}
	return -1;//否则返回-1
}
//删除联系人
void deletePerson(adressbooks*person)
{
	string name;
	cout << "请输入您要删除的联系人的姓名!" << endl;
	cin >> name;
	int exist = isExist(person, name);
	if (exist != -1)//如果isExit返回值不是-1,也就是能找到该联系人
	{
		for (int i = exist; i < person->p_size; i++)
		{
			{
				person->personArr[i] = person->personArr[i + 1];
			}
		}
		(person->p_size)--;//内存减一
		cout << "删除成功!" << endl;
	}
	else
	{
		cout << "没有这个人!" << endl;
	}
	system("pause");
	system("cls");
}
//查找联系人
void findPerson(adressbooks*abs)
{
	string  name;
	cout << "请输入您要查找的联系人姓名:" << endl;
	cin >> name;
	int exist = isExist(abs,name);
	if (exist != -1)
	{
		cout << "该联系人信息如下:" << endl;
		cout << "姓名:" << abs->personArr[exist].p_name << "  "
		     << "性别:" << (abs->personArr[exist].p_sex==1?"男":"女")<< "  "
		     << "年龄:" << abs->personArr[exist].p_age << "  "
		     << "电话:" << abs->personArr[exist].p_phone<<"  "
		     << "地址:" << abs->personArr[exist].p_address << endl;
	}
	else
	{
		cout <<  "没有找到该联系人!" << endl;
	}
	system("pause");
	system("cls");
}
//修改联系人功能函数封装
void mosifyPerson(adressbooks*abs)
{
	string name;
	cout << "请输入您要修改的联系人的姓名:  ";
	cin >> name;
	int exist = isExist(abs, name);
	if (exist != -1)
	{
		string mosifyName;
		cout << "请输入您修改后的联系人姓名:";
		cin >> mosifyName;
		abs->personArr[abs->p_size].p_name = mosifyName;

		while (true)//性别输入,循环,限制用户输入,1,2,男女
		{
			int mosifySex;
			cout << "请输入您修改后的联系人性别" << "1--男,2--女" << "  ";
			cin >> mosifySex;
			if (mosifySex == 1 || mosifySex == 2)
			{
				abs->personArr[abs->p_size].p_sex = mosifySex;
			}
			else
			{
				cout << "输入有误,请重新输入!" << endl;
			}
		}
		int mosifyAge;
		cout << "请输入您修改后的联系人年龄:" << "  ";
		cin >> mosifyAge;
		abs->personArr[abs->p_size].p_age = mosifyAge;

		string mosifyPhone;
		cout << "请输入您修改后的联系人电话:" << "  ";
		cin >> mosifyPhone;
		abs->personArr[abs->p_size].p_phone = mosifyPhone;

		string mosifyAddress;
		cout << "请输入您修改后的联系人地址:" << "  ";
		cin >> mosifyAddress;
		abs->personArr[abs->p_size].p_address = mosifyAddress;
	}
	else
	{
		cout << "未找到需要修改的联系人" << endl;
	}
	system("pause");
	system("cls");
}
//清空联系人
void emptyPerson(adressbooks*abs)
{
	string ensure;
	cout << "您确定要清空所有联系人么,此操作不可逆,如需清空,请输入“我同意”三个字执行" << endl;
	cin >> ensure;
	if (ensure == "我同意")
	{
		abs->p_size = 0;
		cout << "联系人已清空!" << endl;
	}
	else
	{
		cout << "您撤销了清空联系人操作!" << endl;
	}
	system("pause");
	system("cls");//清空子选项内容,main菜单不清空
}
int main()
{
	int select = 0;//创建用户选择输入的量
	//创建通讯录结构体变量
	struct adressbooks abs;//不用值传递,要用地址改实参
	abs.p_size = 0;//初始化当前人数为0

	while (true)
	{
		showmenu();//调用展示菜单的函数
		cin >> select;//用户输入的选项
		switch (select)
		{
		case 1://01.添加联系人
			addPerson(&abs);//利用地址传递在函数的形参中修饰实参
			break;
		case 2://02.显示联系人
			showPerson(&abs);
			break;
		case 3://03.删除联系人
			deletePerson(&abs);
			break;
		case 4://04.查找联系人
			findPerson(&abs);
			break;
		case 5:// 05.修改联系人
			mosifyPerson(&abs);
			break;
		case 6://06.清空联系人
			emptyPerson(&abs);
			break;
		case 0://0.退出通讯录
			cout << "欢迎下次使用!" << endl;
			system("pause");
			return 0;//实现真正的退出
		default:
			cout << "超出范围啦!" << endl;
			cout << "请重新输入0——6的整数哦" << endl;
			break;
		}
		
	}
	
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值