本文章是本人黑馬程序員 C++| 匠心之作 從0到1入門學(xué)編程的學(xué)習(xí)筆記
前置文章:
1、系統(tǒng)需求
通訊錄是一個(gè)可以記錄親人、好友信息的工具。
本教程主要利用C++來實(shí)現(xiàn)一個(gè)通訊錄管理系統(tǒng)
系統(tǒng)中需要實(shí)現(xiàn)的功能如下:
- 添加聯(lián)系人:向通訊錄中添加新人,信息包括(姓名、性別、年齡、聯(lián)系電話、家庭住址),最多記錄1000人
- 顯示聯(lián)系人:顯示通訊錄中所有聯(lián)系人信息
- 刪除聯(lián)系人:按照姓名進(jìn)行刪除指定聯(lián)系人
- 查找聯(lián)系人:按照姓名查看指定聯(lián)系人信息
- 修改聯(lián)系人:按照姓名重新修改指定聯(lián)系人
- 清空聯(lián)系人:清空通訊錄中所有信息
- 退出通訊錄:退出當(dāng)前使用的通訊錄
2、創(chuàng)建項(xiàng)目
創(chuàng)建項(xiàng)目步驟如下
- 創(chuàng)建新項(xià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ù)用戶不同的選擇,進(jìn)入不同的功能,可以選擇 switch分支結(jié)構(gòu),將整個(gè)架構(gòu)進(jìn)行搭建
當(dāng)用戶選擇0時(shí)候,執(zhí)行退出,選擇其他先不做操作,也不會(huì)退出程序
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)系人
功能描述:
實(shí)現(xiàn)添加聯(lián)系人功能,聯(lián)系人上限為1000人,聯(lián)系人信息包括(姓名、性別、年齡、聯(lián)系電話、家庭住址)
添加聯(lián)系人實(shí)現(xiàn)步驟:
- 設(shè)計(jì)聯(lián)系人結(jié)構(gòu)體
- 設(shè)計(jì)通訊錄結(jié)構(gòu)體
-
main函數(shù)中創(chuàng)建通訊錄 - 封裝添加聯(lián)系人函數(shù)
- 測試添加聯(lián)系人功能
5.1 設(shè)計(jì)聯(lián)系人結(jié)構(gòu)體
聯(lián)系人信息包括:姓名、性別、年齡、聯(lián)系電話、家庭住址
設(shè)計(jì)如下:
#include <string> //string頭文件
//聯(lián)系人結(jié)構(gòu)體
struct person
{
string m_Name; //姓名
string m_Sex; //性別
int m_Age; //年齡
string m_Phone; //電話
string m_Address; //住址
};
5.2 設(shè)計(jì)通訊率結(jié)構(gòu)體
設(shè)計(jì)時(shí)候可以在通訊錄結(jié)構(gòu)體中,維護(hù)一個(gè)容量為1000的存放聯(lián)系人的數(shù)組,并記錄當(dāng)前通訊錄中聯(lián)系人數(shù)量
設(shè)計(jì)如下
#define MAX 1000
//通訊率結(jié)構(gòu)體
struct addressBook
{
struct person personArray[MAX]; //通訊錄中保存的聯(lián)系人數(shù)組
int m_Size; //通訊錄中人員個(gè)數(shù)
};
5.3 main函數(shù)中創(chuàng)建通訊錄
int main()
{
//創(chuàng)建通訊錄結(jié)構(gòu)體變量
struct addressBook abs;
//初始化通訊錄中當(dāng)前人員個(gè)數(shù)
abs.m_Size = 0;
5.4 封裝添加聯(lián)系人函數(shù)
思路:添加聯(lián)系人前先判斷通訊錄是否已滿,如果滿了就不再添加,未滿情況將新聯(lián)系人信息逐個(gè)加入到通訊錄
添加聯(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 << "錯(cuò)誤!請輸入“男”、“女”或“其它”。" << 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 << "年齡錯(cuò)誤!請輸入正確的年齡。" << 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); //利用地址傳遞可以修飾實(shí)參
...
...
}
6、顯示聯(lián)系人
功能描述:顯示通訊錄中已有的聯(lián)系人信息
顯示聯(lián)系人實(shí)現(xiàn)步驟:
- 封裝顯示聯(lián)系人函數(shù)
- 測試顯示聯(lián)系人功能
6.1 封裝顯示聯(lián)系人函數(shù)
思路:判斷如果當(dāng)前通訊錄中沒有人員,就提示記錄為空,人數(shù)大于0,顯示通訊錄中信息
顯示聯(lián)系人代碼:
//顯示聯(lián)系人
void showPerson(struct addressBook * abs)
{
//判斷通訊錄中人數(shù)是否為0
if(abs->m_Size == 0)
{
cout << "當(dāng)前記錄為空,沒有聯(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)系人
功能描述:按照姓名進(jìn)行刪除指定聯(lián)系人
刪除聯(lián)系人實(shí)現(xiàn)步驟:
- 封裝檢測聯(lián)系人是否存在
- 封裝刪除聯(lián)系人函數(shù)
- 測試刪除聯(lián)系人功能
7.1 封裝檢測聯(lián)系人是否存在
設(shè)計(jì)思路:
刪除聯(lián)系人前,我們需要先判斷用戶輸入的聯(lián)系人是否存在,如果存在刪除,不存在提示用戶沒有要?jiǎng)h除的聯(lián)系人
因此我們可以把檢測聯(lián)系人是否存在封裝成一個(gè)函數(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)系人判斷通訊錄中是否有此人
查找到進(jìn)行刪除,并提示刪除成功
查找不到提示查無此人
//刪除指定聯(lián)系人信息
void deletePerson(struct addressBook * abs)
{
string name;
cout << "請輸入您要?jiǎng)h除的聯(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)系人實(shí)現(xiàn)步驟:
- 封裝查找聯(lián)系人函數(shù)
- 測試查找指定聯(lián)系人
8.1 封裝查找聯(lián)系人函數(shù)
實(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)系人實(shí)現(xiàn)步驟:
- 封裝修改聯(lián)系人函數(shù)
- 測試修改聯(lián)系人功能
9.1 封裝修改聯(lián)系人函數(shù)
實(shí)現(xiàn)思路:查找用戶輸入的聯(lián)系人,如果查找成功進(jì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 << "錯(cuò)誤!請輸入“男”、“女”或“其它”。" << 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 << "年齡錯(cuò)誤!請輸入正確的年齡。" << 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)系人實(shí)現(xiàn)步驟:
- 封裝清空聯(lián)系人函數(shù)
- 測試清空聯(lián)系人
10.1 封裝清空聯(lián)系人函數(shù)
實(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);
...
...
}