C++通信錄1.0ios
歷時一天,終於把通信錄寫好了。sql
項目要求:數據庫
編寫一個通信錄管理程序。 有一已存在的通信錄文件,數據內容爲各聯繫人信息。 每一個聯繫人信息的組成部分爲: 姓名、電話號碼和住址 等我的基本信息, 並假設已有兩個聯繫人。 並假設已有兩個聯繫人。 (1)輸出聯繫人:打開通信錄文件並顯示其中的數據; (2)添加聯繫人; (3)查找聯繫人:利用字符串函數,按「姓名」查找; (4)修改聯繫人:能夠修改該聯繫人的任一個信息; (5)保存到文件:將操做結果保存到已存在的通信錄文件; (6)用子函數實現各個子功能。
通信錄的 編程
核心類:VAdressBook設計模式
數據庫:SQLite編程語言
編程語言:C++ide
經常使用函數:sprintf函數
經常使用SQLiteAPI函數:sqlite3_execspa
還存在技術問題:重命問題(在翻譯完SQLite高級教程後可解決)翻譯
未使用UI(計劃使用wxWidgets或Java的圖形庫 或 SDL)
還存在的程序設計問題:使用了簡單工廠設計模式,擴展性不佳,維護性不佳。(重構代碼)
如今的皺形效果圖爲:
1 #include"sqlite3.h" 2 #include<cstdlib> 3 #include<cstdio> 4 #include<iostream> 5 #include <cstdio> 6 7 using namespace std; 8 /* 9 格式化輸出命令 10 sqlite>.header on 11 sqlite>.mode column 12 sqlite>.timer on 13 */ 14 15 static int callback(void *data, int argc, char **argv, char **azColName){ 16 int i; 17 for(i=0; i<argc; i++){ 18 printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL"); 19 } 20 printf("\n"); 21 return 0; 22 } 23 24 class VAdressBook 25 { 26 public: 27 virtual bool Display_ContactPerson()=0; 28 virtual bool Add_ContactPerson()=0; 29 virtual bool Find_ContactPerson()=0; 30 virtual bool Change_ContactPerson()=0; 31 //virtual bool SaveToText_ContactPerson()=0; 32 //virtual VAdressBook(){}; 33 }; 34 35 class AdressBook :public VAdressBook 36 { 37 private: 38 sqlite3 *db; 39 int rc; 40 char *ErrorMsg; 41 string sql; 42 string m_strName; 43 string m_strAdress; 44 int m_iTelNum; 45 46 public: 47 AdressBook(); 48 bool Display_ContactPerson(); 49 bool Add_ContactPerson(); 50 bool Find_ContactPerson(); 51 bool Change_ContactPerson(); 52 //bool SaveToText_ContactPerson(); 53 virtual ~AdressBook() 54 { 55 sqlite3_close(db); 56 } 57 }; 58 AdressBook::AdressBook() 59 { 60 ErrorMsg=0; 61 rc = sqlite3_open("adressbook.db", &db); 62 if( rc ) 63 { 64 fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); 65 exit(0); 66 } 67 else 68 { 69 cout<<"Opened database successfully\n"<<endl;; 70 } 71 /*** Create SQL statement ***/ 72 /*** 姓名、電話號碼和住址 ***/ 73 sql = "CREATE TABLE adress(" \ 74 "NAME TEXT NOT NULL," \ 75 "TELNUM INT NOT NULL," \ 76 "ADRESS CHAR(100) );"; 77 78 /* Execute SQL statement */ 79 rc = sqlite3_exec(db, sql.c_str(), 0, 0, &ErrorMsg); 80 if( rc != SQLITE_OK ) 81 { 82 fprintf(stderr, "SQL error: %s\n", ErrorMsg); 83 } 84 else 85 { 86 cout<<"Table created successfully\n"<<endl; 87 } 88 89 /* Create SQL statement */ 90 sql = "INSERT INTO adress (NAME,TELNUM,ADRESS)" \ 91 "VALUES ('WANGCHENG',18061623491,'081101-3-4');" \ 92 "INSERT INTO adress (NAME,TELNUM,ADRESS)" \ 93 "VALUES ('LIYUAN',18061623492,'081101-3-3');"; 94 95 /* Execute SQL statement */ 96 rc = sqlite3_exec(db, sql.c_str(),0, 0, &ErrorMsg); 97 if( rc != SQLITE_OK ) 98 { 99 fprintf(stderr, "SQL error: %s\n", ErrorMsg); 100 sqlite3_free(ErrorMsg); 101 }else 102 { 103 cout<<"Records created successfully\n"<<endl;; 104 } 105 } 106 107 bool AdressBook::Display_ContactPerson() 108 { 109 110 /* Create SQL statement */ 111 sql = "SELECT * FROM adress"; 112 /* Execute SQL statement */ 113 rc = sqlite3_exec(db, sql.c_str(), callback, 0, &ErrorMsg); 114 if( rc != SQLITE_OK ) 115 { 116 fprintf(stderr, "SQL error: %s\n", ErrorMsg); 117 sqlite3_free(ErrorMsg); 118 return false; 119 } 120 else 121 { 122 cout<<"Operation done successfully\n"<<endl;; 123 return true; 124 } 125 } 126 bool AdressBook::Add_ContactPerson() 127 { 128 129 cout<<"please input Name,Contact phone number,Adress"<<endl; 130 cin>>m_strName>>m_iTelNum>>m_strAdress; 131 sprintf((char *)sql.data(),"INSERT INTO adress VALUES(\'%s\',%d,\'%s\');",(const char *)m_strName.c_str(),m_iTelNum,(const char *)m_strAdress.c_str()); 132 133 rc = sqlite3_exec(db, sql.c_str(),0, 0, &ErrorMsg); 134 if( rc != SQLITE_OK ) 135 { 136 fprintf(stderr, "SQL error: %s\n", ErrorMsg); 137 sqlite3_free(ErrorMsg); 138 return false; 139 }else 140 { 141 cout<<"Records created successfully\n"<<endl; 142 return true; 143 } 144 } 145 146 bool AdressBook::Find_ContactPerson() 147 { 148 cout<<"please input Name you want find"<<endl; 149 cin>>m_strName; 150 sprintf((char *)sql.data(),"SELECT * FROM adress WHERE NAME Like \'%%%s%%\';",(const char *)m_strName.c_str()); 151 rc=sqlite3_exec(db,sql.c_str(),callback,0,&ErrorMsg); 152 if( rc != SQLITE_OK ) 153 { 154 fprintf(stderr, "SQL error: %s\n", ErrorMsg); 155 sqlite3_free(ErrorMsg); 156 return false; 157 } 158 else 159 { 160 cout<<"Operation done successfully\n"<<endl; 161 return true; 162 } 163 } 164 bool AdressBook::Change_ContactPerson() 165 { 166 int flag=0; 167 string strTemp; 168 cout<<"please input name to To change Information"<<endl; 169 cin>>m_strName; 170 do 171 { 172 cout<<"please input 一個數字:\n"\ 173 "1:Name\n" \ 174 "2:TelNum\n"\ 175 "3:Adress"<<endl; 176 cin>>flag; 177 } 178 while(1>flag||flag>3); 179 180 switch(flag) 181 { 182 case 1: 183 cin>>strTemp; 184 sprintf((char *)sql.data(),"UPDATE adress set NAME=\'%s\' WHERE NAME LIKE \'%%%s%%\';",(const char *)strTemp.c_str(),(const char *)m_strName.c_str()); 185 break; 186 case 2: 187 cin>>m_iTelNum; 188 sprintf((char *)sql.data(),"UPDATE adress set TELNUM=\'%d\' WHERE NAME LIKE \'%%%s%%\';",m_iTelNum,(const char *)m_strName.c_str()); 189 break; 190 case 3: 191 cin>>strTemp; 192 sprintf((char *)sql.data(),"UPDATE adress set ADRESS=\'%s\' WHERE NAME LIKE \'%%%s%%\';",(const char *)strTemp.c_str(),(const char *)m_strName.c_str()); 193 break; 194 default:cout<<"input error,please restart input"<<endl; 195 196 } 197 rc=sqlite3_exec(db,sql.c_str(),callback,0,&ErrorMsg); 198 if( rc != SQLITE_OK ) 199 { 200 fprintf(stderr, "SQL error: %s\n", ErrorMsg); 201 sqlite3_free(ErrorMsg); 202 return false; 203 } 204 else 205 { 206 cout<<"Operation done successfully\n"<<endl; 207 return true; 208 } 209 return true; 210 211 }
1 #include "VAdressBook.h" 2 3 int main() 4 { 5 AdressBook test; 6 int userchoice; 7 while(true) 8 { 9 do{ 10 cout<<"****************WELCOME USE FDA 通錄訊***************"<<endl; 11 cout<<"* 1. Display All *"<<endl; 12 cout<<"* 2. Add Contact *"<<endl; 13 cout<<"* 3. Change Contact *"<<endl; 14 cout<<"* 4 Find Contact *"<<endl; 15 cout<<"*****************************************************"<<endl; 16 cin>>userchoice; 17 }while(userchoice<1||userchoice>4); 18 switch(userchoice) 19 { 20 case 1:test.Display_ContactPerson(); 21 break; 22 case 2:test.Add_ContactPerson(); 23 break; 24 case 3:test.Change_ContactPerson(); 25 break; 26 case 4:test.Find_ContactPerson(); 27 break; 28 } 29 } 30 return 0; 31 }
想改進這個項目的,請持續關注FDA—orangebook.