找回密码
 立即注册

QQ登录

只需一步,快速开始

工控课堂 首页 工控文库 上位机编程 查看内容

通讯录管理系统(C++)

2022-6-27 21:47| 发布者: 198366809| 查看: 402| 评论: 0

摘要: 前言本程序采用VS2019开发实现博主尽可能完善并健壮了程序功能,如有不理想之处,请加以指正,博主会在第一时间修改完善。原创不易,望"推荐","关注","收藏","转发",谢谢!!!代码点击查看代码#includeiostream #i ...

前言

本程序采用VS2019开发实现
博主尽可能完善并健壮了程序功能,如有不理想之处,请加以指正,博主会在第一时间修改完善。原创不易,望"推荐""关注""收藏""转发",谢谢!!!

代码

点击查看代码
#include<iostream> #include<string> #include<regex> using namespace std; #define MAX 10 // 联系人结构体 struct Person { // 姓名 string m_name; // 性别 1--男;2--女 int m_sex = 0; // 年龄 int m_age = 0; // 电话号码 string m_phoneNum; // 地址 string m_Address; }; // 通讯录结构体 struct AddressBook { // 通讯录中保存联系人的数组 struct Person person[MAX]; // 通讯录中当前联系人的个数 int m_Size = 0; }; // 正则表达式匹配 bool match(string input, string express) { // 匹配结果存放声明 smatch results; regex pattern(express); return regex_search(input, results, pattern); } // 判断姓名 bool jugeName(AddressBook* abs, string name) { bool ret = match(name, "^([\xa1-\xff]{4,8}(@[\xa1-\xff]{4,8}){0,11})$|^([A-Z][a-z]{2,27}( [A-Z][a-z]{2,27}){0,11})$"); if (abs->m_Size == 0) { if (ret) return true; else return false; }else { if (ret) { for (int i = 0; i < abs->m_Size; i++) { if (abs->person[i].m_name._Equal(name)) return false; } } } return true; } // 判断电话号码 bool jugePhoneNum(AddressBook* abs, string phoneNum) { bool ret = match(phoneNum, "^1(3[0-9]|4[01456879]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[0-35-9])[0-9]{8}$"); if (abs->m_Size == 0) { if (ret) return true; else return false; } else { if (ret) { for (int i = 0; i < abs->m_Size; i++) { if (abs->person[i].m_phoneNum._Equal(phoneNum)) return false; } } } return true; } // 判断年龄 bool jugeAge(string age) { if (match(age, "^([7-9]|[1-9][0-9]|1[01][0-9]|1[23]0)$")) return true; return false; } // 判断性别 bool jugeSex(string sex) { if (match(sex, "^([12])$")) return true; return false; } // 判断地址信息 bool jugeAddress(string address) { if (match(address, "^([^省]+省|.+自治区|[^市]+市)([^自治州]+自治州|[^市]+市|[^县]+县|[^区]+区|[^盟]+盟|[^地区]+地区|.+区划)([^市]+市|[^镇]+镇|[^县]+县|[^旗]+旗|.+区)$")) return true; return false; } // 判断联系人是否存在(存在返回下标,不存在返回-1) int IsExist(const AddressBook* const abs, string name) { for (int i = 0; i < abs->m_Size; i++) { // 找到用户输入的姓名了 if (abs->person[i].m_name._Equal(name)) { return i; } } return -1; } // 错误信息 void ErrorMessage() { cout << "输入格式不合理,请按要求重新输入..." << endl << endl; } // 显示具体联系人信息 void showSpecificPersonMessage(struct Person person) { setlocale(LC_ALL, "Zh-Hans"); // 地域设置 wchar_t nameChar[2] = L"·"; cout << "姓名:"; for (unsigned int i = 0; i < person.m_name.length(); i++) { if (person.m_name[i] == '@') wcout << nameChar[0]; else cout << person.m_name[i]; } cout<< "\t\t性别:" << (person.m_sex == 1 ? "男" : "女") << "\t年龄:" << person.m_age << "\t电话号码:" << person.m_phoneNum << "\t地址:" << person.m_Address << endl << endl; } // 功能:健壮姓名的输入 bool formatName(AddressBook* abs, int Num) { while (true) { string name; cout << "请输入目标姓名(如需停止输入,请输入\"q\"):"; getline(cin, name); if (!name._Equal("q")) { if (jugeName(abs, name)) { abs->person[Num].m_name = name; cout << "该姓名可以录入..." << endl << endl; break; } if (abs->m_Size == 0) ErrorMessage(); else cout << "存在该姓名,不能录入..." << endl << endl; }else return false; } return true; } // 功能:健壮性别的输入 void formatSex(AddressBook* abs, int Num) { string sex; while (true) { cout << "请输入目标性别(格式:1--男 2--女):"; getline(cin, sex); if (jugeSex(sex)) { abs->person[Num].m_sex = atoi(sex.c_str()); break; } ErrorMessage(); } } // 功能:健壮年龄输入 void formatAge(AddressBook* abs, int Num) { while (true) { string age; cout << "请输入目标年龄:"; getline(cin, age); if (jugeAge(age)) { abs->person[Num].m_age = atoi(age.c_str()); break; } ErrorMessage(); } } // 功能:健壮电话号码输入 bool formatePhoneNum(AddressBook* abs, int Num) { while (true) { string phoneNum; cout << "请输入目标电话号码(如需停止输入,请输入\"q\"):"; getline(cin, phoneNum); if (!phoneNum._Equal("q")) { if (jugePhoneNum(abs, phoneNum)) { abs->person[Num].m_phoneNum = phoneNum; cout << "该电话号码可以录入..." << endl << endl; break; } if (abs->m_Size == 0) ErrorMessage(); else cout << "存在该电话号码,不能录入..." << endl << endl; }else return false; } return true; } // 功能:健壮地址信息输入 void formateAddress(AddressBook* abs, int Num) { while (true) { string address; cout << "请输入目标地址信息:"; getline(cin, address); if (jugeAddress(address)) { abs->person[Num].m_Address = address; break; } ErrorMessage(); } } // 功能:健壮输入信息 bool formatInputMessage(AddressBook* abs) { // 姓名 bool ret1 = formatName(abs, abs->m_Size); if (ret1) { // 性别 formatSex(abs, abs->m_Size); // 年龄 formatAge(abs, abs->m_Size); }else return false; // 电话号码 bool ret2 = formatePhoneNum(abs, abs->m_Size); if (ret2) { // 地址 formateAddress(abs, abs->m_Size); }else return false; return true; } // 1.添加联系人 void addPerson(AddressBook* abs) { // 判断通讯录是否已满,如果满了就不再添加 if (abs->m_Size == MAX) { cout << "通讯录已满,请删除不常用的联系人后重新添加..." << endl; return; }else { // 添加具体的联系人信息 bool ret = formatInputMessage(abs); if (ret){ abs->m_Size++; cout << "添加成功..." << endl << endl; }else cout << "添加失败..." << endl << endl; } } // 2.显示联系人 void showPerson(const AddressBook * const abs) { if (abs->m_Size == 0) cout << "当前记录为空..." << endl << endl; else { cout << "所有联系人信息如下:" << endl << endl; for (int i = 0; i < abs->m_Size; i++) { showSpecificPersonMessage(abs->person[i]); } } } // 3.删除联系人 bool deletePerson(AddressBook *abs, string name){ int ret = IsExist(abs, name); if (ret != -1) { cout << "存在该联系人..." << endl; for (int i = ret; i < abs->m_Size; i++) { abs->person[i] = abs->person[i + 1]; } abs->m_Size--; }else { cout << "查无此人..." << endl; return false; } return true; } // 4.查找联系人 void findByName(const AddressBook* const abs, string name) { int ret = IsExist(abs, name); if (ret != -1) { cout << endl; cout << "存在该联系人,信息如下..." << endl; showSpecificPersonMessage(abs->person[ret]); }else { cout << "查无此人..." << endl; } } // 封装修改函数 void modifyPersonInner(AddressBook* abs, int ret) { cout << "联系人信息包含以下几项:" << endl; cout << "1.姓名\t2.性别\t3.年龄\t4.电话号码\t5.地址" << endl << "注意:输入数字0则保存修改信息并返回主菜单..." << endl << endl; while (true){ string Num; cout << "请输入要修改信息的数字编号:"; getline(cin, Num); if (Num._Equal("1")) { formatName(abs, ret); }else if (Num._Equal("2")) { formatSex(abs, ret); }else if (Num._Equal("3")) { formatAge(abs, ret); }else if (Num._Equal("4")) { formatePhoneNum(abs, ret); }else if (Num._Equal("5")) { formateAddress(abs, ret); }else if (Num._Equal("0")) { cout << "修改成功..." << endl << endl; cout << "修改后的信息如下:" << endl; showSpecificPersonMessage(abs->person[ret]); break; }else ErrorMessage(); } } // 5.修改联系人 void modifyPersonOuter(AddressBook* abs, string name) { int ret = IsExist(abs, name); if (ret != -1) { cout << endl; cout << "存在该联系人,信息如下..." << endl; showSpecificPersonMessage(abs->person[ret]); cout << endl; cout << "********** 进入修改页面 ************" << endl; modifyPersonInner(abs, ret); } else { cout << "查无此人..." << endl; } } // 6.清空联系人 void clearAll(AddressBook *abs) { if (abs->m_Size == 0) return; while (true) { string SURE; cout << "确定要清空通讯录吗?(Y/N):"; getline(cin, SURE); if (SURE.length() == 1) { if (SURE._Equal("y") || SURE._Equal("Y")) { cout << "您选择YES,请稍等..." << endl; abs->m_Size = 0; cout << "记录清空成功..." << endl << endl; break; }else if (SURE._Equal("N") || SURE._Equal("n")) { cout << "您选择NO, 请稍等..." << endl << endl; break; } } ErrorMessage(); } } // 显示菜单 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; cout << "注意:\n1.姓名不能重复且只能输入 [@,空格] 两种特殊字符,如姓名中有[·],请以[@]代替\n" << "2.性别:1--男,2--女\n" << "3.手机号码不能重复且需符合国家规定\n" << "4.年龄为 7 - 130 之间的整数\n" << "5.地址信息:标准的 [省市区,市区镇,市县镇]...\n\n"; } int main() { // 创建通讯录结构体变量 AddressBook abs; while (true) { showMenu(); // 输入通讯录的功能编号 string Num; while (true) { cout << "请输入选择的功能编号:"; getline(cin, Num); if (match(Num, "^([0-6])$")) break; ErrorMessage(); } switch (atoi(Num.c_str())) { case 1: // 1.添加联系人 { addPerson(&abs); // 利用地址传递可以修改实参 showPerson(&abs); system("pause"); system("cls"); } break; case 2: // 2.显示联系人 { showPerson(&abs); system("pause"); system("cls"); } break; case 3: // 3.删除联系人 { if (abs.m_Size != 0) { string name; cout << "请输入要删除的联系人姓名:"; getline(cin, name); bool ret = deletePerson(&abs, name); if (ret == true) { cout << "删除成功..." << endl << endl; showPerson(&abs); }else { cout << "删除失败..." << endl << endl; } }else cout << "当前记录为空..." << endl << endl; system("pause"); system("cls"); } break; case 4: // 4.查找联系人 { if (abs.m_Size != 0) { string name; cout << "请输入要查找的联系人姓名:"; getline(cin, name); findByName(&abs, name); }else cout << "当前记录为空..." << endl << endl; system("pause"); system("cls"); } break; case 5: // 5.修改联系人 { showPerson(&abs); if (abs.m_Size != 0) { string name; cout << "请输入要修改的联系人姓名:"; getline(cin, name); modifyPersonOuter(&abs, name); } system("pause"); system("cls"); } break; case 6: // 6.清空联系人 { clearAll(&abs); showPerson(&abs); cout << "正在返回主菜单, "; system("pause"); system("cls"); } break; case 0: // 0.退出通讯录 cout << "欢迎下次使用..." << endl; system("pause"); return 0; break; } } return 0; }

关注公众号,加入500人微信群,下载100G免费资料!

最新评论

热门文章
关闭

站长推荐上一条 /1 下一条

QQ|手机版|免责声明|本站介绍|工控课堂 ( 沪ICP备20008691号-1 )

GMT+8, 2025-12-23 02:53 , Processed in 0.065029 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

返回顶部