【C/C++基础实战】:用C++实现通讯录管理系统——含完整源码

文章目录

通讯录管理系统

一、系统需求以及成品演示

1.1 系统需求

通讯录是一个可以记录亲人、好友信息的工具。这里利用C++来实现一个通讯录管理系统

系统中需要实现的功能如下:

  • 添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记录1000人
  • 显示联系人:显示通讯录中所有联系人信息
  • 删除联系人:按照姓名进行删除指定联系人
  • 查找联系人:按照姓名查看指定联系人信息
  • 修改联系人:按照姓名重新修改指定联系人
  • 清空联系人:清空通讯录中所有信息
  • 退出通讯录:退出当前使用的通讯录

1.2 成品演示

通讯录管理系统

二、代码实现

2.1 菜单功能

功能描述: 用户选择功能的界面
步骤:

  • 封装函数显示该界面 void showMenu()
  • 在main函数中调用封装好的函数
cpp 复制代码
// 菜单函数
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;
	cout << "请选择:  ";
}

2.2 退出功能

功能描述:退出通讯录系统

思路:根据用户不同的选择,进入不同的功能,可以选择switch分支结构,将整个架构进行搭建

当用户选择0时候,执行退出,选择其他先不做操作,也不会退出程序

cpp 复制代码
int main()
{
	while (true)
	{
		showMenu();  // 调用菜单函数
		int select = 0;  // 用户选择变量
		cin >> select;
		switch (select)
		{
		case 1:  // 1、添加联系人
			break;
		case 2:  // 2、显示联系人
			break;
		case 3:  // 3、删除联系人
			break;
		case 4:  // 4、查找联系人
			break;
		case 5:  // 5、修改联系人
			break;
		case 6:  // 6、清空联系人
			break;
		case 0:  // 0、退出通讯录
			cout << "欢迎下次使用" << endl;
			system("pause");
			return 0;
			break;
		default:
			break;
		}
	}
	system("pause");
	return 0;
}

2.3 添加联系人

功能描述:

实现添加联系人功能,联系人上限为1000人,联系人信息包括(姓名、性别、年龄、联系电话、家庭住址)

添加联系人实现步骤:

  • 设计联系人结构体
  • 设计通讯录结构体
  • main函数中创建通讯录
  • 封装添加联系人函数
  • 测试添加联系人功能

设计联系人结构体

联系人信息包括:姓名、性别、年龄、联系电话、家庭住址

cpp 复制代码
// 联系人结构体
struct Person
{
	// 姓名
	string m_Name;
	// 性别     1、男    2、女
	int m_Set;
	// 年龄
	int m_Age;
	// 电话
	string m_Phone;
	// 地址
	string m_Addr;
};

设计通讯录结构体

设计时候可以在通讯录结构体中,维护一个容量为1000的存放联系人的数组,并记录当前通讯录中联系人数量。

cpp 复制代码
#define MAX 1000  // 最大人数
// 设计通讯录结构体
struct Addressbooks
{
	// 通讯录中保存的联系人数组
	struct Person personArray[MAX];
	// 通讯录中人员个数
	int m_Size;
};

main函数中创建通讯录

添加联系人函数封装好后,在main函数中创建一个通讯录变量,这个就是我们需要一直维护的通讯录

cpp 复制代码
mian函数起始位置添加:
// 创建通讯录
Addressbooks abs;
//初始化通讯录中人数
abs.m_Size = 0;

封装添加联系人函数

思路:添加联系人前先判断通讯录是否已满,如果满了就不再添加,未满情况将新联系人信息逐个加入到通讯录

cpp 复制代码
// 1、添加联系人信息
void addPerson(Addressbooks* abs)
{
	// 判断通讯录是否已满
	if (abs->m_Size == MAX){
		cout << "通讯录已满,无法继续添加新联系人!!!" << endl;
		return;
	}
	else {
		// 姓名
		string name;  
		cout << "请输入姓名: ";
		cin >> name;
		abs->personArray[abs->m_Size].m_Name = name;
		// 性别
		int sex;
		while (true)
		{
			cout << "请输入性别(1、男 or 2、女):  ";
			cin >> sex;
			if (sex == 1 || sex == 2) {
				abs->personArray[abs->m_Size].m_Sex = sex;
				break;
			}
			cout << "输入错误,请重新输入" << endl;
		}
		// 年龄
		int age;
		cout << "请输入年龄:  ";
		cin >> age;
		abs->personArray[abs->m_Size].m_Age = age;
		// 联系电话
		string phone;
		cout << "请输入联系电话:  ";
		cin >> phone;
		abs->personArray[abs->m_Size].m_Phone = phone;
		// 家庭地址
		string address;
		cout << "请输入家庭地址:  ";
		cin >> address;
		abs->personArray[abs->m_Size].m_Addr = address;
		// 更新通讯录人数
		abs->m_Size++;
		cout << "添加成功" << endl;
		system("pause");
		system("cls");
	}
}

测试添加联系人功能

选择界面中,如果玩家选择了1,代表添加联系人,我们可以测试下该功能

cpp 复制代码
case 1:  //添加联系人
	addPerson(&abs);
	break;

2.4 显示联系人

功能描述:显示通讯录中已有的联系人信息

显示联系人实现步骤:

  • 封装显示联系人函数
  • 测试显示联系人功能

封装显示联系人函数

思路:判断如果当前通讯录中没有人员,就提示记录为空,人数大于0,显示通讯录中信息。

cpp 复制代码
// 显示所有联系人信息
void showPerson(Addressbooks* abs)
{
	if (abs->m_Size == 0) {
		cout << "当前记录为空" << endl;
	}
	else{
		for (int i = 0; i < abs->m_Size; i++) {
			cout << "姓名: " << abs->personArray[i].m_Name << "\t";
			cout << "性别: " << (abs->personArray[i].m_Sex == 1 ? "男" : "女") << "\t";
			cout << "年龄: " << abs->personArray[i].m_Age << "\t";
			cout << "联系电话: " << abs->personArray[i].m_Phone << "\t";
			cout << "家庭地址: " << abs->personArray[i].m_Addr << endl;
		}
	}
	system("pause");
	system("cls");
}

测试显示联系人功能

在switch case语句中,case 2 里添加

cpp 复制代码
case 2:  //显示联系人
	showPerson(&abs);
	break;

2.5 删除联系人

功能描述:按照姓名进行删除指定联系人

删除联系人实现步骤:

  • 封装检测联系人是否存在
  • 封装删除联系人函数
  • 测试删除联系人功能

封装检测联系人是否存在

设计思路:

删除联系人前,我们需要先判断用户输入的联系人是否存在,如果存在删除,不存在提示用户没有要删除的联系人

因此我们可以把检测联系人是否存在封装成一个函数中,如果存在,返回联系人在通讯录中的位置,不存在返回-1。

cpp 复制代码
// 判断是否存在查询的人员,存在返回在数组中索引位置,不存在返回-1
int isExist(Addressbooks* abs, string name)
{
	for (int i = 0; i < abs->m_Size; i++) {
		if (abs->personArray[i].m_Name == name)
			return i;  // 找到了
	}
	return -1;  // 没找到
}

封装删除联系人函数

根据用户输入的联系人判断该通讯录中是否有此人,查找到进行删除,并提示删除成功,查不到提示查无此人。

cpp 复制代码
// 3、删除指定联系人信息
void deletePerson(Addressbooks* abs)
{
	string name;
	cout << "请输入你要删除的联系人:  ";
	cin >> name;
	int ret = isExist(abs, name);
	if (ret != -1) {
		for (int i = ret; i < abs->m_Size; i++) {
			abs->personArray[i] = abs->personArray[i + 1];
		}
		abs->m_Size--;
		cout << "删除成功" << endl;
	}
	else {
		cout << "查无此人" << endl;
	}
	system("pause");
	system("cls");
}

测试删除联系人功能

cpp 复制代码
case 3:  //删除联系人
	deletePerson(&abs);
	break;

2.6 查找联系人

功能描述:按照姓名查看指定联系人信息

查找联系人实现步骤

  • 封装查找联系人函数
  • 测试查找指定联系人

封装查找联系人函数

实现思路:判断用户指定的联系人是否存在,如果存在显示信息,不存在则提示查无此人。

cpp 复制代码
// 4、查找指定联系人信息
void findPerson(Addressbooks* abs)
{
	string name;
	cout << "请输入你要查找的联系人姓名:  ";
	cin >> name;
	int ret = isExist(abs, name);
	if (ret != -1) {
		cout << "姓名: " << abs->personArray[ret].m_Name << "\t";
		cout << "性别: " << (abs->personArray[ret].m_Sex == 1 ? "男" : "女") << "\t";
		cout << "年龄: " << abs->personArray[ret].m_Age << "\t";
		cout << "联系电话: " << abs->personArray[ret].m_Phone << "\t";
		cout << "家庭地址: " << abs->personArray[ret].m_Addr << endl;
	}
	else {
		cout << "查无此人" << endl;
	}
	system("pause");
	system("cls");
}

测试查找指定联系人

在switch case 语句中,case4里添加:

cpp 复制代码
case 4:  //查找联系人
	findPerson(&abs);
	break;

2.7 修改联系人

功能描述:按照姓名重新修改指定联系人

修改联系人实现步骤

  • 封装修改联系人函数
  • 测试修改联系人功能

封装修改联系人函数

实现思路:查找用户输入的联系人,如果查找成功进行修改操作,查找失败提示查无此人。

cpp 复制代码
// 5、修改指定联系人信息
void modifyPerson(Addressbooks* abs)
{
	string name;
	cout << "请输入你要修改的联系人姓名:  ";
	cin >> name;
	int ret = isExist(abs, name);
	if (ret != -1){
		// 姓名
		string name;
		cout << "请输入姓名: ";
		cin >> name;
		abs->personArray[ret].m_Name = name;
		// 性别
		int sex;
		while (true)
		{
			cout << "请输入性别(1、男 or 2、女):  ";
			cin >> sex;
			if (sex == 1 || sex == 2) {
				abs->personArray[ret].m_Sex = sex;
				break;
			}
			cout << "输入错误,请重新输入" << endl;
		}
		// 年龄
		int age;
		cout << "请输入年龄:  ";
		cin >> age;
		abs->personArray[ret].m_Age = age;
		// 联系电话
		string phone;
		cout << "请输入联系电话:  ";
		cin >> phone;
		abs->personArray[ret].m_Phone = phone;
		// 家庭地址
		string address;
		cout << "请输入家庭地址:  ";
		cin >> address;
		abs->personArray[ret].m_Addr = address;
		cout << "联系人信息修改成功" << endl;
	}
	else {
		cout << "查无此人" << endl;
	}
	system("pause");
	system("cls");
}

测试修改联系人功能

在switch case 语句中,case 5里添加:

cpp 复制代码
case 5:  //修改联系人
	modifyPerson(&abs);
	break;

2.8 清空联系人

功能描述:清空通讯录中所有信息

清空联系人实现步骤

  • 封装清空联系人函数
  • 测试清空联系人

封装清空联系人函数

实现思路: 将通讯录所有联系人信息清除掉,只要将通讯录记录的联系人数量置为0,做逻辑清空即可。

cpp 复制代码
// 6、清空所有联系人
void cleanPerson(Addressbooks* abs)
{
	char chiose;
	cout << "确认清空通讯录吗(y/n): ";
	while (true)
	{
		cin >> chiose;
		if (chiose == 'y') {
			abs->m_Size = 0;
			cout << "通讯录已清空" << endl;
			break;
		}
		else if (chiose == 'n') {
			cout << "已取消清空" << endl;
			break;
		}
		else {
			cout << "输入错误,请重新输入" << endl;
		}
	}
	system("pause");
	system("cls");
}

测试清空联系人

在switch case 语句中,case 6 里添加:

cpp 复制代码
case 6:  //清空联系人
	cleanPerson(&abs);
	break;

三、完整代码

cpp 复制代码
#include<iostream>
#include<string>
using namespace std;
#define MAX 1000  // 最大人数

// 联系人结构体
struct Person
{
	// 姓名
	string m_Name;
	// 性别     1、男    2、女
	int m_Sex;
	// 年龄
	int m_Age;
	// 电话
	string m_Phone;
	// 地址
	string m_Addr;
};

// 设计通讯录结构体
struct Addressbooks
{
	// 通讯录中保存的联系人数组
	struct Person personArray[MAX];
	// 通讯录中人员个数
	int m_Size;
};

// 1、添加联系人信息
void addPerson(Addressbooks* abs)
{
	// 判断通讯录是否已满
	if (abs->m_Size == MAX){
		cout << "通讯录已满,无法继续添加新联系人!!!" << endl;
		return;
	}
	else {
		// 姓名
		string name;  
		cout << "请输入姓名: ";
		cin >> name;
		abs->personArray[abs->m_Size].m_Name = name;
		// 性别
		int sex;
		while (true)
		{
			cout << "请输入性别(1、男 or 2、女):  ";
			cin >> sex;
			if (sex == 1 || sex == 2) {
				abs->personArray[abs->m_Size].m_Sex = sex;
				break;
			}
			cout << "输入错误,请重新输入" << endl;
		}
		// 年龄
		int age;
		cout << "请输入年龄:  ";
		cin >> age;
		abs->personArray[abs->m_Size].m_Age = age;
		// 联系电话
		string phone;
		cout << "请输入联系电话:  ";
		cin >> phone;
		abs->personArray[abs->m_Size].m_Phone = phone;
		// 家庭地址
		string address;
		cout << "请输入家庭地址:  ";
		cin >> address;
		abs->personArray[abs->m_Size].m_Addr = address;
		// 更新通讯录人数
		abs->m_Size++;
		cout << "添加成功" << endl;
		system("pause");
		system("cls");
	}
}

// 显示所有联系人信息
void showPerson(Addressbooks* abs)
{
	if (abs->m_Size == 0) {
		cout << "当前记录为空" << endl;
	}
	else{
		for (int i = 0; i < abs->m_Size; i++) {
			cout << "姓名: " << abs->personArray[i].m_Name << "\t";
			cout << "性别: " << (abs->personArray[i].m_Sex == 1 ? "男" : "女") << "\t";
			cout << "年龄: " << abs->personArray[i].m_Age << "\t";
			cout << "联系电话: " << abs->personArray[i].m_Phone << "\t";
			cout << "家庭地址: " << abs->personArray[i].m_Addr << endl;
		}
	}
	system("pause");
	system("cls");
}

// 判断是否存在查询的人员,存在返回在数组中索引位置,不存在返回-1
int isExist(Addressbooks* abs, string name)
{
	for (int i = 0; i < abs->m_Size; i++) {
		if (abs->personArray[i].m_Name == name)
			return i;  // 找到了
	}
	return -1;  // 没找到
}

// 3、删除指定联系人信息
void deletePerson(Addressbooks* abs)
{
	string name;
	cout << "请输入你要删除的联系人:  ";
	cin >> name;
	int ret = isExist(abs, name);
	if (ret != -1) {
		for (int i = ret; i < abs->m_Size; i++) {
			abs->personArray[i] = abs->personArray[i + 1];
		}
		abs->m_Size--;
		cout << "删除成功" << endl;
	}
	else {
		cout << "查无此人" << endl;
	}
	system("pause");
	system("cls");
}

// 4、查找指定联系人信息
void findPerson(Addressbooks* abs)
{
	string name;
	cout << "请输入你要查找的联系人姓名:  ";
	cin >> name;
	int ret = isExist(abs, name);
	if (ret != -1) {
		cout << "姓名: " << abs->personArray[ret].m_Name << "\t";
		cout << "性别: " << (abs->personArray[ret].m_Sex == 1 ? "男" : "女") << "\t";
		cout << "年龄: " << abs->personArray[ret].m_Age << "\t";
		cout << "联系电话: " << abs->personArray[ret].m_Phone << "\t";
		cout << "家庭地址: " << abs->personArray[ret].m_Addr << endl;
	}
	else {
		cout << "查无此人" << endl;
	}
	system("pause");
	system("cls");
}

// 5、修改指定联系人信息
void modifyPerson(Addressbooks* abs)
{
	string name;
	cout << "请输入你要修改的联系人姓名:  ";
	cin >> name;
	int ret = isExist(abs, name);
	if (ret != -1){
		// 姓名
		string name;
		cout << "请输入姓名: ";
		cin >> name;
		abs->personArray[ret].m_Name = name;
		// 性别
		int sex;
		while (true)
		{
			cout << "请输入性别(1、男 or 2、女):  ";
			cin >> sex;
			if (sex == 1 || sex == 2) {
				abs->personArray[ret].m_Sex = sex;
				break;
			}
			cout << "输入错误,请重新输入" << endl;
		}
		// 年龄
		int age;
		cout << "请输入年龄:  ";
		cin >> age;
		abs->personArray[ret].m_Age = age;
		// 联系电话
		string phone;
		cout << "请输入联系电话:  ";
		cin >> phone;
		abs->personArray[ret].m_Phone = phone;
		// 家庭地址
		string address;
		cout << "请输入家庭地址:  ";
		cin >> address;
		abs->personArray[ret].m_Addr = address;
		cout << "联系人信息修改成功" << endl;
	}
	else {
		cout << "查无此人" << endl;
	}
	system("pause");
	system("cls");
}

// 6、清空所有联系人
void cleanPerson(Addressbooks* abs)
{
	char chiose;
	cout << "确认清空通讯录吗(y/n): ";
	while (true)
	{
		cin >> chiose;
		if (chiose == 'y') {
			abs->m_Size = 0;
			cout << "通讯录已清空" << endl;
			break;
		}
		else if (chiose == 'n') {
			cout << "已取消清空" << endl;
			break;
		}
		else {
			cout << "输入错误,请重新输入" << endl;
		}
	}
	system("pause");
	system("cls");
}

// 菜单函数
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;
	cout << "请选择:  ";
}

int main()
{
	// 创建通讯录
	Addressbooks abs;
	//初始化通讯录中人数
	abs.m_Size = 0;
	while (true)
	{
		showMenu();  // 调用菜单函数
		int select = 0;  // 用户选择变量
		cin >> select;
		switch (select)
		{
		case 1:  // 1、添加联系人
			addPerson(&abs);
			break;
		case 2:  // 2、显示联系人
			showPerson(&abs);
			break;
		case 3:  // 3、删除联系人
			deletePerson(&abs);
			break;
		case 4:  // 4、查找联系人
			findPerson(&abs);
			break;
		case 5:  // 5、修改联系人
			modifyPerson(&abs);
			break;
		case 6:  // 6、清空联系人
			cleanPerson(&abs);
			break;
		case 0:  // 0、退出通讯录
			cout << "欢迎下次使用" << endl;
			system("pause");
			return 0;
			break;
		default:
			break;
		}
	}
	system("pause");
	return 0;
}

至此,通讯录管理系统完成!

相关推荐
Channing Lewis26 分钟前
sql server如何创建表导入excel的数据
数据库·oracle·excel
秃头摸鱼侠27 分钟前
MySQL安装与配置
数据库·mysql·adb
small_wh1te_coder29 分钟前
c语言超详细知识点总结 1500行手写源码 持续更新中ing 从25年5月到6月5日
c++·c
UGOTNOSHOT31 分钟前
每日八股文6.3
数据库·sql
weixin_4612594133 分钟前
[C]C语言日志系统宏技巧解析
java·服务器·c语言
m0_6371469338 分钟前
C语言基础面试问答
运维·服务器
t1987512842 分钟前
Linux 上的 Tomcat 端口占用排查
linux·tomcat·firefox
行云流水行云流水1 小时前
数据库、数据仓库、数据中台、数据湖相关概念
数据库·数据仓库
John Song1 小时前
Redis 集群批量删除key报错 CROSSSLOT Keys in request don‘t hash to the same slot
数据库·redis·哈希算法
小狗爱吃黄桃罐头1 小时前
正点原子[第三期]Arm(iMX6U)Linux移植学习笔记-12.1 Linux内核启动流程简介
linux·arm开发·学习