C++通讯录

C++通讯录1.0

历时一天,终于把通讯录写好了。

项目要求:

编写一个通讯录管理程序。
有一已存在的通讯录文件,数据内容为各联系人信息。
每个联系人信息的组成部分为:
    姓名、电话号码和住址
                            等个人基本信息,
                            并假设已有两个联系人。
                            并假设已有两个联系人。

(1)输出联系人:打开通讯录文件并显示其中的数据;
(2)添加联系人;
(3)查找联系人:利用字符串函数,按“姓名”查找;
(4)修改联系人:可以修改该联系人的任一个信息;
(5)保存到文件:将操作结果保存到已存在的通讯录文件;
(6)用子函数实现各个子功能。

 

通讯录的        

核心类:VAdressBook

数据库:SQLite

编程语言:C++

                 常用函数:sprintf

                 常用SQLiteAPI函数:sqlite3_exec

还存在技术问题:重命问题(在翻译完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 }
View Code
 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 }
View Code


想改进这个项目的,请持续关注FDA—orangebook.

 

posted @ 2014-01-10 20:09  Talbot3  阅读(3908)  评论(0编辑  收藏  举报