设计并实现一个简单通讯录管理系统。要求:实现通讯录的建立、通讯者的删除、查询,以及通讯录的保存。
本系统为简单的通讯录管理系统,运行系统时,将从文件中读取已有的数据内容记录在内存中,使用者可以对通讯录进行添加、删除、修改、浏览、查找等操作,每进行一项操作后将内存中的数据写入到文件中,同时并记录操作者的操作内容和当地时间并记录到当前文件夹下的Log.dat文件中。
ADT User
{
数据对象:
D={name,number,add,email,remark|均为string类型}
数据关系:
R={ name,number,add,email,remark}
基本运算:
PeopleData(){}:构造函数
~PeopleData(){}:析构函数
void SetData(string n, string num, string a, string e, string r):对对象的每项私有成员变量变量进行赋值
void SetName(string n):对私有成员变量name变量赋值
void SetNumber(string num):对私有成员变量number变量赋值
void SetAdd(string a):对私有成员变量add变量赋值
void SetEmail(string e):对私有成员变量email变量赋值
void SetRemark(string r):对私有成员变量remark变量赋值
string GetName():返回私有成员变量name值
string GetNumber():返回私有成员变量number值
string GetAdd():返回私有成员变量add值
string GetEmail():返回私有成员变量email值
string GetRemark():返回私有成员变量remark值
}
ADT List
{
数据对象:
D={list | Data类}
数据关系:
R={list}
基本运算:
Function(){}:构造函数
~Function():析构函数
void AddData(Data &):增加一个联系人数据
void SearchData(Data &):查找联系人
int LocateData(Data &, string, int):按姓名或电话号码定位联系人,返回数据的地址
void DeleteData(Data &):删除一个联系人
void SaveData(Data &):保存内存中的数据到文件中
void SearchName(Data &):按姓名查找联系人
void SearchNumber(Data &):按电话号码查找联系人
void OpenFile(Data &):从文件输入数据,初始化
void ShowData(Data &):显示所有联系人的数据
void ShowInfo(Data &, int, int):显示指定联系人数据
void ReviseData(Data &):更改联系人数据
void ReviseConcreteData(Data &, int, int):更改联系人的指定数据
bool Old2New(Data &, int, int, string):显示原联系人信息和新联系人信息,判断是否修改
void About():关于界面
void MenuShow(int):菜单显示
void HomePage():CMD窗体控制
string GetTime():获得系统时间,记录日志时使用
string int2str(int):将int类型数据转换成为string类型数据
void SaveLog(int):将操作日志保存到文件中
}
}
本系统由5个文件组成,其中,2个cpp资源文件,3个h头文件。
一共有3个类,1个结构体,它们的关系如图所示。
联系人类(PeopleData)记录了联系人的基本信息,该类的设计由图所示,类的介绍如表所示。
功能类(Function)提供了通讯录管理系统各功能的实现方式,该类由不同的函数组成,均为Public型。
该类的介绍如表所示。
变量名称 | 类型 | 描述 |
---|---|---|
name | string | 姓名 |
number | string | 电话号码 |
add | string | 地址 |
string | 邮箱 | |
remark | string | 备注 |
功能类(Function)提供了通讯录管理系统各功能的实现方式,该类由不同的函数组成,均为Public型。
该类的介绍如表所示。
函数名称 | 类型 | 描述 |
---|---|---|
AddData(Data &) | void | 添加一个联系人数据 |
SearchData(Data &) | void | 查找联系人 |
LocateData(Data &, string, int) | int | 按姓名或电话号码定位联系人,返回数据的地址 |
DeleteData(Data &) | void | 删除一个联系人 |
SaveData(Data &) | void | 保存内存中的数据到文件中 |
SearchName(Data &) | void | 按姓名查找联系人 |
SearchNumber(Data &) | void | 按电话号码查找联系人 |
OpenFile(Data &) | void | 从文件输入数据,初始化 |
ShowData(Data &) | void | 显示所有联系人的数据 |
ShowInfo(Data &, int, int) | void | 显示指定联系人数据 |
ReviseData(Data &) | void | 更改联系人数据 |
ReviseConcreteData(Data &, int, int) | void | 更改联系人的指定数据 |
Old2New(Data &, int, int, string) | bool | 显示原联系人信息和新联系人信息,判断是否修改 |
About() | void | 关于界面 |
MenuShow(int) | void | 菜单显示 |
HomePage() | void | CMD窗体控制 |
GetTime() | string | 获得系统时间,记录日志时使用 |
int2str(int) | string | 将int类型数据转换成为string类型数据 |
SaveLog(int) | void | 将操作日志保存到文件中 |
数据结构体(Data)记录了联系人线性表的数据和长度,它的定义如下:
struct Data
{
PeopleData user[MaxSize];
int length = 0;
};
类和结构体之间的关系:
定义了PeopleData类之后,在Data结构体中声明PeopleData user[MaxSize]。
定义Function类中,声明结构体对象Data list。
定义了Function类之后,在Main类定义中声明Main类对象Function f。
定义了Main类之后,声明全局类对象Main a。
本系统一共有添加、删除、查找、浏览、修改5个功能模块。
初始化
OpenFile(Data &l)
变量名称 | 变量类型 | 描述 |
---|---|---|
l | Data & | 引用数据表 |
name,number,add,email,remark | string | 联系人各个变量信息 |
infile | ifstream | 从文件流输入 |
添加
Void AddData(Data &l)
变量名称 | 变量类型 | 描述 |
---|---|---|
l | Data & | 引用数据表 |
n,num,a,e,r | string | 联系人各个变量信息 |
查找
SearchData(Data &l)
变量名称 | 变量类型 | 描述 |
---|---|---|
l | Data & | 引用数据表 |
choice | int | 选择指令 |
LocateData(Data &l,string n,int s)
变量名称 | 变量类型 | 描述 |
---|---|---|
l | Data & | 引用数据表 |
n | string | 查找内容 |
s | int | 选择查找方式 |
ShowInfo(Data &l, int i,int s)
变量名称 | 变量类型 | 描述 |
---|---|---|
l | Data & | 引用数据表 |
i | int | 联系人数组地址 |
s | int | 选择查找方式 |
删除
DeleteData(Data &l)
变量名称 | 变量类型 | 描述 |
---|---|---|
l | Data & | 引用数据表 |
n | string | 删除的联系人姓名 |
check | char | 确认删除指令 |
state | int | 查找状态 |
浏览
ShowData(Data &l)
变量名称 | 变量类型 | 描述 |
---|---|---|
l | Data & | 引用数据表 |
修改
ReviseData(Data &l)
变量名称 | 变量类型 | 描述 |
---|---|---|
l | Data & | 引用数据表 |
n | string | 修改的联系人姓名 |
state | int | 查找状态 |
choice | int | 选择修改内容 |
ReviseConcreteData(Data &l,int c,int s)
变量名称 | 变量类型 | 描述 |
---|---|---|
l | Data & | 引用数据表 |
c | int | 选择修改内容 |
s | int | 联系人数组地址 |
Old2New(Data &l, int c,int s, string n)
变量名称 | 变量类型 | 描述 |
---|---|---|
l | Data & | 引用数据表 |
c | int | 选择修改内容 |
s | int | 联系人数组地址 |
n | string | 新修改的内容 |
check | char | 确认修改指令 |
日志记录
GetTime()
变量名称 | 变量类型 | 描述 |
---|---|---|
day, mon, year | int | 记录日,月,年 |
hour, min, sec | int | 记录小时,分钟,秒 |
time | string | 时间字符串 |
int2str(int num)
变量名称 | 变量类型 | 描述 |
---|---|---|
num | int | 待转换数值 |
str | string | 转换后的字符串 |
SaveLog(int n)
变量名称 | 变量类型 | 描述 |
---|---|---|
n | int | 判断操作状态 |
state | int | 将状态值进行判断 |
outfile | ofstream | 向文件流中输入 |
SaveData(Data &l)
变量名称 | 变量类型 | 描述 |
---|---|---|
l | Data & | 引用数据表 |
outfile | ofstream | 向文件流中输入 |
其他
MenuShow(int c)
变量名称 | 变量类型 | 描述 |
---|---|---|
c | int | 菜单显示 |
About()
变量名称 | 变量类型 | 描述 |
---|---|---|
x,y | double | 坐标值 |
3.1查找
查找模块有2中方式进行查找,输入指令1时选择按姓名进行查找,输入指令2时按电话号码进行查找,无论是按姓名查找还是按电话号码查找,都是把当前输入的字符串传递到LocateData()函数中,进行顺序查找,若找到匹配的值,则返回该值在user[]中的逻辑序号,若查找失败,则返回-1。
3.2修改
修改模块允许操作者对联系人的数据进行修改操作,可以修改联系人的姓名、电话号码、地址、邮箱和备注。进行修改操作时,先输入修改联系人的姓名,进行查找操作,若查找失败则退出该模块,若成功则让操作者输入修改内容的指令,同时将联系人数据的原信息保存在temp变量里,调用Old2New()函数,将原信息和新信息进同时显示,方便操作者进行对比操作,最后让操作者确认是否修改。
3.3日志记录
日志记录记录了操作者在本系统的所有操作。
本模块使用ctime头文件,使用GetTime()函数调用系统时间并用int2str()函数将int型数据转化成string数据类型。当完成每一项操作时,则当前时间和该操作的名称(修改、删除等)记录在当前文件夹的Log.dat文件中。
3.4删除
本系统的数据结构本质上线性表的操作,所以进行删除操作时,先进行查找操作,若查找成功则将当前后面的每一项数据表向前移动一位,直到n项数据表移动到n-1位置时则删除成功。
Function.h
struct Data
{
PeopleData user[MaxSize];
int length = 0;
};
class Function
{
public:
Function(){}
~Function();
Data list;
void AddData(Data &);
void SearchData(Data &);
int LocateData(Data &, string, int);
void DeleteData(Data &);
void SaveData(Data &);
void SearchName(Data &);
void SearchNumber(Data &);
void OpenFile(Data &);
void ShowData(Data &);
void ShowInfo(Data &, int, int);
void ReviseData(Data &);
void ReviseConcreteData(Data &, int, int);
bool Old2New(Data &, int, int, string);
void About();
void MenuShow(int);
void HomePage();
string GetTime();
string int2str(int);
void SaveLog(int);
};
class Main
{
public:
Main();
}a;
PeopleData.h
class PeopleData
{
private:
string name;
string number;
string add;
string email;
string remark;
public:
PeopleData(){}
~PeopleData(){}
void SetData(string n, string num, string a, string e, string r);
void SetName(string n){ name = n; }
void SetNumber(string num){ number = num; }
void SetAdd(string a){ add = a; }
void SetEmail(string e){ email = e; }
void SetRemark(string r){ remark = r; }
string GetName(){ return name; }
string GetNumber(){ return number; }
string GetAdd(){ return add; }
string GetEmail(){ return email; }
string GetRemark(){ return remark; };
};
Main类
Main::Main()
{
Function f;
char choice;
f.OpenFile(f.list);
while (1)
{
f.HomePage();
f.MenuShow(0);
cout << "请输入操作指令:";
cin >> choice;
switch (choice)
{
case '0':exit(0); f.SaveData(f.list);
case '1':f.AddData(f.list); f.SaveData(f.list); f.SaveLog(1); break;
case '2':f.DeleteData(f.list); f.SaveData(f.list); f.SaveLog(2); break;
case '3':f.SearchData(f.list); f.SaveData(f.list); f.SaveLog(3); break;
case '4':f.ShowData(f.list); f.SaveData(f.list); f.SaveLog(4); break;
case '5':f.ReviseData(f.list); f.SaveData(f.list); f.SaveLog(5); break;
case 'i':f.About(); break;
default:
cerr << "输入错误,请重新输入。" << endl;
system("PAUSE");
continue;
}
}
}
About()
void Function::About()
{
double x, y;
int H = 3;
for (y = -4; y <= 0; y += 0.3)
{
for (x = -4; x <= 4; x += 0.2)
if (fabs(sqrt(x*x + y*y) - H*sin(2 * atan(y / x))) <= 1 || fabs(sqrt(x*x + y*y) - H*sin(2 * atan(-y / x))) <= 1)
cout << "*";
else
cout << " ";
cout << endl;
}
for (y = -1; y <= 0; y += 0.2)
{
for (x = -4; x <= 4; x += 0.2)
if (fabs(y) - 0.65*x*x >= 0.2)
cout << "*";
else
cout << " ";
cout << endl;
};
cout << " 通讯录" << endl << " 版本:5.0" << endl << endl;;
system("PAUSE");
}