本文章是本人黑馬程序員 C++| 匠心之作 從0到1入門學編程的學習筆記
前置文章:
1、系統(tǒng)需求
通訊錄是一個可以記錄親人、好友信息的工具。
本教程主要利用C++來實現(xiàn)一個通訊錄管理系統(tǒng)
系統(tǒng)中需要實現(xiàn)的功能如下:
- 添加聯(lián)系人:向通訊錄中添加新人,信息包括(姓名、性別、年齡、聯(lián)系電話、家庭住址),最多記錄1000人
- 顯示聯(lián)系人:顯示通訊錄中所有聯(lián)系人信息
- 刪除聯(lián)系人:按照姓名進行刪除指定聯(lián)系人
- 查找聯(lián)系人:按照姓名查看指定聯(lián)系人信息
- 修改聯(lián)系人:按照姓名重新修改指定聯(lián)系人
- 清空聯(lián)系人:清空通訊錄中所有信息
- 退出通訊錄:退出當前使用的通訊錄
2、創(chuàng)建項目
創(chuàng)建項目步驟如下
- 創(chuàng)建新項目
- 添加文件
3、菜單功能
功能描述:用戶選擇功能的界面
步驟
- 封裝函數(shù)顯示該界面,如
void showMenu()
- 在
main
函數(shù)中調(diào)用封裝好的函數(shù)
代碼
#include <iostream>
using namespace std;
void clear()
{
system("cls||clear");
return;
}
void pause()
{
system("echo 請按任意鍵繼續(xù) . . . && ( read x 2> nul; rm nul || pause > nul )");
return;
}
//菜單界面
void showMenu()
{
clear();
cout << "*************************" << endl;
cout << "***** 1、添加聯(lián)系人 *****" << endl;
cout << "***** 2、顯示聯(lián)系人 *****" << endl;
cout << "***** 3、刪除聯(lián)系人 *****" << endl;
cout << "***** 4、查找聯(lián)系人 *****" << endl;
cout << "***** 5、修改聯(lián)系人 *****" << endl;
cout << "***** 6、清空聯(lián)系人 *****" << endl;
cout << "***** 0、退出通訊錄 *****" << endl;
cout << "*************************" << endl;
}
int main()
{
//菜單調(diào)用
showMenu();
pause();
return 0;
}
4、退出功能
功能描述:退出通訊錄系統(tǒng)
思路:根據(jù)用戶不同的選擇,進入不同的功能,可以選擇 switch分支結構,將整個架構進行搭建
當用戶選擇0時候,執(zhí)行退出,選擇其他先不做操作,也不會退出程序
int main()
{
while(true)
{
//菜單調(diào)用
showMenu();
int select = 0;
cin >> select;
switch (select)
{
case 0: //0、退出通訊錄
cout << "歡迎下次使用" << endl;
pause();
clear();
return 0;
break;
case 1: //1、添加聯(lián)系人
break;
case 2: //2、顯示聯(lián)系人
break;
case 3: //3、刪除聯(lián)系人
break;
case 4: //4、查找聯(lián)系人
break;
case 5: //5、修改聯(lián)系人
break;
case 6: //6、清空聯(lián)系人
break;
default:
break;
}
}
pause();
return 0;
}
5、添加聯(lián)系人
功能描述:
實現(xiàn)添加聯(lián)系人功能,聯(lián)系人上限為1000人,聯(lián)系人信息包括(姓名、性別、年齡、聯(lián)系電話、家庭住址)
添加聯(lián)系人實現(xiàn)步驟:
- 設計聯(lián)系人結構體
- 設計通訊錄結構體
-
main
函數(shù)中創(chuàng)建通訊錄 - 封裝添加聯(lián)系人函數(shù)
- 測試添加聯(lián)系人功能
5.1 設計聯(lián)系人結構體
聯(lián)系人信息包括:姓名、性別、年齡、聯(lián)系電話、家庭住址
設計如下:
#include <string> //string頭文件
//聯(lián)系人結構體
struct person
{
string m_Name; //姓名
string m_Sex; //性別
int m_Age; //年齡
string m_Phone; //電話
string m_Address; //住址
};
5.2 設計通訊率結構體
設計時候可以在通訊錄結構體中,維護一個容量為1000的存放聯(lián)系人的數(shù)組,并記錄當前通訊錄中聯(lián)系人數(shù)量
設計如下
#define MAX 1000
//通訊率結構體
struct addressBook
{
struct person personArray[MAX]; //通訊錄中保存的聯(lián)系人數(shù)組
int m_Size; //通訊錄中人員個數(shù)
};
5.3 main
函數(shù)中創(chuàng)建通訊錄
int main()
{
//創(chuàng)建通訊錄結構體變量
struct addressBook abs;
//初始化通訊錄中當前人員個數(shù)
abs.m_Size = 0;
5.4 封裝添加聯(lián)系人函數(shù)
思路:添加聯(lián)系人前先判斷通訊錄是否已滿,如果滿了就不再添加,未滿情況將新聯(lián)系人信息逐個加入到通訊錄
添加聯(lián)系人代碼:
//添加聯(lián)系人
void addPerson(struct addressBook * abs)
{
//判斷通訊錄是否已滿。如果滿了就不再添加
if(abs->m_Size >= MAX)
{
cout << "通訊錄已滿,無法添加!";
return;
}
else
{
//添加具體聯(lián)系人
//姓名
cout << "姓名:";
cin >> abs->personArray[abs->m_Size].m_Name;
//性別
cout << "性別:";
cin >> abs->personArray[abs->m_Size].m_Sex;
while(abs->personArray[abs->m_Size].m_Sex != "男" && abs->personArray[abs->m_Size].m_Sex != "女"
&& abs->personArray[abs->m_Size].m_Sex != "其它")
{
cout << "錯誤!請輸入“男”、“女”或“其它”。" << endl;
cout << "性別:";
cin >> abs->personArray[abs->m_Size].m_Sex;
}
//年齡
cout << "年齡:";
cin >> abs->personArray[abs->m_Size].m_Age;
while(abs->personArray[abs->m_Size].m_Age < 0 || abs->personArray[abs->m_Size].m_Age > 150)
{
cout << "年齡錯誤!請輸入正確的年齡。" << endl;
cout << "年齡:";
cin >> abs->personArray[abs->m_Size].m_Age;
}
//電話
cout << "電話:";
cin >> abs->personArray[abs->m_Size].m_Phone;
//地址
cout << "地址:";
cin >> abs->personArray[abs->m_Size].m_Address;
cout << "\n聯(lián)系人 " << abs->personArray[abs->m_Size].m_Name << " 添加成功!\n" << endl;
//更新通訊錄人數(shù)
abs->m_Size++;
//清屏
pause();
}
return;
}
int main()
{
...
switch (select)
{
...
case 1: //1、添加聯(lián)系人
addPerson(&abs); //利用地址傳遞可以修飾實參
...
...
}
6、顯示聯(lián)系人
功能描述:顯示通訊錄中已有的聯(lián)系人信息
顯示聯(lián)系人實現(xiàn)步驟:
- 封裝顯示聯(lián)系人函數(shù)
- 測試顯示聯(lián)系人功能
6.1 封裝顯示聯(lián)系人函數(shù)
思路:判斷如果當前通訊錄中沒有人員,就提示記錄為空,人數(shù)大于0,顯示通訊錄中信息
顯示聯(lián)系人代碼:
//顯示聯(lián)系人
void showPerson(struct addressBook * abs)
{
//判斷通訊錄中人數(shù)是否為0
if(abs->m_Size == 0)
{
cout << "當前記錄為空,沒有聯(lián)系人!" << endl;
}
else
{
for(int i = 0; i < abs->m_Size; i++)
{
cout << "姓名:" << abs->personArray[i].m_Name;
cout << "\t性別:" << abs->personArray[i].m_Sex;
cout << "\t年齡:" << abs->personArray[i].m_Age;
cout << "\t電話:" << abs->personArray[i].m_Phone;
cout << "\t地址:" << abs->personArray[i].m_Address << endl;
}
}
pause();
}
int main()
{
...
switch (select)
{
...
case 2: //2、顯示聯(lián)系人
showPerson(&abs);
...
...
}
7、刪除聯(lián)系人
功能描述:按照姓名進行刪除指定聯(lián)系人
刪除聯(lián)系人實現(xiàn)步驟:
- 封裝檢測聯(lián)系人是否存在
- 封裝刪除聯(lián)系人函數(shù)
- 測試刪除聯(lián)系人功能
7.1 封裝檢測聯(lián)系人是否存在
設計思路:
刪除聯(lián)系人前,我們需要先判斷用戶輸入的聯(lián)系人是否存在,如果存在刪除,不存在提示用戶沒有要刪除的聯(lián)系人
因此我們可以把檢測聯(lián)系人是否存在封裝成一個函數(shù)中,如果存在,返回聯(lián)系人在通訊錄中的位置,不存在返回-1
//檢測聯(lián)系人是否存在
int isExist(struct addressBook * abs, string name)
{
for(int i = 0; i < abs->m_Size; i++)
{
if(abs->personArray[i].m_Name == name)
{
return i;
}
}
return -1;
}
7.2 封裝刪除聯(lián)系人
根據(jù)用戶輸入的聯(lián)系人判斷通訊錄中是否有此人
查找到進行刪除,并提示刪除成功
查找不到提示查無此人
//刪除指定聯(lián)系人信息
void deletePerson(struct addressBook * abs)
{
string name;
cout << "請輸入您要刪除的聯(lián)系人:";
cin >> name;
int ret = isExist(abs, name);
if(ret != -1)
{
for(int i = ret; i < abs->m_Size; i++)
{
//前移數(shù)據(jù)
abs->personArray[i] = abs->personArray[i + i];
cout << "abs->personArray[" << i << "] = " << abs->personArray[i]
}
abs->m_Size--;
cout << "刪除聯(lián)系人 " << name << " 成功!" << endl;
}
else
{
cout << "聯(lián)系人 " << name << " 查無此人!" << endl;
}
pause();
}
int main()
{
...
switch (select)
{
...
case 3: //3、刪除聯(lián)系人
deletePerson(&abs);
...
...
}
8、查找聯(lián)系人
功能描述:按照姓名查看指定聯(lián)系人信
查找聯(lián)系人實現(xiàn)步驟:
- 封裝查找聯(lián)系人函數(shù)
- 測試查找指定聯(lián)系人
8.1 封裝查找聯(lián)系人函數(shù)
實現(xiàn)思路:判斷用戶指定的聯(lián)系人是否存在,如果存在顯示信息,不存在則提示查無此人。
查找聯(lián)系人代碼:
//查找指定聯(lián)系人信息
void findPerson(struct addressBook * abs)
{
string name;
cout << "請輸入您要查找的聯(lián)系人:";
cin >> name;
int ret = isExist(abs, name);
if(ret != -1)
{
cout << "姓名:" << abs->personArray[ret].m_Name;
cout << "\t性別:" << abs->personArray[ret].m_Sex;
cout << "\t年齡:" << abs->personArray[ret].m_Age;
cout << "\t電話:" << abs->personArray[ret].m_Phone;
cout << "\t地址:" << abs->personArray[ret].m_Address << endl;
}
else
{
cout << "聯(lián)系人 " << name << " 查無此人!" << endl;
}
pause();
}
8.2 測試查找指定聯(lián)系人
在switch case
語句中,case 4
里添加
int main()
{
...
switch (select)
{
...
case 4: //4、查找聯(lián)系人
findPerson(&abs);
...
...
}
9、修改聯(lián)系人
功能描述:按照姓名重新修改指定聯(lián)系人
修改聯(lián)系人實現(xiàn)步驟:
- 封裝修改聯(lián)系人函數(shù)
- 測試修改聯(lián)系人功能
9.1 封裝修改聯(lián)系人函數(shù)
實現(xiàn)思路:查找用戶輸入的聯(lián)系人,如果查找成功進行修改操作,查找失敗提示查無此人
修改聯(lián)系人代碼:
//修改指定聯(lián)系人信息
void modifyPerson(struct addressBook * abs)
{
string name;
cout << "請輸入您要修改的聯(lián)系人:";
cin >> name;
int ret = isExist(abs, name);
if(ret != -1)
{
//姓名
cout << "姓名:";
cin >> abs->personArray[ret].m_Name;
//性別
cout << "性別:";
cin >> abs->personArray[ret].m_Sex;
while(abs->personArray[ret].m_Sex != "男" && abs->personArray[ret].m_Sex != "女"
&& abs->personArray[ret].m_Sex != "其它")
{
cout << "錯誤!請輸入“男”、“女”或“其它”。" << endl;
cout << "性別:";
cin >> abs->personArray[ret].m_Sex;
}
//年齡
cout << "年齡:";
cin >> abs->personArray[ret].m_Age;
while(abs->personArray[ret].m_Age < 0 || abs->personArray[ret].m_Age > 150)
{
cout << "年齡錯誤!請輸入正確的年齡。" << endl;
cout << "年齡:";
cin >> abs->personArray[ret].m_Age;
}
//電話
cout << "電話:";
cin >> abs->personArray[ret].m_Phone;
//地址
cout << "地址:";
cin >> abs->personArray[ret].m_Address;
cout << "\n聯(lián)系人 " << abs->personArray[ret].m_Name << " 修改成功!\n" << endl;
}
else
{
cout << "聯(lián)系人 " << name << " 查無此人!" << endl;
}
pause();
}
9.2 測試修改聯(lián)系人功能
在switch case
語句中,case 5
里添加
int main()
{
...
switch (select)
{
...
case 5: //5、修改聯(lián)系人
modifyPerson(&abs);
...
...
}
10、清空聯(lián)系人
功能描述:清空通訊錄中所有信息
清空聯(lián)系人實現(xiàn)步驟:
- 封裝清空聯(lián)系人函數(shù)
- 測試清空聯(lián)系人
10.1 封裝清空聯(lián)系人函數(shù)
實現(xiàn)思路:將通訊錄所有聯(lián)系人信息清除掉只要將通訊錄記錄的聯(lián)系人數(shù)量置為0,做邏輯清空即可。
清空聯(lián)系人代碼:
//清空聯(lián)系人
void clearPerson(struct addressBook * abs)
{
abs->m_Size = 0;
pause();
}
int main()
{
...
switch (select)
{
...
case 6: //6、清空聯(lián)系人
clearPerson(&abs);
...
...
}