学习视频资料见B站:https://www.bilibili.com/video/BV1et411b73Z
通讯录管理系统
1 系统要求
系统中需要实现的功能如下:
- 添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记录1000人
- 显示联系人:显示通讯录中所有联系人信息
- 删除联系人:按照姓名进行删除指定联系人
- 查找联系人:按照姓名查看指定联系人信息
- 修改联系人:按照姓名重新修改指定联系人
- 清空联系人:清空通讯录中所有信息
- 退出通讯录:退出当前使用的通讯录
2 创建项目
创建项目和源文件,之前讲过,这里不再赘述。
3 菜单功能
菜单界面如下:
步骤:
- 封装一个函数来实现菜单的显示
void showMenu()
- 在main函数中执行这个函数
示例:
#include<iostream>
using namespace std;
//封装一个显示菜单的函数
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()
{
showMenu();
system("pause");
return 0;
}
4 退出功能
用switch语句实现
5 添加联系人
功能描述:
实现添加联系人功能,联系人上限为1000人,联系人信息包括(姓名、性别、年龄、联系电话、家庭住址)
添加联系人实现步骤:
- 设计联系人结构体
- 设计通讯录结构体
- main函数中创建通讯录
- 封装添加联系人函数
- 测试添加联系人功能
5.1 设计联系人结构体
联系人信息包括:姓名、性别、年龄、联系电话、家庭住址
示例:
#include<string>
//设计联系人结构体
struct Contact
{
string name;
int gender; //1--男性 2--女性
int age;
string phoneNum;
string address;
};
5.2设计通讯录结构体
里面包括了一个联系人结构体数组,以及目前通讯录中已有的人数。
示例:
#define MACX 1000
//创建通讯录结构体
struct contactBook
{
Contact pensonArray[MAX]; //通讯录中是一个联系人构成的数组,最大1000个
int size; //用来记录现有的联系人个数
};
5.3 main函数中创建通讯录变量
示例:
//创建一个通讯录变量
contactBook ctb;
//给这个变量赋初值
ctb.size = 0; //一开始通讯录人数为零
5.4 封装一个添加联系人子函数
示例:
//封装添加联系人子函数
void addPerson(contactBook * p)
{
if (p->size >= MAX)
{
cout << "抱歉,通讯录已满" << endl; //判断通讯录是否已经满了
}
else
{
//姓名
cout << "请输入联系人姓名:" << endl;
string name;
cin >> name;
p->pensonArray[p->size].name = name;
//性别
cout << "请输入联系人性别:" << endl;
cout << "1——男性" << endl;
cout << "2——女性" << endl;
int gender;
while (1)
{
cin >> gender;
if (gender == 1 || gender == 2)
{
p->pensonArray[p->size].gender = gender;
break;
}
else
{
cout << "请输入正确的性别!" << endl;
}
}
//年龄
cout << "请输入联系人年龄:" << endl;
int age;
cin >> age;
p->pensonArray[p->size].age = age;
//电话号码
cout << "请输入联系人电话号码:" << endl;
string num;
cin >> num;
p->pensonArray[p->size].phoneNum = num;
//住址
cout << "请输入联系人地址:" << endl;
string add;
cin >> add;
p->pensonArray[p->size].address = add;
//更新通讯录人数
p->size++;
cout<<"联系人 "<< name << " 添加成功!" << endl;
system("pause"); //按任意键继续
system("cls"); //清屏操作
}
}
6 显示联系人
封装显示联系人子函数
示例:
//2.封装显示联系人子函数
void showPerson(contactBook * p)
{
//判断通讯录是否为空
if (p->size == 0)
{
cout << "当前通讯录为空!" << endl;
}
else
{
for (int i = 0; i < p->size; i++)
{
cout << "姓名:" << p->pensonArray[i].name << "\t"
<< "性别:" << (p->pensonArray[i].gender == 1 ? "男" : "女") << "\t"
<< "年龄:" << p->pensonArray[i].age << "\t"
<< "电话:" << p->pensonArray[i].phoneNum << "\t"
<< "住址:" << p->pensonArray[i].address << endl;
}
}
system("pause");
system("cls");
}
7 删除联系人
功能描述:按照姓名进行删除指定联系人
删除联系人实现步骤:
- 封装检测联系人是否存在
- 封装删除联系人函数
- 测试删除联系人功能
7.1 封装检测联系人是否存在的子函数
示例:
//3.封装一个检测联系人是否存在的函数,存在返回位置,不存在返回-1
// 传入的参数 参数1:通讯录 参数2:查找的人
int weatherExist(contactBook * p, string name)
{
for (int i = 0; i < p->size; i++)
{
if (p->pensonArray[i].name == name)
{
return i;
}
}
return -1;
}
7.2 封装一个删除联系人的函数
示例:
//4.封装一个删除联系人的函数
void deletePerson(contactBook * p)
{
cout << "请输入想要删除的联系人姓名:" << endl;
string name;
cin >> name;
int resp = weatherExist(p, name);
if (resp !=-1)
{
for (int i = resp; i < p->size; i++)
{
p->pensonArray[i] = p->pensonArray[i + 1];
}
p->size--;
cout << "联系人 " << name << " 删除成功!" << endl;
}
else
{
cout << "查无此人!" << endl;
}
system("pause");
system("cls");
}
8 查找联系人
封装一个查找联系人的子函数
示例:
//5.封装一个查找联系人的子函数
void findPerson(contactBook * p)
{
cout << "请输入您想要查找的联系人姓名:" << endl;
string name;
cin >> name;
int resp = weatherExist(p, name);
if (resp != -1) //联系人存在
{
cout << "姓名:" << p->pensonArray[resp].name << "\t"
<< "性别:" << (p->pensonArray[resp].gender == 1 ? "男" : "女") << "\t"
<< "年龄:" << p->pensonArray[resp].age << "\t"
<< "电话:" << p->pensonArray[resp].phoneNum << "\t"
<< "住址:" << p->pensonArray[resp].address << endl;
}
else //联系人不存在
{
cout << "查无此人" << endl;
}
system("pause");
system("cls");
}
9 修改联系人
封装一个修改联系人的子函数
示例:
//6.封装一个修改联系人的子函数
void modifyPerson(contactBook * p)
{
cout << "请输入您想要修改的联系人姓名:" << endl;
string name;
cin >> name;
int resp = weatherExist(p, name);
if (resp != -1) //联系人存在
{
//姓名
cout << "请输入修改后联系人姓名:" << endl;
string name;
cin >> name;
p->pensonArray[resp].name = name;
//性别
cout << "请输入修改后联系人性别:" << endl;
cout << "1——男性" << endl;
cout << "2——女性" << endl;
int gender;
while (1)
{
cin >> gender;
if (gender == 1 || gender == 2)
{
p->pensonArray[resp].gender = gender;
break;
}
else
{
cout << "请输入正确的性别!" << endl;
}
}
//年龄
cout << "请输入修改后联系人年龄:" << endl;
int age;
cin >> age;
p->pensonArray[resp].age = age;
//电话号码
cout << "请输入修改后联系人电话号码:" << endl;
string num;
cin >> num;
p->pensonArray[resp].phoneNum = num;
//住址
cout << "请输入修改后联系人地址:" << endl;
string add;
cin >> add;
p->pensonArray[resp].address = add;
cout << "联系人 " << name << " 修改成功!" << endl;
}
else //联系人不存在
{
cout << "查无此人" << endl;
}
system("pause");
system("cls");
}
10 清空联系人
封装清空联系人函数
示例:
//7.封装一个清空联系人的函数
void cleanPerson(contactBook * p)
{
p->size = 0; //做逻辑清空操作
cout << "清空通讯录成功!" << endl;
system("pause");
system("cls");
}
11 所有程序
#include<iostream>
using namespace std;
#include<string>
#define MAX 1000 //这里用宏定义方便以后直接修改人数上限
//封装一个显示菜单的函数
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;
}
//设计联系人结构体
struct Contact
{
string name;
int gender; //1--男性 2--女性
int age;
string phoneNum;
string address;
};
//创建通讯录结构体MAX
struct contactBook
{
Contact pensonArray[MAX]; //通讯录中是一个联系人构成的数组,最大1000个
int size; //用来记录现有的联系人个数
};
//1.封装添加联系人子函数
void addPerson(contactBook * p)
{
if (p->size >= MAX)
{
cout << "抱歉,通讯录已满" << endl; //判断通讯录是否已经满了
}
else
{
//姓名
cout << "请输入联系人姓名:" << endl;
string name;
cin >> name;
p->pensonArray[p->size].name = name;
//性别
cout << "请输入联系人性别:" << endl;
cout << "1——男性" << endl;
cout << "2——女性" << endl;
int gender;
while (1)
{
cin >> gender;
if (gender == 1 || gender == 2)
{
p->pensonArray[p->size].gender = gender;
break;
}
else
{
cout << "请输入正确的性别!" << endl;
}
}
//年龄
cout << "请输入联系人年龄:" << endl;
int age;
cin >> age;
p->pensonArray[p->size].age = age;
//电话号码
cout << "请输入联系人电话号码:" << endl;
string num;
cin >> num;
p->pensonArray[p->size].phoneNum = num;
//住址
cout << "请输入联系人地址:" << endl;
string add;
cin >> add;
p->pensonArray[p->size].address = add;
//更新通讯录人数
p->size++;
cout<<"联系人 "<< name << " 添加成功!" << endl;
system("pause"); //按任意键继续
system("cls"); //清屏操作
}
}
//2.封装显示联系人子函数
void showPerson(contactBook * p)
{
//判断通讯录是否为空
if (p->size == 0)
{
cout << "当前通讯录为空!" << endl;
}
else
{
for (int i = 0; i < p->size; i++)
{
cout << "姓名:" << p->pensonArray[i].name << "\t"
<< "性别:" << (p->pensonArray[i].gender == 1 ? "男" : "女") << "\t"
<< "年龄:" << p->pensonArray[i].age << "\t"
<< "电话:" << p->pensonArray[i].phoneNum << "\t"
<< "住址:" << p->pensonArray[i].address << endl;
}
}
system("pause");
system("cls");
}
//3.封装一个检测联系人是否存在的函数,存在返回位置,不存在返回-1
// 传入的参数 参数1:通讯录 参数2:查找的人
int weatherExist(contactBook * p, string name)
{
for (int i = 0; i < p->size; i++)
{
if (p->pensonArray[i].name == name)
{
return i;
}
}
return -1;
}
//4.封装一个删除联系人的函数
void deletePerson(contactBook * p)
{
cout << "请输入想要删除的联系人姓名:" << endl;
string name;
cin >> name;
int resp = weatherExist(p, name);
if (resp !=-1)
{
for (int i = resp; i < p->size; i++)
{
p->pensonArray[i] = p->pensonArray[i + 1]; //数组整体前移,覆盖掉要删除的联系人
}
p->size--;
cout << "联系人 " << name << " 删除成功!" << endl;
}
else
{
cout << "查无此人!" << endl;
}
system("pause");
system("cls");
}
//5.封装一个查找联系人的子函数
void findPerson(contactBook * p)
{
cout << "请输入您想要查找的联系人姓名:" << endl;
string name;
cin >> name;
int resp = weatherExist(p, name);
if (resp != -1) //联系人存在
{
cout << "姓名:" << p->pensonArray[resp].name << "\t"
<< "性别:" << (p->pensonArray[resp].gender == 1 ? "男" : "女") << "\t"
<< "年龄:" << p->pensonArray[resp].age << "\t"
<< "电话:" << p->pensonArray[resp].phoneNum << "\t"
<< "住址:" << p->pensonArray[resp].address << endl;
}
else //联系人不存在
{
cout << "查无此人" << endl;
}
system("pause");
system("cls");
}
//6.封装一个修改联系人的子函数
void modifyPerson(contactBook * p)
{
cout << "请输入您想要修改的联系人姓名:" << endl;
string name;
cin >> name;
int resp = weatherExist(p, name);
if (resp != -1) //联系人存在
{
//姓名
cout << "请输入修改后联系人姓名:" << endl;
string name;
cin >> name;
p->pensonArray[resp].name = name;
//性别
cout << "请输入修改后联系人性别:" << endl;
cout << "1——男性" << endl;
cout << "2——女性" << endl;
int gender;
while (1)
{
cin >> gender;
if (gender == 1 || gender == 2)
{
p->pensonArray[resp].gender = gender;
break;
}
else
{
cout << "请输入正确的性别!" << endl;
}
}
//年龄
cout << "请输入修改后联系人年龄:" << endl;
int age;
cin >> age;
p->pensonArray[resp].age = age;
//电话号码
cout << "请输入修改后联系人电话号码:" << endl;
string num;
cin >> num;
p->pensonArray[resp].phoneNum = num;
//住址
cout << "请输入修改后联系人地址:" << endl;
string add;
cin >> add;
p->pensonArray[resp].address = add;
cout << "联系人 " << name << " 修改成功!" << endl;
}
else //联系人不存在
{
cout << "查无此人" << endl;
}
system("pause");
system("cls");
}
//7.封装一个清空联系人的函数
void cleanPerson(contactBook * p)
{
p->size = 0; //做逻辑清空操作
cout << "清空通讯录成功!" << endl;
system("pause");
system("cls");
}
int main()
{
int select = 0;//创建一个变量,用来接收用户输入的选项
//创建一个通讯录变量
contactBook ctb;
//给这个变量赋初值
ctb.size = 0; //一开始通讯录人数为零
while (1) //用while实现能够一直操作的目的
{
showMenu();
cin >> select;
switch (select)
{
case 1:
addPerson(&ctb); //创建一个子函数,实现添加联系人的功能,这里采用地址传递
break;
case 2:
showPerson(&ctb); //封装一个显示联系人的子函数,也是地址传递
break;
case 3:
deletePerson(&ctb); //封装的删除联系人的子函数
break;
case 4:
findPerson(&ctb); //封装的查找联系人的子函数
break;
case 5:
modifyPerson(&ctb); //封装的修改联系人的子函数
break;
case 6:
cleanPerson(&ctb); //封装的清空联系人的函数
break;
case 0:
cout << "欢迎您下次使用本系统" << endl;
system("pause");
return 0; //可以直接跳出main函数,结束程序
break;
default:
cout << "请输入正确的序号" << endl;
break;
}
}
system("pause");
return 0;
}