C++通讯录1.0

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

项目要求:

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

通讯录的

核心类:VAdressBook

数据库:SQLite

编程语言:C++

                 常用函数:sprintf

                 常用SQLiteAPI函数:sqlite3_exec

还存在技术问题:重命问题(在翻译完SQLite高级教程后可解决)

未使用UI(计划使用wxWidgets或Java的图形库 或 SDL)

还存在的程序设计问题:使用了简单工厂设计模式,扩展性不佳,维护性不佳。(重构代码)

现在的皱形效果图为:

 #include"sqlite3.h"
#include<cstdlib>
#include<cstdio>
#include<iostream>
#include <cstdio> using namespace std;
/*
格式化输出命令
sqlite>.header on
sqlite>.mode column
sqlite>.timer on
*/ static int callback(void *data, int argc, char **argv, char **azColName){
int i;
for(i=; i<argc; i++){
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
return ;
} class VAdressBook
{
public:
virtual bool Display_ContactPerson()=;
virtual bool Add_ContactPerson()=;
virtual bool Find_ContactPerson()=;
virtual bool Change_ContactPerson()=;
//virtual bool SaveToText_ContactPerson()=0;
//virtual VAdressBook(){};
}; class AdressBook :public VAdressBook
{
private:
sqlite3 *db;
int rc;
char *ErrorMsg;
string sql;
string m_strName;
string m_strAdress;
int m_iTelNum; public:
AdressBook();
bool Display_ContactPerson();
bool Add_ContactPerson();
bool Find_ContactPerson();
bool Change_ContactPerson();
//bool SaveToText_ContactPerson();
virtual ~AdressBook()
{
sqlite3_close(db);
}
};
AdressBook::AdressBook()
{
ErrorMsg=;
rc = sqlite3_open("adressbook.db", &db);
if( rc )
{
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
exit();
}
else
{
cout<<"Opened database successfully\n"<<endl;;
}
/*** Create SQL statement ***/
/*** 姓名、电话号码和住址 ***/
sql = "CREATE TABLE adress(" \
"NAME TEXT NOT NULL," \
"TELNUM INT NOT NULL," \
"ADRESS CHAR(100) );"; /* Execute SQL statement */
rc = sqlite3_exec(db, sql.c_str(), , , &ErrorMsg);
if( rc != SQLITE_OK )
{
fprintf(stderr, "SQL error: %s\n", ErrorMsg);
}
else
{
cout<<"Table created successfully\n"<<endl;
} /* Create SQL statement */
sql = "INSERT INTO adress (NAME,TELNUM,ADRESS)" \
"VALUES ('WANGCHENG',18061623491,'081101-3-4');" \
"INSERT INTO adress (NAME,TELNUM,ADRESS)" \
"VALUES ('LIYUAN',18061623492,'081101-3-3');"; /* Execute SQL statement */
rc = sqlite3_exec(db, sql.c_str(),, , &ErrorMsg);
if( rc != SQLITE_OK )
{
fprintf(stderr, "SQL error: %s\n", ErrorMsg);
sqlite3_free(ErrorMsg);
}else
{
cout<<"Records created successfully\n"<<endl;;
}
} bool AdressBook::Display_ContactPerson()
{ /* Create SQL statement */
sql = "SELECT * FROM adress";
/* Execute SQL statement */
rc = sqlite3_exec(db, sql.c_str(), callback, , &ErrorMsg);
if( rc != SQLITE_OK )
{
fprintf(stderr, "SQL error: %s\n", ErrorMsg);
sqlite3_free(ErrorMsg);
return false;
}
else
{
cout<<"Operation done successfully\n"<<endl;;
return true;
}
}
bool AdressBook::Add_ContactPerson()
{ cout<<"please input Name,Contact phone number,Adress"<<endl;
cin>>m_strName>>m_iTelNum>>m_strAdress;
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()); rc = sqlite3_exec(db, sql.c_str(),, , &ErrorMsg);
if( rc != SQLITE_OK )
{
fprintf(stderr, "SQL error: %s\n", ErrorMsg);
sqlite3_free(ErrorMsg);
return false;
}else
{
cout<<"Records created successfully\n"<<endl;
return true;
}
} bool AdressBook::Find_ContactPerson()
{
cout<<"please input Name you want find"<<endl;
cin>>m_strName;
sprintf((char *)sql.data(),"SELECT * FROM adress WHERE NAME Like \'%%%s%%\';",(const char *)m_strName.c_str());
rc=sqlite3_exec(db,sql.c_str(),callback,,&ErrorMsg);
if( rc != SQLITE_OK )
{
fprintf(stderr, "SQL error: %s\n", ErrorMsg);
sqlite3_free(ErrorMsg);
return false;
}
else
{
cout<<"Operation done successfully\n"<<endl;
return true;
}
}
bool AdressBook::Change_ContactPerson()
{
int flag=;
string strTemp;
cout<<"please input name to To change Information"<<endl;
cin>>m_strName;
do
{
cout<<"please input 一个数字:\n"\
"1:Name\n" \
"2:TelNum\n"\
"3:Adress"<<endl;
cin>>flag;
}
while(>flag||flag>); switch(flag)
{
case :
cin>>strTemp;
sprintf((char *)sql.data(),"UPDATE adress set NAME=\'%s\' WHERE NAME LIKE \'%%%s%%\';",(const char *)strTemp.c_str(),(const char *)m_strName.c_str());
break;
case :
cin>>m_iTelNum;
sprintf((char *)sql.data(),"UPDATE adress set TELNUM=\'%d\' WHERE NAME LIKE \'%%%s%%\';",m_iTelNum,(const char *)m_strName.c_str());
break;
case :
cin>>strTemp;
sprintf((char *)sql.data(),"UPDATE adress set ADRESS=\'%s\' WHERE NAME LIKE \'%%%s%%\';",(const char *)strTemp.c_str(),(const char *)m_strName.c_str());
break;
default:cout<<"input error,please restart input"<<endl; }
rc=sqlite3_exec(db,sql.c_str(),callback,,&ErrorMsg);
if( rc != SQLITE_OK )
{
fprintf(stderr, "SQL error: %s\n", ErrorMsg);
sqlite3_free(ErrorMsg);
return false;
}
else
{
cout<<"Operation done successfully\n"<<endl;
return true;
}
return true; }
 #include "VAdressBook.h"

 int main()
{
AdressBook test;
int userchoice;
while(true)
{
do{
cout<<"****************WELCOME USE FDA 通录讯***************"<<endl;
cout<<"* 1. Display All *"<<endl;
cout<<"* 2. Add Contact *"<<endl;
cout<<"* 3. Change Contact *"<<endl;
cout<<"* 4 Find Contact *"<<endl;
cout<<"*****************************************************"<<endl;
cin>>userchoice;
}while(userchoice<||userchoice>);
switch(userchoice)
{
case :test.Display_ContactPerson();
break;
case :test.Add_ContactPerson();
break;
case :test.Change_ContactPerson();
break;
case :test.Find_ContactPerson();
break;
}
}
return ;
}

想改进这个项目的,请持续关注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. 关于weblogic 10.3.6.0 的漏洞复现(1)

    最近小R 搭建了个weblogic,  因为之前在公司找系统漏洞的时候,发现了这个漏洞,所以为了特地专门搭建了个10.3.6.0版本. 漏洞编号: CVE-2017-10271 漏洞的描述:就是web ...

  2. HDU5880【AC自动机】

    题意: 给出n个字符串,再给出一个字符串,把之前出现过的字符串全部变成* 思路: AC自动机,Trie树上存的值是一个字符串的长度,也就是往前的长度,然后倒着处理一遍. 感想: 第三题AC自动机,本来 ...

  3. 51nod1640 【最小生成树】

    题意: 在一副图中,搞N-1条边,使得每个点都相连, 有多种可能的情况,所以求一种使得其中n-1条边的最大是所有可能的最小,然后并保证连接的n-1条边的权值总和最大 思路: 一开始没有看清题意,随便写 ...

  4. IT兄弟连 JavaWeb教程 Servlet会话跟踪 设置Session存活时长

    方式一:修改所有的session默认时长,修改tomcat目录下的conf文件夹下的web.xml文件. <session-config> <session-timeout>希 ...

  5. ZooKeeper应用案例

    我们通过学习借鉴,哪些项目或应用都使用了ZooKeeper,可以了解我们的应用使用ZooKeeper是否能真正地带来价值,当然,有些项目可能也未必非常适合使用ZooKeeper,我们要批判地学习.借鉴 ...

  6. js+canvas(H5)实现小球移动小demo

    *canvas提供画布,大小自定义,js得到画布,从画布对象通过getContext('2d')来得到画笔,然后就可以开始画了 代码: <!DOCTYPE html> <html l ...

  7. 生产环境中mysql+keepalive双主模式,keepalive守护进程实现双主切换提供数据库服务

    mysql+keepalive实现浮动地址自动切换,由于keepalive无自带健康检查功能,所以必须自动编写健康检查守护进程(监控DB1和DB2数据库的监控状态,来保证浮动地址双机自动切换.) 一, ...

  8. 表单辅助函数-form_open()

    使用from_open()之前需要装载本辅助函数: $this->load->helper('form'); php===> echo form_open('email/send') ...

  9. [转]Android应用自动更新功能的代码实现

    本文转自:http://www.cnblogs.com/coolszy/archive/2012/04/27/2474279.html 由于Android项目开源所致,市面上出现了N多安卓软件市场.为 ...

  10. jsp动态图片页面基础

    1. 什么是动态网页? 动态网页是指在服务器端运行的程序或者网页,它们会随不同客户.不同时间,返回不同的网页. 注意:在静态网页中插入flash ,虽然flash是在动的,但是并不是说这个网页就是动态 ...