通讯录管理系统(C++)
前言
博主尽可能完善并健壮了程序功能,如有不理想之处,请加以指正,博主会在第一时间修改完善。原创不易,望"点赞","推荐","收藏",谢谢!!!
代码
点击查看代码
#include
#include
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 jugePhoneNum(string phonenum) {
if (phonenum.length() != 11) return false;
for (int i = 0; i < 11; i++) {
if (phonenum[i] >= '0' && phonenum[i] <= '9' && phonenum[i] != ' ') {}
else return false;
}
return true;
}
// 判断年龄
bool jugeAge(string age, int intage) {
if (intage < 7 || intage > 130 || intage == 0) return false;
for (unsigned int i = 0; i < age.length(); i++) { // age.length() 被定义为 unsigned int 类型,所以使用 int 会报警告信息:warning C4018: “<”: 有符号/无符号不匹配
if (age[i] < '0' || age[i] > '9') return false;
}
return true;
}
// 判断联系人是否存在(存在返回下标,不存在返回-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 showSpecificPersonMessage(struct Person person) {
cout << "姓名:" << person.m_name << "\t\t性别:"
<< (person.m_sex == 1 ? "男" : "女")
<< "\t年龄:" << person.m_age
<< "\t电话号码:" << person.m_phoneNum
<< "\t地址:" << person.m_Address << endl;
}
// 功能:健壮姓名的输入
void formatName(AddressBook* abs, int Num) {
string name;
cout << "请输入目标姓名:";
getline(cin, name);
abs->person[Num].m_name = name;
}
// 功能:健壮性别的输入
void formatSex(AddressBook* abs, int Num) {
string sex;
while (true) {
cout << "请输入目标性别(格式:1--男 2--女):";
getline(cin, sex);
if (sex.length() == 1) {
if (sex._Equal("1")) {
abs->person[Num].m_sex = 1;
break;
}
else if (sex._Equal("2")) {
abs->person[Num].m_sex = 2;
break;
}
}
cout << "输入方式不合理,请按要求重新输入..." << endl << endl;
}
}
// 功能:健壮年龄输入
void formatAge(AddressBook* abs, int Num) {
string age;
while (true) {
cout << "请输入目标年龄(范围为7-130):";
getline(cin, age);
if (age.length() >= 1 && age.length() <= 3) {
int IntAge = atoi(age.c_str());
if (jugeAge(age, IntAge)) {
abs->person[Num].m_age = IntAge;
break;
}
}
cout << "输入方式不合理,请按要求重新输入..." << endl << endl;
}
}
// 功能:健壮电话号码输入
void formatePhoneNum(AddressBook* abs, int Num) {
string phoneNum;
while (true) {
cout << "请输入目标电话号码(11位):";
getline(cin, phoneNum);
if (jugePhoneNum(phoneNum)) {
abs->person[Num].m_phoneNum = phoneNum;
break;
}
cout << "输入方式不合理,请按要求重新输入..." << endl << endl;
}
}
// 功能:健壮地址信息输入
void formateAddress(AddressBook* abs, int Num) {
string address;
cout << "请输入目标地址信息:";
cin >> address;
abs->person[Num].m_Address = address;
}
// 功能:健壮输入信息
void formatInputMessage(AddressBook* abs) {
// 姓名
formatName(abs, abs->m_Size);
// 性别
formatSex(abs, abs->m_Size);
// 年龄
formatAge(abs, abs->m_Size);
// 电话号码
formatePhoneNum(abs, abs->m_Size);
// 地址
formateAddress(abs, abs->m_Size);
}
// 1.添加联系人
void addPerson(AddressBook* abs) {
// 判断通讯录是否已满,如果满了就不再添加
if (abs->m_Size >= MAX) {
cout << "通讯录已满,请删除不常用的联系人后重新添加..." << endl;
return;
}else {
// 添加具体的联系人信息
formatInputMessage(abs);
}
abs->m_Size++;
}
// 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.length() == 1) {
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")) {
formatAge(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 {
cout << "输入方式不合理,请按要求重新输入..." << endl << endl;
}
}else {
cout << "输入方式不合理,请按要求重新输入..." << endl << endl;
}
}
}
// 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;
}
}
cout << "输入方式不合理,请按要求重新输入..." << endl << endl;
}
}
// 显示菜单
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;
}
int main() {
// 创建通讯录结构体变量
AddressBook abs;
// 输入通讯录的功能编号
string input;
// 接收getchar的返回值(本不需要接收,只是为了更严谨...)
int temp = 0;
while (true) {
showMenu();
while (true) {
cout << "请输入选择的功能编号:";
getline(cin, input);
if (input.length() == 1) {
if (input._Equal("1") || input._Equal("2") || input._Equal("3") || input._Equal("4")
|| input._Equal("5") || input._Equal("6") || input._Equal("0")) break;
}
cout << "输入方式不合理,请按要求重新输入..." << endl << endl;
}
switch (atoi(input.c_str())) {
case 1: // 1.添加联系人
{
addPerson(&abs); // 利用地址传递可以修改实参
system("cls");
cout << "添加成功..." << endl;
showPerson(&abs);
system("pause");
temp = getchar();
system("cls");
}
break;
case 2: // 2.显示联系人
showPerson(&abs);
system("pause");
system("cls");
break;
case 3: // 3.删除联系人
{
string name;
cout << "请输入要删除的联系人姓名:";
getline(cin, name);
bool ret = deletePerson(&abs, name);
if (ret == true) {
cout << "删除成功..." << endl << endl;
showPerson(&abs);
}else{
cout << "删除失败..." << endl << endl;
}
system("pause");
system("cls");
}
break;
case 4: // 4.查找联系人
{
string name;
cout << "请输入要查找的联系人姓名:";
getline(cin, name);
findByName(&abs, name);
system("pause");
system("cls");
}
break;
case 5: // 5.修改联系人
{
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;
}