通讯录管理系统(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;
}