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