C++入门通讯录综合管理系统代码(自写,开源)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

1.代码量约300行,仅实现了基于命令行的简易通讯录管理功能,其中还有许多地方可以拓展改进,以提高代码的可读性和健壮性。
2.综合运用了C++入门的if-else、switch-case、string、for、结构体嵌套、结构体数组、键值判断等思想。
3.技巧上,包括值传递与指针地址传递、函数调用、结构体数组成员变量属性的修改、索引记录等手段。

代码开源

很简单,就不进行解释了。

#include <iostream>
#include <string>
#include <cstdlib> // 添加这个头文件
using namespace std;

#define MAX_NUM 1000

//①实现一个显示菜单的功能函数
void showManu() {
	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;
}

//③创建一个联系人信息的结构体
struct People {
	string name;//姓名
	string sex;//性别
	int age;//年龄
	string phone_number;//电话号码
	string address;//地址
};

struct AddressBooks {
	struct People personArray[MAX_NUM];//嵌套联系人结构体
	int current_num;//当前人数
};

//④编写添加联系人的功能函数
void Addperson(AddressBooks * ads) {//用一个指针去接收通讯录结构体的地址
	//首先判断通讯录是否已经满了,满了就不再添加
	if (ads->current_num >= MAX_NUM) {
		cout << "通讯录已满,无法添加!" << endl;
	}
	else {//添加具体联系人
		//姓名
		string name;
		cout << "请输入姓名:" << endl;
		cin >> name;
		ads->personArray[ads->current_num].name = name;

		//年龄
		int age;
		cout << "请输入年龄:" << endl;
		cin >> age;
		ads->personArray[ads->current_num].age = age;

		//性别,为了提高健壮性需要进行逻辑判断
		string sex;
		while (true) {
			cout << "请输入性别:" << endl;
			cin >> sex;

			// 输入验证逻辑
			if (sex == "男" || sex == "女") {
				break;  // 输入有效,退出循环
			}
			else {
				cout << "性别输入无效,请重新输入。" << endl;
			}
		}
		ads->personArray[ads->current_num].sex = sex;

		//电话号码
		string number;
		cout << "请输入电话号码:" << endl;
		cin >> number;
		ads->personArray[ads->current_num].phone_number = number;

		//家庭住址
		string address;
		cout << "请输入家庭住址:" << endl;
		cin >> address;
		ads->personArray[ads->current_num].address = address;
	}
	ads->current_num++;
	cout << "添加成功!" << endl;
	//_sleep(500);
	system("cls");
}

//⑤编写功能:显示目前的所有联系人信息
void showperson(AddressBooks ads) {
	if (ads.current_num == 0) {
		cout << "抱歉,目前通讯录无联系人。" << endl;
	}
	else {
		for (int i = 0; i < ads.current_num; i++) {
			cout <<"序号:"<<i << " 联系人:" << ads.personArray[i].name << " 年龄:" << ads.personArray[i].age << " 性别:" <<
				ads.personArray[i].sex << " 电话号码:" << ads.personArray[i].phone_number
				<< " 家庭住址:" << ads.personArray[i].address << "\t" << endl;
		}
	}
}

//⑥编写功能删除特定的联系人:首先检索是否存在与输入姓名相同的联系人,然后再一次确认是否删除,最后进行删除
void deleteperson(AddressBooks* ads) {
	if (ads->current_num == 0) {
		cout << "通讯录为空,无法删除联系人" << endl;
	}
	else {
		string same_name;
		int ifensure;
		int delete_index=-1;//一开始是一个无效值
		cout << "请输入您要删除的联系人姓名:" << endl;
		cin >> same_name;
		for (int i = 0; i < ads->current_num; i++) {
			if (ads->personArray[i].name == same_name) {
				delete_index = i;//这是用来记录姓名相同的那个人在结构体数组中的序号
				cout << "请再次确认您是否要删除该联系人:按“1”删除,按“2”退出" << endl;
				cin >> ifensure;
			}
		}

		if (ifensure == 1&&delete_index!=-1) {//如果要删除,并且从前往后检索一遍能找到这个相同姓名的联系人
			for (int j = delete_index; j < ads->current_num-1; j++) {
				ads->personArray[j] = ads->personArray[j + 1];//从delete_index后面的元素整体前移
			}
			ads->current_num--;//结构体数组长度减一
			cout << "删除成功!" << endl;
		}
		else {
			cout << "未找到匹配的联系人,无法删除。" << endl;
		}
	}
	//_sleep(500);
	system("cls");
}

//⑦查找指定姓名的联系人,报出全部信息
void selectperson(AddressBooks ads) {
	string same_name;
	int delete_index = -1;//一开始是一个无效值
	cout << "请输入您要查找的联系人姓名:" << endl;
	cin >> same_name;
	for (int i = 0; i < ads.current_num; i++) {
		if (ads.personArray[i].name == same_name) {
			delete_index = i;//这是用来记录姓名相同的那个人在结构体数组中的序号
			cout << "序号:" << i << " 联系人:" << ads.personArray[i].name << " 年龄:" << ads.personArray[i].age << " 性别:" <<
			ads.personArray[i].sex << " 电话号码:" << ads.personArray[i].phone_number
			<< " 家庭住址:" << ads.personArray[i].address << "\t" << endl;
		}
	}
	if (delete_index == -1) {
		cout << "未找到匹配的联系人。" << endl;
	}

}

//⑧修改指定联系人的相关信息 
void changeperson(AddressBooks* ads) {
	if (ads->current_num == 0) {
		cout << "通讯录为空,无法修改联系人信息" << endl;
	}
	else {
		string same_name;
		int changenumber;
		int change_index = -1;//一开始是一个无效值

		string new_name;
		int new_age;
		string new_sex;
		string new_number;
		string new_address;
		cout << "请输入您要修改的联系人姓名:" << endl;
		cin >> same_name;
		for (int i = 0; i < ads->current_num; i++) {
			if (ads->personArray[i].name == same_name) {
				change_index = i;//这是用来记录姓名相同的那个人在结构体数组中的序号
				cout << "请确认您要修改该联系人的信息为:"<<endl;
				cout << "按“1”修改姓名,按“2”修改年龄,按“3”修改性别,按“4”修改电话号码,按“5”修改家庭住址"<< endl;
				cin >> changenumber;
				break;
			}
		}
		if (change_index == -1) {
			cout << "未找到匹配的联系人,无法修改。" << endl;
		}
		else {
			switch (changenumber) {
			case 1:

				cout << "请输入您要更改的姓名:" << endl;
				cin >> new_name;
				ads->personArray[change_index].name = new_name;
				break;
			case 2:
				cout << "请输入您要更改的年龄:" << endl;
				cin >> new_age;
				ads->personArray[change_index].age = new_age;
				break;
			case 3:
				cout << "请输入您要更改的性别:" << endl;
				cin >> new_sex;
				ads->personArray[change_index].sex = new_sex;
				break;
			case 4:
				cout << "请输入您要更改的电话号码:" << endl;
				cin >> new_number;
				ads->personArray[change_index].phone_number = new_number;
				break;
			case 5:
				cout << "请输入您要更改的家庭地址:" << endl;
				cin >> new_address;
				ads->personArray[change_index].address = new_address;
				break;
			}
			cout << "修改成功!" << endl;
		}
	}
	system("cls");
}

//⑨清空通讯录
void clear(AddressBooks *ads) {
	ads->current_num = 0;//给通讯录结构体的长度清零即可
	cout << "通讯录已清空!" << endl;
	system("cls");
}
int main() {
	int current_num = 0;
	int key_select = 0;//创建一个用户按键键值
	AddressBooks addbooks;//实例化通讯录结构体
	addbooks.current_num = 0;//一开始人数为0
	while (1) {
		
		showManu();

		cin >> key_select;//判断用户接下来输入的是什么键值

		switch (key_select) {

		case 1://添加联系人
			Addperson(&addbooks);//地址传递,因为要切实的操作(改变)结构体成员属性
			break;
		case 2://显示联系人
			showperson(addbooks);//值传递,因为不用改变结构体属性,只需要展示属性
			break;
		case 3://删除联系人
			deleteperson(&addbooks);//地址传递
			break;
		case 4://查找
			selectperson(addbooks);//值传递
			break;
		case 5://修改信息
			changeperson(&addbooks);//地址传递
			break;
		case 6://清空通讯录
			clear(&addbooks);//地址传递
			break;
		case 0://退出系统
			cout << "欢迎下一次继续使用通讯录。" << endl;
			system("pause");
			return 0;
			break;
		}
	}
	system("pause");
	return 0;
}
  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值