黑马程序员匠心之作|C++教程从0到1入门编程
系统需求:
通讯录是一个可以记录亲人、好友信息的工具。本教程主要利用C++来实现一个通讯录管理系统系统中需实现的功能如下:
1、添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记 1000人
2、显示联系人:显示通讯录中所有联系人信息
3、删除联系人:按照姓名进行删除指定联系人
4、查找联系人:按照姓名查看指定联系人信息
5、修改联系人:按照姓名重新修改指定联系人
6、清空联系人:清空通讯录中所有信息
7、退出通讯录:退出当前使用的通讯录
菜单界面效果如下:
步骤:
1、封装函数显示该界面,如:void showMenu()
2、在main函数中调用封装好的函数
#include
using namespace std;
//1、封装函数显示该界面,如:`void showMenu()`
//菜单界面
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()
{
//2、在main函数中调用封装好的函数
//菜单调用
showMenu();
system("pause");
return 0;
}
思路:根据用户不同的选择,进入不同功能,可以选择switch分支结构,将整个框架进行搭建。
当用户选择0的时候,执行退出,选择其他先不做操作,也不会退出程序。
#include
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()
{
int select = 0;//创建用户选择输入的变量
while (true)
{
//菜单调用
showMenu();
cin >> select;
switch (select)
{
case 1://1、添加联系人
break;
case 2://2、显示联系人
break;
case 3://3、删除联系人
break;
case 4://4、查找联系人
break;
case 5://5、修改联系人
break;
case 6://6、清空联系人
break;
case 0://0、退出通讯录
cout << "欢迎下次使用!" << endl;
system("pause");
return 0;
break;
default:
break;
}
}
system("pause");
return 0;
}
while()的作用:
没加之前,输入1~6都会显示“请按任意键继续……”,是由于最结尾处的system("pause");return 0;
。
加入后,只有在输入0时,才会显示“请按任意键继续……”,且按后退出;按其他键仍旧显示菜单目录。
添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记 1000人
实现步骤:
1、设计联系人结构体
2、设计通讯录结构体
3、main函数中创建通讯录
4、封装添加联系人函数
5、测试添加联系人功能
#define MAX 1000 //最大人数
//联系人结构体
//信息包括(姓名、性别、年龄、联系电话、家庭住址)
struct person
{
string m_Name;//姓名
int m_Sex;//性别:1男 2女
int m_Age;//年龄
string m_Phone;//联系电话
string m_Addr;//
};
//通讯录结构体
struct Addressbooks
{
struct person personArry[MAX]; //通讯录中保存的联系人数组
int m_Size;//通讯录中人员个数
};
实现步骤:
1、设计联系人结构体
2、设计通讯录结构体
3、main函数中创建通讯录
4、封装添加联系人函数
5、测试添加联系人功能
//main函数起始位置添加:
//创建通讯录结构体变量
struct Addressbooks abs;
//初始化通讯录中当前人员个数
abs.m_Size = 0;
//封装添加联系人函数
//判断通讯录是否已满,满了不再添加,未满情况将联系人信息逐个加入到通讯录
//添加联系人函数
void addPerson(struct Addressbooks * abs)
{
//判断通讯录是否已满,满了就不再添加
if (abs->m_Size == MAX)
{
cout << "通讯录已满,无法添加!" << endl;
return ;
}
else
{
//添加具体联系人
//姓名
string name;
cout << "请输入姓名:"<< endl;
cin >> name;
abs->personArry[abs->m_Size].m_Name = name;
//性别
int sex = 0;
cout << "请输入性别:" << endl;
cout << "1 --- 男:" << endl;
cout << "2 --- 女:" << endl;
cin >> sex;
//输入对了,退出循环
//输入错了,一直输入
while (true)
{
//cin >> sex;//错误位置,加在这里需要输入两次
if (sex == 1 || sex == 2)
{
abs->personArry[abs->m_Size].m_Sex = sex;
break; //输入对了,存后退出
}
cout << "输入错误,请重新输入性别" << endl;
cin >> sex;//正确位置,输入的不对就一直输
}
//年龄
int age = 0;
cout << "请输入年龄:" << endl;
cin >> age;
while (true)
{
//cin >> sex;//错误位置,加在这里需要输入两次
if (age > 0 && age < 150)
{
abs->personArry[abs->m_Size].m_Age = age;
break; //输入对了,存后退出
}
cout << "输入错误,请重新输入年龄" << endl;
cin >> age;//正确位置,输入的不对就一直输
}
//电话
string phone;
cout << "请输入电话:" << endl;
cin >> phone;
abs->personArry[abs->m_Size].m_Phone = phone;
//住址
string address;
cout << "请输入住址:" << endl;
cin >> address;
abs->personArry[abs->m_Size].m_Addr = address;
//更新通讯录人数
abs->m_Size++;
cout << "添加成功" << endl;
system("pause");//请按任意键继续
system("cls");//清屏操作
}
}
//main函数switch (select)中case 1变为:
case 1://1、添加联系人
//addPerson(abs); //值传递,不改变实参,无法增加
addPerson(&abs);//利用地址传递,可以修改实参
break;
步骤:
1、封装显示联系人函数
2、测试显示联系人功能
//显示所有联系人函数
void showPerson(struct Addressbooks * abs)
{
//判断通讯录中是否为0
//如果为0,提示记录为空
//如果不为0,显示记录的联系人信息
if (abs->m_Size == 0)
{
cout << "当前的记录为空" << endl;
}
else
{
for (int i = 0;i < abs->m_Size;i++)
{
cout << "姓名:" << abs->personArry[i].m_Name << "\t"
<< "性别:" << (abs->personArry[i].m_Sex == 1 ? "男":"女" )<< "\t"
<< "年龄:" << abs->personArry[i].m_Age << "\t"
<< "联系电话:" << abs->personArry[i].m_Phone << "\t"
<< "家庭地址:" << abs->personArry[i].m_Addr << endl;
}
}
system("pause");//请按任意键继续
system("cls");//清屏操作
}
//main函数switch (select)中case 2变为:
case 2://2、显示联系人
showPerson(&abs);
break;
步骤:
1、封装检测联系人是否存在
2、封装删除联系人函数
3、测试删除联系人功能
设计思路:
删除联系人前,我们需要先判断用户输入的联系人是否存在,如果存在删除,不存在提示用户没有要删除的联系人。因此,我们可以把检测联系人是否存在封装成一个函数中,如果存在,返回联系人在通讯录中的位置,不存在返回-1。
//检测联系人是否存在
//如果存在,返回联系人所在数组具体位置;如果不存在,返回-1
int isExist(struct Addressbooks * abs,string name)
{
for(int i=0;im_Size;i++)
{
//找到用户输入的姓名了
if (abs->personArry[i].m_Name==name)
{
return i;//找到了,返回这个人在数组中的下标编号
}
}
return -1;//如果遍历后,没找到用户输入的姓名,返回-1
system("pause");//请按任意键继续
system("cls");//清屏操作
}
//main函数switch (select)中case 3变为:
case 3://3、删除联系人
{ //不加大括号,switch就会底下有红色波浪线
cout << "请输入删除联系人姓名:" << endl;
string name;
cin >> name;
if (isExist(&abs, name) == -1)
{
cout << "查无此人" << endl;
}
else
{
cout << "找到了" << endl;
}
}
break;
注意:如果不把case3中break前代码用{}括起来,switch底下有红色波浪线,因为代码过长。
步骤:
1、封装检测联系人是否存在
2、封装删除联系人函数
3、测试删除联系人功能
根据用户输入的联系人判断通讯录中是否有人
查找到进行删除,并提示删除成功
查不到提示查无此人
//删除指定联系人
void delectPerson(struct Addressbooks * abs)
{
cout << "请输入删除联系人姓名:" << endl;
string name;
cin >> name;
int ret = isExist(abs, name);
if (ret == -1)
{
cout << "查无此人" << endl;
}
else
{ //查到此人,进行删除操作
int i = ret;
//要删除i,将i后所有数据进行前移,并让通讯录中人员个数-1
for (;i < abs->m_Size;i++)
{
//数据前移
abs->personArry[i].m_Name = abs->personArry[i + 1].m_Name;
abs->personArry[i].m_Sex = abs->personArry[i + 1].m_Sex;
abs->personArry[i].m_Age = abs->personArry[i + 1].m_Age;
abs->personArry[i].m_Phone = abs->personArry[i + 1].m_Phone;
abs->personArry[i].m_Addr = abs->personArry[i + 1].m_Addr;
}
abs->m_Size--;//更新通讯录中人员数
cout << "删除成功" << endl;
}
system("pause");
system("cls");
}
//main函数switch (select)中case 3变为:
case 3://3、删除联系人
//{ //不加大括号,switch就会底下有红色波浪线
// cout << "请输入删除联系人姓名:" << endl;
// string name;
// cin >> name;
// if (isExist(&abs, name) == -1)
// {
// cout << "查无此人" << endl;
// }
// else
// {
// cout << "找到了" << endl;
// }
//}
delectPerson( &abs);
break;
步骤:
1、封装查找联系人函数
2、测试查找指定联系人
//查找联系人
void findPerson(struct Addressbooks * abs)
{
cout << "请输入您想要查找的联系人:" << endl;
string name;
cin >> name;
int ret = isExist(abs, name);
if (ret == -1)
{
cout << "查无此人" << endl;
}
else
{ //查到此人,进行显示操作
int i = ret;
cout << "姓名:"<< abs->personArry[i].m_Name <<"\t";
cout << "性别:" << abs->personArry[i].m_Sex << "\t";
cout << "年龄:" << abs->personArry[i].m_Age << "\t";
cout << "联系方式:" << abs->personArry[i].m_Phone << "\t";
cout << "地址:" << abs->personArry[i].m_Addr << endl;
}
system("pause");
system("cls");
}
//main函数switch (select)中case 4变为:
case 4://4、查找联系人
findPerson(&abs);
break;
注意:功能2显示所有联系人,功能4只显示你查找的联系人
步骤:
1、封装修改联系人函数
2、测试修改指定联系人
//修改联系人
void modifyPerson(struct Addressbooks *abs)
{
cout << "请输入您想要修改的联系人:" << endl;
string name;
cin >> name;
int ret = isExist(abs, name);
if (ret == -1)
{
cout << "查无此人" << endl;
}
else
{ //查到此人,进行修改操作
//姓名
int i = ret;
string name;
cout << "请输入姓名:" << endl;
cin >> name;
abs->personArry[i].m_Name = name;
//性别
int sex = 0;
cout << "请输入性别:" << endl;
cout << "1 --- 男:" << endl;
cout << "2 --- 女:" << endl;
cin >> sex;
//输入对了,退出循环
//输入错了,一直输入
while (true)
{
//cin >> sex;//错误位置,加在这里需要输入两次
if (sex == 1 || sex == 2)
{
abs->personArry[i].m_Sex = sex;
break; //输入对了,存后退出
}
cout << "输入错误,请重新输入性别" << endl;
cin >> sex;//正确位置,输入的不对就一直输
}
//年龄
int age = 0;
cout << "请输入年龄:" << endl;
cin >> age;
while (true)
{
//cin >> sex;//错误位置,加在这里需要输入两次
if (age > 0 && age < 150)
{
abs->personArry[i].m_Age = age;
break; //输入对了,存后退出
}
cout << "输入错误,请重新输入年龄" << endl;
cin >> age;//正确位置,输入的不对就一直输
}
//电话
string phone;
cout << "请输入电话:" << endl;
cin >> phone;
abs->personArry[i].m_Phone = phone;
//住址
string address;
cout << "请输入住址:" << endl;
cin >> address;
abs->personArry[i].m_Addr = address;
cout << "修改成功" << endl;
}
system("pause");
system("cls");
}
//main函数switch (select)中case 5变为:
case 5://5、修改联系人
modifyPerson(&abs);
break;
步骤:
1、封装清空联系人函数
2、测试清空指定联系人
思路:
将通讯录中所有联系人信息删除,只要将通讯录记录人数置为0,做逻辑清空即可。
//删除所有联系人
void cleanPerson(struct Addressbooks *abs)
{
cout << "是否确认清空?" << endl;
cout << "1 --- 是" << endl;
cout << "2 --- 否" << endl;
int a;
cin >> a;
if (a == 1)
{
abs->m_Size = 0;//将当前记录联系人数量置为0,做逻辑上的清空操作
cout << "通讯录已清空" << endl;
}
system("pause");
system("cls");
}
//main函数switch (select)中case 6变为:
case 6://6、清空联系人
cleanPerson(&abs);
break;
1、在要通讯录管理系统项目的解决方案 右键→添加→ 新建项目
2、安装Visual Studio Installer (如果已经存在 Visual Studio Installer,直接跳往第3步)
左侧安装和部署底下没有Visual Studio Installer 说明没有安装打包插件,如果按确定的话会弹出以下界面
安装打包插件:Microsoft Visual Studio 2015 Installer Projects
方法1:点击链接Microsoft Visual Studio 2015 Installer Projects,进行下载
方法2:工具 --> 扩展和更新 --> 联机,搜索Microsoft Visual Studio 2017 Installer Projects
下载并安装,安装过程简单,不再详述
安装好以后,重启vs2017
3、回到我们的新建项目,选择其他项目类型 --> Visual Studio Installer --> Setup Project --> 输入Setup --> 确定
4、在出现的界面中,右键Application Folder → Add → 项目输出,然后选择 主输出 点击确定
5、右键【主输出from 通讯录管理系统】 选择 Create Shortcut to… 生成快捷方式。
7、修改快捷方式的名称为通讯录管理系统Demo,并拖入 User‘s Desktop
8、右键 setup project,选择生成
10、在通讯录管理系统Demo\Debug中可以看到
一个exe,一个msi。
msi是重点,可直接安装在Windows中。
1、在通讯录管理系统Demo\Debug中可以看到,一个exe,一个msi。双击.msi文件进行安装
2、点击下一步
3、选择安装位置
4、确认安装
5、安装成功后桌面显示图标
6、双击图标可进行操作
1、通讯录管理系统-项目资源
链接:https://pan.baidu.com/s/19HNO7kWwXEjjG5zzxbXSpA
提取码:bm2e
2、通讯录管理系统Demo-可安装部署的应用程序
链接:https://pan.baidu.com/s/1S44-1Ujl_2D1MmFclKILaA
提取码:v1zm
3、通讯录管理系统-源码
#include
#include
using namespace std;
#define MAX 1000 //最大人数
//联系人结构体
//信息包括(姓名、性别、年龄、联系电话、家庭住址)
struct person
{
string m_Name;//姓名
int m_Sex;//性别:1男 2女
int m_Age;//年龄
string m_Phone;//联系电话
string m_Addr;//
};
//通讯录结构体
struct Addressbooks
{
struct person personArry[MAX]; //通讯录中保存的联系人数组
int m_Size;//通讯录中人员个数
};
//1、添加联系人
void addPerson(struct Addressbooks * abs)
{
//判断通讯录是否已满,满了就不再添加
if (abs->m_Size == MAX)
{
cout << "通讯录已满,无法添加!" << endl;
return ;
}
else
{
//添加具体联系人
//姓名
string name;
cout << "请输入姓名:"<< endl;
cin >> name;
abs->personArry[abs->m_Size].m_Name = name;
//性别
int sex = 0;
cout << "请输入性别:" << endl;
cout << "1 --- 男:" << endl;
cout << "2 --- 女:" << endl;
cin >> sex;
//输入对了,退出循环
//输入错了,一直输入
while (true)
{
//cin >> sex;//错误位置,加在这里需要输入两次
if (sex == 1 || sex == 2)
{
abs->personArry[abs->m_Size].m_Sex = sex;
break; //输入对了,存后退出
}
cout << "输入错误,请重新输入性别" << endl;
cin >> sex;//正确位置,输入的不对就一直输
}
//年龄
int age = 0;
cout << "请输入年龄:" << endl;
cin >> age;
while (true)
{
//cin >> sex;//错误位置,加在这里需要输入两次
if (age > 0 && age < 150)
{
abs->personArry[abs->m_Size].m_Age = age;
break; //输入对了,存后退出
}
cout << "输入错误,请重新输入年龄" << endl;
cin >> age;//正确位置,输入的不对就一直输
}
//电话
string phone;
cout << "请输入电话:" << endl;
cin >> phone;
abs->personArry[abs->m_Size].m_Phone = phone;
//住址
string address;
cout << "请输入住址:" << endl;
cin >> address;
abs->personArry[abs->m_Size].m_Addr = address;
//更新通讯录人数
abs->m_Size++;
cout << "添加成功" << endl;
}
system("pause");//请按任意键继续
system("cls");//清屏操作
}
//2、显示所有联系人
void showPerson(struct Addressbooks * abs)
{
//判断通讯录中是否为0
//如果为0,提示记录为空
//如果不为0,显示记录的联系人信息
if (abs->m_Size == 0)
{
cout << "当前的记录为空" << endl;
}
else
{
for (int i = 0;i < abs->m_Size;i++)
{
cout << "姓名:" << abs->personArry[i].m_Name << "\t"
<< "性别:" << (abs->personArry[i].m_Sex == 1 ? "男":"女" )<< "\t"
<< "年龄:" << abs->personArry[i].m_Age << "\t"
<< "联系电话:" << abs->personArry[i].m_Phone << "\t"
<< "家庭地址:" << abs->personArry[i].m_Addr << endl;
}
}
system("pause");//请按任意键继续
system("cls");//清屏操作
}
//检测联系人是否存在
//如果存在,返回联系人所在数组具体位置;如果不存在,返回-1
int isExist(struct Addressbooks * abs,string name)
{
for(int i=0;im_Size;i++)
{
//找到用户输入的姓名了
if (abs->personArry[i].m_Name==name)
{
return i;//找到了,返回这个人在数组中的下标编号
}
}
return -1;//如果遍历后,没找到用户输入的姓名,返回-1
system("pause");//请按任意键继续
system("cls");//清屏操作
}
//3、删除指定联系人
void delectPerson(struct Addressbooks * abs)
{
cout << "请输入删除联系人姓名:" << endl;
string name;
cin >> name;
int ret = isExist(abs, name);
if (ret == -1)
{
cout << "查无此人" << endl;
}
else
{ //查到此人,进行删除操作
int i = ret;
//要删除i,将i后所有数据进行前移,并让通讯录中人员个数-1
for (;i < abs->m_Size;i++)
{
//数据前移
abs->personArry[i].m_Name = abs->personArry[i + 1].m_Name;
abs->personArry[i].m_Sex = abs->personArry[i + 1].m_Sex;
abs->personArry[i].m_Age = abs->personArry[i + 1].m_Age;
abs->personArry[i].m_Phone = abs->personArry[i + 1].m_Phone;
abs->personArry[i].m_Addr = abs->personArry[i + 1].m_Addr;
}
abs->m_Size--;//更新通讯录中人员数
cout << "删除成功" << endl;
}
system("pause");
system("cls");
}
//4、查找联系人
void findPerson(struct Addressbooks * abs)
{
cout << "请输入您想要查找的联系人:" << endl;
string name;
cin >> name;
int ret = isExist(abs, name);
if (ret == -1)
{
cout << "查无此人" << endl;
}
else
{ //查到此人,进行显示操作
int i = ret;
cout << "姓名:"<< abs->personArry[i].m_Name <<"\t";
cout << "性别:" << abs->personArry[i].m_Sex << "\t";
cout << "年龄:" << abs->personArry[i].m_Age << "\t";
cout << "联系方式:" << abs->personArry[i].m_Phone << "\t";
cout << "地址:" << abs->personArry[i].m_Addr << endl;
}
//按任意键清屏
system("pause");
system("cls");
}
//5、修改联系人
void modifyPerson(struct Addressbooks *abs)
{
cout << "请输入您想要修改的联系人:" << endl;
string name;
cin >> name;
int ret = isExist(abs, name);
if (ret == -1)
{
cout << "查无此人" << endl;
}
else
{ //查到此人,进行修改操作
//姓名
int i = ret;
string name;
cout << "请输入姓名:" << endl;
cin >> name;
abs->personArry[i].m_Name = name;
//性别
int sex = 0;
cout << "请输入性别:" << endl;
cout << "1 --- 男:" << endl;
cout << "2 --- 女:" << endl;
cin >> sex;
//输入对了,退出循环
//输入错了,一直输入
while (true)
{
//cin >> sex;//错误位置,加在这里需要输入两次
if (sex == 1 || sex == 2)
{
abs->personArry[i].m_Sex = sex;
break; //输入对了,存后退出
}
cout << "输入错误,请重新输入性别" << endl;
cin >> sex;//正确位置,输入的不对就一直输
}
//年龄
int age = 0;
cout << "请输入年龄:" << endl;
cin >> age;
while (true)
{
//cin >> sex;//错误位置,加在这里需要输入两次
if (age > 0 && age < 150)
{
abs->personArry[i].m_Age = age;
break; //输入对了,存后退出
}
cout << "输入错误,请重新输入年龄" << endl;
cin >> age;//正确位置,输入的不对就一直输
}
//电话
string phone;
cout << "请输入电话:" << endl;
cin >> phone;
abs->personArry[i].m_Phone = phone;
//住址
string address;
cout << "请输入住址:" << endl;
cin >> address;
abs->personArry[i].m_Addr = address;
cout << "修改成功" << endl;
}
system("pause");
system("cls");
}
//6、删除所有联系人
void cleanPerson(struct Addressbooks *abs)
{
cout << "是否确认清空?" << endl;
cout << "1 --- 是" << endl;
cout << "2 --- 否" << endl;
int a;
cin >> a;
if (a == 1)
{
abs->m_Size = 0;//将当前记录联系人数量置为0,做逻辑上的清空操作
cout << "通讯录已清空" << endl;
}
system("pause");
system("cls");
}
//菜单界面
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()
{
//创建通讯录结构体变量
struct Addressbooks abs;
//初始化通讯录中当前人员个数
abs.m_Size = 0;
int select = 0;//创建用户选择输入的变量
while (true)
{
//菜单调用
showMenu();
cin >> select;
switch (select)
{
case 1://1、添加联系人
//addPerson(abs); //值传递,不改变实参,无法增加
addPerson(&abs);//利用地址传递,可以修改实参
break;
case 2://2、显示联系人
showPerson(&abs);
break;
case 3://3、删除联系人
//{ //不加大括号,switch就会底下有红色波浪线
// cout << "请输入删除联系人姓名:" << endl;
// string name;
// cin >> name;
// if (isExist(&abs, name) == -1)
// {
// cout << "查无此人" << endl;
// }
// else
// {
// cout << "找到了" << endl;
// }
//}
delectPerson( &abs);
break;
case 4://4、查找联系人
findPerson(&abs);
break;
case 5://5、修改联系人
modifyPerson(&abs);
break;
case 6://6、清空联系人
cleanPerson(&abs);
break;
case 0://0、退出通讯录
cout << "欢迎下次使用!" << endl;
system("pause");
return 0;
break;
default:
break;
}
}
system("pause");
return 0;
}