C++通讯录
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++通讯录的更多相关文章
- Android中使用ExpandableListView实现微信通讯录界面(完善仿微信APP)
之前的博文<Android中使用ExpandableListView实现好友分组>我简单介绍了使用ExpandableListView实现简单的好友分组功能,今天我们针对之前的所做的仿微信 ...
- iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总
--系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用 ...
- android 通讯录实现
最近项目需要,于是自己实现了一个带导航栏的通讯录,上代码! 一.数据准备 (1)bean: public class Friend { private String remark; private S ...
- IOS学习之-私人通讯录
通过一段时间IOS的学习完成了一个简单的应用,"私人通讯录". 运行效果如下图: 1.登录页 2.通讯录列表 3.添加 4.编辑 5.删除 6.注销 总视图结构如下图: 总结本程序 ...
- C#开发微信门户及应用(18)-微信企业号的通讯录管理开发之成员管理
在上篇随笔<C#开发微信门户及应用(17)-微信企业号的通讯录管理开发之部门管理>介绍了通讯录的部门的相关操作管理,通讯录管理包括部门管理.成员管理.标签管理三个部分,本篇主要介绍成员的管 ...
- C#开发微信门户及应用(17)-微信企业号的通讯录管理开发之部门管理
前面一篇随笔企业号的一些基础信息,以及介绍如何配置企业号的回调方式实现和企业号服务器进行沟通的桥梁.本篇主要还是继续介绍企业号的开发工作的开展,介绍微信企业号通讯录管理开发功能,介绍其中组织机构里面如 ...
- 一个App完成入门篇(六)- 完成通讯录页面
第五章和第六章间隔时间有点长,对不起大家了.下面继续. 本节教程将要教会大家如何加载本地通讯录. 导入项目 导入通讯录 自定义js模块 发送和订阅page消息 将要学习的demo效果图如下所示 1. ...
- iOS中通讯录的开发
通讯录开发主要是获取用户手机中的联系人,进而可以在应用中添加好友 一 .如何访问通讯录 (1)在iOS9之前,有两个框架可以访问用户的通讯录 AddressBookUI.framework: 提供了联 ...
- js做通讯录的索引滑动显示效果和滑动显示锚点效果
只做实现..完全没考虑性能优化.所以我实现了以后特别卡. 第一个是在通讯录右边的索引条上进行滑动,滑动到相应字母就跳转到相应字母的锚点上. 思路:监听touchmove事件,获取clientX和cli ...
- Android开发3:Intent、Bundle的使用和ListView的应用 、RelativeLayout(相对布局)简述(简单通讯录的实现)
前言 啦啦啦~博主又来骚扰大家啦~大家是不是感觉上次的Android开发博文有点长呢~主要是因为博主也是小白,在做实验的过程中查询了很多很多概念,努力去理解每一个知识点,才完成了最终的实验.还有就是随 ...
随机推荐
- Identity Server 4 原理和实战(完结)_为 MVC 客户端刷新 Token
服务端修改token的过期使劲为60秒 过期了 仍然还能获取到api1的资源 api1,设置每隔一分钟就验证token 并且要求token必须要有超时时间这个参数, 1分钟后提示超时,两边都是一分钟, ...
- 坑暗花明:又遇 .NET Core 中 System.Data.SqlClient 查询缓慢的问题
之前发布过一篇博文 下单快发货慢:一个 JOIN SQL 引起 SqlClient 读取数据慢的奇特问题,当时遇到的问题是从 SQL Server 2008 R2 中查询获取 100 条记录竟然耗时 ...
- Math对象产生随机数一个小应用
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- JAG Practice Contest for ACM-ICPC Asia Regional 2016 C题【贪心】
camp给出的题解: 题解:贪心,先算出最小需要的长度.然后从左到右依次确定每一位.复杂度O(n)O(n) 长度为 2n2n 的串可以构造出需要 [0,1+3+...+2n-1][0,1+3+...+ ...
- WinMain和main
WinMain的原型: int WINAPI WinMain(HINSTANCE hinstance,//程序本身的实例句柄 HINS ...
- Spring Cloud:使用Ribbon实现负载均衡详解(下)
在上一篇文章(Spring Cloud:使用Ribbon实现负载均衡详解(上))中,我对 Ribbon 做了一个介绍,Ribbon 可以实现直接通过服务名称对服务进行访问.这一篇文章我详细分析一下如何 ...
- MySQL--表操作1
这是对自己学习燕十八老师mysql教程的总结,非常感谢燕十八老师. 依赖软件:mysql 系统环境:win 注:本次所有命令都是在命令行上执行 数据库的四大天王操作:增删改查 增删改查都是在对表进行操 ...
- web项目数据存入mysql数据库中文乱码问题
刚开始怀疑是项目中编码设置问题,发现在web.xml中已经有过设置:后来dubug显示数据在传输的过程中一切正常,怀疑是数据库编码问题,然后查看mysql编码: show variables like ...
- 学习java设计模式的必要性探讨
1.设计模式是什么:设计模式为我们提供了一套可复用的面向对象技术,再配合重构方法,可以让我们避免简单重复的工作.它使用面向接口编程,而不是面向实现.可以说设计模式是java程序设计的灵魂. 2.为什么 ...
- Django (六) 视图 views
views 1. 视图及HttpRequest 和HttpResponse Django中的视图主要用来接受Web请求,并做出响应. 视图的本质就是一个Python中的函数 视图的响应分为两大类 1) ...