Statement:
視訊連結:https://www.bilibili.com/video/BV1et411b73Z?p=72
通訊錄管理系統
1、系統需求
通訊錄是一個可以記錄親人、好友資訊的工具。
本教程主要利用C++來實作一個通訊錄管理系統
系統中需要實作的功能如下:
- 添加聯系人:向通訊錄中添加新人,資訊包括(姓名、性别、年齡、聯系電話、家庭住址)最多記錄1000人
- 顯示聯系人:顯示通訊錄中所有聯系人資訊
- 删除聯系人:按照姓名進行删除指定聯系人
- 查找聯系人:按照姓名檢視指定聯系人資訊
- 修改聯系人:按照姓名重新修改指定聯系人
- 清空聯系人:清空通訊錄中所有資訊
- 退出通訊錄:退出目前使用的通訊錄
2、菜單功能
功能描述: 使用者選擇功能的界面
菜單界面效果如下圖:
步驟:
- 封裝函數顯示該界面 如
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;
}
3、退出功能
功能描述:退出通訊錄系統
思路:根據使用者不同的選擇,進入不同的功能,可以選擇switch分支結構,将整個架構進行搭建
當使用者選擇0時候,執行退出,選擇其他先不做操作,也不會退出程式
int main()
{
int select = 0;
while (true)
{
showMenu();
cin >> select;
switch (select)
{
case 1: //添加聯系人
break;
case 2: //顯示聯系人
break;
case 3: //删除聯系人
break;
case 4: //查找聯系人
break;
case 5: //修改聯系人
break;
case 6: //清空聯系人
break;
case 0: //退出通訊錄
cout << "歡迎下次使用" << endl;
system("pause");
return 0;
break;
default:
break;
}
}
}
4、添加聯系人
功能描述:
實作添加聯系人功能,聯系人上限為1000人,聯系人資訊包括(姓名、性别、年齡、聯系電話、家庭住址)
添加聯系人實作步驟:
- 設計聯系人結構體
- 設計通訊錄結構體
- main函數中建立通訊錄
- 封裝添加聯系人函數
- 測試添加聯系人功能
4.1 設計聯系人結構體
聯系人資訊包括:姓名、性别、年齡、聯系電話、家庭住址
設計如下:
//聯系人結構體
struct Person
{
string m_Name; //姓名
int m_Sex; //性别:1男 2女
int m_Age; //年齡
string m_Phone; //電話
string m_Addr; //住址
};
4.2 設計通訊錄結構體
設計時候可以在通訊錄結構體中,維護一個容量為1000的存放聯系人的數組,并記錄目前通訊錄中聯系人數量
#define MAX 1000 //最大人數
//通訊錄結構體
struct Addressbooks
{
struct Person personArray[MAX]; //通訊錄中儲存的聯系人數組
int m_Size; //通訊錄中人員個數
};
4.3 main函數中建立通訊錄
添加聯系人函數封裝好後,在main函數中建立一個通訊錄變量,這個就是我們需要一直維護的通訊錄
mian函數起始位置添加:
//建立通訊錄
Addressbooks abs;
//初始化通訊錄中人數
abs.m_Size = 0;
4.4 封裝添加聯系人函數
思路:添加聯系人前先判斷通訊錄是否已滿,如果滿了就不再添加,未滿情況将新聯系人資訊逐個加入到通訊錄
//1、添加聯系人資訊
void addPerson(Addressbooks *abs)
{
//判斷電話本是否滿了
if (abs->m_Size == MAX)
{
cout << "通訊錄已滿,無法添加" << endl;
return;
}
else
{
//姓名
string name;
cout << "請輸入姓名:" << endl;
cin >> name;
abs->personArray[abs->m_Size].m_Name = name;
cout << "請輸入性别:" << endl;
cout << "1 -- 男" << endl;
cout << "2 -- 女" << endl;
//性别
int sex = 0;
while (true)
{
cin >> sex;
if (sex == 1 || sex == 2)
{
abs->personArray[abs->m_Size].m_Sex = sex;
break;
}
cout << "輸入有誤,請重新輸入";
}
//年齡
cout << "請輸入年齡:" << endl;
int age = 0;
cin >> age;
abs->personArray[abs->m_Size].m_Age = age;
//聯系電話
cout << "請輸入聯系電話:" << endl;
string phone = "";
cin >> phone;
abs->personArray[abs->m_Size].m_Phone = phone;
//家庭住址
cout << "請輸入家庭住址:" << endl;
string address;
cin >> address;
abs->personArray[abs->m_Size].m_Addr = address;
//更新通訊錄人數
abs->m_Size++;
cout << "添加成功" << endl;
//任意鍵按下後清屏
system("pause");
system("cls");//清屏操作
}
}
4.5 測試添加聯系人功能
選擇界面中,如果玩家選擇了1,代表添加聯系人,我們可以測試下該功能
在switch case 語句中,case1裡添加:
case 1: //添加聯系人
addPerson(&abs);
break;
5、顯示聯系人
功能描述:顯示通訊錄中已有的聯系人資訊
顯示聯系人實作步驟:
- 封裝顯示聯系人函數
- 測試顯示聯系人功能
5.1 封裝顯示聯系人函數
思路:判斷如果目前通訊錄中沒有人員,就提示記錄為空,人數大于0,顯示通訊錄中資訊
//2、顯示所有聯系人資訊
void showPerson(Addressbooks * abs)
{
if (abs->m_Size == 0)
{
cout << "目前記錄為空" << endl;
}
else
{
for (int i = 0; i < abs->m_Size; i++)
{
cout << "姓名:" << abs->personArray[i].m_Name << "\t";
cout << "性别:" << (abs->personArray[i].m_Sex == 1 ? "男" : "女") << "\t";
cout << "年齡:" << abs->personArray[i].m_Age << "\t";
cout << "電話:" << abs->personArray[i].m_Phone << "\t";
cout << "住址:" << abs->personArray[i].m_Addr << endl;
}
}
system("pause");
system("cls");
}
5.2 測試顯示聯系人功能
在switch case語句中,case 2 裡添加
case 2: //顯示聯系人
showPerson(&abs);
break;
6、删除聯系人
功能描述:按照姓名進行删除指定聯系人
删除聯系人實作步驟:
- 封裝檢測聯系人是否存在
- 封裝删除聯系人函數
- 測試删除聯系人功能
6.1 封裝檢測聯系人是否存在
設計思路:
删除聯系人前,我們需要先判斷使用者輸入的聯系人是否存在,如果存在删除,不存在提示使用者沒有要删除的聯系人
是以我們可以把檢測聯系人是否存在封裝成一個函數中,如果存在,傳回聯系人在通訊錄中的位置,不存在傳回-1
int isExist(Addressbooks * abs, string name)
{
for (int i = 0; i < abs->m_Size; i++)
{
if (abs->personArray[i].m_Name == name)
{
return i;//找到了,傳回這個人在數組中的下标編号
}
}
return -1;//沒找到,傳回-1
}
6.2 封裝删除聯系人函數
根據使用者輸入的聯系人判斷該通訊錄中是否有此人
查找到進行删除,并提示删除成功
查不到提示查無此人。
//3、删除指定聯系人資訊
void deletePerson(Addressbooks * abs)
{
cout << "請輸入您要删除的聯系人" << endl;
string name;
cin >> name;
//ret = -1 未查到
//ret != -1 查到了
int ret = isExist(abs, name);
if (ret != -1)
{
//查到此人,要進行删除操作
for (int i = ret; i < abs->m_Size; i++)
{
//資料前移
abs->personArray[i] = abs->personArray[i + 1];
}
abs->m_Size--;//更新通訊錄中的人員數
cout << "删除成功" << endl;
}
else
{
cout << "查無此人" << endl;
}
system("pause");
system("cls");
}
6.3 測試删除聯系人功能
在switch case 語句中,case3裡添加:
case 3: //删除聯系人
deletePerson(&abs);
break;
7、查找聯系人
功能描述:按照姓名檢視指定聯系人資訊
查找聯系人實作步驟
- 封裝查找聯系人函數
- 測試查找指定聯系人
7.1 封裝查找聯系人函數
實作思路:判斷使用者指定的聯系人是否存在,如果存在顯示資訊,不存在則提示查無此人。
//4、查找指定聯系人資訊
void findPerson(Addressbooks * abs)
{
cout << "請輸入您要查找的聯系人" << endl;
string name;
cin >> name;
//判斷指定的聯系人是否存在通訊錄中
int ret = isExist(abs, name);
if (ret != -1)//找到聯系人
{
cout << "姓名:" << abs->personArray[ret].m_Name << "\t";
cout << "性别:" << abs->personArray[ret].m_Sex << "\t";
cout << "年齡:" << abs->personArray[ret].m_Age << "\t";
cout << "電話:" << abs->personArray[ret].m_Phone << "\t";
cout << "住址:" << abs->personArray[ret].m_Addr << endl;
}
else//未找到
{
cout << "查無此人" << endl;
}
system("pause");
system("cls");
}
7.2 測試查找指定聯系人
在switch case 語句中,case4裡添加:
case 4: //查找聯系人
findPerson(&abs);
break;
8、修改聯系人
功能描述:按照姓名重新修改指定聯系人
修改聯系人實作步驟
- 封裝修改聯系人函數
- 測試修改聯系人功能
8.1 封裝修改聯系人函數
實作思路:查找使用者輸入的聯系人,如果查找成功進行修改操作,查找失敗提示查無此人
//5、修改指定聯系人資訊
void modifyPerson(Addressbooks * abs)
{
cout << "請輸入您要修改的聯系人" << endl;
string name;
cin >> name;
int ret = isExist(abs, name);
if (ret != -1)
{
//姓名
string name;
cout << "請輸入姓名:" << endl;
cin >> name;
abs->personArray[ret].m_Name = name;
cout << "請輸入性别:" << endl;
cout << "1 -- 男" << endl;
cout << "2 -- 女" << endl;
//性别
int sex = 0;
while (true)
{
cin >> sex;
if (sex == 1 || sex == 2)
{
abs->personArray[ret].m_Sex = sex;
break;
}
cout << "輸入有誤,請重新輸入";
}
//年齡
cout << "請輸入年齡:" << endl;
int age = 0;
cin >> age;
abs->personArray[ret].m_Age = age;
//聯系電話
cout << "請輸入聯系電話:" << endl;
string phone = "";
cin >> phone;
abs->personArray[ret].m_Phone = phone;
//家庭住址
cout << "請輸入家庭住址:" << endl;
string address;
cin >> address;
abs->personArray[ret].m_Addr = address;
cout << "修改成功" << endl;
}
else
{
cout << "查無此人" << endl;
}
system("pause");
system("cls");
}
8.2 測試修改聯系人功能
在switch case 語句中,case 5裡添加:
case 5: //修改聯系人
modifyPerson(&abs);
break;
9、清空聯系人
功能描述:清空通訊錄中所有資訊
清空聯系人實作步驟
- 封裝清空聯系人函數
- 測試清空聯系人
9.1 封裝清空聯系人函數
實作思路: 将通訊錄所有聯系人資訊清除掉,隻要将通訊錄記錄的聯系人數量置為0,做邏輯清空即可。
//6、清空所有聯系人
void cleanPerson(Addressbooks * abs)
{
abs->m_Size = 0;
cout << "通訊錄已清空" << endl;
system("pause");
system("cls");
}
9.2 測試清空聯系人
在switch case 語句中,case 6 裡添加:
case 6: //清空聯系人
cleanPerson(&abs);
break;
10、完整代碼
在Visual Studio Code上能完美運作
#include<iostream>
using namespace std;
#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 Person
{
string m_Name; //姓名
int m_Sex; //性别:1男 2女
int m_Age; //年齡
string m_Phone; //電話
string m_Addr; //住址
};
//通訊錄結構體
struct Addressbooks
{
struct Person personArray[MAX]; //通訊錄中儲存的聯系人數組
int m_Size; //通訊錄中人員個數
};
//1、添加聯系人資訊
void addPerson(Addressbooks *abs)
{
//判斷電話本是否滿了
if (abs->m_Size == MAX)
{
cout << "通訊錄已滿,無法添加" << endl;
return;
}
else
{
//姓名
string name;
cout << "請輸入姓名:" << endl;
cin >> name;
abs->personArray[abs->m_Size].m_Name = name;
cout << "請輸入性别:" << endl;
cout << "1 -- 男" << endl;
cout << "2 -- 女" << endl;
//性别
int sex = 0;
while (true)
{
cin >> sex;
if (sex == 1 || sex == 2)
{
abs->personArray[abs->m_Size].m_Sex = sex;
break;
}
cout << "輸入有誤,請重新輸入";
}
//年齡
cout << "請輸入年齡:" << endl;
int age = 0;
cin >> age;
abs->personArray[abs->m_Size].m_Age = age;
//聯系電話
cout << "請輸入聯系電話:" << endl;
string phone = "";
cin >> phone;
abs->personArray[abs->m_Size].m_Phone = phone;
//家庭住址
cout << "請輸入家庭住址:" << endl;
string address;
cin >> address;
abs->personArray[abs->m_Size].m_Addr = address;
//更新通訊錄人數
abs->m_Size++;
cout << "添加成功" << endl;
//任意鍵按下後清屏
system("pause");
system("cls");//清屏操作
}
}
//2、顯示所有聯系人資訊
void showPerson(Addressbooks * abs)
{
if (abs->m_Size == 0)
{
cout << "目前記錄為空" << endl;
}
else
{
for (int i = 0; i < abs->m_Size; i++)
{
cout << "姓名:" << abs->personArray[i].m_Name << "\t";
cout << "性别:" << (abs->personArray[i].m_Sex == 1 ? "男" : "女") << "\t";
cout << "年齡:" << abs->personArray[i].m_Age << "\t";
cout << "電話:" << abs->personArray[i].m_Phone << "\t";
cout << "住址:" << abs->personArray[i].m_Addr << endl;
}
}
system("pause");
system("cls");
}
//判斷是否存在查詢的人員,存在傳回在數組中索引位置,不存在傳回-1
//參數1 通訊錄 參數2 對比姓名
int isExist(Addressbooks * abs, string name)
{
for (int i = 0; i < abs->m_Size; i++)
{
if (abs->personArray[i].m_Name == name)
{
return i;//找到了,傳回這個人在數組中的下标編号
}
}
return -1;//沒找到,傳回-1
}
//3、删除指定聯系人資訊
void deletePerson(Addressbooks * abs)
{
cout << "請輸入您要删除的聯系人" << endl;
string name;
cin >> name;
//ret = -1 未查到
//ret != -1 查到了
int ret = isExist(abs, name);
if (ret != -1)
{
//查到此人,要進行删除操作
for (int i = ret; i < abs->m_Size; i++)
{
//資料前移
abs->personArray[i] = abs->personArray[i + 1];
}
abs->m_Size--;//更新通訊錄中的人員數
cout << "删除成功" << endl;
}
else
{
cout << "查無此人" << endl;
}
system("pause");
system("cls");
}
//4、查找指定聯系人資訊
void findPerson(Addressbooks * abs)
{
cout << "請輸入您要查找的聯系人" << endl;
string name;
cin >> name;
//判斷指定的聯系人是否存在通訊錄中
int ret = isExist(abs, name);
if (ret != -1)//找到聯系人
{
cout << "姓名:" << abs->personArray[ret].m_Name << "\t";
cout << "性别:" << abs->personArray[ret].m_Sex << "\t";
cout << "年齡:" << abs->personArray[ret].m_Age << "\t";
cout << "電話:" << abs->personArray[ret].m_Phone << "\t";
cout << "住址:" << abs->personArray[ret].m_Addr << endl;
}
else//未找到
{
cout << "查無此人" << endl;
}
system("pause");
system("cls");
}
//5、修改指定聯系人資訊
void modifyPerson(Addressbooks * abs)
{
cout << "請輸入您要修改的聯系人" << endl;
string name;
cin >> name;
int ret = isExist(abs, name);
if (ret != -1)
{
//姓名
string name;
cout << "請輸入姓名:" << endl;
cin >> name;
abs->personArray[ret].m_Name = name;
cout << "請輸入性别:" << endl;
cout << "1 -- 男" << endl;
cout << "2 -- 女" << endl;
//性别
int sex = 0;
while (true)
{
cin >> sex;
if (sex == 1 || sex == 2)
{
abs->personArray[ret].m_Sex = sex;
break;
}
cout << "輸入有誤,請重新輸入";
}
//年齡
cout << "請輸入年齡:" << endl;
int age = 0;
cin >> age;
abs->personArray[ret].m_Age = age;
//聯系電話
cout << "請輸入聯系電話:" << endl;
string phone = "";
cin >> phone;
abs->personArray[ret].m_Phone = phone;
//家庭住址
cout << "請輸入家庭住址:" << endl;
string address;
cin >> address;
abs->personArray[ret].m_Addr = address;
cout << "修改成功" << endl;
}
else
{
cout << "查無此人" << endl;
}
system("pause");
system("cls");
}
//6、清空所有聯系人
void cleanPerson(Addressbooks * abs)
{
abs->m_Size = 0;
cout << "通訊錄已清空" << endl;
system("pause");
system("cls");
}
int main()
{
//建立通訊錄
Addressbooks abs;
//初始化通訊錄中人數
abs.m_Size = 0;
int select = 0;
while (true)
{
showMenu();
cin >> select;
switch (select)
{
case 1: //添加聯系人
addPerson(&abs);//利用位址傳遞,可以修飾實參
break;
case 2: //顯示聯系人
showPerson(&abs);
break;
case 3: //删除聯系人
deletePerson(&abs);
break;
case 4: //查找聯系人
findPerson(&abs);
break;
case 5: //修改聯系人
modifyPerson(&abs);
break;
case 6: //清空聯系人
cleanPerson(&abs);
break;
case 0: //退出通訊錄
cout << "歡迎下次使用" << endl;
system("pause");
return 0;
break;
default:
break;
}
}
system("pause");
return 0;
}