C++ 从入门到精通C++ 从入门到精通
首页
基础教程
进阶教程
实战项目
编程指南
首页
基础教程
进阶教程
实战项目
编程指南
  • 🛠️ 实战项目

    • 🛠️ C++ 实战项目
    • 第23章 - 学生管理系统
    • 第24章 - 通讯录管理系统
    • 第25章 - 图书管理系统
    • 第26章 - 简易银行系统
    • 第27章 - 贪吃蛇游戏

第24章 - 通讯录管理系统

嗨,朋友!我是长安。

这个项目使用 map 容器实现一个功能完善的通讯录管理系统。

🎯 项目功能

  • ✅ 添加联系人
  • ✅ 删除联系人
  • ✅ 查找联系人
  • ✅ 修改联系人
  • ✅ 显示所有联系人
  • ✅ 按姓名排序显示
  • ✅ 文件持久化存储

💡 核心技术

  • map容器 - 快速查找
  • 结构体 - 数据封装
  • 文件操作 - 数据持久化
  • 类封装 - 面向对象设计

📝 完整代码

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

// 联系人结构
struct Contact {
    string name;
    string phone;
    string email;
    string address;
};

class ContactManager {
private:
    map<string, Contact> contacts;
    const string filename = "contacts.txt";
    
public:
    ContactManager() {
        loadFromFile();
    }
    
    ~ContactManager() {
        saveToFile();
    }
    
    // 添加联系人
    void addContact() {
        Contact c;
        cout << "\n===== 添加联系人 =====" << endl;
        cout << "姓名:";
        cin.ignore();
        getline(cin, c.name);
        
        if (contacts.find(c.name) != contacts.end()) {
            cout << "联系人已存在!" << endl;
            return;
        }
        
        cout << "电话:";
        getline(cin, c.phone);
        cout << "邮箱:";
        getline(cin, c.email);
        cout << "地址:";
        getline(cin, c.address);
        
        contacts[c.name] = c;
        cout << "✓ 添加成功!" << endl;
    }
    
    // 删除联系人
    void deleteContact() {
        string name;
        cout << "\n===== 删除联系人 =====" << endl;
        cout << "请输入姓名:";
        cin.ignore();
        getline(cin, name);
        
        if (contacts.erase(name)) {
            cout << "✓ 删除成功!" << endl;
        } else {
            cout << "✗ 未找到该联系人!" << endl;
        }
    }
    
    // 查找联系人
    void findContact() {
        string name;
        cout << "\n===== 查找联系人 =====" << endl;
        cout << "请输入姓名:";
        cin.ignore();
        getline(cin, name);
        
        auto it = contacts.find(name);
        if (it != contacts.end()) {
            displayContact(it->second);
        } else {
            cout << "✗ 未找到该联系人!" << endl;
        }
    }
    
    // 修改联系人
    void modifyContact() {
        string name;
        cout << "\n===== 修改联系人 =====" << endl;
        cout << "请输入姓名:";
        cin.ignore();
        getline(cin, name);
        
        auto it = contacts.find(name);
        if (it == contacts.end()) {
            cout << "✗ 未找到该联系人!" << endl;
            return;
        }
        
        cout << "\n当前信息:" << endl;
        displayContact(it->second);
        
        cout << "\n请输入新信息(直接回车保持不变):" << endl;
        
        string input;
        cout << "电话 [" << it->second.phone << "]:";
        getline(cin, input);
        if (!input.empty()) it->second.phone = input;
        
        cout << "邮箱 [" << it->second.email << "]:";
        getline(cin, input);
        if (!input.empty()) it->second.email = input;
        
        cout << "地址 [" << it->second.address << "]:";
        getline(cin, input);
        if (!input.empty()) it->second.address = input;
        
        cout << "✓ 修改成功!" << endl;
    }
    
    // 显示单个联系人
    void displayContact(const Contact& c) {
        cout << "\n━━━━━━━━━━━━━━━━━━━━" << endl;
        cout << "姓名:" << c.name << endl;
        cout << "电话:" << c.phone << endl;
        cout << "邮箱:" << c.email << endl;
        cout << "地址:" << c.address << endl;
        cout << "━━━━━━━━━━━━━━━━━━━━" << endl;
    }
    
    // 显示所有联系人
    void displayAll() {
        if (contacts.empty()) {
            cout << "\n通讯录为空!" << endl;
            return;
        }
        
        cout << "\n===== 通讯录列表 =====" << endl;
        cout << "共有 " << contacts.size() << " 个联系人\n" << endl;
        
        for (auto& pair : contacts) {
            displayContact(pair.second);
        }
    }
    
    // 保存到文件
    void saveToFile() {
        ofstream outFile(filename);
        if (!outFile) {
            cout << "无法保存文件!" << endl;
            return;
        }
        
        outFile << contacts.size() << endl;
        for (auto& pair : contacts) {
            Contact& c = pair.second;
            outFile << c.name << endl
                    << c.phone << endl
                    << c.email << endl
                    << c.address << endl;
        }
        
        outFile.close();
    }
    
    // 从文件加载
    void loadFromFile() {
        ifstream inFile(filename);
        if (!inFile) return;
        
        int count;
        inFile >> count;
        inFile.ignore();
        
        for (int i = 0; i < count; i++) {
            Contact c;
            getline(inFile, c.name);
            getline(inFile, c.phone);
            getline(inFile, c.email);
            getline(inFile, c.address);
            
            contacts[c.name] = c;
        }
        
        inFile.close();
        cout << "✓ 已加载 " << count << " 个联系人" << endl;
    }
};

// 显示菜单
void showMenu() {
    cout << "\n╔══════════════════════════╗" << endl;
    cout << "║    通讯录管理系统        ║" << endl;
    cout << "╠══════════════════════════╣" << endl;
    cout << "║  1. 添加联系人           ║" << endl;
    cout << "║  2. 删除联系人           ║" << endl;
    cout << "║  3. 查找联系人           ║" << endl;
    cout << "║  4. 修改联系人           ║" << endl;
    cout << "║  5. 显示所有联系人       ║" << endl;
    cout << "║  0. 退出系统             ║" << endl;
    cout << "╚══════════════════════════╝" << endl;
    cout << "请选择:";
}

int main() {
    ContactManager manager;
    int choice;
    
    while (true) {
        showMenu();
        cin >> choice;
        
        switch (choice) {
            case 1:
                manager.addContact();
                break;
            case 2:
                manager.deleteContact();
                break;
            case 3:
                manager.findContact();
                break;
            case 4:
                manager.modifyContact();
                break;
            case 5:
                manager.displayAll();
                break;
            case 0:
                cout << "\n感谢使用,再见!" << endl;
                return 0;
            default:
                cout << "无效选择!" << endl;
        }
    }
    
    return 0;
}

🎯 运行效果

✓ 已加载 0 个联系人

╔══════════════════════════╗
║    通讯录管理系统        ║
╠══════════════════════════╣
║  1. 添加联系人           ║
║  2. 删除联系人           ║
║  3. 查找联系人           ║
║  4. 修改联系人           ║
║  5. 显示所有联系人       ║
║  0. 退出系统             ║
╚══════════════════════════╝
请选择:1

===== 添加联系人 =====
姓名:张三
电话:13800138000
邮箱:zhangsan@example.com
地址:北京市朝阳区
✓ 添加成功!

💡 知识点

  • map自动排序 - 联系人按姓名自动排序
  • 文件持久化 - 程序关闭后数据不丢失
  • 异常处理 - 文件读写的容错处理
  • 用户交互 - 友好的输入提示

🚀 扩展练习

  1. 添加按拼音首字母分组显示
  2. 实现模糊查询功能
  3. 添加生日提醒功能
  4. 导入/导出CSV格式

➡️ 第25章 - 图书管理系统

最近更新: 2025/12/26 17:25
Contributors: 王长安
Prev
第23章 - 学生管理系统
Next
第25章 - 图书管理系统