C++ 通讯录管理系统实战:从零实现增删改查功能

Jasper
Jasper
发布时间:2026-10-16| 8人浏览过
原创

本文以 C++ 控制台程序为载体,详细拆解如何实现一个具备完整增删改查功能的通讯录管理系统。通过定义Person和PhoneBook结构体建立数据模型,结合指针操作与循环控制,解决了姓名匹配、手机号位数校验、数组元素前移删除以及界面交互等关键技术点。

数据结构设计与核心模块分析

在构建通讯录之前,首先需要明确数据的存储方式。本方案采用静态数组配合结构体的方式来模拟数据库表行数据的管理,这种模式简单直观,非常适合理解 C++ 中的内存布局与指针传递。

第一步:定义联系人数据结构

使用 struct 关键字将联系人的姓名、性别、年龄、电话和地址封装在一起,形成自定义类型 Person。这不仅提高了代码的可读性,也为后续批量管理数据打下基础:

// 联系人基本信息结构体
struct Person {
    string p_name; // 姓名
    int p_sex;     // 性别 (1:男, 2:女)
    int p_age;     // 年龄
    string p_phone;// 电话号码
    string p_address;// 联系地址
};

第二步:构建通讯录容器

为了容纳多个联系人并维护当前数量,设计 PhoneBook 结构体。其中包含一个固定大小的 Person 数组 pArray[Max](最大支持 1000 人)以及一个记录实际存入人数的整数 b_size:

#define Max 1000
struct PhoneBook {
    struct Person pArray[Max];
    int b_size;
};

第三步:输入验证工具函数

在实际应用中,用户输入往往不规范。代码利用 <sstream> 库实现了 isNum 函数,通过流提取操作判断字符串是否完全由数字组成,确保录入的手机号码符合纯数字要求:

bool isNum(string str) {
    stringstream sin(str);
    double d;
    char c;
    if (!(sin >> d)) return false;
    if (sin >> c) return false;
    return true;
}

核心功能实现逻辑详解

第四步:实现信息录入(增加联系人)

该功能首先检查数组是否已满,随后依次获取各项信息。关键注意点在于性别与手机号的循环校验机制:

  • 性别校验:仅在用户输入 1 或 2 时才跳出循环,否则提示错误并重新等待输入。
  • 手机号校验:同时检查长度是否为 11 位且内容为纯数字,不合规则强制重输。

添加联系人成功后的界面反馈

第五步:遍历与展示(显示联系人)

调用 printPerson 函数时,若 b_size 为 0 则提示空;否则通过 for 循环索引访问数组。程序根据存储的性别数字映射为中文“男”或“女”,并按格式化字符串输出所有字段。

第六步:精准定位(查找联系人)

为了提高复用性,代码单独封装了 isExist 函数。它接收通讯录指针与目标姓名,通过顺序查找返回匹配的下标索引;若未找到则返回 -1。这一设计被复用到后续的删除和修改功能中。

高级操作:修改与删除技术要点

第七步:执行数据修改

修改逻辑依赖于上一步找到的下标。确认后,程序会进入输入交互环节,允许更新联系人的姓名、性别、年龄、电话和地址。每完成一项赋值,屏幕即打印修改成功提示并清屏返回主菜单。

第八步:处理数组删除(覆盖法)

这是本系统中最具代表性的数据结构操作。当删除指定姓名的联系人时,系统无法像链表那样直接断开连接,而是必须将该位置之后的所有元素整体向前平移一位来填补空缺:

int r = isExist(pb, name);
if (r != -1) {
    // 从删除位置的下一个元素开始,逐个前移
    for (int i = r; i < pb->b_size; i++) {
        pb->pArray[i] = pb->pArray[i + 1];
    }
    pb->b_size--; // 总数减一
    cout << "删除成功" << endl;
}

此过程涉及底层内存拷贝效率问题,虽然在千级规模下影响微乎其微,但理解了这一点是掌握 C 风格动态数据处理的关键。

执行查找操作时的控制台输出示例

第九步:快速清空重置

相比于逐一遍历删除,清空功能只需将计数器 pb->b_size 归零即可。这在物理内存未被释放的情况下,瞬间完成了逻辑上的“清空”操作。

系统主控流程与交互体验优化

main 函数作为系统的入口,构建了基于 while(true) 的死循环框架。配合 switch-case 语句分发用户的菜单选择(0-6),实现了非阻塞式的持续交互。

  • 清屏机制:在每个子功能执行完毕后调用 system("cls")(Windows环境)清除屏幕内容,保持界面整洁。
  • 暂停等待:通过 system("pause") 让用户有时间观察运行结果后再继续下一步。

删除联系人前后的数据结构变化示意

运行效果与测试验证

完整的代码编译后,用户在终端将看到清晰的文字菜单导航。经多轮操作测试,系统在以下场景中表现稳定:

  1. 边界测试:连续添加至 1000 人上限时,准确拦截并提示满员。
  2. 异常输入测试:输入带字母的手机号或非法性别值,均能触发重试提示直至合法。
  3. 越界保护:尝试删除不存在的姓名,正确返回“查无此人”。

执行修改联系人操作的全流程演示

程序最终退出状态及欢迎语

总结

通过这个简单的通讯录案例,我们实际上完成了一个微型的关系型数据仓库开发。掌握了结构体传参、数组内存偏移技巧以及严格的输入过滤策略。以上就是用 C++ 实现通讯录管理系统的全过程,更多关于 C++ 进阶学习的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。