第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自动排序 - 联系人按姓名自动排序
- 文件持久化 - 程序关闭后数据不丢失
- 异常处理 - 文件读写的容错处理
- 用户交互 - 友好的输入提示
🚀 扩展练习
- 添加按拼音首字母分组显示
- 实现模糊查询功能
- 添加生日提醒功能
- 导入/导出CSV格式
