一.主函数及基本功能函数源文件

1.主函数:设计最基本的框架,即输入一个选项,调用相应的函数实现相应的功能

#include"showMenu.h"
#include"addContactPerson.h"
#include"showContactPerson.h"
#include"deleteContactPerson.h"
#include"findContactPerson.h"
#include"changeContactPerson.h"
#include"emptyContactPerson.h"
#include"structureDesign.h"

// 通讯录功能包括:其实就是最基本的增删改查,在此基础上外加清空和退出
// 功能描述:进入界面,显示菜单,用户通过输入对应数字0-6选择相应操作,其中0代表退出;
//           只要用户不选择退出,便可不断进行操作,直到用户选择退出为止;
//           任何一种操作,都需要给用户相应的反馈

int main() {
	int option = 0; // 菜单选项

	// 创建通讯录结构体
	AddressBook ab;

	// 输入选项,即选定要做的操作
	cout << "请输入选项:"<<endl;
	showMenu();
	cin >> option;

	// 使用循环结构
	// 当用户没选择退出通讯录需要不断操作
	// 当用户输入0,即选择退出通讯录时循环结束
	while (true) {
		// 根据不同操作调用不同函数
		switch (option) {
		case 1: // 添加联系人
			addContactPerson(&ab);
			ab.size++; // 更新通讯录人数
			break;
		case 2: // 显示联系人
			showContactPerson(ab);
			break;
		case 3: // 删除联系人
			deleteContactPerson(&ab);
			break;
		case 4: // 查找联系人
			findContactPerson(ab);
			break;
		case 5: // 修改联系人
			changeContactPerson(&ab);
			break;
		case 6: // 清空联系人
			emptyContactPerson(&ab);
			break;
		case 0: // 退出通讯录
			cout << "欢迎下次使用!" << endl;
			system("pause"); // 按任意键退出
			return 0; // 退出整个代码
			break;
		}

		cout << endl;

		cout << "请再次输入选项:" << endl;
		showMenu();
		cin >> option;

	}
	
	system("pause");
	return 0;
}

2.添加联系人功能:

#include"addContactPerson.h"

// 添加联系人功能
// 联系人添加上限为1000
// 功能描述:用户输入待添加的联系人的姓名、性别、电话号码;可自行决定继续添加或者退出添加
//           这里需要用到循环结构,我们在主函数中实现循环调用即可
void addContactPerson(AddressBook *ab) {
	string name; // 待添加的联系人姓名
	string gender; // 待添加的联系人性别
	string phoneNum; // 待添加的联系人电话号码
	bool flag = true; // 标记,当flag为false终止循环
	if (ab->size == MAX) { // 判断通讯录是否已满
		cout << "通讯录人数已达上限,无法继续添加!" << endl;
		return; // 退出函数
	}
	else {
		// 姓名
		cout << "请输入待添加的联系人姓名:";
		cin >> name;
		ab->person[ab->size].name = name;

		// 性别
		cout << "请输入待添加的联系人性别:";
		cin >> gender;
		// 为了避免用户输入不存在的性别,加入循环结构;
		// 当用户输入性别错误时,允许用户重新输入;当输入正确时循环终止
		while (true) {
			if (gender == "男" || gender == "女") {
				ab->person[ab->size].gender = gender;
				break;
			}
			else {
				cout << "输入错误,不存在的性别!请重新输入:";
				cin >> gender;
			}
		}

		// 电话号码
		cout << "请输入待添加的联系人电话号码:";
		cin >> phoneNum;
		ab->person[ab->size].phoneNum = phoneNum;

		cout << "添加成功!" << endl;

		system("pause"); // 暂停代码执行,按任意键可继续

		system("cls"); // 清屏

	}
	
}

3.修改联系人功能:

#include"changeContactPerson.h"
#include"isExistContactPerson.h"

// 修改联系人功能
// 功能描述:输入待修改的联系人的姓名,然后依次将修改后的信息输入;若查无此人,给出相应提示
void changeContactPerson(AddressBook* ab) {
	string originName; // 修改前的姓名
	string name; // 修改后的姓名
	string gender; // 修改后的性别
	string phoneNum; // 修改后的电话号码
	cout << "请输入待修改的联系人的名字:";
	cin >> originName;
	// 判断是否存在该联系人
	int ret = isExistContactPerson(*ab, originName);
	if (ret == -1) { // 找不到联系人
		cout << "不存在该联系人!" << endl;

		system("pause"); // 暂停代码执行,按任意键继续

		system("cls"); // 清屏

		return;
	}
	else { // 找到了联系人
		cout << "请输入修改后的名字:";
		cin >> name;
		ab->person[ret].name = name;
		cout << "请输入修改后的性别:";
		cin >> gender;
		while (true) {
			if (gender == "男" || gender == "女") { // 性别输入正确,退出循环
				ab->person[ret].gender = gender;
				break;
			}
			else { // 性别输入错误,重新输入
				cout << "错误,不存在的性别!" << endl;
				cout << "请重新输入修改后的性别:";
				cin >> gender;
			}
		}
		cout << "请输入修改后的电话号码:";
		cin >> phoneNum;
		ab->person[ret].phoneNum = phoneNum;
	}

	cout << "修改成功!" << endl;

	system("pause"); // 暂停代码执行,按任意键继续

	system("cls"); // 清屏


}

4.删除联系人功能:

#include"deleteContactPerson.h"
#include"isExistContactPerson.h"

// 删除联系人功能
// 删除的方法:与删除数组中特定元素的方法相同
//             从待删除的下标开始,每个元素往前移动
//			   数组长度-1
// 功能描述:提供待删除联系人姓名,将此人删除;若不存在此人则给出相应提示
void deleteContactPerson(AddressBook* ab) {
	string name;
	cout << "请输入待删除的联系人姓名:";
	cin >> name;
	// 判断是否存在该联系人
	int ret = isExistContactPerson(*ab,name);
	if (ret == -1) { // 未查到该联系人
		cout << "不存在该联系人!" << endl;
		return; // 退出函数
	}
	else { // 查到该联系人
		for (int i = ret; i < ab->size; i++) {
			// 从待删除位置开始,数据前移
			ab->person[i] = ab->person[i + 1];
		}
		ab->size--; // 通讯录中数组长度-1
	}

	cout << "删除成功!" << endl;

	system("pause"); // 暂停代码执行,按任意键继续

	system("cls"); // 清屏


}

5.清空通讯录功能:

#include"emptyContactPerson.h"
#include"existContactPerson.h"

// 清空联系人功能
// 清空方法:将通讯录当前联系数量置0
// 功能描述:将通讯录中所有联系人清空
//           由于清空通讯录是一个需要谨慎进行的操作
//           所以在进行清空操作前提示用户
void emptyContactPerson(AddressBook* ab) {
	bool flag; // 标记变量,用于判断是否确定清空通讯录
	if (existContactPerson(*ab) == false) { // 通讯录中无联系人
		cout << "当前通讯录中无联系人!" << endl;
	}
	else { // 通讯录中有联系人
		cout << "请问您确定要清空通讯录吗?(是请按1,否请按0)";
		cin >> flag;
		if (flag == true) {
			ab->size = 0;
			cout << "清空通讯录成功!" << endl;
		}
		else {
			cout << "取消清空通讯录操作!" << endl;
		}

	}

	system("pause"); // 暂停代码执行,按任意键继续

	system("cls"); // 清屏

}

6.查找联系人功能:

#include"findContactPerson.h"
#include"isExistContactPerson.h"

void findContactPerson(AddressBook ab) {
	string name; // 待查找的联系人姓名
	cout << "请输入待查找的联系人姓名:";
	cin >> name;
	// 判断是否存在该联系人
	int ret = isExistContactPerson(ab,name);
	if (ret == -1) { // 找不到联系人
		cout << "查无此人!" << endl;
		system("pause"); // 暂停代码执行,按任意键继续
		system("cls"); // 清屏
		return;
	}
	else { // 找到了联系人
		cout << "姓名:" << ab.person[ret].name<<' ';
		cout << "性别:" << ab.person[ret].gender<<' ';
		cout << "电话号码:" << ab.person[ret].phoneNum << endl;

		system("pause"); // 暂停代码执行,按任意键继续

		system("cls"); // 清屏

	}
}

7.显示所有联系人功能:

#include"showContactPerson.h"
#include"existContactPerson.h"

// 显示联系人功能
// 功能描述:显示通讯录中所有联系人的姓名、性别、电话号码;若通讯录中么没有联系人,则打印相应提示
void showContactPerson(AddressBook ab) {
	bool flag = existContactPerson(ab);
	if (flag == false) {
		cout << "暂未添加任何联系人!" << endl;
	}
	else {
		for (int i = 0; i < ab.size; i++) {
			cout << "联系人姓名:" << ab.person[i].name << ' ';
			cout << "联系人性别:" << ab.person[i].gender << ' ';
			cout << "联系人电话号码:" << ab.person[i].phoneNum <<endl;
		}
	}

	system("pause"); // 暂停代码执行,按任意键继续

	system("cls"); // 清屏

}

8.打印菜单功能:

#include"showMenu.h"

// 显示菜单
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;
}

二.基本功能函数头文件(即函数声明)

1.添加联系人:

#pragma once
#include<iostream>
#include<cstring>
#include"structureDesign.h"

using namespace std;

# define MAX 1000 // 通讯录中最多存放的人


// 添加联系人功能
void addContactPerson(AddressBook *ab);

2.修改联系人:

#pragma once
#include<iostream>
#include<cstring>
#include"existContactPerson.h"
#include"structureDesign.h"

using namespace std;

// 修改联系人功能
void changeContactPerson(AddressBook *ab);

3.删除联系人:

#pragma once
#include<iostream>
#include<cstring>
#include"existContactPerson.h"
#include"structureDesign.h"

using namespace std;

// 删除联系人功能
void deleteContactPerson(AddressBook *ab);

4.清空通讯录:

#pragma once
#include<iostream>
#include<cstring>
#include"structureDesign.h"

using namespace std;

// 清空联系人功能
void emptyContactPerson(AddressBook *ab);

5.查找联系人:

#pragma once
#include<iostream>
#include<cstring>
#include"structureDesign.h"

using namespace std;

// 查找通讯录中指定联系人
void findContactPerson(AddressBook ab);

6.显示所有联系人:

#pragma once
#include<iostream>
#include<cstring>
#include"structureDesign.h"

using namespace std;

// 显示联系人功能
void showContactPerson(AddressBook ab);

三.其他函数源文件:这里的其他函数特指判断通讯录中是否存在联系人以及判断通讯录中是否存

                                 在特定联系人。这两个功能在基本功能函数中经常需要用到,故将其封装为   

                                 函数。                                  

1.判断通讯录中是否存在联系人:

#include"existContactPerson.h"

// 判断通讯录中是否存在联系人
// 判断方法:判断通讯录当前联系人数是否为0
// 功能描述:判断通讯录中是否存在联系人,是则返回真,否则返回假
bool existContactPerson(AddressBook ab) {
	if (ab.size == 0) {
		return false;
	}
	else {
		return true;
	}
}

2.判断通讯录中是否存在特定联系人:

#include"isExistContactPerson.h"

// 判断通讯录中是否存在某特定联系人功能
// 若存在返回该联系人下标,若不存在返回-1
int isExistContactPerson(AddressBook ab, string name) {
	for (int i = 0; i < ab.size; i++) {
		// 找到用户输入的姓名了
		if (ab.person[i].name == name) {
			return i; // 如果找到,返回这个人在数组中的下标
		}
	}
	return -1; // 如果遍历结束都未找到,返回-1
}

四.其他函数头文件

1.判断通讯录中是否存在联系人:

#pragma once
#include<iostream>
#include<cstring>
#include"structureDesign.h"

using namespace std;

// 判断通讯录中是否存在联系人
bool existContactPerson(AddressBook ab);

2.判断通讯录中是否存在特定联系人

#pragma once
#include"structureDesign.h"
#include<iostream>
#include<cstring>

using namespace std;

// 判断通讯录是否存在某特定联系人功能
int isExistContactPerson(AddressBook ab,string name);

五.结构体设计头文件:自顶向下,首先设计通讯录结构体——通讯录中需要存放众多联系人,还

                                     需要存放当前联系人个数;联系人本身包含姓名、性别、电话号码,因此

                                     联系人本身也是一个结构体,具体设计如以下头文件所示。我们把结构体

                                     设计写在一个头文件里,当主函数和各个功能函数需要用到结构体信息只

                                     需包含此头文件即可,不仅使得代码清晰易读,还节省空间。

#pragma once
#include<iostream>
#include<cstring>

using namespace std;

// 定义联系人结构体
// 联系人应包含的信息有:姓名、性别、电话号码
struct ContactPerson {
	string name; // 姓名
	string gender; // 性别
	string phoneNum; // 电话号码
};

// 定义通讯录结构体
// 通讯录应包含的信息有:联系人集合(即联系人结构体数组)、通讯录当前联系人数
struct AddressBook {
	ContactPerson person[1000]; // 联系人
	int size = 0; // 通讯录当前联系人数
};