C++简易通讯录系统实现流程详解

程一诺
程一诺
发布时间:2026-10-15 | 2人浏览过
原创

本文介绍如何使用C++的struct结构体数组实现一个简易的通讯录管理系统。核心功能包括添加、显示、删除、查找、修改和清空联系人,最大容纳1000人数据。通过封装各模块函数并配合主循环菜单交互,清晰展示了基础的数据管理与逻辑控制方法。

功能设计与数据结构准备

通讯录系统的核心在于对人员信息的结构化存储。为了实现可扩展性与管理便利,我们利用 struct 定义单人的信息模型以及包含多人的通讯录容器。

首先定义联系人结构体 Person,包含姓名、性别(用整数区分)、年龄、联系电话及地址:

// 定义联系人信息结构体
struct Person {
	string m_Name; // 姓名
	int m_Sex;     // 性别:1代表男,2代表女
	int m_Age;     // 年龄
	string m_Phone;// 联系电话
	string m_Address; // 家庭住址 (原稿误拼为m_Afddar已修正)
};

接着定义通讯录结构体 AddaressBooks,内部维护一个固定大小的结构体数组用于存储所有联系人,并用整数变量记录当前实际存在的联系人数目:

#define MAX 1000 // 最大容纳人数
struct AddaressBooks {
	struct Person personArray[MAX]; // 保存的人员数据
	int m_Size;                     // 当前有效联系人数量
};

构建交互式菜单界面

为了让程序易于操作,我们需要设计一个直观的命令行菜单,并通过死循环保持程序的持续运行,直到用户主动退出。

第1步:实现菜单显示函数

目的:在每次操作前向控制台输出选项,提升用户体验。
入口:showMenu() 函数。
动作:使用 cout 打印分隔线与数字序号对应的功能选项。

// 菜单界面显示
void showMenu() {
	cout << "***************************" << endl;
	cout << "*****\t1.添加联系人  *****" << endl;
	cout << "*****\t2.显示联系人  *****" << endl;
	cout << "*****\t3.删除联系人  *****" << endl;
	cout << "*****\t4.查找联系人  *****" << endl;
	cout << "*****\t5.修改联系人  *****" << endl;
	cout << "*****\t6.清空联系人  *****" << endl;
	cout << "*****\t0.退出通讯录  *****" << endl;
	cout << "***************************" << endl;
}

第2步:创建主函数与控制循环

目的:初始化系统状态,并根据用户输入分发相应的业务逻辑。
入口:main() 函数。
动作:
1. 实例化 AddaressBooks 对象并初始化 m_Size = 0。
2. 开启 while(true) 循环,每次轮询先调用菜单函数,再读取用户输入的分流编号。
3. 使用 switch 语句匹配编号,调用对应的处理函数。

以下是在主循环中集成各项功能的框架逻辑:

int main() {
	AddaressBooks abs;
	abs.m_Size = 0;
	int select = 0;

	while (true) {
		showMenu();
		cin >> select;
		switch (select) {
		case 1: addPerson(&abs); break;
		case 2: showPerson(&abs); break;
		case 3: deletePerson(&abs); break;
		case 4: selectPerson(&abs); break;
		case 5: editPerson(&abs); break;
		case 6: cleanPerson(&abs); break;
		case 0:
			cout << "欢迎下次使用" << endl;
			system("pause");
			return 0;
		default:
			break;
		}
	}
}

核心业务逻辑实现

各功能模块独立封装,主要通过指针传递通讯录地址以便直接修改内存中的数据状态。

第1步:安全添加联系人

目的:确保不超出数组边界,并校验基础输入合法性(如性别)。
入口:addPerson(AddaressBooks* abs)
参数:abs 指向通讯录实例。
重要步骤:
1. 检查 abs->m_Size == MAX,若已满则提示并返回。
2. 依次接收姓名、选择性别(仅接受1或2)、年龄、电话、地址并赋值给 personArray[m_Size]。
3. 输入完成后执行 m_Size++,并清屏以保持界面整洁。

第2步:遍历显示所有联系人

目的:直观呈现当前通讯录的所有内容。
入口:showPerson(AddaressBooks* abs)
动作:判断 m_Size 是否为0;若非0,则使用 for 循环迭代数组,格式化输出每个人的详细信息。

第3步:按姓名搜索与辅助函数

在删除、查找、修改操作中,首先需要定位目标在数组中的下标。为此引入 isExist 辅助函数:
isExist(abs, name) 遍历现有联系人,比对姓名是否一致,找到则返回索引,否则返回 -1。

第4步:按名执行删除

目的:移除指定联系人并填补空缺。
入口:deletePerson(AddaressBooks* abs)
动作:
1. 获取目标姓名的索引 ret。
2. 若 ret != -1,从该位置起,将后续所有元素向前移动一位(即 personArray[i] = personArray[i+1])。
3. 数组长度 m_Size--。
注:此方法虽简单但时间复杂度较高,适合小规模数据存储。

第5步:按名查找详情

目的:展示单个联系人的全部属性。
入口:selectPerson(AddaressBooks* abs)
动作:复用 isExist 获取索引后,输出对应下标的结构体字段。

第6步:按名修改信息

目的:更新已知联系人的错误或不准确资料。
入口:editPerson(AddaressBooks* abs)
动作:先查找定位。若存在,再次触发输入流程,覆盖原有字段。特别注意需重新验证性别输入。

第7步:逻辑清空通讯录

目的:重置数据状态而非物理擦除内存。
入口:cleanPerson(AddaressBooks* abs)
动作:直接将 abs->m_Size = 0。这会在逻辑上视为清空,后续写入将从首地址开始覆盖旧数据。

完成判断与排错指南

当代码能够无误编译且能顺畅通过菜单流转,执行增删改查无报错时,即标志着系统功能闭环。若在运行中遇到异常,可参考以下情形:

  • 越界崩溃: 通常是由于删除操作未严格限制索引范围,或者未在添加前检查 MAX 限制导致的。
  • 输入类型不匹配: C++中混用字符串与整数输入(如 getline 与 cin >>)可能遗留换行符导致跳过下一次输入,需注意清理输入缓冲区。
  • 内存未释放: 虽然结构体数组是栈上分配,但在退出前不要试图手动 delete 非动态申请的内存对象。
以上就是C++简易通讯录系统实现的详细内容,更多关于C++通讯录开发的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表