C++基础实战——通讯录管理系统

本专栏记录C++学习过程包括C++基础以及数据结构和算法,其中第一部分计划时间一个月,主要跟着黑马视频教程,学习路线如下,不定时更新,欢迎关注
当前章节处于:
---------第1阶段-C++基础入门
====>第2阶段实战-通讯录管理系统
---------第3阶段-C++核心编程,
---------第4阶段实战-基于多态的企业职工系统
---------第5阶段-C++提高编程
---------第6阶段实战-基于STL泛化编程的演讲比赛
---------第7阶段-C++实战项目机房预约管理系统

一、系统需求

利用C++来实现一个通讯录管理系统,实现的功能如下:

  1. 添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭组织),最多记录1000人
  2. 显示联系人:显示通讯录中所有联系人信息
  3. 删除联系人:按照姓名进行删除指定联系人
  4. 查找联系人:按照姓名查找指定联系人信息
  5. 修改联系人:按照姓名重新修改指定联系人
  6. 清空联系人:清空通讯录中所有信息
  7. 退出通讯录:退出当前使用的通讯录

二、需求分析

整个通讯录系统说白了就是一个结构体数组,数组里面的每个结构体就代表一个联系人

  1. 添加联系人上的信息,这个结构体应该包括姓名,性别,年龄,联系方式和家庭住址,最多1000人,那么数组的长度就指定为1000。
  2. 显示联系人,由于创建数组长度是1000,肯定不会填满,那么打印时候就需要做一个判断,如果到空的了就不打印,防止无用信息也被打印出来。
  3. 删除联系人:找到该联系人,然后将该结构体置空。
  4. 查找联系人:也是比较简单,遍历,然后用if去判断就可以。
  5. 修改联系人:查找到然后修改。
  6. 清空联系人:将整个结构体数组置空。
  7. 退出通讯录:说明整个是在一个while循环里面,那么就需要写一个菜单,输入不同的选项代表不同的操作,其中有一个选项代表退出循环。每一个功能都封装成一个函数,用switch case进行判断。并且,如果想通过封装的函数对结构体数组直接改变的话,那么一定是地址传递,因此还需要定义一个结构体指针用于指向结构体数组,传的时候就传入结构体指针,遍历的时候仍然采用索引的方式。

三、封装函数

3.1 定义通讯录的结构体

// 通讯录结构体
struct people
{
    
    
	string name;
	string gender;
	int age;
	long long phone;
	string address;
};

3.2 通讯录显示菜单

// 显示通讯录菜单
void showMenu() {
    
    
	cout << "-------欢迎来到通讯录系统-------" << endl;
	cout << "1.添加联系人" << endl;
	cout << "2.显示联系人" << endl;
	cout << "3.删除联系人" << endl;
	cout << "4.查找联系人" << endl;
	cout << "5.修改联系人" << endl;
	cout << "6.清空联系人" << endl;
	cout << "7.退出通讯录" << endl;
}

3.3 添加联系人

注意字符串比较的时候用compare方法,而不能直接用==判断,并且如果两字符串compare相等时返回的是0。

// 添加联系人
bool addPeople(struct people* p) {
    
    
	string name;
	string gender;
	int age;
	long long phone;
	string address;
	cout << "姓名:";
	cin >> name;
	cout << "性别:";
	cin >> gender;
	cout << "年龄:";
	cin >> age;
	cout << "电话:";
	cin >> phone;
	cout << "地址:";
	cin >> address;
	struct people temp = {
    
     name,gender,age,phone,address };
	// 找数组中空的地方
	for (int i = 0; i < 1000; i++) {
    
    

		if (p[i].name.compare("")==0)
		{
    
    
			//cout << i << endl;
			p[i] = temp;
			return true;
		}
		
	}
	return false;
}

3.4 显示联系人

// 显示联系人
void showSystem(const struct people *p) {
    
    
	for (int i = 0; i < 1000; i++) {
    
    
		if (p[i].name.compare("") !=0 ) {
    
    
			cout << p[i].name << endl;
		}
	}
}

3.5 删除联系人

删除相当于将结构体内各值重新初始化。

// 删除联系人
bool del(struct people* p,string targetName) {
    
    
	for (int i = 0; i < 1000; i++) {
    
    
		if (p[i].name.compare(targetName)==0)
			// 创建新的联系人
			p[i] = {
    
    "","",0,0,""};
			cout << "删除完成!" << endl;
			return true;
	}
	return false;
}

3.7 查找联系人

// 查找联系人
bool find(struct people* p, string targetName) {
    
    
	for (int i = 0; i < 1000; i++) {
    
    
		if (p[i].name.compare(targetName) == 0) {
    
    
			cout << "姓名:" << p[i].name << "  性别:" << p[i].gender << "  年龄:" << p[i].age << "   电话:" << p[i].phone << "   地址:" << p[i].address << endl;
			return true;
		}
		
		
	}
	return false;
}

3.8 修改联系人

修改比较麻烦,由于不知道用户需要修改哪个属性,因此需要逐个判断。

// 修改联系人
bool change(struct people* p, string targetName) {
    
    
	string target = ""; // 存放需要更改的选项
	string result = ""; // 存放修改的具体内容
	int result_age = 0; // 存放修改后的年龄
	long long result_phone = 0; // 存放修改后的电话
	for (int i = 0; i < 1000; i++) {
    
    
		//cout << (p[i].name.compare(targetName) == 0) << endl;
		if (p[i].name.compare(targetName)==0) {
    
    
			cout << "请输入你要修改的信息:";
			cin >> target;
			if (target.compare("姓名")==0){
    
    
				cout << "请输入修改后的姓名:";
				cin >> result;
				p[i].name = result;
				cout << "修改成功!" << endl;
			}
			else if (target.compare("年龄")==0) {
    
    
				cout << "请输入修改后的年龄:";
				cin >> result_age;
				p[i].age = result_age;
				cout << "修改成功!" << endl;
			}
			else if (target.compare("性别")==0) {
    
    
				cout << "请输入修改后的性别:";
				cin >> result;
				p[i].gender = result;
				cout << "修改成功!" << endl;
			}
			else if (target.compare("联系方式")==0) {
    
    
				cout << "请输入修改后的联系方式:";
				cin >> result_phone;
				p[i].phone = result_phone;
				cout << "修改成功!" << endl;
			}
			else if (target.compare("家庭住址")==0) {
    
    
				cout << "请输入修改后的性别:";
				cin >> result;
				p[i].address = result;
				cout << "修改成功!" << endl;
			}
			else {
    
    
				cout << "没有这项信息!" << endl;
				return false;
			}
			return true;
		}
	}
	return false;
}

3.9 清空通讯录

// 清空通讯录
bool clean(struct people* p) {
    
    
	string flag = "";
	cout << "确认清空通讯录吗?Y/N" << endl;
	cin >> flag;
	if (flag.compare("Y")==0) {
    
    
		for (int i = 0; i < 1000; i++) {
    
    
			p[i] = {
    
     "","",0,0,"" };
		}
		cout << "清空成功!" << endl;
		return true;
	}
	else {
    
    
		return false;
	}
}

3.10 main主函数

主函数包括创建结构体数组,接收用户的选择输入,在跳出主循环采用goto标志位的方式跳出双重循环。

int main() {
    
    
	// 创建结构体数组
	struct people PhoneSystemArr[1000];
	//cout << (PhoneSystemArr[0].name == "") << endl;
	// 创建指针
	struct people* p = PhoneSystemArr;

	mainwhile:while (1) {
    
    
		showMenu();
		cout << "请输入你选择的选项:";
		int choice = 0;
		bool flag = 0;
		string targetname = "";
		cin >> choice;
		switch (choice)
		{
    
    
		case 1:
			flag = addPeople(p);
			if (flag) {
    
    
				cout << "添加成功!" << endl;
			}
			else {
    
    
				cout << "添加失败!" << endl;
			}
			break;
		case 2:
			showSystem(p);
			break;
		case 3:
			cout << "请输入你要删除的姓名:";
			cin >> targetname;
			flag = del(p,targetname);
			if (flag) {
    
    
				cout << endl;
			}
			else {
    
    
				cout << "添加失败!" << endl;
			}
			break;
		case 4:
			cout << "请输入你要查找的姓名:";
			cin >> targetname;
			flag = find(p,targetname);
			if (flag) {
    
    
				cout << "查找成功!" << endl;
			}
			else {
    
    
				cout << "查找失败!" << endl;
			}
			break;
		case 5:
			cout << "请输入你要修改的姓名:";
			cin >> targetname;
			flag = change(p, targetname);
			if (flag) {
    
    
				cout  << endl;
			}
			else {
    
    
				cout << "修改失败!" << endl;
			}
			break;
		case 6:
			clean(p);
			break;
		case 7:
			goto FLAG;  // goto跳转
			cout << "退出成功!" << endl;
			break;
		default:
			cout << "没有这个选项,请重新输入!" << endl;
			break;
		}
	}
	FLAG:
	system("pause");
	return 0;

}

四、完整代码

#include <iostream>
using namespace std;
// 通讯录结构体
struct people
{
    
    
	string name;
	string gender;
	int age;
	long long phone;
	string address;
};
// 显示通讯录菜单
void showMenu() {
    
    
	cout << "-------欢迎来到通讯录系统-------" << endl;
	cout << "1.添加联系人" << endl;
	cout << "2.显示联系人" << endl;
	cout << "3.删除联系人" << endl;
	cout << "4.查找联系人" << endl;
	cout << "5.修改联系人" << endl;
	cout << "6.清空联系人" << endl;
	cout << "7.退出通讯录" << endl;
}
// 添加联系人
bool addPeople(struct people* p) {
    
    
	string name;
	string gender;
	int age;
	long long phone;
	string address;
	cout << "姓名:";
	cin >> name;
	cout << "性别:";
	cin >> gender;
	cout << "年龄:";
	cin >> age;
	cout << "电话:";
	cin >> phone;
	cout << "地址:";
	cin >> address;
	struct people temp = {
    
     name,gender,age,phone,address };
	// 找数组中空的地方
	for (int i = 0; i < 1000; i++) {
    
    

		if (p[i].name.compare("")==0)
		{
    
    
			//cout << i << endl;
			p[i] = temp;
			return true;
		}
		
	}
	return false;
}
// 显示联系人
void showSystem(const struct people *p) {
    
    
	for (int i = 0; i < 1000; i++) {
    
    
		if (p[i].name.compare("") !=0 ) {
    
    
			cout << p[i].name << endl;
		}
	}
}
// 删除联系人
bool del(struct people* p,string targetName) {
    
    
	for (int i = 0; i < 1000; i++) {
    
    
		if (p[i].name.compare(targetName)==0)
			// 创建新的联系人
			p[i] = {
    
    "","",0,0,""};
			cout << "删除完成!" << endl;
			return true;
	}
	return false;
}
// 查找联系人
bool find(struct people* p, string targetName) {
    
    
	for (int i = 0; i < 1000; i++) {
    
    
		if (p[i].name.compare(targetName) == 0) {
    
    
			cout << "姓名:" << p[i].name << "  性别:" << p[i].gender << "  年龄:" << p[i].age << "   电话:" << p[i].phone << "   地址:" << p[i].address << endl;
			return true;
		}
		
		
	}
	return false;
}
// 修改联系人
bool change(struct people* p, string targetName) {
    
    
	string target = ""; // 存放需要更改的选项
	string result = ""; // 存放修改的具体内容
	int result_age = 0; // 存放修改后的年龄
	long long result_phone = 0; // 存放修改后的电话
	for (int i = 0; i < 1000; i++) {
    
    
		//cout << (p[i].name.compare(targetName) == 0) << endl;
		if (p[i].name.compare(targetName)==0) {
    
    
			cout << "请输入你要修改的信息:";
			cin >> target;
			if (target.compare("姓名")==0){
    
    
				cout << "请输入修改后的姓名:";
				cin >> result;
				p[i].name = result;
				cout << "修改成功!" << endl;
			}
			else if (target.compare("年龄")==0) {
    
    
				cout << "请输入修改后的年龄:";
				cin >> result_age;
				p[i].age = result_age;
				cout << "修改成功!" << endl;
			}
			else if (target.compare("性别")==0) {
    
    
				cout << "请输入修改后的性别:";
				cin >> result;
				p[i].gender = result;
				cout << "修改成功!" << endl;
			}
			else if (target.compare("联系方式")==0) {
    
    
				cout << "请输入修改后的联系方式:";
				cin >> result_phone;
				p[i].phone = result_phone;
				cout << "修改成功!" << endl;
			}
			else if (target.compare("家庭住址")==0) {
    
    
				cout << "请输入修改后的性别:";
				cin >> result;
				p[i].address = result;
				cout << "修改成功!" << endl;
			}
			else {
    
    
				cout << "没有这项信息!" << endl;
				return false;
			}
			return true;
		}
	}
	return false;
}
bool clean(struct people* p) {
    
    
	string flag = "";
	cout << "确认清空通讯录吗?Y/N" << endl;
	cin >> flag;
	if (flag.compare("Y")==0) {
    
    
		for (int i = 0; i < 1000; i++) {
    
    
			p[i] = {
    
     "","",0,0,"" };
		}
		cout << "清空成功!" << endl;
		return true;
	}
	else {
    
    
		return false;
	}
}
int main() {
    
    
	// 创建结构体数组
	struct people PhoneSystemArr[1000];
	//cout << (PhoneSystemArr[0].name == "") << endl;
	// 创建指针
	struct people* p = PhoneSystemArr;

	mainwhile:while (1) {
    
    
		showMenu();
		cout << "请输入你选择的选项:";
		int choice = 0;
		bool flag = 0;
		string targetname = "";
		cin >> choice;
		switch (choice)
		{
    
    
		case 1:
			flag = addPeople(p);
			if (flag) {
    
    
				cout << "添加成功!" << endl;
			}
			else {
    
    
				cout << "添加失败!" << endl;
			}
			break;
		case 2:
			showSystem(p);
			break;
		case 3:
			cout << "请输入你要删除的姓名:";
			cin >> targetname;
			flag = del(p,targetname);
			if (flag) {
    
    
				cout << endl;
			}
			else {
    
    
				cout << "添加失败!" << endl;
			}
			break;
		case 4:
			cout << "请输入你要查找的姓名:";
			cin >> targetname;
			flag = find(p,targetname);
			if (flag) {
    
    
				cout << "查找成功!" << endl;
			}
			else {
    
    
				cout << "查找失败!" << endl;
			}
			break;
		case 5:
			cout << "请输入你要修改的姓名:";
			cin >> targetname;
			flag = change(p, targetname);
			if (flag) {
    
    
				cout  << endl;
			}
			else {
    
    
				cout << "修改失败!" << endl;
			}
			break;
		case 6:
			clean(p);
			break;
		case 7:
			goto FLAG;  // goto跳转
			cout << "退出成功!" << endl;
			break;
		default:
			cout << "没有这个选项,请重新输入!" << endl;
			break;
		}
	}
	FLAG:
	system("pause");
	return 0;

}

五、测试样例

-------欢迎来到通讯录系统-------
1.添加联系人
2.显示联系人
3.删除联系人
4.查找联系人
5.修改联系人
6.清空联系人
7.退出通讯录
请输入你选择的选项:8
没有这个选项,请重新输入!
-------欢迎来到通讯录系统-------
1.添加联系人
2.显示联系人
3.删除联系人
4.查找联系人
5.修改联系人
6.清空联系人
7.退出通讯录
请输入你选择的选项:1
姓名:张三
性别:男
年龄:18
电话:123456
地址:安徽
添加成功!
-------欢迎来到通讯录系统-------
1.添加联系人
2.显示联系人
3.删除联系人
4.查找联系人
5.修改联系人
6.清空联系人
7.退出通讯录
请输入你选择的选项:1
姓名:李四
性别:男
年龄:21
电话:45678
地址:天津
添加成功!
-------欢迎来到通讯录系统-------
1.添加联系人
2.显示联系人
3.删除联系人
4.查找联系人
5.修改联系人
6.清空联系人
7.退出通讯录
请输入你选择的选项:2
张三
李四
-------欢迎来到通讯录系统-------
1.添加联系人
2.显示联系人
3.删除联系人
4.查找联系人
5.修改联系人
6.清空联系人
7.退出通讯录
请输入你选择的选项:3
请输入你要删除的姓名:张三
删除完成!

-------欢迎来到通讯录系统-------
1.添加联系人
2.显示联系人
3.删除联系人
4.查找联系人
5.修改联系人
6.清空联系人
7.退出通讯录
请输入你选择的选项:4
请输入你要查找的姓名:李四
姓名:李四  性别:男  年龄:21   电话:45678   地址:天津
查找成功!
-------欢迎来到通讯录系统-------
1.添加联系人
2.显示联系人
3.删除联系人
4.查找联系人
5.修改联系人
6.清空联系人
7.退出通讯录
请输入你选择的选项:2
李四
-------欢迎来到通讯录系统-------
1.添加联系人
2.显示联系人
3.删除联系人
4.查找联系人
5.修改联系人
6.清空联系人
7.退出通讯录
请输入你选择的选项:5
请输入你要修改的姓名:李四
请输入你要修改的信息:年龄
请输入修改后的年龄:23
修改成功!
修改成功!
-------欢迎来到通讯录系统-------
1.添加联系人
2.显示联系人
3.删除联系人
4.查找联系人
5.修改联系人
6.清空联系人
7.退出通讯录
请输入你选择的选项:4
请输入你要查找的姓名:李四
姓名:李四  性别:男  年龄:23   电话:45678   地址:天津
查找成功!
-------欢迎来到通讯录系统-------
1.添加联系人
2.显示联系人
3.删除联系人
4.查找联系人
5.修改联系人
6.清空联系人
7.退出通讯录
请输入你选择的选项:6
确认清空通讯录吗?Y/N
Y
清空成功!
-------欢迎来到通讯录系统-------
1.添加联系人
2.显示联系人
3.删除联系人
4.查找联系人
5.修改联系人
6.清空联系人
7.退出通讯录
请输入你选择的选项:2
-------欢迎来到通讯录系统-------
1.添加联系人
2.显示联系人
3.删除联系人
4.查找联系人
5.修改联系人
6.清空联系人
7.退出通讯录
请输入你选择的选项:7
请按任意键继续. . .

这个项目还是很有综合性的,把之前学的知识都囊括再内,至此,C++基础告一段落,明天开始C++核心编程的学习。

猜你喜欢

转载自blog.csdn.net/weixin_63866037/article/details/135427604