用c++写的简易学生通讯录
http://blog.youkuaiyun.com/yuzhihui_no1/article/details/43530445昨天我一大学室友找到我说他亲戚要个学生通讯录程序,一定要c++来写,而他是学Java的,对c++的基本语法都忘干净了。因为我是做c方面开发的,所以问我能不能搞定。虽然我也半年多没用c++写过东西了,但作为室友怎么能拒绝呢,再个看了下他的需求感觉挺简单的(没涉及到数据库操作),于是就应承下来了。
他给我的需求是这样的:
学生通讯录系统
学生通信录信息包括:姓名、学号、年龄、性别、家庭住址、联系电话、寝室号等信息。
系统以菜单方式工作,使之能提供以下功能::
学生通信录信息的输入
学生的通信录信息删除和修改
学生的通信录信息查询和统计功能
学生的通信录信息输出显示
而且数据都保存在内存中;
我在Linux下用了半上午时间给他写了个简易的通讯录程序,下面我把代码贴出来,希望可以给那些大一大二想写这个程序的同学一点思路。其中不规范的地方还望大家指出了(因为为了尽快完成功能,所以一些规范就没太注意),谢谢!
[cpp] view plain copy
#include<iostream>
#include<cstdlib> //主要是用到exit()退出进程函数
#include<string.h>//字符串头文件
#define NoFind -1
#define NoOperation -2
#define Fill -3
#define Exist -4
using namespace std;
class student
{
public:
void printStudent(); // print a student information
void setName();
string getName();
void setId();
unsigned int getId();
void setAge();
unsigned int getAge();
void setSex();
char getSex();
void setAddr();
string getAddr();
void setPhone();
string getPhone();
void setRoom();
string getRoom();
private:
string name;
unsigned int id;
unsigned int age;
char sex;
string addr;
string phone;
string room;
};
void student::setId()
{
cout<<"Id:";
cin>>id;
}
unsigned int student::getId()
{
return id;
}
void student::setName()
{
cout<<"Name:";
cin>>name;
}
string student::getName()
{
return name;
}
void student::setAge()
{
cout<<"Age:";
cin>>age;
}
unsigned int student::getAge()
{
return age;
}
void student::setSex()
{
cout<<"Sex:";
cin>>sex;
}
char student::getSex()
{
return sex;
}
void student::setAddr()
{
cout<<"Addr:";
cin>>addr;
}
string student::getAddr()
{
return addr;
}
void student::setPhone()
{
cout<<"Phone:";
cin>>phone;
}
string student::getPhone()
{
return phone;
}
void student::setRoom()
{
cout<<"Room:";
cin>>room;
}
string student::getRoom()
{
return room;
}
void student::printStudent()
{
cout<<"Id:"<<id<<endl;
cout<<"Name:"<<name<<endl;
cout<<"Age:"<<age<<endl;
cout<<"Sex:"<<sex<<endl;
cout<<"Addr:"<<addr<<endl;
cout<<"Phone:"<<phone<<endl;
cout<<"Room:"<<room<<endl;
cout<<endl;
}
//上面都是学生类,以及类的属性设置和获取函数
#define LEN 1024
//定义一个结构体,保存类对象和数据有效性标志
typedef struct Node{
student s;
int flag;//如果为0 表示该结构体中的对象无效
}Node;
static int studentNum = 0;
static Node buff[LEN] = {};//用来存放上面结构体对象的,一个对象表示一个同学的信息
//在数组中得到一个空闲的元素,返回数组小标;是否空闲可以查看flag标志位
int getArrayFree()
{
int i;
for(i = 0; i < LEN; i++)
{
if(0 == buff[i].flag)
return i;
}
return Fill;
}
//在数组中查找指定学生的信息,该函数被删除和修改函数调用
//用学号查询和姓名查询两种方式,返回查找到的学生在数组中下标号
int getArrayIndex()
{
unsigned int select;
unsigned int id = 0;
string name = "";
cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
cout<<"select operation student way, id or name?"<<endl;
cout<<"****************************"<<endl;
cout<<" 1 Use id "<<endl;
cout<<" 2 Use name "<<endl;
cout<<" 3 Break "<<endl;
cout<<" 4 Exit "<<endl;
cout<<"****************************"<<endl;
cin>>select;
switch(select)
{
case 1:
cout<<"please enter the student Id:";
cin>>id;
break;
case 2:
cout<<"please enter the student Name:";
cin>>name;
break;
case 3:
return NoOperation;
case 4:
cout<<"exit process!"<<endl;exit(0);
default:
cout<<"other select will go break!"<<endl;
return NoOperation;
}
int i;
for(i = 0; i < LEN; i++)
{
if(!(buff[i]).flag) continue;
if(0 == id)
{
if(name == buff[i].s.getName())
return i;
}
if(id == buff[i].s.getId())
return i;
}
return NoFind;
}
//判断该id是否存在,姓名可以相同,但学号一定不能相同
int isExist(int id)
{
int i;
int count = 0;
for(i = 0; i < LEN; i++)
{
if(id == buff[i].s.getId())
count++;
}
return count;
}
//增加一个学生的信息到数组中,也即是通讯录中增加一条通讯录
int addStudentInfo()
{
student newStd;
string name;
int i;
int index;
char yORn;
cout<<endl;
cout<<"-----------------------------------"<<endl;
cout<<"addStudentInfo:"<<endl;
newStd.setId();
newStd.setName();
newStd.setAge();
newStd.setSex();
newStd.setAddr();
newStd.setPhone();
newStd.setRoom();
cout<<endl;
newStd.printStudent();
cout<<"Are you sure this information is correct?[y or N]"<<endl;
cin>>yORn;
if(!(('y' == yORn) || ('Y' == yORn)))
return 0;
if( -1 == (index = getArrayFree()) )
{
cout<<"The contacts filled!"<<endl;
return Fill;
}
if(isExist(newStd.getId()))
{
cout<<"The id is exist!"<<endl;
return Exist;
}
buff[index].s = newStd;
buff[index].flag = 1;
studentNum++;
cout<<endl;
cout<<"Success"<<endl;cout<<endl;
return 0;
}
//删除指定学生的通讯录信息,只要flag置0
int delStudentInfo()
{
int index;
index = getArrayIndex();
if(NoFind == index)
{
cout<<"No find the student!"<<endl;
return 0;
}
if(NoOperation == index) return 0;
buff[index].flag = 0;
studentNum--;
cout<<"--------------------------------------"<<endl;
cout<<"Success"<<endl;
return 0;
}
//修改指定学生的信息
int updateStudentInfo()
{
int index;
int select;
int count = 2;
cout<<endl;
cout<<"---------------------------------"<<endl;
cout<<"update the student information:"<<endl;
index = getArrayIndex();
if(NoFind == index)
{
cout<<"No find the student!"<<endl;
return NoFind;
}
if(NoOperation == index) return 0;
while(1)
{
cout<<endl;
cout<<"~~~~~~~~~~~~~~~~~~~~"<<endl;
cout<<" 1 Id "<<endl;
cout<<" 2 Name "<<endl;
cout<<" 3 Age "<<endl;
cout<<" 4 Sex "<<endl;
cout<<" 5 Addr "<<endl;
cout<<" 6 Phone "<<endl;
cout<<" 7 Room "<<endl;
cout<<" 8 Break "<<endl;
cout<<" 9 Exit "<<endl;
cout<<"~~~~~~~~~~~~~~~~~~~~"<<endl;
cout<<endl;
cout<<"please select update informaton:"<<endl;
cin>>select;
switch(select)
{
case 1://下面循环要判断id(学号)是否重合,如果重合就再选择一个学号,直到没有重合的
while((count-1))
{
buff[index].s.setId();
count = isExist(buff[index].s.getId());
if(count >= 2) cout<<"id is exist!"<<endl;
}
break;
case 2: buff[index].s.setName();break;
case 3: buff[index].s.setAge();break;
case 4: buff[index].s.setSex();break;
case 5: buff[index].s.setAddr();break;
case 6: buff[index].s.setPhone();break;
case 7: buff[index].s.setRoom();break;
case 8: return NoOperation;
case 9: cout<<"exit process!"<<endl;exit(0);
default:return NoOperation;
}
}
return 0;
}
//统计通讯录中有多少个学生
int accoutStudent() // accout Student number
{
cout<<endl;
cout<<"---------------------------------"<<endl;
cout<<"student number:"<<studentNum<<endl;
return 0;
}
//打印指定学生信息
void printStudentInfo()
{
int index;
index = getArrayIndex();
if(NoFind == index)
{
cout<<"No find the student!"<<endl;
return;
}
if(NoOperation == index) return;
cout<<endl;
cout<<"---------------------------------"<<endl;
buff[index].s.printStudent();
return;
}
//打印所有学生的信息
void showAllStudentInfo()
{
int i;
cout<<endl;
cout<<"show all stduent information:"<<endl;
for(i = 0; i < LEN; i++)
{
if(1 == buff[i].flag)
buff[i].s.printStudent();
}
return;
}
//根据菜单选择调用对应函数
void select(int number)
{
switch(number)
{
case 1:
addStudentInfo();break;
case 2:
delStudentInfo();break;
case 3:
updateStudentInfo();break;
case 4:
accoutStudent();break;
case 5:
printStudentInfo();break;
case 6:
showAllStudentInfo();break;
default:
cout<<"error"<<endl;return;
}
}
//选择菜单函数
void menu()
{
unsigned int number = 7;
while(1)
{
cout<<endl;
cout<<"**********************************"<<endl;
cout<<" 1 Add student information" <<endl;
cout<<" 2 Del student information" <<endl;
cout<<" 3 Update student information" <<endl;
cout<<" 4 Accout student number" <<endl;
cout<<" 5 Printf a student information"<<endl;
cout<<" 6 Show all student information"<<endl;
cout<<" 7 Exit "<<endl;
cout<<"**********************************"<<endl;
cout<<endl;
cout<<"please enter the number:<1~7>"<<endl;
cin>>number;
if(7 == number)
return;
if((1 <= number)&&(7 > number))
select(number);
sleep(1);
}
}
int main(int argc, char **argv)
{
menu();
return 0;
}
程序基本就是这样的,在Linux系统上测试通过,没问题。在其他系统上应该没有大问题,如果有的话就是头文件的问题(听室友说在mac上sleep()函数是没有的,Windows下要添加一个头文件,具体什么头文件需要的可以百度下);
程序还有个问题,就是在menu()函数中输入值给number时,如果你输入字符就会出现死循环(这个死循环不是因为while(1)造成的,如果正常死循环,每循环一次就会等待用户输入一个值),在我预计中不会出现这个问题的,因为输入字符也是转化成ascii码,然后也会被剔除的。可惜,不是这样,我打印了下number(当输入字符A时),结果却是0,而不是64;还有当输入学生信息时,如果在id输入时,不小心输入名字时(其实就是字符串)也会出现未知的错误。查了资料说是c++中类型不能混用,本应该要有防止这种失误操作的处理方法,但我实验了下,没成功,如果谁有好的办法希望可以告诉我一声,共同学习嘛。谢谢!
转载请注明作者和原文出处,原文地址:http://blog.youkuaiyun.com/yuzhihui_no1/article/details/43530445
========
C++ 通讯录实现
http://blog.youkuaiyun.com/ky_heart/article/details/55045996昨晚实现了用C++编写通讯录,深刻的感受到了封装的便利性啊,vector真是太方便了!!!
代码如下:
info.h
[cpp] view plain copy print?
#ifndef _PERSON_H_
#define _PERSON_H_
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Info
{
private:
int id;
string name;
string tel;
string addr;
public:
Info();
~Info();
static int count; //记录通讯录中的人数
int GetId();
void SetName();
string GetName() const;
void SetTel();
string GetTel() const;
void SetAddr();
string GetAddr() const;
void choose();
void insert();
void show();
void search();
void interface();
void delete_info();
void exit_info();
void modify();
};
#endif
info.cpp
[cpp] view plain copy print?
#include "info.h"
vector<Info> per;
int Info::count = 0;
int Info::GetId()
{
return id;
}
void Info::SetName()
{
cout << "姓名:";
cin >> name;
}
string Info::GetName() const
{
string tmp = name;
return tmp;
}
void Info::SetTel()
{
cout << "电话:";
cin >> tel;
}
string Info::GetTel() const
{
string tmp = tel;
return tmp;
}
void Info::SetAddr()
{
cout << "地址:";
cin >> addr;
}
string Info::GetAddr() const
{
string tmp = addr;
return tmp;
}
Info::Info()
{
}
Info::~Info()
{
}
void Info::insert()
{
Info tmp;
vector<Info>::iterator it;
loop:
count++;
cout << "ID: " << count << endl;
tmp.SetName();
for(it = per.begin(); it != per.end(); ++it)
{
if(!((it->GetName()).compare(tmp.GetName())))
{
cout << "与已有联系人重名,请重新输入。" << endl;
count--;
goto loop;
}
}
tmp.SetTel();
tmp.SetAddr();
tmp.id = count;
per.push_back(tmp);
cout << "是否继续添加联系人 y/n :";
char ch;
cin >> ch;
if('y' == ch || 'Y' == ch)
{
goto loop;
}
}
void Info::show()
{
vector<Info>::iterator it;
if(per.empty())
{
cout << "通讯录暂无联系人!" << endl;
}
else
{
for(it = per.begin(); it != per.end(); ++it)
{
cout << "ID: " << it->GetId() << endl;
cout << "姓名:" << it->GetName() << endl;
cout << "电话:" << it->GetTel() << endl;
cout << "地址:" << it->GetAddr() << endl;
}
cout << "请按任意键退出" << endl;
char ch;
cin >> ch;
}
}
void Info::search()
{
vector<Info>::iterator it;
if(per.empty())
{
cout << "通讯录暂无联系人!" << endl;
}
else
{
search_loop:
int tp = 0; //查询方式选择位
int num = 0; //查找的ID
string tn; //查找的姓名
int flag = 0; //查找成功与否标志位
cout << "查找方式:1.ID 2.姓名" << endl;
cin >> tp;
if(1 == tp)
{
cout << "请输入查找的ID:";
cin >> num;
for(it = per.begin(); it != per.end(); ++it)
{
if(it->GetId() == num)
{
flag = 1;
cout << "你要找的联系人为:" <<endl;
cout << "ID: " << it->GetId() << endl;
cout << "姓名:" << it->GetName() << endl;
cout << "电话:" << it->GetTel() << endl;
cout << "地址:" << it->GetAddr() << endl;
}
}
}
else if(2 == tp)
{
cout << "请输入查找的姓名:";
cin >> tn;
for(it = per.begin(); it != per.end(); ++it)
{
if(!((it->GetName()).compare(tn)))
{
flag = 1;
cout << "你要找的联系人为:" <<endl;
cout << "ID: " << it->GetId() << endl;
cout << "姓名:" << it->GetName() << endl;
cout << "电话:" << it->GetTel() << endl;
cout << "地址:" << it->GetAddr() << endl;
}
}
}
else
{
cout << "查找方式选择错误,请重新选择。" << endl;
goto search_loop;
}
if(0 == flag)
{
cout << "无找到此联系人" << endl;
}
else
{
cout << "查找成功" << endl;
}
cout << "请按任意键退出" << endl;
char ch;
cin >> ch;
}
}
void Info::delete_info()
{
vector<Info>::iterator it;
if(per.empty())
{
cout << "通讯录暂无联系人!" << endl;
}
else
{
delete_loop:
int tp = 0; //删除方式选择位
int num = 0; //删除的ID
string tn; //删除的姓名
int flag = 0; //删除成功与否标志位
cout << "删除方式:1.ID 2.姓名" << endl;
cin >> tp;
if(1 == tp)
{
cout << "请输入删除的ID:";
cin >> num;
for(it = per.begin(); it != per.end();)
{
if(it->GetId() == num)
{
flag = 1;
cout << "你要删除的联系人为:" <<endl;
cout << "ID: " << it->GetId() << endl;
cout << "姓名:" << it->GetName() << endl;
cout << "电话:" << it->GetTel() << endl;
cout << "地址:" << it->GetAddr() << endl;
cout << "确定删除此联系人吗?y/n : ";
char ch1;
cin >> ch1;
if (ch1 == 'y' || ch1 == 'Y')
{
it = per.erase(it);
}
}
else
{
++it;
}
}
}
else if(2 == tp)
{
cout << "请输入删除的姓名:";
cin >> tn;
for(it = per.begin(); it != per.end(); )
{
if(!((it->GetName()).compare(tn)))
{
flag = 1;
cout << "你要删除的联系人为:" <<endl;
cout << "ID: " << it->GetId() << endl;
cout << "姓名:" << it->GetName() << endl;
cout << "电话:" << it->GetTel() << endl;
cout << "地址:" << it->GetAddr() << endl;
cout << "确定删除此联系人吗?y/n : ";
char ch1;
cin >> ch1;
if (ch1 == 'y' || ch1 == 'Y')
{
it = per.erase(it);
}
}
else
{
++it;
}
}
}
else
{
cout << "删除方式选择错误,请重新选择。" << endl;
goto delete_loop;
}
if(0 == flag)
{
cout << "没有找到此联系人" << endl;
}
else
{
cout << "删除成功" << endl;
}
cout << "请按任意键退出" << endl;
char ch;
cin >> ch;
}
}
void Info::modify()
{
vector<Info>::iterator it;
if(per.empty())
{
cout << "通讯录暂无联系人!" << endl;
}
else
{
modify_loop:
string tn;
int flag2 = 0;
int flag = 0; //修改对象查找成功与否标志位
cout << "请输入你要编辑的人的姓名:" ;
cin >> tn;
for(it = per.begin(); it != per.end(); )
{
if(!((it->GetName()).compare(tn)))
{
flag = 1;
cout << "你要修改的联系人为:" <<endl;
cout << "ID: " << it->GetId() << endl;
cout << "姓名:" << it->GetName() << endl;
cout << "电话:" << it->GetTel() << endl;
cout << "地址:" << it->GetAddr() << endl;
cout << "确定修改此联系人吗?y/n : ";
char ch1;
cin >> ch1;
char ch2;
if (ch1 == 'y' || ch1 == 'Y')
{
cout << "你要修改的是:1.姓名 2.电话 3.地址:";
cin >> ch2;
switch(ch2)
{
case '1':
{
it->SetName();
cout << "修改成功!该联系人信息改为:" << endl;
cout << "ID: " << it->GetId() << endl;
cout << "姓名:" << it->GetName() << endl;
cout << "电话:" << it->GetTel() << endl;
cout << "地址:" << it->GetAddr() << endl;
flag2 = 1;
break;
}
case '2':
{
it->SetTel();
cout << "修改成功!该联系人信息改为:" << endl;
cout << "ID: " << it->GetId() << endl;
cout << "姓名:" << it->GetName() << endl;
cout << "电话:" << it->GetTel() << endl;
cout << "地址:" << it->GetAddr() << endl;
flag2 = 1;
break;
}
case '3':
{
it->SetAddr();
cout << "修改成功!该联系人信息改为:" << endl;
cout << "ID: " << it->GetId() << endl;
cout << "姓名:" << it->GetName() << endl;
cout << "电话:" << it->GetTel() << endl;
cout << "地址:" << it->GetAddr() << endl;
flag2 = 1;
break;
}
default :
{
cout << "指令输入错误!" << endl;
break;
}
}
}
else
{
break;
}
}
else
{
++it;
}
}
if(0 == flag)
{
cout << "没有找到此联系人" << endl;
}
if(1 == flag2)
{
cout << "修改成功!" << endl;
}
cout << "请按任意键退出" << endl;
char ch3;
cin >> ch3;
}
}
void Info::exit_info()
{
cout << "确定退出此通讯录吗?y/n: " ;
char ch1;
cin >> ch1;
if (ch1 == 'y' || ch1 == 'Y')
{
exit(1);
}
}
void Info::choose()
{
char action;
Info tmp;
cout << "请输入你要实现的功能(0-4):" ;
cin >> action;
switch(action)
{
case '1':
{
tmp.insert();
tmp.interface();
choose();
break;
}
case '2':
{
tmp.show();
tmp.interface();
choose();
break;
}
case '3':
{
tmp.delete_info();
tmp.interface();
choose();
}
case '4':
{
tmp.search();
tmp.interface();
choose();
break;
}
case '5':
{
tmp.modify();
tmp.interface();
choose();
break;
}
case '6':
{
tmp.exit_info();
break;
}
default:
{
cout << "输入指令有误,请重新输入!" << endl;
choose();
break;
}
}
}
void Info::interface()
{
system("clear");
printf("\n");
printf("\n");
printf(" |***********************************************|\n");
printf(" |* 多 功 能 电 子 通 讯 录 *|\n");
printf(" |* *|\n");
printf(" |* 版本号:V_1.0.0*|\n");
printf(" |***********************************************|\n");
printf(" |* *|\n");
printf(" |* 功能选择: 1. 添加好友信息 *|\n");
printf(" |* 2. 查看好友信息 *|\n");
printf(" |* 3. 删除好友信息 *|\n");
printf(" |* 4. 搜索好友信息 *|\n");
printf(" |* 5. 修改好友信息 *|\n");
printf(" |***********************************************|\n");
printf(" |* 请输入你想要实现的功能: *|\n");
printf(" |* *|\n");
printf(" |* 1添加 2查看 3删除 4搜索 5修改 6退出 *|\n");
printf(" |***********************************************|\n");
}
main.cpp
[cpp] view plain copy print?
#include "info.h"
int main()
{
Info s;
s.interface();
s.choose();
return 0;
}
========
C++通讯录
http://www.cnblogs.com/orangebook/p/3514452.htmlC++通讯录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 }
复制代码
复制代码
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 }
复制代码
想改进这个项目的,请持续关注FDA—orangebook.
========
c/c++通讯录
http://blog.youkuaiyun.com/rushierer/article/details/54633233第二个程序是C语言实训的程序
其实和第一个学生成绩管理系统程序差不多,只是多了文件功能!
[cpp] view plain copy
<span style="color: rgb(51, 51, 51); font-family: "Source Code Pro", monospace; font-size: 14px; white-space: pre; background-color: rgba(128, 128, 128, 0.0470588);">Copyright ©Rushierer</span>
[cpp] view plain copy
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 60
typedef struct s_teleBook
{
int number; /*编号*/
char name[15]; /*姓名*/
char phone[12]; /*手机*/
char qq[15]; /*QQ号*/
}TELE;
typedef struct date
{
int infoCount; /*统计数据个数*/
}DATE;
void showMenu(); /*显示菜单*/
void mainMenu(TELE myBook[],int n,DATE date[]); /*显示首页*/
void showdate(TELE myBook[],int n,DATE date[]); /*只显示数据*/
void input(TELE myBook[],int n,DATE date[]); /*从键盘输入数据*/
void searchR(TELE myBook[],int n,DATE date[]); /*查询信息*/
void searchByNumber(TELE myBook[],int n,DATE date[]); /*按编号查询信息*/
void searchByName(TELE myBook[],int n,DATE date[]); /*按名字查询信息*/
void deleteR(TELE myBook[],int n,DATE date[]); /*删除信息*/
void insertR(TELE myBook[],int n,DATE date[]); /*插入信息*/
void modify(TELE myBook[],int n,DATE date[]); /*修改信息*/
void sortR(TELE myBook[],int n,DATE date[]); /*排序信息*/
void sortByName(TELE myBook[],int n,DATE date[]); /*按名字排序*/
void sortByNumber(TELE myBook[],int n,DATE date[]); /*按编号排序*/
void save(TELE myBook[],int n,DATE date[]); /*保存数据到文件*/
void display(TELE myBook[],int n,DATE date[]); /*显示数据*/
void read(TELE myBook[],int n,DATE date[]); /*从文件读取数据*/
int main()
{
int choice;
TELE myBook[N];
DATE date[1];
showMenu();
printf("\n");
printf("欢迎使用通讯录!\n");
printf("\n");
printf("首次使用通讯录,请输入要添加联系人的个数:");
scanf("%d",&date[0].infoCount);
printf("\n");
printf("1进行录入数据 0退出:");
scanf("%d",&choice);
switch(choice)
{
case 1:
system("cls");
input(myBook,date[0].infoCount,date);break;
case 0:
exit(0);break;
}
return 0;
}
/*显示选项Menu*/
void showMenu()
{
printf(" 通讯录管理系统 \n");
printf(" *******************************************\n");
printf(" * *\n");
printf(" * 1 input record 2 search record *\n");
printf(" * 3 delete record 4 insert record *\n");
printf(" * 5 modify record 6 sort record *\n");
printf(" * 7 save record 8 display record *\n");
printf(" * 9 read record 0 quit system *\n");
printf(" * *\n");
printf(" *******************************************\n");
}
/*显示主菜单*/
void mainMenu(TELE myBook[],int n,DATE date[])
{
int choice;
showMenu();
printf("请输入选项(0~9):");
scanf("%d",&choice);
switch(choice)
{
case 1:
system("cls");
input(myBook,n,date);break;
case 2:
system("cls");
searchR(myBook,n,date);break;
case 3:
system("cls");
deleteR(myBook,n,date);break;
case 4:
system("cls");
insertR(myBook,n,date);break;
case 5:
system("cls");
modify(myBook,n,date);break;
case 6:
system("cls");
sortR(myBook,n,date);break;
case 7:
system("cls");
save(myBook,n,date);break;
case 8:
system("cls");
display(myBook,n,date);break;
case 9:
system("cls");
read(myBook,n,date);break;
case 0:
exit(0);break;
}
}
/*从键盘输入联系人信息*/
void input(TELE myBook[],int n,DATE date[])
{
int j,i;
printf(" Input record \n");
printf("*****************************************************\n");
printf("\n");
printf("数据录入格式提示:\n");
printf("1.数据内容:编号、姓名、手机号码、QQ号\n");
printf("2.数据间以空格做间隔,最后回车录入数据结束!\n");
printf("\n");
for(i=0;i<n;i++)
{
printf("请输入第%d个联系人的信息:",i+1);
scanf(" %d",&myBook[i].number);
scanf("%s",myBook[i].name);
scanf("%s",myBook[i].phone);
scanf("%s",myBook[i].qq);
}
printf("\n");
printf("数据录入完成!\n");
printf("\n");
printf("1显示录入的信息 2返回主菜单 0退出:");
scanf("%d",&j);
if(j==1)
{
printf("\n");
display(myBook,n,date);
}
else if(j==2)
{
system("cls");
mainMenu(myBook,n,date);
}
else
exit(0);
}
/*显示所有信息*/
void display(TELE myBook[],int n,DATE date[])
{
int i,j;
printf("所有信息:\n");
printf("\n");
printf("编号 姓名 电话号码 QQ号 \n");
for(i=0;i<n;i++)
{
printf("%-6d%-15s%-15s%-15s\n",myBook[i].number,
myBook[i].name,
myBook[i].phone,
myBook[i].qq);
}
printf("\n");
printf("1返回主菜单 0退出:");
scanf("%d",&j);
if(j==1)
{
system("cls");
mainMenu(myBook,n,date);
}
else
exit(0);
}
/*只显示数据*/
void showdate(TELE myBook[],int n,DATE date[])
{
int i;
printf("已录入的信息:\n");
printf("\n");
printf("编号 姓名 电话号码 QQ号 \n");
for(i=0;i<n;i++)
{
printf("%-6d%-15s%-15s%-15s\n",myBook[i].number,
myBook[i].name,
myBook[i].phone,
myBook[i].qq);
}
}
/*查找数据*/
void searchR(TELE myBook[],int n,DATE date[])
{
int k;
printf(" Search record \n");
printf("*****************************************************\n");
printf("\n");
printf("查找方式:1.按编号查找 2.按姓名查找\n");
printf("请选择查找方式(1/2):");
scanf("%d",&k);
printf("\n");
if(k==1)
{
searchByNumber(myBook,n,date);
}
else
{
searchByName(myBook,n,date);
}
}
/*按编号查询*/
void searchByNumber(TELE myBook[],int n,DATE date[])
{
int i,j,k=0;
int number1;
printf("请输入想查找的编号:");
scanf("%d",&number1);
printf("\n");
printf("查找结果:");
printf("\n");
for(i=0;i<n;i++)
{
if(myBook[i].number==number1)
{
printf("%-6d%-15s%-15s%-15s\n",myBook[i].number,
myBook[i].name,
myBook[i].phone,
myBook[i].qq);
k+=1;
}
}
if(k==0)
printf("输入的编号不存在或输入格式不对!\n");
printf("\n");
printf("1重新查询 2返回主菜单 0退出:");
scanf("%d",&j);
switch(j)
{
case 1:
system("cls");
searchR(myBook,n,date);break;
case 2:
system("cls");
mainMenu(myBook,n,date);break;
case 0:
exit(0);break;
}
}
/*按姓名查询*/
void searchByName(TELE myBook[],int n,DATE date[])
{
int i,j,k=0;
char name1[15];
printf("请输入想查找的姓名:");
scanf("%s",name1);
printf("\n");
printf("查找结果:");
printf("\n");
for(i=0;i<n;i++)
{
if(strcmp(myBook[i].name,name1)==0)
{
printf("%-6d%-15s%-15s%-15s\n",myBook[i].number,
myBook[i].name,
myBook[i].phone,
myBook[i].qq);
k+=1;
}
}
if(k==0)
printf("输入的姓名不存在或输入格式不对!\n");
printf("\n");
printf("1重新查询 2返回主菜单 0退出:");
scanf("%d",&j);
switch(j)
{
case 1:
system("cls");
searchR(myBook,n,date);break;
case 2:
system("cls");
mainMenu(myBook,n,date);break;
case 0:
exit(0);break;
}
}
/*删除信息*/
void deleteR(TELE myBook[],int n,DATE date[])
{
int i,k,j;
printf(" Delete record \n");
printf("*****************************************************\n");
printf("\n");
showdate(myBook,n,date);
printf("已经录入%d个联系人的信息,你想删除第几联系人个的信息:",n);
scanf("%d",&k);
i=k-1;
for(;i<=n-2;i++)
{
strcpy(myBook[i].name,myBook[i+1].name);
strcpy(myBook[i].phone,myBook[i+1].phone);
strcpy(myBook[i].qq,myBook[i+1].qq);
myBook[i].number=myBook[i+1].number;
}
printf("\n");
printf("已成功删除!\n");
date[0].infoCount=date[0].infoCount-1;
n=n-1;
printf("\n");
printf("1显示修改后的信息 2返回主菜单 0退出:");
scanf("%d",&j);
switch(j)
{
case 1:
printf("\n");
display(myBook,n,date);break;
case 2:
system("cls");
mainMenu(myBook,n,date);break;
case 0:
exit(0);break;
}
}
/*插入信息*/
void insertR(TELE myBook[],int n,DATE date[])
{
int i,k,j;
int number;
char name[15]; /*姓名*/
char phone[12]; /*电话*/
char qq[15]; /*QQ号*/
printf(" Insert record \n");
printf("*****************************************************\n");
printf("\n");
showdate(myBook,n,date);
printf("\n");
printf("你想在第几个数据之后插入数据:");
scanf("%d",&k);
if(k>n||k<=0)
{
printf("\n");
printf("输入错误!\n");
printf("请重新输入你想在第几个数据之后插入数据:");
scanf("%d",&i);
k=i;
}
printf("\n");
printf("请输入插入的信息:");
scanf("%d",&number);
scanf("%s",name);
scanf("%s",phone);
scanf("%s",qq);
for(i=n;k+1<=i;i--);
{
strcpy(myBook[i].name,myBook[i-1].name);
strcpy(myBook[i].phone,myBook[i-1].phone);
strcpy(myBook[i].qq,myBook[i-1].qq);
myBook[i].number=myBook[i-1].number;
}
strcpy(myBook[k].name,name);
strcpy(myBook[k].phone,phone);
strcpy(myBook[k].qq,qq);
myBook[k].number=number;
date[0].infoCount=date[0].infoCount+1;
n=n+1;
printf("\n");
printf("插入完成!\n");
printf("\n");
printf("1显示修改后的信息输入 2返回主菜单 0退出:");
scanf("%d",&j);
switch(j)
{
case 1:
printf("\n");
display(myBook,n,date);break;
case 2:
system("cls");
mainMenu(myBook,n,date);break;
case 0:
exit(0);break;
}
}
/*修改信息*/
void modify(TELE myBook[],int n,DATE date[])
{
int i,k,j;
int number;
char name[15]; /*姓名*/
char phone[12]; /*电话*/
char qq[15]; /*QQ号*/
printf(" Modify record \n");
printf("*****************************************************\n");
printf("\n");
showdate(myBook,n,date);
printf("\n");
printf("已经录入%d个联系人的信息,你想修改第几个联系人的记录:",n);
scanf("%d",&k);
if(k>n||k<=0)
{
printf("\n");
printf("输入错误,无这条记录!\n");
printf("请重新输入你想修改第几个联系人的记录:");
scanf("%d",&i);
k=i;
}
printf("\n");
printf("请输入修改后的信息:");
scanf("%d",&number);
scanf("%s",name);
scanf("%s",phone);
scanf("%s",qq);
strcpy(myBook[k-1].name,name);
strcpy(myBook[k-1].phone,phone);
strcpy(myBook[k-1].qq,qq);
myBook[k-1].number=number;
printf("\n");
printf("修改完成!\n");
printf("\n");
printf("1显示修改后的信息 2返回主菜单 0退出:");
scanf("%d",&j);
switch(j)
{
case 1:
printf("\n");
display(myBook,n,date);break;
case 2:
system("cls");
mainMenu(myBook,n,date);break;
case 0:
exit(0);break;
}
}
/*排序信息*/
void sortR(TELE myBook[],int n,DATE date[])
{
int k;
printf(" Sort record \n");
printf("*****************************************************\n");
printf("\n");
printf("排序方式:1.按编号排序 2.按姓名排序\n");
printf("请选择排序方式(1/2):");
scanf("%d",&k);
printf("\n");
if(k==1)
{
sortByNumber(myBook,n,date);
}
else
{
sortByName(myBook,n,date);
}
}
/*按姓名排序信息*/
void sortByName(TELE myBook[],int n,DATE date[])
{
int i,j;
TELE temp;
for(j=1;j<n;j++)
for(i=0;i<n-j;i++)
if(strcmp(myBook[i].name,myBook[i+1].name)>0)
{
temp=myBook[i];
myBook[i]=myBook[i+1];
myBook[i+1]=temp;
}
printf("排序后的信息:\n");
printf("\n");
printf(" 姓名 编号 电话号码 QQ号 \n");
for(i=0;i<n;i++)
{
printf("%-15s%-6d%-15s%-15s\n",myBook[i].name,
myBook[i].number,
myBook[i].phone,
myBook[i].qq);
}
printf("\n");
printf("1重新排序 2返回主菜单 0退出:");
scanf("%d",&j);
switch(j)
{
case 1:
system("cls");
sortR(myBook,n,date);break;
case 2:
system("cls");
mainMenu(myBook,n,date);break;
case 0:
exit(0);break;
}
}
/*按编号排序信息*/
void sortByNumber(TELE myBook[],int n,DATE date[])
{
int i,j;
TELE temp;
for(j=1;j<n;j++)
for(i=0;i<n-j;i++)
if(myBook[i].number>myBook[i+1].number)
{
temp=myBooki[];
myBook[i]=myBook[i+1];
myBook[i+1]=temp;
}
printf("排序后的信息:\n");
printf("\n");
printf("编号 姓名 电话号码 QQ号 \n");
for(i=0;i<n;i++)
{
printf("%-6d%-15s%-15s%-15s\n",myBook[i].number,
myBook[i].name,
myBook[i].phone,
myBook[i].qq);
}
printf("\n");
printf("1重新排序 2返回主菜单 0退出:");
scanf("%d",&j);
switch(j)
{
case 1:
system("cls");
sortR(myBook,n,date);break;
case 2:
system("cls");
mainMenu(myBook,n,date);break;
case 0:
exit(0);break;
}
}
/*保存信息*/
void save(TELE myBook[],int n,DATE date[])
{
FILE *fp;
int i,j;
TELE temp;
printf(" Save record \n");
printf("*****************************************************\n");
if((fp=fopen("teleBook.txt","w"))==NULL) /*以写方式打开文本文件*/
{
printf("Failure to open teleBook.txt!\n");
printf("1返回主菜单 0退出:");
scanf("%d",&j);
if(j==1)
{
system("cls");
mainMenu(myBook,n,date);
}
else
exit(0);
}
for(j=1;j<n;j++) //对全部信息按序号排序后再保存到文件
for(i=0;i<n-j;i++)
if(myBook[i].number>myBook[i+1].number)
{
temp=myBook[i];
myBook[i]=myBook[i+1];
myBook[i+1]=temp;
}
for(i=0;i<n;i++)
{
fprintf(fp," %-6d%-15s%-15s%-15s",myBook[i].number,
myBook[i].name,
myBook[i].phone,
myBook[i].qq);
fprintf(fp,"\n");
}
fclose(fp);
printf("\n");
printf("保存通讯录信息成功!\n");
printf("\n");
printf("可在文件目录查看teleBook.txt文件!\n");
printf("\n");
printf("1返回主菜单 0退出:");
scanf("%d",&j);
if(j==1)
{
system("cls");
mainMenu(myBook,n,date);
}
else
exit(0);
}
/*从文件读取数据*/
void read(TELE myBook[],int n,DATE date[])
{
FILE *fp;
int i,j;
TELE myBook1[N];
printf(" Read record \n");
printf("*****************************************************\n");
printf("\n");
printf("读取信息结果:\n");
printf("\n");
if((fp=fopen("teleBook.txt","r"))==NULL) /*以读方式打开文本文件*/
{
printf("Failure to open teleBook.txt!\n");
printf("可能没有保存数据,可以返回主菜单先保存数据!\n");
printf("1返回主菜单 0退出:");
scanf("%d",&j);
if(j==1)
{
system("cls");
mainMenu(myBook,n,date);
}
else
exit(0);
}
for(i=0;!feof(fp);i++) /*若未读到文件末尾,则继续读*/
{
fscanf(fp," %6d",&myBook1[i].number);
fscanf(fp,"%15s",myBook1[i].name);
fscanf(fp,"%15s",myBook1[i].phone);
fscanf(fp,"%15s",myBook1[i].qq);
}
fclose(fp);
printf("编号 姓名 电话号码 QQ号 \n");
for(i=0;i<n;i++)
{
printf("%-6d%-15s%-15s%-15s",myBook1[i].number,
myBook1[i].name,
myBook1[i].phone,
myBook1[i].qq);
printf("\n");
}
printf("\n");
printf("读取通讯录文件信息成功!\n");
printf("\n");
printf("1返回主菜单 0退出:");
scanf("%d",&j);
if(j==1)
{
system("cls");
mainMenu(myBook,n,date);
}
else
exit(0);
}
========