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. SSH框架搭建的时候遇到的问题

    1.spring-web.jar包问题:使用user libaries方式,识别不到,于是出现了下面问题 java.lang.ClassNotFoundException: org.springfra ...

  2. 2.3-2.6 HBase java API

    一.get .put.delete.scan 1.代码 package com.beifeng.senior.hadoop.hbase; import org.apache.hadoop.conf.C ...

  3. 【Linux学习】Linux文件系统3—文件操作命令

    Linux文件系统3-文件操作命令 Linux文件操作命令主要有: cd:    改变目录位置 pwd:  显示当前目录的绝对路径 ls:    显示文件名称.属性等 -a 列出全部文件 -l  列出 ...

  4. Flutter实战视频-移动电商-18.首页_火爆专区后台接口调试

    18.首页_火爆专区后台接口调试 楼层结束之后有个火爆专区.到地图有个上拉加载的效果 lib/config/service_url.dart 首先找到我们的接口配置文件,增加接口的配置 lib/ser ...

  5. HTML学习笔记(六)TCP/IP

    TCP/IP 是供已连接因特网的计算机进行通信的通信协议. 在 TCP/IP 中包含一系列用于处理数据通信的协议: TCP (传输控制协议) - 应用程序之间通信 UDP (用户数据包协议) - 应用 ...

  6. 525. Contiguous Array

    Given a binary array, find the maximum length of a contiguous subarray with equal number of 0 and 1. ...

  7. unity模型法线反转问题

    fbx模型导入unity正常 但只要绑了骨骼,在3dmax中正常,进入unity就法线反转 原因是3dmax中模型用到复制和镜像的导出需要多一步处理 1重置变换 2反转法线 按顺序进行这两个,在绑定模 ...

  8. Unity3D之如何将包大小减少到极致

    http://www.luzexi.com Unity3D之如何将包大小减少到极致,图片是游戏app里最最占空间的资源,所以请各位还没有理解u3d对图片文件存储方式理解的请看<unity3d-t ...

  9. [Xcode 实际操作]七、文件与数据-(19)颜色集(Color Set)的使用

    目录:[Swift]Xcode实际操作 本文将演示颜色集合的使用. 使用颜色集合可以很方便地创建应用程序的主题色,并且可以方便的对主题颜色进行更换. 要使用颜色集功能,需要设置项目的部署(Deploy ...

  10. Cocoapods在OS X Yosemite上报错的解决方法

    今天升级了Mac OS X 10.10-Yosemite以后运行pod install遇到下面的错误: /System/Library/Frameworks/Ruby.framework/Versio ...