个人电话号码查询系统
目的:通過設計一個《個人電話號碼查詢系統》,進一步熟悉一些概念、基本知識和技能,利用所學的基本知識和技能解決簡單的面向對象的程序設計問題。實現根據用戶輸入的信息進行快速的查詢。
要求: 實現一個簡單的個人電話號碼查詢系統,根據用戶輸入的信息(例如姓名等),對數據進行二叉排序并實現平衡二叉樹,對數據進行快速查詢。編程完成通訊錄的一般性管理工作,如通訊錄中記錄的增加、修改、查找、刪除、輸出等功能。每個記錄包含姓名、電話號碼、住址等個人基本信息。
(1)在外存上,用文件保存電話號碼信息;
????? (2)在內存中,設計數據結構存儲電話號碼信息;
????? (3)提供查詢功能,如根據姓名實現快速查詢;
????? (4)提供其他維護功能,例如插入、刪除、修改等。
1.實驗問題分析
需要用到數據結構課上學到的平衡二叉樹的知識,實現刪除和插入,增加功能。理解關于二叉樹的相關的基本算法。將輸入的信息保存入文件和從文件輸出。
2.實驗概要分析
首先由于程序中要有對學生信息的增加和減少,定義一個全局變量n,在此程序的任意的模塊中均可以使用。宏定義,用LEN來代替開辟地址空間,定義一個結構體變量,record,來存儲聯系人信息。
代碼的實現如下:
Main.cpp #include <string> #include <vector> #include <fstream> using namespace std; static int n=0;//輸入的數據個數 #define limit 100//通訊錄的存儲空間class PostCodedress{public:struct xinxi{int id;//編號順序char Name[20];char Phone[20];}xx;void zengPostCodedress();//增加信息;int cc(char na[]); //看輸入的名字是不是重復; }; void PostCodedress::zengPostCodedress()//增加信息的 {for(int i = 1;i<=2;i++){if(i==1){cout<<"請輸入聯系人姓名: "<<endl;cin>>xx.Name;}if(i==2){cout<<"請輸入聯系人電話號碼: "<<endl;cin>>xx.Phone;}} } int PostCodedress::cc(char na[]) {if(strcmp(na,xx.Name)==0)return 1;else return 0; } PostCodedress B[10]; class POSTCODEDRESDBOOK:public PostCodedress //對信息進行排序,并且寫進文件,打開文件; { public:void searchPostCodedress1(char nu[]);//根據電話號碼查找聯系人;void searchPostCodedress2(char na[]);//根據姓名查找聯系人;void Save(); //實現保存功能;void Put(); //增加的信息寫入文件void RePostCode(); //打開文件,顯示信息void display(); //瀏覽功能,顯示信息;void Delete(); //刪除功能; }; void POSTCODEDRESDBOOK::searchPostCodedress1(char nu[])//根據電話號碼查找聯系人; {int i;if(n==0){cout<<"查無此人"<<endl;}else{for(i=0;i<n;i++){if(strcmp(nu,B[i].xx.Phone)==0){ cout<<B[i].xx.id<<" "<<B[i].xx.Name<<" "<<B[i].xx.Phone<<endl;break;}else if(strcmp(nu,B[i].xx.Phone)!=0 && i==n-1){cout<<"查無此人"<<endl;break;}}}} void POSTCODEDRESDBOOK::searchPostCodedress2(char na[])//根據姓名查找聯系人; {int i;if(n==0){cout<<"查無此人"<<endl;}else{for(i=0;i<n;i++){if(strcmp(na,B[i].xx.Name)==0){ cout<<B[i].xx.id<<" "<<B[i].xx.Name<<" "<<B[i].xx.Phone<<endl;break;}else if(strcmp(na,B[i].xx.Name)!=0 && i==n-1){cout<<"查無此人"<<endl;break;}}}} void POSTCODEDRESDBOOK::Save()//實現保存功能; {ofstream f2("save_PostCodedress.txt");f2.close();remove("save_PostCodedress.txt");ofstream f3("save_PostCodedress.txt");for(int i=0;i<n;i++){f3<<B[i].xx.id<<" "<<B[i].xx.Name<<" "<<B[i].xx.Phone<<endl;}f3.close(); } void POSTCODEDRESDBOOK::Put()//增加的信息寫入文件 {ofstream RePostCode("xcc.txt");if(!RePostCode){cout << "不能打開文件 ";exit(1); // terminate with error}cout<<"這是您輸入的第"<<n+1<<"個聯系人 "<<endl;for(int i=n;;i++){if(i==limit){cout<<"存儲空間已滿,可選擇刪除數據再進行輸入"<<endl;break;}B[i].zengPostCodedress();for(int j=0;j<n;j++){if(B[i].cc(B[j].xx.Name)){cout<<"數據錄入重復"<<endl;i=i-1;break;}}n++;B[i].xx.id=n;RePostCode<<B[i].xx.id<<" "<<B[i].xx.Name<<" "<<B[i].xx.Phone<<endl;char q;cout<<"選擇是否繼續輸入(y/n)"<<endl;cin>>q;if(q=='n')break;if(q=='y')continue;}RePostCode.close(); } void POSTCODEDRESDBOOK::RePostCode()//輸出文件 {fstream Myfile("xcc.txt");if(!Myfile) //判斷是否成功打開文件{cerr<<"open error!"<<endl;abort();}string temp;while(getline(Myfile,temp)){cout<<temp<<endl;}Myfile.close();} void POSTCODEDRESDBOOK::display()//顯示當前聯系人 {cout<<"當前通訊錄聯系人有:"<<n<<"個 "<<endl<<"通訊錄中最多可以添加"<<100-n<<"個聯系人"<<endl;cout<<"聯系人如下: " <<endl;for(int i=0;i<n;i++){cout<<B[i].xx.id<<" "<<B[i].xx.Name<<" "<<B[i].xx.Phone<<endl;}cout<<endl; } void POSTCODEDRESDBOOK::Delete()//刪除聯系人 {char na[20];cout<<"輸入你要刪除的人的名字"<<endl;cin>>na;int j;for(int i=0;i<n;i++){if(strcmp(na,B[i].xx.Name)==0){j=i;break;}}for(int i1=j;i1<n-1;i1++){B[i1]=B[i1+1];B[i1].xx.id=i1;}n--;fstream Myfile("xcc.txt");ofstream f2("tmp2.txt");for(int i3=0;i3<n;i3++){f2<<B[i3].xx.id<<" "<<B[i3].xx.Name<<" "<<B[i3].xx.Phone<<endl;}Myfile.close();f2.close();remove("xcc.txt");rename("tmp2.txt","xcc.txt"); }int main() {POSTCODEDRESDBOOK P;char Q;cout<<"***歡 迎 使 用 電 話 號 碼***"<<endl;fstream f1("xcc.txt");f1.clear();f1.close();while(1){POSTCODEDRESDBOOK p;cout<<"*********通訊錄*********"<<endl;cout<<"*****1.添加聯系人*****"<<endl;cout<<"*****2.聯系人列表*****"<<endl;cout<<"*****3.查找聯系人*****"<<endl;cout<<"*****4.刪除聯系人*****"<<endl;cout<<"*****5.通訊錄存盤*****"<<endl;cout<<"*****6.讀出通訊錄*****"<<endl;cout<<"*****7.退出***********"<<endl;cout<<"***********************"<<endl;int q;cout<<"請選擇操作:"<<endl;cin>>q;switch(q){case 1:p.display();p.Put();break;case 2:p.display();break;case 3:p.display();char h[11];cout<<"輸入你要按號碼(h)查找還是按姓名(m)查找:"<<endl;char z;cin>>z;if(z=='h'){char h[11];cout<<"輸入你要查找的號碼:"<<endl;cin>>h;p.searchPostCodedress1(h);}if(z=='m'){char m[20];cout<<"輸入你要查找的姓名:"<<endl;cin>>m;p.searchPostCodedress2(m);}break;case 4:p.display();p.Delete();break;case 5:p.display();p.Save();break;case 6:p.display();p.RePostCode();break;case 7:break;}cout<<"請問是否繼續使用系統? 是(y) 否(n)"<<endl;cin>>Q;if(Q=='y')continue;if(Q=='n')break;}return 0; }1.h #include <stdio.h> #include <stdlib.h> #include <string> #include <windows.h> #define HASHSIZE 53 //定義表長 #define MAXSIZE 20 //電話薄記錄數量 #define ok 1 #define error -1 #define LEN sizeof(HashTable) typedef int Status; typedef char NA[MAX_SIZE]; typedef struct //記錄 {NA name;NA tel; } Record;typedef struct { //散列表Record *elem[HASHSIZE]; //數據元素存儲基址int count; //當前數據元素個數int size; //當前容量 } HashTable;Status eq(NA x,NA y) {//關鍵字比較,相等返回1;否則返回-1if(strcmp(x,y)==0)return ok;else return error; }Status NUM_BER; //記錄的個數?
.實驗結果
5. 實驗總結分析
通過這次實驗,體會到要掌握以下幾點內容:
1.要學會先做好模塊,從大到小,進行細化。
?? ???? 2.編寫好函數,并進行測試與調試。
3.寫程序時要善于使用庫函數,可以提高效率。
4.定義函數時,應選好參數的個數和數據類型。
但仍需進一步的學習二叉樹地相關知識,才能夠更加熟練的運用數據結構(C++)來設計系統。
??
?
總結
以上是生活随笔為你收集整理的个人电话号码查询系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: excel合并两列内容_还在为合并WPS
- 下一篇: linux解决Tomcat内存溢出