C++ | 通讯录管理系统
目錄
前言
?項目需求
需求分析
整體分析
設計思路
數據類型
實現框架
函數設計
增加函數addPerson()
設計思路
函數實現
查詢函數ifExit()
設計思路
函數實現
刪除函數deletePerson()
設計思路
函數實現
修改函數modifyPerson()
設計思路
函數實現
查找函數findPerson()
設計思路
函數實現
清空函數
設計思路
函數實現
源碼地址
結語
技術棧:c++ 指針&結構體
須知:
1.需要有一定的c++基礎
2.需要知道github是什么
3.需要知道怎么從github上下載源碼并運行
如果本文章對您有所幫助,麻煩您點贊、收藏加評論三連走起哦!
前言
? 最近,在學習的過程中。上手跟做了一個通訊錄管理系統,后來自己又復現了一遍。加了一點自己的內容。完成這個項目之后,想把自己對于這個項目的理解和設計分享出來。供大家做個參考,也希望能對大家有所幫助!
?項目需求
? 設計一個通訊錄管理系統,主要實現以下功能:
需求分析
整體分析
? 該項目的主要的功能就是使用c++實現對數據簡單的增刪改查,還有基礎的輸入與輸出功能即可完成該項目的功能需求。
設計思路
數據類型
? 首先,需要保存數據。不能通過單個的int、string這樣的數據類型。操作太過繁雜且不好管理。所以就需要使用到結構體來保存。由于通訊錄和聯系人直接時包含關系,所以只需要在使用系統的時候就新建一個通訊錄的結構體,然后在通訊錄結構體內再定義一個新的結構體數據,用于保存聯系人的信息和一個整型變量存儲通訊錄的人數。如下圖所示:
? 另外,項目還要求該通訊錄限制聯系人個數為1000。那么,聯系人結構體數組的長度就已知了。之后也不需要改變長度。就直接在源碼頭部定義一個宏常量MAX_SIZE來代替總人數,方便后續維護。通過以上的兩步,就可以先初步設計出我們所需要的數據類型了。代碼部分如下所示:
#define MAX_SIZE 1000 //設置最大人數// 定義聯系人結構體 struct people {string name;//姓名string sex;//性別int age;//年齡string telephoneNumber;//聯系電話string address;//家庭住宅 };// 定義通訊錄結構體 struct addressBook {int id;// 聯系人編號people peopleArray[MAX_SIZE];// 聯系人數組 };實現框架
? 選擇完所需要數據類型,就可以進行對自己代碼的整體框架進行一個設計。首先,主函數部分我們通過一個 while 循環和 switch 語句分別進行不同功能的實現。其中,修改函數的部分我們同樣可以參照主函數使用一個二級菜單界面讓用戶選擇。其它的函數只需要實現對應的功能并完成封裝和調用即可。大概的邏輯示意圖如下所示:
?根據示意圖,自定義函數名。就完成了一個大概的需求分析。
//顯示界面函數 void showMenu();// 增加函數 void addPerson(addressBook *p);// 顯示函數 // 只讀不寫 加const防止誤操作 void showPerson(const addressBook *p);// 查找函數 int ifExit(addressBook *p,string name);// 刪除函數 void deletePerson(addressBook *p);// 查找函數 void findPerson(addressBook *p);// 修改聯系人 void modifyPerson(addressBook *p);// 修改的界面顯示函數 void showSmallMenu();// 清空通訊錄 void cleanAll(addressBook *p);為什么是傳址?
因為傳地址調用更節省內存空間而且可以通過形參修飾實參。
函數設計
? 此處主要講解主要的增刪改查的函數,其余函數我會在源代碼中給出。因為這個項目中最核心的部分就是對數據的增刪改查。具體指針部分不做過多講解,如果不理解基礎的內容。直接講解如何使用指針作用不大。會給出源碼,自己可以自行先了解指針的原理就可以明白如何我是如何使用指針的。
增加函數addPerson()
設計思路
? 首先獲取用戶想要輸入的聯系人個數,然后對用戶的輸入做一個合法性的判斷。如果輸入正確且沒有超出容量個數,就可以正常進行輸入。通過以上描述,主要使用 if 判斷和 for 循環語句來完成。
函數實現
void addPerson(addressBook *p) {cout<<"當前系統容量為:"<<MAX_SIZE - p->id<<endl;// 詢問添加人數int num=0;cout << "你要添加的人數為:";cin >> num;// 判斷用戶輸入是否大于總容量 1000if (num > 1000 || num + (p->id) > 1000) {cout << "你的添加量已經超出容量,請檢查容量后再輸入" << endl;} else if(num<=1000 && num>0 && num+(p->id)<=1000){for (int i = 0; i < num; i++) {// 指針賦值操作cout<<"\n姓名:";cin >> p->peopleArray[p->id].name;cout<<"性別:";cin >> p->peopleArray[p->id].sex;// 只有年齡需要準確的判斷cout<<"年齡:";while(true){cin >> p->peopleArray[p->id].age;if(p->peopleArray[p->id].age<0||p->peopleArray[p->id].age>150){cout<<"請重新輸入你的年齡:";}else{break;}}cout<<"聯系電話:";cin >> p->peopleArray[p->id].telephoneNumber;cout<<"家庭住址:";cin >> p->peopleArray[p->id].address;(p->id) += 1; // 每加一個人 就記錄當前通訊錄的人數}cout << "添加成功!"<<endl;}else{cout<<"你的輸入有誤,請檢查后重新輸入"<<endl;}system("pause"); //暫停指令system("cls"); //清屏指令 }查詢函數ifExit()
? 我們可以發現,在刪除特定聯系人、查找特定聯系人以及修改聯系人信息中。都是要做到一個操作,就是先要查詢聯系人列表,看是否有這個人。如果有,再進行下一步操作。所以,為了減少代碼的重復,就在此處單獨定義一個查詢函數,之后直接調用即可。
設計思路
? 參數應該有兩個,聯系人數組和想要查詢的姓名。直接 for 循環遍歷聯系人,在for循環內部嵌套一個 if 判斷語句。如果數組中的聯系人姓名與查詢的姓名相同。就返回當前聯系人的下標。如果沒有找到,就返回一個-1。在函數中接受返回值,進行判斷即可。
函數實現
// 若找到 返回下標 // 若未找到 返回-1 int ifExit(addressBook *p,string name){for(int i = 0;i<p->id;i++){//判斷是否相等if(p->peopleArray[i].name == name){//找到 返回下標return i;}}// 遍歷完數組若沒找到 返回-1return -1; }刪除函數deletePerson()
設計思路
? 直接調用查詢函數,用一個變量接收查詢函數返回的值。如果找到查詢的下標,直接用一個 for 循環從當前下標開始遍歷,用下一個聯系人信息覆蓋所要刪除的聯系人信息即可。遍歷結束后,只需讓總人數做一個減一即可。若沒有找到,直接顯示查無此人即可。
函數實現
void deletePerson(addressBook *p){// 詢問獲取姓名string name;cout<<"請輸入你想要刪除的人:";cin>>name;int result = ifExit(p,name);if(result == -1){cout<<"查無此人"<<endl;}else{//遍歷覆蓋int temp = p->id;for(int i = result;i<temp;i++){p->peopleArray[i]=p->peopleArray[i+1];}(p->id)--;cout<<"刪除完成"<<endl;}system("pause"); //暫停指令system("cls"); //清屏指令 }修改函數modifyPerson()
設計思路
?? 直接調用查詢函數,用一個變量接收查詢函數返回的值。如果找到查詢的下標,進入一個二級菜單,然后分別顯示需要修改的內容。直到用戶修改完成,選擇退出二級菜單的修改界面即可。若沒有找到,直接顯示查無此人即可。
函數實現
// 二級菜單函數定義 void showSmallMenu(){system("cls");cout<<"******1.修改姓名********"<<endl;cout<<"******2.修改性別********"<<endl;cout<<"******3.修改年齡********"<<endl;cout<<"******4.修改電話********"<<endl;cout<<"******5.修改住址********"<<endl;cout<<"******0.退出修改********"<<endl;}// 修改函數 void modifyPerson(addressBook *p){// 詢問獲取姓名string name;cout<<"請輸入你想要修改的人:";cin>>name;int result = ifExit(p,name);if(result == -1){cout<<"查無此人"<<endl;}else{int select_modify = 0;int num = 1;while (num) {showSmallMenu();cout<<"請輸入你的選擇:";cin>>select_modify;switch (select_modify) {case 1:cout << "請輸入新的姓名:";cin >> p->peopleArray[result].name;break;case 2:cout << "請輸入新的性別:";cin >> p->peopleArray[result].sex;break;case 3:cout << "請輸入新的年齡:";cin >> p->peopleArray[result].age;break;case 4:cout << "請輸入新的電話:";cin >> p->peopleArray[result].telephoneNumber;break;case 5:cout << "請輸入新的住址:";cin >> p->peopleArray[result].address;break;case 0:num--;cout<<"退出成功"<<endl;break;default:cout<<"輸入有誤!請重新輸入:";break;}}}system("pause"); //暫停指令system("cls"); //清屏指令 }查找函數findPerson()
設計思路
? 直接調用查詢函數,用一個變量接收查詢函數返回的值。如果找到查詢的下標,直接使用 cout 輸出當前下標人的信息。若沒有找到,直接顯示查無此人即可。
函數實現
void findPerson(addressBook *p){// 詢問獲取姓名string name;cout<<"請輸入你想要查找的人:";cin>>name;int result = ifExit(p,name);if(result == -1){cout<<"查無此人"<<endl;}else{cout<<"姓名:";cout<<p->peopleArray[result].name;cout<<"\t性別:";cout<<p->peopleArray[result].sex;cout<<"\t年齡:";cout<<p->peopleArray[result].age;cout<<"\t聯系電話:";cout<<p->peopleArray[result].telephoneNumber;cout<<"\t家庭地址:";cout<<p->peopleArray[result].address<<endl;}system("pause"); //暫停指令system("cls"); //清屏指令 }清空函數
設計思路
? 如果選擇全部清空,二次詢問防止誤操作。如果二次確認清空,直接將總人數改為 0 即可做到一個邏輯上的清零。如果是誤操作,直接退出即可
函數實現
void cleanAll(addressBook *p){cout<<"是否清空?(y/n):";char select_clean;cin >> select_clean;while(true) {if (select_clean == 'y' || select_clean == 'Y') {p->id = 0;cout<<"清空成功"<<endl;break;} else if (select_clean == 'n' || select_clean == 'N') {break;} else{cout<<"輸入有誤,請重新輸入"<<endl;cin>>select_clean;}}system("pause"); //暫停指令system("cls"); //清屏指令 }源碼地址
獲取源碼https://github.com/TuoXiaodong/Address-book-management-system
結語
? 到此為止,對于通訊錄管理系統的整體部分講解已經結束了。希望以上的講解對你有所幫助!如果你需要源碼,可以自己自行跳轉鏈接下載即可。別忘了點個star哦!當前的系統還是有不足之處,希望你能提出寶貴意見,我會根據你的建議繼續不斷地完善這個系統。github上會持續更新的,也歡迎你關注我的更新與完善。
? 創作不易,請多多支持!
? 希望大家能多多點贊+評論+收藏!!!!!
總結
以上是生活随笔為你收集整理的C++ | 通讯录管理系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Pandas库的学习使用(一)
- 下一篇: s3c2440移植MQTT