C++ 基础入门篇综合练习:通讯录管理系统

目录

1、系统需求

2、创建项目

2.1 创建项目

2.2 添加文件

3、菜单功能

4、退出功能

5、添加联系人

5.1 设计联系人结构体

5.2 设计通讯录结构体

5.3 main函数中创建通讯录

5.4 封装添加联系人函数

5.5 测试添加联系人功能

6、显示联系人

6.1 封装显示联系人函数

6.2 测试显示联系人功能

7、删除联系人

7.1 封装检测联系人是否存在

7.2 封装删除联系人函数

8、查找联系人

8.1 封装查找联系人函数

8.2 测试查找指定联系人

 9、修改联系人

9.1 封装修改联系人函数

9.2 修改联系人测试

10、清空联系人

10.1 封装清空联系人函数

10.2 清空联系人测试

总结:通讯录管理系统案例代码打包


1、系统需求

通讯录是一个可以记录亲人、好友信息的工具

本教程主要利用C++来实现一个通讯录管理系统

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

1. 添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记录1000人

2. 显示联系人:显示通讯录中所有联系人的信息

3. 删除联系人:按照姓名进行删除指定联系人

4. 查找联系人:按照姓名查看指定联系人信息

5. 修改联系人:按照姓名重新修改指定联系人

6. 清空联系人:清空通讯录中所有信息

7. 退出通讯录:退出当前使用的通讯录

2、创建项目

创建项目步骤如下:

1. 创建新项目

2. 添加文件

2.1 创建项目

(1)打开VS2022

(2)点击-——创建新项目——Visual C++——空项目——输入项目名称——选择项目路径——确定保存

2.2 添加文件

点击源文件——创建通讯录管理系统.cpp 文件

3、菜单功能

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

图片示例:

步骤:

1. 封装函数显示该界面 如 void showMenu()

2. 在main函数中调用封装好的函数

#include<iostream>
using namespace std;

// 1.菜单界面
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;
}

int main()
{
	// 菜单调用
	showMenu();

	system("pause");

	return 0;
}

4、退出功能

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

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

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

int main()
{
	int select = 0;  // 创建用户选择输入的变量

	while (true)
	{
		// 菜单调用
		showMenu();

		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;
		}
	}
}

5、添加联系人

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

添加联系人实现步骤:

1. 设计联系人结构体

2. 设计通讯录结构体

3. main函数中创建通讯录

4. 封装添加联系人函数

5. 测试添加联系人功能

5.1 设计联系人结构体

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

#include<string>

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

5.2 设计通讯录结构体

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

#define MAX 1000

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

	// 通讯录中当前记录联系人个数
	int m_Size;
};

5.3 main函数中创建通讯录

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

main函数起始位置添加:

// 创建通讯录结构体变量
	Addressbooks abs;
	// 初始化通讯录中当前人员个数
	abs.m_Size = 0;

5.4 封装添加联系人函数

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

添加联系人代码:

// 1、添加联系人
void addPerson(Addressbooks* abs)
{
	// 判断通讯录是否已满,如果满了就不再添加
	if (abs->m_Size == MAX)
	{
		cout << "通讯录已满,无法添加!" << endl;
		return;
	}
	else
	{
		// 添加具体联系人

		// 姓名
		string name;
		cout << "请输入姓名:" << endl;
		cin >> name;
		abs->personArray[abs->m_Size].m_Name = name;

		// 性别
		cout << "请输入性别:" << endl;
		cout << "1 --- 男" << endl;
		cout << "2 --- 女" << endl;
		int sex = 0;

		while (true)
		{
			// 如果输入的是1 或者 2 可以退出循环,因为输入的是正确值
			cin >> sex;
			if (sex == 1 || sex == 2)
			{
				abs->personArray[abs->m_Size].m_Sex = sex;
				break;
			}
			cout << "输入有误,请重新输入" << endl;

		}

		// 年龄
		cout << "请输入年龄:" << endl;
		int age = 0;
		cin >> age;
		abs->personArray[abs->m_Size].m_Age = age;

		// 电话
		cout << "请输入联系电话:" << endl;
		string phone;
		cin >> phone;
		abs->personArray[abs->m_Size].m_Phone = phone;

		// 家庭住址
		cout << "请输入家庭住址:" << endl;
		string address;
		cin >> address;
		abs->personArray[abs->m_Size].m_Addr = address;

		// 更新通讯录人数
		abs->m_Size++;

		cout << "添加成功" << endl;

		system("pause");

		system("cls"); // 清屏操作
	}

}

5.5 测试添加联系人功能

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

在switch case语句中,case1里面添加:

		case 1:  // 1、添加联系人
			addPerson(&abs); // 利用地址传递,可以修饰实参
			break;

测试图片如下

6、显示联系人

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

显示联系人实现步骤:

1. 封装显示联系人函数

2. 测试显示联系人功能

6.1 封装显示联系人函数

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

显示联系人代码如下:

// 2、显示所有联系人
void showPerson(Addressbooks* abs)
{
	// 判断通讯录中人数是否为0,如果为0,提示记录为空
	// 如果不为0,显示记录的联系人信息
	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"); // 清屏

}

6.2 测试显示联系人功能

在switch case语句中,case2中添加代码:

		case 2:  // 2、显示联系人
			showPerson(&abs);
			break;

测试效果如下:

7、删除联系人

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

删除联系人实现步骤

1. 封装检测联系人是否存在

2. 封装删除联系人函数

3. 测试删除联系人功能

7.1 封装检测联系人是否存在

设计思路:

删除联系人之前,我们需要先判断用户输入的联系人是否存在,如果存在删除,不存在提示用户没有要删除的联系人,因此我们可以把检测联系人是否存在封装成一个函数,如果存在,返回联系人在通讯录中的位置,不存在返回-1

// 检测联系人是否存在,如果存在,返回联系人所在数组中的具体位置,不存在返回-1
// 参数1 通讯录 参数2 对比姓名
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; // 如果遍历结束都没有找到,返回-1
}

7.2 封装删除联系人函数

 根据用户输入的联系人判断该通讯录中是否有此人

查找到进行删除,并提示删除成功

查不到提示查无此人

// 3、删除指定联系人
void deletePerson(Addressbooks * abs)
{
	cout << "请输入您要删除的联系人:" << endl;

	string name;
	cin >> name;
	
	// ret == -1  未查到
	// ret != -1  查到了
	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");
}

8、查找联系人

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

查找联系人实现步骤

1. 封装查找联系人函数

2. 测试查找指定联系人 

8.1 封装查找联系人函数

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

查找联系人代码:

// 4、查找指定联系人信息
void findPerson(Addressbooks* abs)
{
	cout << "请输入您要查找的联系人" << endl;
	string name;
	cin >> name;

	// 判断指定的联系人是否存在通讯录中
	int ret = isExist(abs, name);

	if (ret != -1) // 找到联系人
	{
		cout << "姓名:" << abs->personArray[ret].m_Name << "\t";
		cout << "性别:" << abs->personArray[ret].m_Sex << "\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");

}

8.2 测试查找指定联系人

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

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

测试结果如图:

 9、修改联系人

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

修改联系人实现步骤:

1. 封装修改联系人函数

2. 测试修改联系人功能

9.1 封装修改联系人函数

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

// 5、修改指定联系人信息
void modifyPerson(Addressbooks* abs)
{
	cout << "请输入您要修改的联系人" << endl;
	string name;
	cin >> name;

	int ret = isExist(abs, name);

	if (ret != -1) // 找到指定联系人
	{
		// 姓名
		string name;
		cout << "请输入姓名:" << endl;
		cin >> name;
		abs->personArray[ret].m_Name = name;

		// 性别
		cout << "请输入性别:" << endl;
		cout << "1 ---- 男" << endl;
		cout << "2 ---- 女" << endl;
		int sex = 0;

		while (true)
		{
			cin >> sex;
			if (sex == 1 || sex == 2)
			{
				// 输入正确 退出循环输入
				abs->personArray[ret].m_Sex = sex;
				break;
			}
			cout << "输入有误,请重新输入" << endl;
		}

		// 年龄
		cout << "请输入年龄:" << endl;
		int age = 0;
		cin >> age;
		abs->personArray[ret].m_Age = age;

		// 电话
		cout << "请输入联系电话:" << endl;
		string phone;
		cin >> phone;
		abs->personArray[ret].m_Phone = phone;

		// 住址
		cout << "请输入家庭住址:" << endl;
		string address;
		cin >> address;
		abs->personArray[ret].m_Addr = address;

		cout << "修改成功!" << endl;

	}
	else  // 未找到联系人
	{
		cout << "查无此人" << endl;
	}
	// 按任意键后清屏
	system("pause");

	system("cls");

}

9.2 修改联系人测试

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

		case 5:  // 5、修改联系人
			modifyPerson(&abs);
			break;

运行结果如下:

10、清空联系人

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

清空联系人实现步骤:

1. 封装清空联系人函数

2. 测试清空联系人

10.1 封装清空联系人函数

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

清空联系人代码:

// 6、清空所有联系人
void cleanPerson(Addressbooks* abs)
{
	abs->m_Size = 0; // 将当前记录联系人数量置为0,做逻辑上清空操作
	cout << "通讯录已清空" << endl;
	// 按任意键后清屏
	system("pause");
	system("cls");
}

 10.2 清空联系人测试

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

		case 6:  // 6、清空联系人
			cleanPerson(&abs);
			break;

测试结果如下:

总结:通讯录管理系统案例代码打包

链接:【免费】通讯录管理系统.rar资源-CSDN文库

  • 37
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
通讯录管理系统使用C++链表实现,是一种常见的数据结构应用。链表是一种线性数据结构,每个节点(或元素)包含数据和指向下一个节点的指针。在通讯录中,链表可以用来存储联系人信息,如姓名、电话、电子邮件等。 以下是使用C++链表实现通讯录管理系统的基本步骤: 1. **定义节点**:创建一个ContactNode类,包含联系人信息(如std::string name, std::string phone, std::string email)以及指向下一个节点的指针。 ```cpp class ContactNode { public: std::string name; std::string phone; std::string email; ContactNode* next; }; ``` 2. **创建链表**:定义一个ContactList类,包含链表头指针(通常是nullptr)和链表管理的方法,如添加联系人、删除联系人和搜索联系人。 ```cpp class ContactList { private: ContactNode* head; public: void addContact(ContactNode* node); void removeContact(const std::string& name); ContactNode* searchContact(const std::string& name); }; ``` 3. **链表操作**: - **添加联系人**:从链表头部开始遍历,找到合适的位置插入新节点。 - **删除联系人**:根据名字查找节点,然后调整前一个节点的next指针以跳过要删除的节点。 - **搜索联系人**:从头节点开始逐个比较,直到找到匹配的名字或遍历到链表末尾。 4. **链表遍历**:为了显示所有联系人,你可以实现一个方法来遍历整个链表并打印联系人信息。 ```cpp void ContactList::displayContacts() const { if (head == nullptr) { std::cout << "No contacts in the list.\n"; } else { displayNode(head); } } // 递归函数,遍历单个节点 void displayNode(const ContactNode* node) { if (node != nullptr) { std::cout << "Name: " << node->name << ", Phone: " << node->phone << ", Email: " << node->email << "\n"; displayNode(node->next); } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万喵字节

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值