黑馬程序員 - 通訊錄管理系統(tǒng)

本文章是本人黑馬程序員 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);
          ...
    ...
}
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。