C++通讯录1.0

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

项目要求:

  1. 编写一个通讯录管理程序。
  2. 有一已存在的通讯录文件,数据内容为各联系人信息。
  3. 每个联系人信息的组成部分为:
  4. 姓名、电话号码和住址
  5. 等个人基本信息,
  6. 并假设已有两个联系人。
  7. 并假设已有两个联系人。
  8.  
  9. ()输出联系人:打开通讯录文件并显示其中的数据;
  10. ()添加联系人;
  11. ()查找联系人:利用字符串函数,按“姓名”查找;
  12. ()修改联系人:可以修改该联系人的任一个信息;
  13. ()保存到文件:将操作结果保存到已存在的通讯录文件;
  14. ()用子函数实现各个子功能。

通讯录的

核心类: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=; i<argc; i++){
  18. printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
  19. }
  20. printf("\n");
  21. return ;
  22. }
  23.  
  24. class VAdressBook
  25. {
  26. public:
  27. virtual bool Display_ContactPerson()=;
  28. virtual bool Add_ContactPerson()=;
  29. virtual bool Find_ContactPerson()=;
  30. virtual bool Change_ContactPerson()=;
  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=;
  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();
  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(), , , &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(),, , &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, , &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(),, , &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,,&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=;
  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(>flag||flag>);
  179.  
  180. switch(flag)
  181. {
  182. case :
  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 :
  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 :
  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,,&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<||userchoice>);
  18. switch(userchoice)
  19. {
  20. case :test.Display_ContactPerson();
  21. break;
  22. case :test.Add_ContactPerson();
  23. break;
  24. case :test.Change_ContactPerson();
  25. break;
  26. case :test.Find_ContactPerson();
  27. break;
  28. }
  29. }
  30. return ;
  31. }

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

C++通讯录的更多相关文章

  1. Android中使用ExpandableListView实现微信通讯录界面(完善仿微信APP)

    之前的博文<Android中使用ExpandableListView实现好友分组>我简单介绍了使用ExpandableListView实现简单的好友分组功能,今天我们针对之前的所做的仿微信 ...

  2. iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总

    --系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用 ...

  3. android 通讯录实现

    最近项目需要,于是自己实现了一个带导航栏的通讯录,上代码! 一.数据准备 (1)bean: public class Friend { private String remark; private S ...

  4. IOS学习之-私人通讯录

    通过一段时间IOS的学习完成了一个简单的应用,"私人通讯录". 运行效果如下图: 1.登录页 2.通讯录列表 3.添加 4.编辑 5.删除 6.注销 总视图结构如下图: 总结本程序 ...

  5. C#开发微信门户及应用(18)-微信企业号的通讯录管理开发之成员管理

    在上篇随笔<C#开发微信门户及应用(17)-微信企业号的通讯录管理开发之部门管理>介绍了通讯录的部门的相关操作管理,通讯录管理包括部门管理.成员管理.标签管理三个部分,本篇主要介绍成员的管 ...

  6. C#开发微信门户及应用(17)-微信企业号的通讯录管理开发之部门管理

    前面一篇随笔企业号的一些基础信息,以及介绍如何配置企业号的回调方式实现和企业号服务器进行沟通的桥梁.本篇主要还是继续介绍企业号的开发工作的开展,介绍微信企业号通讯录管理开发功能,介绍其中组织机构里面如 ...

  7. 一个App完成入门篇(六)- 完成通讯录页面

    第五章和第六章间隔时间有点长,对不起大家了.下面继续. 本节教程将要教会大家如何加载本地通讯录. 导入项目 导入通讯录 自定义js模块 发送和订阅page消息 将要学习的demo效果图如下所示 1. ...

  8. iOS中通讯录的开发

    通讯录开发主要是获取用户手机中的联系人,进而可以在应用中添加好友 一 .如何访问通讯录 (1)在iOS9之前,有两个框架可以访问用户的通讯录 AddressBookUI.framework: 提供了联 ...

  9. js做通讯录的索引滑动显示效果和滑动显示锚点效果

    只做实现..完全没考虑性能优化.所以我实现了以后特别卡. 第一个是在通讯录右边的索引条上进行滑动,滑动到相应字母就跳转到相应字母的锚点上. 思路:监听touchmove事件,获取clientX和cli ...

  10. Android开发3:Intent、Bundle的使用和ListView的应用 、RelativeLayout(相对布局)简述(简单通讯录的实现)

    前言 啦啦啦~博主又来骚扰大家啦~大家是不是感觉上次的Android开发博文有点长呢~主要是因为博主也是小白,在做实验的过程中查询了很多很多概念,努力去理解每一个知识点,才完成了最终的实验.还有就是随 ...

随机推荐

  1. CPython里的GIL

    GIL不是Python特性,是CPython解释器特性,因为CPython有垃圾回收机制. GIL 本质是互斥锁,保护解释器安全. 保证线程安全,垃圾回收线程不会和其他线程一起运行. 多个线程不能实现 ...

  2. 16.oauth2 + oidc 实现 client部分

    把授权和认证过的Server启动一下先 因为代码是之前的代码,所以有些代码需要清除一下 之类注释掉,因为这里暂时没有用到EFCode了 运行的时候发现一点错误 发现登陆的时候使用的RegisterVi ...

  3. 1-2关键字 & 2-1什么是变量

    2-1什么是变量 驼峰第一个字母首字母小写后面字母首字母大写 Pascal命名规范:

  4. linux的grep命令参数全拼详解

    今天为了查找文件中某段字符,找了好久,最后成功使用指令: find . -name "*.cpp" |xargs grep -in “get_itemInfo” | grep -v ...

  5. 宝塔Linux 8888 进不去

    一.前言 导致该问题的原因是 Python 版本问题,可能是您更新了 python 的问题.参考宝塔问题的解决方案做的小结.仅供自己做笔记,不作其他用途. 二.解决方案 1.进入shell 命令行,输 ...

  6. Modulation of Lipid Metabolism by Celastrol (文献分享一组-赵倩倩)

    文献名:Modulation of Lipid Metabolism by Celastrol (雷公藤红素对脂质代谢调节作用的研究) 期刊名:Journal of Proteome Research ...

  7. python 函数求两个数的最大公约数和最小公倍数

    1. 求最小公倍数的算法: 最小公倍数  =  两个整数的乘积 /  最大公约数 所以我们首先要求出两个整数的最大公约数, 求两个数的最大公约数思路如下: 2. 求最大公约数算法: 1. 整数A对整数 ...

  8. PostgreSQL-13-缺失值处理

    -- 1.查看缺失值CREATE TABLE dnull AS SELECT * FROM data; -- 复制数据SELECT * FROM dnull WHERE 房屋编码 IS NULL OR ...

  9. Map集合的四种常用遍历方式整理

    1.Map集合简介:map集合是一个key—value型的数据结构,存储的数据具有查询速度快速的特点,但由于是无序的,所以没有顺序可言.在遍历时没有办法像简单的list或数组一样. 2.代码: pac ...

  10. python入门之lambda表达式、内置函数

    lambda 简单的函数就可以用lambda表达式 格式: abc = lambda a1,a2:a1+a2 其中,传参是a1和a2,返回值是a1+a2 内置函数 abs(a) #取绝对值 all(a ...