您好,登錄后才能下訂單哦!
這篇文章主要介紹了C++類怎么實現通訊錄功能的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇C++類怎么實現通訊錄功能文章都會有所收獲,下面我們一起來看看吧。
首先,是思考要實現什么功能。
一般的通訊錄有添加,刪除,修改,查找,顯示等功能,一般聯系人的信息包括:姓名,性別,年齡,電話號碼,家庭地址。
我們首先新建一個類,用來初始化姓名,年齡,性別,電話號碼,家庭地址,這幾個變量
#pragma once #include<iostream> #include<string> //#include "MailList.hpp" using namespace std; class MailList { public: void setName(string);//給變量賦值函數 void setAge(string); void setSex(string); void setTel(string); void setAddress(string); string getName();//返回變量值函數 string getAge(); string getSex(); string getTel(); string getAddress(); private: string name;//私有函數成員,定義變量 string age; string sex; string tel; string address; }; void MailList::setName(string name) { this->name=name; } void MailList::setAge(string age) { this->age=age; } void MailList::setSex(string sex) { this->sex=sex; } void MailList::setTel(string tel) { this->tel=tel; } void MailList::setAddress(string address) { this->address=address; } string MailList::getName() { return this->name; } string MailList::getAge() { return this->age; } string MailList::getSex() { return this->sex; } string MailList::getTel() { return this->tel; } string MailList::getAddress() { return this->address; }
這里也可以使用構造函數初始化函數成員,構造函數函數名與類名一樣。
然后,創建一個通訊錄管理類,先把總的結構搭建起來
class MailListManager//通訊錄管理類 { public: MailListManager();//構造函數 void initList();//初始化通訊錄功能,在通訊錄里記錄為空時使用 void insertList();//添加聯系人功能,在通訊錄里有記錄時使用 void showList();//顯示聯系人功能,顯示通訊錄中所有聯系人的記錄 void deleteList();//刪除聯系人功能 void selectList();//查找聯系人功能 void updateList();//修改聯系人功能 void dropList();//清空通訊錄功能 void save();//保存到文件,文件的寫入 void loading();//加載,讀出文件 string pw();//密碼加密(我沒能實現) int exiet(string);//檢查聯系人是否存在 private: MailList mail[Max];//數組,MailList類型,這屬于實例化對象 int len;//計數器 }; MailListManager::MailListManager()//構造函數就是用來初始化函數成員的,未初始化的函數成員不可用。這里初始化一下計數器 { len = 0; } int MailListManager::exiet(string name)//定義檢查函數,檢查聯系人是否存在,以姓名的匹配為條件 { } void MailListManager::loading()//定義加載函數 { } void MailListManager::save()//定義保存函數 { } void MailListManager::initList()//定義初始化函數 { } void MailListManager::insertList()//定義添加函數 { } void MailListManager::showList()//定義顯示函數 { } void MailListManager::updateList()//定義修改函數 { } void MailListManager::deleteList()//定義刪除函數 { } void MailListManager::selectList()//定義查找函數 { } void MailListManager::dropList()//定義清空函數 { }
總結構搭建好后,再開始編寫里面的定義內容。
//這里聲明部分就不顯示了,直接看定義 void MailListManager::loading()//加載函數的定義 { len = 0;//計數器len,每次調用加載函數的時候都要重新初始化為0,這樣做是防止之后添加聯系人時重復加載導致保存多次。 string name, sex, age, tel, address;//局部變量,每次使用都要聲明一下的 ifstream in;//實例化文件類“fstream”對象 in.open("maillist/mail.txt");//打開文件 if (!in)//如果文件未打開 { cout << "--文件打開失敗--" << endl; system("pause"); } else { while (!in.eof())//如果未達到文件末尾 { in >> name >> age >> sex >> tel >> address; if (in.fail())break;//ifstream類的作用是從文件中讀出數據到控制臺上,但沒有顯示出來,這就相當于再次賦值給數組,就是給之前聲明的MailList類的數組,所以這里使用數組mail[*].***保存數據,因為不知道到底有多少數據,所以用死循環來控制,跳出條件是達到文件末尾就跳出,這樣就可以保證將文件中的內容全部存到數組里 mail[len].setName(name); mail[len].setAge(age); mail[len].setSex(sex); mail[len].setTel(tel); mail[len].setAddress(address); len++; } } in.close(); } int MailListManager::exiet(string name)//檢驗聯系人是否存在 { for (int i = 0; i < len; i++)//每當調用檢驗聯系人的函數之前,一定要加載一下,讓數據全部保存到控制臺的數組中,且要從控制臺輸入一個名字傳給檢驗聯系人函數,讓傳入的名字與數組中的數據逐一對比,從而檢驗聯系人是否存在 { if (mail[i].getName() == name) { return i;//如果存在,返回數組下標 } } return -1;//不存在,返回-1 } void MailListManager::save()//保存文件函數 { ofstream out;//ofstream類的作用是把控制臺上的數據寫入文件 out.open("maillist/mail.txt");//打開文件 if (!out)//如果文件未打開 { cout << "--文件打開失敗--" << endl; } else { for (int i = 0; i < len; i++)//這里的計數器len的值來自之后定義的函數中,len的值取決于誰調用的保存函數 { out << mail[i].getName() << " " << mail[i].getAge() << " " << mail[i].getSex() << " " << mail[i].getTel() << " " << mail[i].getAddress() << endl; } } out.close(); } void MailListManager::initList()//初始化聯系人。之前我先寫了添加,修改,刪除,在解決一些問題的時候發現添加功能調用加載函數與刪除修改功能調用加載函數有沖突,導致重復顯示,所以在老師的幫助下加入了這個初始化聯系人功能,當然有更好的方法,只是我暫時還不會用(TvT) { string name, age, sex, tel, address; cout << "請輸入聯系人的信息(在姓名后輸入stop停止輸入):" << endl; while (true) { cout << "姓名:"; cin >> name; if (name == "stop") break; else { mail[len].setName(name);//簡單的調用函數,不想講了 cout << "年齡:"; cin >> age; mail[len].setAge(age); cout << "性別:"; cin >> sex; mail[len].setSex(sex); cout << "電話號碼:"; cin >> tel; mail[len].setTel(tel); cout << "家庭地址:"; cin >> address; mail[len].setAddress(address); len++;//這個len最終的值會給到save.....emmm..說“給”好像不太準確,找不到合適的詞了,反正代碼順著往下執,len加到最后不會再變了,save直接用它。 } } save(); } void MailListManager::insertList()//添加聯系人函數 { this->loading();//加載一下初始化聯系人的數據 string name, age, sex, tel, address;//局部變量要重新聲明 cout << "請輸入插入聯系人的數量:" << endl; int count = 0;//再來個計數器,控制每次想要添加的聯系人的數量 cin >> count;//讓用戶來指定每次添加多少人 for (int i = 0; i < count; i++) { cout << "姓名:"; cin >> name; mail[i].setName(name);//函數調用過程,還是說一下吧。mail[]數組的類型是MailList,然后它是MailListManager這個類的函數成員,通過它作為橋梁來調用MailListManager類成員函數 cout << "年齡:"; cin >> age; mail[i].setAge(age); cout << "性別:"; cin >> sex; mail[i].setSex(sex); cout << "電話號碼:"; cin >> tel; mail[i].setTel(tel); cout << "家庭地址:"; cin >> address; mail[i].setAddress(address); } ofstream out;//添加有單獨的保存文件定義,因為只有添加功能需要使用文件追加 out.open("maillist/mail.txt", ios::app); if (!out) { cout << "--文件打開失敗--" << endl; } else { for (int i = 0; i < count; i++) { out << mail[i].getName() << " " << mail[i].getAge() << " " << mail[i].getSex() << " " << mail[i].getTel() << " " << mail[i].getAddress() << endl; } out.close(); } } void MailListManager::showList()//顯示聯系人 { loading(); MailList temp; for (int j=0;j<len;j++)//這里是給聯系人排序,通過名字排序 { for (int i = j+1; i < len; i++) { if (mail[j].getName() > mail[i].getName()) { temp = mail[i]; mail[i] = mail[j];//交換 mail[j] = temp; } } } for (int i = 0; i < len; i++)//這里的len值來自loading() { cout << setw(10) << mail[i].getName() << " " << setw(8) << mail[i].getAge() << " " << setw(4) << mail[i].getSex() << " " << setw(15) << mail[i].getTel() << " " << setw(20) << mail[i].getAddress();//setw()是格式控制函數 cout << endl << endl; } } void MailListManager::updateList()//修改聯系人,修改聯系人之前要找到這個聯系人,存在才能刪除 { loading();//加載一下 string name, age, sex, tel, address; cout << "請輸入要修改的聯系人姓名:"; cin >> name; int ret = exiet(name);//檢驗一下是否存在,存在exiet()會返回該聯系人所在的數組下標,在這個數組下標里重新輸入一遍數據覆蓋掉原有數據就是修改聯系人了 if (ret != -1) { cout << "請重新輸入聯系人信息:" << endl; cout << "姓名:"; cin >> name; mail[ret].setName(name); cout << "年齡:"; cin >> age; mail[ret].setAge(age); cout << "性別:"; cin >> sex; mail[ret].setSex(sex); cout << "電話號碼:"; cin >> tel; mail[ret].setTel(tel); cout << "家庭地址:"; cin >> address; mail[ret].setAddress(address); } else cout << "啊哦~聯系人不存在喔(-o-)"; save();//改完記得重新保存一下,不然是沒有任何改動的哦 } void MailListManager::deleteList()//刪除聯系人,理同修改一樣,只不過是信息的覆蓋變為了內容前移覆蓋 { loading(); string name; int o; cout << "請輸入要刪除的聯系人的姓名: "; cin >> name; int ret = exiet(name); if (ret == -1) { cout << "啊哦~聯系人不存在喔(-o-)"; } else { cout << "確定要刪除嗎?" << endl << "1.確定" << " " << "2.我再想想" << endl << "請選擇:"; cin >> o; if (o == 2) cout << "好的~"; else { for (int i = ret; i < len; i++) { mail[i] = mail[i + 1]; } cout << "刪除成功!"; } } save(); } void MailListManager::selectList()//查找聯系人,查找聯系人就更簡單啦,調用一下檢驗存在的函數,然后根據下標直接輸出此聯系人信息就好 { loading(); string name; cout << "請輸入要查找的人的姓名: "; cin >> name; int ret = exiet(name); if (ret != -1) { cout << "姓名:" << mail[ret].getName() << endl; cout << "年齡:" << mail[ret].getAge() << endl; cout << "性別:" << mail[ret].getSex() << endl; cout << "電話號碼:" << mail[ret].getTel() << endl; cout << "家庭地址:" << mail[ret].getAddress() << endl; } else cout << "啊哦~聯系人不存在喔(-o-)"; } void MailListManager::dropList()//清空通訊錄,重新寫入文件,寫入一個空字符覆蓋之前的數據,就清空啦 { int n; cout << "確定清空嗎?" << endl << " " << "1.YES" << " " << "2.NO" << "請選擇:"; cin >> n; if (n == 2) { cout << "好的~"; } else { ofstream out; out.open("maillist/mail.txt"); if (!out) { cout << "--文件打開失敗--" << endl; } else { out << " "; cout << "清除成功" << endl; } out.close(); } } string MailListManager::pw()//密碼加密,未完成 { char psw[100] = { 0 }, c; int i = 0; /* cin >> c*/; while ((c = getch()) != '\r') { if (c != '\b') { cout << "*"; psw[i++]; } else { cout << "\b \b"; i--; } } psw[i] = '\0'; cout << psw; }
然后再寫個登陸類
#include<iostream> #include<fstream> #include<string> using namespace std; class User { public: User(); void loading(); int check(string); int login(string, string); void sign(string,string); private: string s[50]; int len; }; User::User() { len = 0; } void User::loading()//加載函數 { string name, password; ifstream in; in.open("User/user.txt"); if (!in) { cout << "錯誤!"; } else { while (!in.eof()) { in >> s[len]; if (in.fail())break; len++; } } in.close(); } int User::check(string name)//檢驗函數 { loading(); for (int i = 0; i < len; i=i+2) { if (name == s[i]) { return i; } else { return -1; } } } int User::login(string name, string password)//登陸函數 { if (check(name) == -1) { cout << "用戶根本不存在喔!"; } else { if (s[check(name) + 1] == password) { return 1; } else { cout << "密碼輸入錯誤!"; } } } void User::sign(string name,string password)//注冊函數 { loading(); if (check(name) != -1)//已有用戶名 { cout << "用戶名已存在!"; } else { ofstream out; out.open("User/user.txt", ios::app); if (!out) { cout << "文件打開失敗!"; } else { out <<endl<< name<<" "<< password; } out.close(); cout << " 注冊成功!"; system("pause"); } }
登陸類的加載函數,檢驗函數邏輯同之前管理類的一樣,登陸函數與注冊函數,實際上就是文件讀出與寫入。
最后,寫主函數
#include"MailListManager.hpp" #include"userl.hpp" void menu() { cout << endl << endl << endl ; cout << " -----------(^O^)---------" << endl; cout << " - 1、初始化聯系人 -" << endl; cout << " - 2、顯示聯系人 -" << endl; cout << " - 3、刪除聯系人 -" << endl; cout << " - 4、查找聯系人 -" << endl; cout << " - 5、修改聯系人 -" << endl; cout << " - 6、清空聯系人 -" << endl; cout << " - 7、添加聯系人 -" << endl; cout << " - 0、退出通訊錄 -" << endl; cout << " ---------(·v·)---------" << endl; }//手動格式控制O(∩_∩)O哈哈~ int main() { User u;//實例化對象 int e; cout << endl << endl << endl << endl << endl << endl; cout << " ******************歡迎使用通訊錄管理系統~******************" << endl; cout << " * *" << endl; cout << " * *" << endl; cout << " * *" << endl; cout << " ********************** ***********************" << endl; cout << " **1.我已有賬戶,登錄**" <<" "<< "** 2.我沒有賬戶,注冊**" << endl; cout << " ********************** ***********************" << endl;//這是一個登陸界面,有賬戶才能管理通訊錄哦 cout << endl<<endl; cout<<" 請選擇:"; cin >> e; if (e == 1) { while (true) { MailListManager* m = new MailListManager;//來個指針指向堆區 system("cls"); string name, password; cout <<endl<<endl<< " 請輸入:" << endl << " 用戶名:"; cin >> name; cout << endl << " 密碼:"; cin >> password; /*password = getch();*/ //這兩段本來是用來密碼加密的,但我沒實現所以注釋掉了 /*m->pw();*/ /*password = putch(getch());*/ int i = u.login(name, password);//調用User里的登陸函數,并將返回值給i,i=1就證明用戶名密碼輸入正確,反之就是輸入錯誤 if (i == 1) { int n; while (true) { system("cls"); cout <<endl<<endl<< " 登錄成功!歡迎" << name << endl; cout << " 通訊錄管理系統功能選項" << endl; menu(); cout << " 請選擇:"; cin >> n; switch (n) { case 7:system("cls"); m->insertList(); system("pause"); break; case 2:system("cls"); m->showList(); system("pause"); break; case 3:system("cls"); m->deleteList(); system("pause"); break; case 4:system("cls"); m->selectList(); system("pause"); break; case 5:system("cls"); m->updateList(); system("pause"); break; case 6:system("cls"); m->dropList(); system("pause"); break; case 1:system("cls"); m->initList(); system("pause"); break;//調用各種函數 case 0:exit(0); break; } } delete m; m = NULL; } else { cout<<endl<<endl << " 請重新輸入" << endl; system("pause"); } } } else { u.loading();//調用User類里的加載函數 while (true) { system("cls"); string name, password; cout <<endl<<endl<< " 請輸入:" << endl << " 用戶名:"; cin >> name; if (u.check(name) !=-1) { cout << " 用戶名已存在!請重新輸入:"<<endl; system("pause"); } else { MailListManager* m = new MailListManager; cout << endl << " 密碼:"; cin >> password; /*m->pw();*/ u.sign(name, password);//調用User類的注冊函數,保存注冊用戶信息 int n; while (true) { system("cls"); cout <<endl<<endl<< " 注冊成功!歡迎" << name << endl; cout << " 通訊錄管理系統功能選項" << endl; menu(); cout << " 請選擇:"; cin >> n; switch (n) { case 1:system("cls"); m->insertList(); system("pause"); break; case 2:system("cls"); m->showList(); system("pause"); break; case 3:system("cls"); m->deleteList(); system("pause"); break; case 4:system("cls"); m->selectList(); system("pause"); break; case 5:system("cls"); m->updateList(); system("pause"); break; case 6:system("cls"); m->dropList(); system("pause"); break; case 7:system("cls"); m->initList(); system("pause"); break;//調用各種函數 case 0: exit(0); break; } } } } } return 0; }
關于“C++類怎么實現通訊錄功能”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“C++類怎么實現通訊錄功能”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。