我是靠谱客的博主 尊敬柠檬,最近开发中收集的这篇文章主要介绍数据结构课程设计 - 通讯录管理系统一、 问题描述及要求二、 需求分析三、总体设计四、详细设计,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、 问题描述及要求

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

二、 需求分析

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

这里写图片描述

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

这里写图片描述

四、详细设计

本系统由5个文件组成,其中,2个cpp资源文件,3个h头文件。
一共有3个类,1个结构体,它们的关系如图所示。
这里写图片描述

1、类和结构体介绍:

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

这里写图片描述

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

变量名称类型描述
namestring姓名
numberstring电话号码
addstring地址
emailstring邮箱
remarkstring备注

功能类(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()voidCMD窗体控制
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)

变量名称变量类型描述
lData &引用数据表
name,number,add,email,remarkstring联系人各个变量信息
infileifstream从文件流输入

添加
Void AddData(Data &l)

变量名称变量类型描述
lData &引用数据表
n,num,a,e,rstring联系人各个变量信息

查找
SearchData(Data &l)

变量名称变量类型描述
lData &引用数据表
choiceint选择指令

LocateData(Data &l,string n,int s)

变量名称变量类型描述
lData &引用数据表
nstring查找内容
sint选择查找方式

ShowInfo(Data &l, int i,int s)

变量名称变量类型描述
lData &引用数据表
iint联系人数组地址
sint选择查找方式

删除
DeleteData(Data &l)

变量名称变量类型描述
lData &引用数据表
nstring删除的联系人姓名
checkchar确认删除指令
stateint查找状态

浏览
ShowData(Data &l)

变量名称变量类型描述
lData &引用数据表

修改
ReviseData(Data &l)

变量名称变量类型描述
lData &引用数据表
nstring修改的联系人姓名
stateint查找状态
choiceint选择修改内容

ReviseConcreteData(Data &l,int c,int s)

变量名称变量类型描述
lData &引用数据表
cint选择修改内容
sint联系人数组地址

Old2New(Data &l, int c,int s, string n)

变量名称变量类型描述
lData &引用数据表
cint选择修改内容
sint联系人数组地址
nstring新修改的内容
checkchar确认修改指令

日志记录
GetTime()

变量名称变量类型描述
day, mon, yearint记录日,月,年
hour, min, secint记录小时,分钟,秒
timestring时间字符串

int2str(int num)

变量名称变量类型描述
numint待转换数值
strstring转换后的字符串

SaveLog(int n)

变量名称变量类型描述
nint判断操作状态
stateint将状态值进行判断
outfileofstream向文件流中输入

SaveData(Data &l)

变量名称变量类型描述
lData &引用数据表
outfileofstream向文件流中输入

其他
MenuShow(int c)

变量名称变量类型描述
cint菜单显示

About()

变量名称变量类型描述
x,ydouble坐标值

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主页面
这里写图片描述

4.2添加
这里写图片描述

4.3查找
这里写图片描述

4.4删除
这里写图片描述

4.5修改
这里写图片描述

4.6浏览
这里写图片描述

4.7错误界面
这里写图片描述
这里写图片描述

4.8日志记录
这里写图片描述

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

最后

以上就是尊敬柠檬为你收集整理的数据结构课程设计 - 通讯录管理系统一、 问题描述及要求二、 需求分析三、总体设计四、详细设计的全部内容,希望文章能够帮你解决数据结构课程设计 - 通讯录管理系统一、 问题描述及要求二、 需求分析三、总体设计四、详细设计所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部