数据结构课程设计 - 通讯录管理系统

一、 问题描述及要求

设计并实现一个简单通讯录管理系统。要求:实现通讯录的建立、通讯者的删除、查询,以及通讯录的保存。

二、 需求分析

本系统为简单的通讯录管理系统,运行系统时,将从文件中读取已有的数据内容记录在内存中,使用者可以对通讯录进行添加、删除、修改、浏览、查找等操作,每进行一项操作后将内存中的数据写入到文件中,同时并记录操作者的操作内容和当地时间并记录到当前文件夹下的Log.dat文件中。

三、总体设计

1. 程序中用到的所有抽象数据类型定义

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():返回私有成员变量numberstring GetAdd():返回私有成员变量addstring 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):将操作日志保存到文件中
        }
}

2.主程序流程图

数据结构课程设计 - 通讯录管理系统_第1张图片

3. 各程序模块之间的层次(调用)关系

数据结构课程设计 - 通讯录管理系统_第2张图片

四、详细设计

本系统由5个文件组成,其中,2个cpp资源文件,3个h头文件。
一共有3个类,1个结构体,它们的关系如图所示。
数据结构课程设计 - 通讯录管理系统_第3张图片

1、类和结构体介绍:

联系人类(PeopleData)记录了联系人的基本信息,该类的设计由图所示,类的介绍如表所示。

数据结构课程设计 - 通讯录管理系统_第4张图片

功能类(Function)提供了通讯录管理系统各功能的实现方式,该类由不同的函数组成,均为Public型。
该类的介绍如表所示。

变量名称 类型 描述
name string 姓名
number string 电话号码
add string 地址
email 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。

2、各功能模块实现函数

本系统一共有添加、删除、查找、浏览、修改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、关键算法分析

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位置时则删除成功。

4、程序运行截图

4.1主页面
数据结构课程设计 - 通讯录管理系统_第5张图片

4.2添加
数据结构课程设计 - 通讯录管理系统_第6张图片

4.3查找
数据结构课程设计 - 通讯录管理系统_第7张图片

4.4删除
数据结构课程设计 - 通讯录管理系统_第8张图片

4.5修改
数据结构课程设计 - 通讯录管理系统_第9张图片

4.6浏览
数据结构课程设计 - 通讯录管理系统_第10张图片

4.7错误界面
数据结构课程设计 - 通讯录管理系统_第11张图片
数据结构课程设计 - 通讯录管理系统_第12张图片

4.8日志记录
数据结构课程设计 - 通讯录管理系统_第13张图片

5.部分源代码

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");
}

你可能感兴趣的:(C++库,算法与数据结构库)