【C/C++学习】通讯录管理系统

该文章介绍了一个使用C++编写的通讯录管理系统,包括添加、删除、修改和查询联系人信息的功能。系统使用结构体存储联系人数据,并通过冒泡排序进行信息排序。系统还包含检测信息重复、清空通讯录等辅助功能,但目前缺少文件操作来持久化数据。
摘要由CSDN通过智能技术生成

目录

前言

1.系统需求

2.系统功能

2.1 联系人结构体

2.2 功能函数

2.2.1  菜单

2.2.2  检测联系人信息

2.2.3  排序联系人信息

2.2.4  添加联系人信息

2.2.5  修改联系人信息

2.2.6  删除联系人信息

2.2.7  浏览联系人信息

2.2.8  查找联系人信息

2.2.9  清空通讯录信息

2.2.10 main函数

3,完整代码

总结


前言


        通讯录管理系统,可以用于记录联系人信息,也可以进行增删改的功能(暂无利用文件操作存储信息)。

        编写工具为:Microsoft Visual Studio2022

        工具下载:Visual Studio: 面向软件开发人员和 Teams 的 IDE 和代码编辑器


1.系统需求

可用于记录联系人的信息(姓名,性别,年龄,电话号码等)

主要功能:  ① 添加联系人信息:用于添加联系人的各种信息

                  ② 修改联系人信息:用于修改联系人的某一样信息

                  ③ 删除联系人信息:可以删除某一位联系人信息

                  ④ 浏览联系人信息:展示所记录的所有联系人信息

                  ⑤ 查找联系人信息:按照姓名查找对应联系人的信息

                  ⑥ 清空通讯录信息:清空所记录的所有信息

辅助功能:  ① 检测联系人信息:检测联系人信息是否重复

                  ② 排序联系人信息:按照联系人姓名的顺序进行联系人信息的排序

                  ③ 菜单:封装一个可以展示选项和进行选择的菜单函数

2.系统功能

2.1 联系人结构体

#define MAX 100                     //设置封装好的信息的最大数目

typedef struct Information
{
	string name;					//姓名
	int sex_num = NULL;		        //性别
	int age = NULL;		            //年龄
	long long  Phone = NULL;		//电话号码
}Informations;

typedef struct my_Info
{
	Informations infos[MAX];        //信息结构体
	int In_size = NULL;             //信息计数器
}Infos;

2.2 功能函数

2.2.1  菜单

作用:展示出系统的各种选项功能,同时进行功能的选择,以此对联系人信息进行增添、删减、修改等功能

函数:void MainMenu()

void MainMenu()
{
	bool flag = true;		        //循环标志
	system("cls");		            //清屏
	int choose = 0;		            //选项
	Infos Info;    
	Info.In_size = 0;
	while (flag) {
		//Menu
		cout << "\t********************************" << endl;
		cout << "\t*****   1.添加联系人信息   *****" << endl;
		cout << "\t*****   2.修改联系人信息   *****" << endl;
		cout << "\t*****   3.删除联系人信息   *****" << endl;
		cout << "\t*****   4.浏览联系人信息   *****" << endl;
		cout << "\t*****   5.查找联系人信息   *****" << endl;
		cout << "\t*****   6.清空通讯录信息   *****" << endl;
		cout << "\t*****   0.退出通讯录系统   *****" << endl;
		cout << "\t********************************" << endl;
		cout << "请选择(0-6):";
		cin >> choose;              //获取选项
		switch (choose)
		{
		case 0:
			flag = false;           //退出通讯录系统   
			break;
		case 1:
			AddInfo(&Info);         //添加联系人信息
			break;
		case 2:
			AfterInfo(&Info);       //修改联系人信息   
			break;
		case 3:
			DelInfo(&Info);         //删除联系人信息   
			break;
		case 4:
			InfoList(&Info);        //浏览联系人信息   
			break; 
		case 5:
			FindInfo(&Info);        //查找联系人信息   
			break;
		case 6:
			AllDelInfo(&Info);      //清空通讯录信息   
			break;
		default:
			cout << "输入有误,请重新输入" << endl;
            system("pause");        //暂停操作,等待下一步
            system("cls");          //清屏
			break;
		}
	}
}

2.2.2  检测联系人信息

作用:利用遍历对比信息的方法,避免了在修改、删除或添加时不会出现修改不存在联系人信息、删除不存在联系人信息或添加已存在联系人信息等问题的出现;同时可以在查找信息的检测联系人是否存在,以便快速查找到联系人的信息。

函数:int CheckInfo(Infos* Info, string name)

解释:若检测出联系人已经存在,则返回联系人所在的位置;若联系人不存在,则返回-1

int CheckInfo(Infos* Info, string name)
{
	for (int i = 0; i < Info->In_size; i++)
	{
		if (Info->infos[i].name == name)
		{
			return i;		//表示存在
		}
	}
	return -1;		        //表示不存在
}

2.2.3  排序联系人信息

作用:为了能够清晰的查看联系人的信息,所以按照联系人姓名的字典顺序进行信息的排序;该排序功能函数采用的是冒泡排序的方法。

函数:void SortInfo(Infos* Info)

void SortInfo(Infos* Info)
{
	if (Info->In_size >= 2)
	{
		for (int i = 0; i < Info->In_size; i++)
		{
			for (int j = 0; j < Info->In_size; j++)
			{
				if (Info->infos[j].name > Info->infos[i].name)    //升序排序
				{
					Informations data;
					data = Info->infos[i];
					Info->infos[i] = Info->infos[j];
					Info->infos[j] = data;
				}
			}
		}
	}
}

2.2.4  添加联系人信息

作用:将需要添加的联系人信息一步一步地记录在系统中;在记录完成之后会对已存在的联系人信息进行排序。

函数:void AddInfo(Infos* Info)

void AddInfo(Infos* Info)
{
	if (Info->In_size == MAX)            //判断联系人数量是否已满
	{
		cout << "通讯录已满" << endl;
		system("pause");
		system("cls");
		return;
	}
	else
	{
		string name;
		int sex_num = 0;
		int age = 0;
		long long phone = 0;
		//姓名
		cout << "请输入姓名" << endl;
		cin >> name;
		int Check = CheckInfo(Info, name);
		if (Check != -1)                //判断联系人是否存在
		{
			cout << "该联系人已存在" << endl;
			system("pause");        //暂停操作,等待下一步
            system("cls");          //清屏
			return;
		}
		else
		{
			Info->infos[Info->In_size].name = name;
		}
		//性别
		cout << "请输入性别" << endl;
		cout << "1--男\n2--女" << endl;
		cin >> sex_num;
		while (sex_num != 1 && sex_num != 2)
		{
			cout << "输入有误,请重新输入" << endl;
			cin >> sex_num;
		}
		Info->infos[Info->In_size].sex_num = sex_num;
		//年龄
		cout << "请输入年龄" << endl;
		cin >> age;
		Info->infos[Info->In_size].age = age;
		//电话
		cout << "请输入联系电话" << endl;
		cin >> phone;
		Info->infos[Info->In_size].Phone = phone;
		//更新通讯录人数
		Info->In_size += 1;
		cout << "添加成功" << endl;
		SortInfo(Info);
		system("pause");        //暂停操作,等待下一步
        system("cls");          //清屏
	}
}

2.2.5  修改联系人信息

作用:对已添加的联系人的信息进行修改,同时会对修改完成的联系人信息再次进行排序。

函数:void AfterInfo(Infos* Info)

void AfterInfo(Infos* Info)
{
	string name;
	if (Info->In_size == 0)                             //判断通讯录中是否存在记录
	{ 
		cout << "当前记录为空" << endl;
		system("pause");        //暂停操作,等待下一步
        system("cls");          //清屏
		return;
	}
	else
	{
		cout << "请输入联系人姓名" << endl;
		cin >> name;
		int Check = CheckInfo(Info, name);              //记录检测联系人的返回结果
		if (Check != -1)
		{
			cout << "\t(1) 姓名\t(2) 性别\n\t(3) 年龄\t(4) 联系电话" << endl;
			cout << "请选择需要修改的信息(1~4):" << endl;
			int choose = 0;
			cin >> choose;
			switch (choose)
			{
			case 1:										//修改姓名
			{
				string name;
				cout << "请输入姓名" << endl;
				cin >> name;
				int Check = CheckInfo(Info, name);
				if (Check != -1)
				{
					cout << "该联系人已存在" << endl;
					system("pause");        //暂停操作,等待下一步
                    system("cls");          //清屏
					return;
				}
				else
				{
					Info->infos[Info->In_size].name = name;
					SortInfo(Info);
					cout << "修改成功" << endl;
					system("pause");        //暂停操作,等待下一步
                    system("cls");          //清屏
                    return;
				}
			}
			break;
			case 2:										//修改性别
			{
				int sex_num = NULL;
				cout << "请输入性别" << endl;
				cout << "1--男\n2--女" << endl;
				cin >> sex_num;
				while (sex_num != 1 && sex_num != 2)
				{
					cout << "输入有误,请重新输入" << endl;
					cin >> sex_num;
				}
				Info->infos[Info->In_size].sex_num = sex_num;
				cout << "修改成功" << endl;
				system("pause");        //暂停操作,等待下一步
                system("cls");          //清屏
                return;
			}
			break;
			case 3:										//修改年龄
			{
				int age = NULL;
				cout << "请输入年龄" << endl;
				cin >> age;
				Info->infos[Info->In_size].age = age;
				cout << "修改成功" << endl;
				system("pause");        //暂停操作,等待下一步
                system("cls");          //清屏
                return;
			}
			break;
			case 4:										//修改联系电话
			{
				long long phone = NULL;
				cout << "请输入联系电话" << endl;
				cin >> phone;
				Info->infos[Info->In_size].Phone = phone;
				cout << "修改成功" << endl;
				system("pause");        //暂停操作,等待下一步
                system("cls");          //清屏
                return;
			}
			break;
			default:
				break;
			}
		}
		else
		{
			cout << "该联系人不存在" << endl;
			system("pause");        //暂停操作,等待下一步
            system("cls");          //清屏
			return;
		}
	}
}

2.2.6  删除联系人信息

作用:利用检测联系人是否存在的功能找到需要删除的联系人,若存在联系人,则进行删除;若不存在,则删除失败;

函数:void DelInfo(Infos* Info)

void DelInfo(Infos* Info)
{
	string name;
	if (Info->In_size == 0)                           //判断通讯录中是否存在记录
	{
		cout << "当前记录为空" << endl;
		system("pause");        //暂停操作,等待下一步
        system("cls");          //清屏
		return;
	}
	else
	{
		cout << "请输入联系人姓名" << endl;
		cin >> name;
		int Check = CheckInfo(Info, name);            //记录检测联系人的返回结果
		if (Check != -1)
		{
			for (int i = Check; i < Info->In_size; i++)
			{
				Info->infos[i] = Info->infos[i + 1];
			}
			Info->In_size -= 1;
			cout << "删除成功" << endl;
			system("pause");        //暂停操作,等待下一步
            system("cls");          //清屏
			return;
		}
		else
		{
			cout << "该联系人不存在" << endl;
			system("pause");        //暂停操作,等待下一步
            system("cls");          //清屏
			return;
		}
	}
}

2.2.7  浏览联系人信息

作用:将系统中记录的所有信息逐个打印出来。

函数:void InfoList(Infos* Info)

注:该功能函数使用了三目运算符,Info->infos[i].sex_num == 1 ? "男" : "女"

void InfoList(Infos* Info)
{
	if (Info->In_size == 0)                //判断通讯录是否存在记录
	{
		cout << "当前记录为空" << endl;
		system("pause");
		system("cls");
		return;
	}
	else
	{
		//cout << "\t姓名\t" << "性别\t" << "年龄\t" << "电话" << endl;
		for (int i = 0; i < Info->In_size; i++)
		{
			cout << "\t" << i + 1 <<
				"\t姓名:" << Info->infos[i].name <<
				"\t性别:" << (Info->infos[i].sex_num == 1 ? "男" : "女") <<
				"\t年龄:" << Info->infos[i].age <<
				"\t电话:" << Info->infos[i].Phone << endl;
		}
		system("pause");        //暂停操作,等待下一步
        system("cls");          //清屏
	}
}

2.2.8  查找联系人信息

作用:利用检测联系人是否存在的功能寻找到所需要的联系人信息,并将其打印出来

函数:void FindInfo(Infos* Info)

注:该功能函数使用了与InfoList函数中相同的三目运算符

void FindInfo(Infos* Info)
{
	string name;
	if (Info->In_size == 0)
	{
		cout << "当前记录为空" << endl;        //判断通讯录是否存在记录
		system("pause");
		system("cls");
	}
	else
	{
		cout << "请输入联系人姓名" << endl;
		cin >> name;
		int Check = CheckInfo(Info, name);        //记录检测联系人的返回结果
		if (Check != -1)
		{
			cout << "\t" << Check + 1 <<
				"\t姓名:" << Info->infos[Check].name <<
				"\t性别:" << (Info->infos[Check].sex_num == 1 ? "男" : "女") <<
				"\t年龄:" << Info->infos[Check].age <<
				"\t电话:" << Info->infos[Check].Phone << endl;
			system("pause");        //暂停操作,等待下一步
            system("cls");          //清屏
		}
		else
		{
			cout << "该联系人不存在" << endl;
			system("pause");        //暂停操作,等待下一步
            system("cls");          //清屏
		}
	}
}

2.2.9  清空通讯录信息

作用:将当前所记录的所有联系人信息进行间接清空的操作(改变结构体中的In_size).

函数:void AllDelInfo(Infos* Info)

解释:将In_size的值改为0,则系统将冲第一条开始记录,之后记录的信息将会覆盖原来的信息,达到间接清空联系人信息的作用。

void AllDelInfo(Infos* Info)
{
	if (Info->In_size != 0)        //判断通讯录是否存在记录
	{
		string choose;
		cout << "确定要清空通讯录信息(Yes/No)?" << endl;
		cin >> choose;
		if (choose == "Yes")
		{
			Info->In_size = 0;
			cout << "清空成功!" << endl;
			system("pause");        //暂停操作,等待下一步
            system("cls");          //清屏
		}
		else
		{
			cout << "取消操作成功!" << endl;
			system("pause");        //暂停操作,等待下一步
            system("cls");          //清屏
		}
	}
	else
	{
		cout << "当前记录为空" << endl;
		system("pause");        //暂停操作,等待下一步
        system("cls");          //清屏
	}
}

2.2.10 main函数

int main()
{
	MainMenu();
	return 0;
}

3,完整代码

#include <iostream>
#include <string>
#include <string.h>
#define MAX 100

using namespace std;

typedef struct Information
{
	string name;					//姓名
	int sex_num = NULL;		//性别
	int age = NULL;							//年龄
	long long  Phone = NULL;					//电话号码
}Informations;

typedef struct my_Info
{
	Informations infos[MAX];
	int In_size = NULL;
}Infos;

//检测联系人是否存在
int CheckInfo(Infos* Info, string name)
{
	for (int i = 0; i < Info->In_size; i++)
	{
		if (Info->infos[i].name == name)
		{
			return i;		//表示存在
		}
	}
	return -1;		//表示不存在
}
//排序联系人信息(冒泡排序)
void SortInfo(Infos* Info)
{
	if (Info->In_size >= 2)
	{
		for (int i = 0; i < Info->In_size; i++)
		{
			for (int j = 0; j < Info->In_size; j++)
			{
				if (Info->infos[j].name > Info->infos[i].name)
				{
					Informations data;
					data = Info->infos[i];
					Info->infos[i] = Info->infos[j];
					Info->infos[j] = data;
				}
			}
		}
	}
}
//添加联系人信息
void AddInfo(Infos* Info)
{
	if (Info->In_size == MAX)
	{
		cout << "通讯录已满" << endl;
		system("pause");
		system("cls");
		return;
	}
	else
	{
		string name;
		int sex_num = 0;
		int age = 0;
		long long phone = 0;
		//姓名
		cout << "请输入姓名" << endl;
		cin >> name;
		int Check = CheckInfo(Info, name);
		if (Check != -1)
		{
			cout << "该联系人已存在" << endl;
			system("pause");
			system("cls");
			return;
		}
		else
		{
			Info->infos[Info->In_size].name = name;
		}
		//性别
		cout << "请输入性别" << endl;
		cout << "1--男\n2--女" << endl;
		cin >> sex_num;
		while (sex_num != 1 && sex_num != 2)
		{
			cout << "输入有误,请重新输入" << endl;
			cin >> sex_num;
		}
		Info->infos[Info->In_size].sex_num = sex_num;
		//年龄
		cout << "请输入年龄" << endl;
		cin >> age;
		Info->infos[Info->In_size].age = age;
		//电话
		cout << "请输入联系电话" << endl;
		cin >> phone;
		Info->infos[Info->In_size].Phone = phone;
		//更新通讯录人数
		Info->In_size += 1;
		cout << "添加成功" << endl;
		SortInfo(Info);
		system("pause");        //暂停操作,等待下一步
		system("cls");          //清屏
	}
}
//修改联系人信息
void AfterInfo(Infos* Info)
{
	string name;
	if (Info->In_size == 0)
	{
		cout << "当前记录为空" << endl;
		system("pause");
		system("cls");
		return;
	}
	else
	{
		cout << "请输入联系人姓名" << endl;
		cin >> name;
		int Check = CheckInfo(Info, name);
		if (Check != -1)
		{
			cout << "\t(1) 姓名\t(2) 性别\n\t(3) 年龄\t(4) 联系电话" << endl;
			cout << "请选择需要修改的信息(1~4):" << endl;
			int choose = 0;
			cin >> choose;
			switch (choose)
			{
			case 1:										//修改姓名
			{
				string name;
				cout << "请输入姓名" << endl;
				cin >> name;
				int Check = CheckInfo(Info, name);
				if (Check != -1)
				{
					cout << "该联系人已存在" << endl;
					system("pause");
					system("cls");
					return;
				}
				else
				{
					Info->infos[Info->In_size].name = name;
					SortInfo(Info);
					cout << "修改成功" << endl;
					system("pause");
					system("cls");
					return;
				}
			}
			break;
			case 2:										//修改性别
			{
				int sex_num = NULL;
				cout << "请输入性别" << endl;
				cout << "1--男\n2--女" << endl;
				cin >> sex_num;
				while (sex_num != 1 && sex_num != 2)
				{
					cout << "输入有误,请重新输入" << endl;
					cin >> sex_num;
				}
				Info->infos[Info->In_size].sex_num = sex_num;
				cout << "修改成功" << endl;
				system("pause");
				system("cls");
				return;
			}
			break;
			case 3:										//修改年龄
			{
				int age = NULL;
				cout << "请输入年龄" << endl;
				cin >> age;
				Info->infos[Info->In_size].age = age;
				cout << "修改成功" << endl;
				system("pause");
				system("cls");
				return;
			}
			break;
			case 4:										//修改联系电话
			{
				long long phone = NULL;
				cout << "请输入联系电话" << endl;
				cin >> phone;
				Info->infos[Info->In_size].Phone = phone;
				cout << "修改成功" << endl;
				system("pause");
				system("cls");
				return;
			}
			break;
			default:
				break;
			}
		}
		else
		{
			cout << "该联系人不存在" << endl;
			system("pause");
			system("cls");
			return;
		}
	}
}
//删除联系人信息
void DelInfo(Infos* Info)
{
	string name;
	if (Info->In_size == 0)
	{
		cout << "当前记录为空" << endl;
		system("pause");
		system("cls");
		return;
	}
	else
	{
		cout << "请输入联系人姓名" << endl;
		cin >> name;
		int Check = CheckInfo(Info, name);
		if (Check != -1)
		{
			for (int i = Check; i < Info->In_size; i++)
			{
				Info->infos[i] = Info->infos[i + 1];
			}
			Info->In_size -= 1;
			cout << "删除成功" << endl;
			system("pause");
			system("cls");
			return;
		}
		else
		{
			cout << "该联系人不存在" << endl;
			system("pause");
			system("cls");
			return;
		}
	}
}
//浏览联系人信息
void InfoList(Infos* Info)
{
	if (Info->In_size == 0)
	{
		cout << "当前记录为空" << endl;
		system("pause");
		system("cls");
		return;
	}
	else
	{
		//cout << "\t姓名\t" << "性别\t" << "年龄\t" << "电话" << endl;
		for (int i = 0; i < Info->In_size; i++)
		{
			cout << "\t" << i + 1 <<
				"\t姓名:" << Info->infos[i].name <<
				"\t性别:" << (Info->infos[i].sex_num == 1 ? "男" : "女") <<
				"\t年龄:" << Info->infos[i].age <<
				"\t电话:" << Info->infos[i].Phone << endl;
		}
		system("pause");
		system("cls");
	}
}
//查找联系人信息
void FindInfo(Infos* Info)
{
	string name;
	if (Info->In_size == 0)
	{
		cout << "当前记录为空" << endl;
		system("pause");
		system("cls");
	}
	else
	{
		cout << "请输入联系人姓名" << endl;
		cin >> name;
		int Check = CheckInfo(Info, name);
		if (Check != -1)
		{
			cout << "\t" << Check + 1 <<
				"\t姓名:" << Info->infos[Check].name <<
				"\t性别:" << (Info->infos[Check].sex_num == 1 ? "男" : "女") <<
				"\t年龄:" << Info->infos[Check].age <<
				"\t电话:" << Info->infos[Check].Phone << endl;
			system("pause");
			system("cls");
		}
		else
		{
			cout << "该联系人不存在" << endl;
			system("pause");
			system("cls");
		}
	}
}
//清空通讯录信息
void AllDelInfo(Infos* Info)
{
	if (Info->In_size != 0)
	{
		string choose;
		cout << "确定要清空通讯录信息(Yes/No)?" << endl;
		cin >> choose;
		if (choose == "Yes")
		{
			Info->In_size = 0;
			cout << "清空成功!" << endl;
			system("pause");
			system("cls");
		}
		else
		{
			cout << "取消操作成功!" << endl;
			system("pause");
			system("cls");
		}
	}
	else
	{
		cout << "当前记录为空" << endl;
		system("pause");
		system("cls");
	}
}
//菜单功能
void MainMenu()
{
	bool flag = true;		//循环标志
	system("cls");		//清屏
	int choose = 0;		//储存选项
	Infos Info;
	Info.In_size = 0;
	while (flag) {
		//Menu
		cout << "\t********************************" << endl;
		cout << "\t*****   1.添加联系人信息   *****" << endl;
		cout << "\t*****   2.修改联系人信息   *****" << endl;
		cout << "\t*****   3.删除联系人信息   *****" << endl;
		cout << "\t*****   4.浏览联系人信息   *****" << endl;
		cout << "\t*****   5.查找联系人信息   *****" << endl;
		cout << "\t*****   6.清空通讯录信息   *****" << endl;
		cout << "\t*****   0.退出通讯录系统   *****" << endl;
		cout << "\t********************************" << endl;
		cout << "请选择(0-6):";
		cin >> choose;
		switch (choose)
		{
		case 0:
			flag = false;
			break;
		case 1:
			AddInfo(&Info);
			break;
		case 2:
			AfterInfo(&Info);
			break;
		case 3:
			DelInfo(&Info);
			break;
		case 4:
			InfoList(&Info);
			break;
		case 5:
			FindInfo(&Info);
			break;
		case 6:
			AllDelInfo(&Info);
			break;
		default:
			cout << "请重新输入" << endl;
			break;
		}
	}
}

int main()
{
	MainMenu();
	return 0;
}

总结

        在完成该系统的制作的,先是将会用到的功能列出来,然后再进行功能的逐步完善。在完成的过程中出现了很多种bug,但也花时间去解决了,不足之处就是一些不必要的代码段任然没找出,没能将代码进行简化显得有点杂糅。与此同时,这次完成好这个系统+做好笔记后让我对整体更加了解,也巩固了我对知识的理解,之后会继续努力,争取之后能够添加上文件操作的功能,以此来保存信息至本地文件中

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YdaMooc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值