目录

一、前言

二、设计要求

 三、概要设计

3.1 主界面设计

3.1.1 设计图

3.1.2设计代码

3.2 存储结构设计

3.3 系统功能设计

3.3.1 系统流程图​编辑

3.3.2 系统子程序及功能介绍 

四、详细设计

4.1 头文件

4.2 数据定义

4.3 系统主要子程序详细设计

4.3.1 主函数

4.3.2 添加联系人

4.3.3 显示联系人

4.3.4 以姓名查找联系人(返回联系人编号)

4.3.5 以电话号码查找联系人(返回联系人编号)

4.3.6 以住址查找联系人(并返回联系人编号)

4.3.7 删除联系人

4.3.8 查找联系人

4.3.9 修改联系人

4.3.10 备份通讯录

4.3.11 恢复通讯录

4.3.12 清空通讯录

4.3.13 退出程序

五、源代码清单


一、前言

        通讯录管理系统是一个比较实用的小型管理系统。随着生活节奏的加快,人们追求丰富便捷的电子产品体验,因此也提高对便捷方式的喜爱。当今社会下人们的交际范围越来越广泛,通讯录系统的出现,给人们的生活带来了极大便利和帮助,帮助人们处理繁琐复杂的工作,可以帮人们高效的处理和存储信息。

二、设计要求

        使用C++实现一个通讯录管理系统,具有实现通讯录联系人的添加、 删除、查找、修改以及通讯录的清空、备份与还原等功能。

添加联系人:向通讯录中添加联系人,信息包括(姓名、性别、年龄、联系方式、住址)最多记录1000人。

显示联系人:显示通讯录中所有联系人信息。

删除联系人:按照用户需求进行删除指定联系人。

查找联系人:按照用户需求查看指定联系人信息。

修改联系人:按照用户需求重新修改指定联系人。

备份通讯录:将通讯录数据备份到文件中。

恢复通讯录:将备份的数据恢复到通讯录中。

清空通讯录:清空通讯录中所有信息。

退出通讯录:退出当前使用的通讯录。

 三、概要设计

3.1 主界面设计

3.1.1 设计图

cbc8edc0a1d1401b819febd9d9601b4a.png

3.1.2设计代码

void showMenu()
{
    cout << "***********************" << endl
         << "*****1、添加联系人*****" << endl
         << "*****2、显示联系人*****" << endl
         << "*****3、删除联系人*****" << endl
         << "*****4、查找联系人*****" << endl
         << "*****5、修改联系人*****" << endl
         << "*****6、备份通讯录*****" << endl
         << "*****7、恢复通讯录*****" << endl
         << "*****8、清空通讯录*****" << endl
         << "*****0、退出通讯录*****" << endl
         << "***********************" << endl;
}

3.2 存储结构设计

        声明一个通讯录结构体,存储联系人结构体和人数。联系人结构体存储的内容有姓名、性别、年龄、电话号码、住址。 

d7e9addcf9ce4146aaa723415beb38bc.png

3.3 系统功能设计

3.3.1 系统流程图328fbdc11a744cacb3280cd971427a92.png

3.3.2 系统子程序及功能介绍 

函数名

功能

int main()

主函数

void showMenu()

菜单调用

void addPerson(addressbook *abs)

添加联系人

void showPerson(const addressbook *abs)

显示联系人

int namefind(addressbook *abs)

int phonefind(addressbook *abs)

int addressfind(addressbook *abs)

按需求查找联系人

(姓名、电话号码、住址)

返回联系人编号

void deletePerson(addressbook *abs)

删除联系人

void findPerson(addressbook *abs)

查找联系人

void modifyPerson(addressbook *abs)

修改联系人

void ofaddressbook(const addressbook *abs)

备份通讯录

void ifaddressbook(addressbook *abs)

恢复通讯录

void cleanPerson(addressbook *abs)

清空联系人

void end()

退出通讯录

四、详细设计

4.1 头文件

#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;

4.2 数据定义

const int MAX= 1e3+10; //最大人数

struct Person
{
    string name;    //姓名
    string sex;     //性别
    int age;        //年龄
    string phone;   //电话号码
    string address; //住址
};

struct addressbook
{
    Person personarray[MAX]; //通讯录中保存的联系人数组
    int size;                //通讯录中人员个数
};

4.3 系统主要子程序详细设计

4.3.1 主函数

int main()
{
    int select;
    addressbook abs;
    abs.size = 0;
    while (true)
    {
        showMenu(); //菜单调用
        cin >> select;
        system("clear");
        switch (select)
        {
        case 0: //退出通讯录
            end();
            break;
        case 1: //添加联系人
            addPerson(&abs);
            break;
        case 2: //显示联系人
            showPerson(&abs);
            break;
        case 3: //删除联系人
            deletePerson(&abs);
            break;
        case 4: //查找联系人
            findPerson(&abs);
            break;
        case 5: //修改联系人
            modifyPerson(&abs);
            break;
        case 6: //备份通讯录
            ofaddressbook(&abs);
            break;
        case 7: //恢复通讯录
            ifaddressbook(&abs);
            break;
        case 8: //清空通讯录
            cleanPerson(&abs);
            break;
        default:
            cout << "输入错误,请重新输入" << endl;
            cout << "请按任意键并回车继续" << endl; // MAC系统
            cin >> select;                          // MAC系统
            system("clear");                        // MAC系统
            // system("pause");WINDOWS系统
            // system("cls");WINDOWS系统
            continue;
        }
        cout << "请按任意键并回车继续" << endl; // MAC系统
        cin >> select;                          // MAC系统
        system("clear");                        // MAC系统
        // system("pause");WINDOWS系统
        // system("cls");WINDOWS系统
    }
    return 0;
}

4.3.2 添加联系人

        在主菜单按“1”运行,分别输入姓名、性别、年龄、电话、住址。

void addPerson(addressbook *abs)
{
    if (abs->size == MAX) //判断通讯录人数是否已满
    {
        cout << "通讯录人数已满" << endl;
    }
    else
    {
        cout << "请输入姓名:";
        cin >> abs->personarray[abs->size].name;
        cout << "请输入性别:";
        cin >> abs->personarray[abs->size].sex;
        cout << "请输入年龄:";
        cin >> abs->personarray[abs->size].age;
        cout << "请输入电话号码:";
        cin >> abs->personarray[abs->size].phone;
        cout << "请输入住址:";
        cin >> abs->personarray[abs->size].address;
        abs->size++;
        cout << "联系人添加成功" << endl;
    }
}

4.3.3 显示联系人

        在主菜单按“2”运行,分别显示输入的所有联系人信息。

void showPerson(const addressbook *abs)
{
    if (abs->size) //判断人数是否为零
    {
        for (int i = 0; i < abs->size; i++)
        {
            cout << "姓名:" << abs->personarray[i].name
                 << "\t性别:" << abs->personarray[i].sex
                 << "\t年龄:" << abs->personarray[i].age
                 << "\t电话号码:" << abs->personarray[i].phone
                 << "\t住址:" << abs->personarray[i].address
                 << endl;
        }
    }
    else
    {
        cout << "通讯录为空" << endl;
    }
}

4.3.4 以姓名查找联系人(返回联系人编号)

int namefind(addressbook *abs)
{
    string name;
    cout << "请输入您要查找联系人的姓名" << endl;
    cin >> name;
    for (int i = 0; i < abs->size; i++) //查找输入的联系人
    {
        if (name.compare(abs->personarray[i].name) == 0)
        {
            return i;
        }
    }
    return -1;
}

4.3.5 以电话号码查找联系人(返回联系人编号)

int phonefind(addressbook *abs)
{
    string phone;
    cout << "请输入您要查找联系人的电话号码" << endl;
    cin >> phone;
    for (int i = 0; i < abs->size; i++) //查找输入的联系人
    {
        if (phone.compare(abs->personarray[i].phone) == 0)
        {
            return i;
        }
    }
    return -1;
}

4.3.6 以住址查找联系人(并返回联系人编号)

int addressfind(addressbook *abs)
{
    string address;
    cout << "请输入您要查找联系人住址" << endl;
    cin >> address;
    for (int i = 0; i < abs->size; i++) //查找输入的联系人
    {
        if (address.compare(abs->personarray[i].address) == 0)
        {
            return i;
        }
    }
    return -1;
}

4.3.7 删除联系人

        在主菜单按“3”运行,选择按1.姓名2.电话号码3.住址,然后输入一定的数据,通讯录有该联系人则删除,没有则输出查无此人。

void deletePerson(addressbook *abs)
{
    int n;
    cout << "请输入查询方式\n1.姓名\n2.电话号码\n3.住址" << endl;
    cin >> n;
    switch (n) //选择查询方式
    {
    case 1:
        n = namefind(abs);
        break;
    case 2:
        n = phonefind(abs);
        break;
    case 3:
        n = addressfind(abs);
        break;
    default:
        cout << "您输入有误,请重新输入" << endl;
    }
    system("clear");
    if (n != -1)
    {
        abs->personarray[n] = abs->personarray[abs->size - 1]; //替换将删除的联系人
        abs->size--;                                           //通讯录人数-1
        cout << "删除成功" << endl;
    }
    else
    {
        cout << "查无此人" << endl;
    }
}

4.3.8 查找联系人

        在主菜单按“4”运行,选择按1.姓名2.电话号码3.住址,然后输入一定的数据,通讯录有该联系人则显示,没有则输出查无此人。

void findPerson(addressbook *abs)
{
    int n;
    cout << "请输入查询方式\n1.姓名\n2.电话号码\n3.住址" << endl;
    cin >> n;
    switch (n) //选择查询方式
    {
    case 1:
        n = namefind(abs);
        break;
    case 2:
        n = phonefind(abs);
        break;
    case 3:
        n = addressfind(abs);
        break;
    default:
        cout << "您输入有误,请重新输入" << endl;
    }
    system("clear");
    if (n != -1)
    {
        cout << "姓名:" << abs->personarray[n].name
             << "\t性别:" << abs->personarray[n].sex
             << "\t年龄:" << abs->personarray[n].age
             << "\t电话号码:" << abs->personarray[n].phone
             << "\t住址:" << abs->personarray[n].address
             << endl;
    }
    else
    {
        cout << "查无此人" << endl;
    }
}

4.3.9 修改联系人

        在主菜单按“5”运行,选择按1.姓名2.电话号码3.住址,然后输入一定的数据,通讯录有该联系人提示用户输入数据并修改,没有则输出查无此人。

void modifyPerson(addressbook *abs)
{
    int n;
    cout << "请输入查询方式\n1.姓名\n2.电话号码\n3.住址" << endl;
    cin >> n;
    switch (n) //选择查询方式
    {
    case 1:
        n = namefind(abs);
        break;
    case 2:
        n = phonefind(abs);
        break;
    case 3:
        n = addressfind(abs);
        break;
    default:
        cout << "您输入有误,请重新输入" << endl;
    }
    system("clear");
    if (n != -1)
    {
        cout << "请输入修改后的姓名:";
        cin >> abs->personarray[n].name;
        cout << "请输入修改后的性别:";
        cin >> abs->personarray[n].sex;
        cout << "请输入修改后的年龄:";
        cin >> abs->personarray[n].age;
        cout << "请输入修改后的电话号码:";
        cin >> abs->personarray[n].phone;
        cout << "请输入修改后的住址:";
        cin >> abs->personarray[n].address;
        cout << "修改成功" << endl;
    }
    else
    {
        cout << "查无此人" << endl;
    }
}

4.3.10 备份通讯录

        在主菜单按“6”运行,将通讯录数据备份到文件中。

void ofaddressbook(const addressbook *abs)
{
    ofstream ofs;
    ofs.open("addressbook.txt", ios::out); //打开文件
    ofs << "姓名\t性别\t年龄\t电话号码\t住址" << endl;
    for (int i = 0; i < abs->size; i++)
    {
        ofs << abs->personarray[i].name
            << "\t\t" << abs->personarray[i].sex
            << "\t\t" << abs->personarray[i].age
            << "\t\t" << abs->personarray[i].phone
            << "\t\t" << abs->personarray[i].address
            << endl;
    }
    ofs.close(); //关闭文件
    cout << "备份成功" << endl;
}

4.3.11 恢复通讯录

        在主菜单按“7”运行,将文件数据恢复到通讯录中。

void ifaddressbook(addressbook *abs)
{
    string temp;
    ifstream ifs;
    ifs.open("addressbook.txt", ios::in); //打开文件
    if (ifs.is_open())
    {
        getline(ifs, temp); //将文件上方的标签输入到临时字符串
        while (ifs >> abs->personarray[abs->size].name >> abs->personarray[abs->size].sex >> abs->personarray[abs->size].age >> abs->personarray[abs->size].phone >> abs->personarray[abs->size].address)
        {
            abs->size++; //人数+1
        }
        ifs.close(); //关闭文件
        cout << "恢复成功" << endl;
    }
    else
    {
        cout << "文件打开失败" << endl;
    }
}

4.3.12 清空通讯录

        在主菜单按“8”运行,将通讯录中成员全部清空。

void cleanPerson(addressbook *abs)
{
    abs->size = 0; //将通讯录清空
    cout << "通讯录已清空" << endl;
}

4.3.13 退出程序

        在主菜单按“0”运行,退出通讯录管理系统。

void end()
{
    cout << "欢迎下次使用" << endl;
    exit(0); //退出程序
}

五、源代码清单

#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;

const int MAX = 1e3 + 10; // 最大人数

struct Person
{
    string name;    // 姓名
    string sex;     // 性别
    int age;        // 年龄
    string phone;   // 电话号码
    string address; // 住址
};

struct addressbook
{
    Person personarray[MAX]; // 通讯录中保存的联系人数组
    int size;                // 通讯录中人员个数
};

void showMenu();
void addPerson(addressbook *abs);
void showPerson(const addressbook *abs);
int namefind(addressbook *abs);
int phonefind(addressbook *abs);
int addressfind(addressbook *abs);
void deletePerson(addressbook *abs);
void findPerson(addressbook *abs);
void modifyPerson(addressbook *abs);
void ofaddressbook(const addressbook *abs);
void ifaddressbook(addressbook *abs);
void cleanPerson(addressbook *abs);
void end();

int main()
{
    int select;
    addressbook abs;
    abs.size = 0;
    while (true)
    {
        showMenu(); // 菜单调用
        cin >> select;
        system("clear");
        switch (select)
        {
        case 0: // 退出通讯录
            end();
            break;
        case 1: // 添加联系人
            addPerson(&abs);
            break;
        case 2: // 显示联系人
            showPerson(&abs);
            break;
        case 3: // 删除联系人
            deletePerson(&abs);
            break;
        case 4: // 查找联系人
            findPerson(&abs);
            break;
        case 5: // 修改联系人
            modifyPerson(&abs);
            break;
        case 6: // 备份通讯录
            ofaddressbook(&abs);
            break;
        case 7: // 恢复通讯录
            ifaddressbook(&abs);
            break;
        case 8: // 清空通讯录
            cleanPerson(&abs);
            break;
        default:
            cout << "输入错误,请重新输入" << endl;
            cout << "请按任意键并回车继续" << endl; // MAC系统
            cin >> select;                          // MAC系统
            system("clear");                        // MAC系统
            // system("pause");WINDOWS系统
            // system("cls");WINDOWS系统
            continue;
        }
        cout << "请按任意键并回车继续" << endl; // MAC系统
        cin >> select;                          // MAC系统
        system("clear");                        // MAC系统
        // system("pause");WINDOWS系统
        // system("cls");WINDOWS系统
    }
    return 0;
}

void showMenu()
{
    cout << "***********************" << endl
         << "*****1、添加联系人*****" << endl
         << "*****2、显示联系人*****" << endl
         << "*****3、删除联系人*****" << endl
         << "*****4、查找联系人*****" << endl
         << "*****5、修改联系人*****" << endl
         << "*****6、备份通讯录*****" << endl
         << "*****7、恢复通讯录*****" << endl
         << "*****8、清空通讯录*****" << endl
         << "*****0、退出通讯录*****" << endl
         << "***********************" << endl;
}

void addPerson(addressbook *abs)
{
    if (abs->size == MAX) // 判断通讯录人数是否已满
    {
        cout << "通讯录人数已满" << endl;
    }
    else
    {
        cout << "请输入姓名:";
        cin >> abs->personarray[abs->size].name;
        cout << "请输入性别:";
        cin >> abs->personarray[abs->size].sex;
        cout << "请输入年龄:";
        cin >> abs->personarray[abs->size].age;
        cout << "请输入电话号码:";
        cin >> abs->personarray[abs->size].phone;
        cout << "请输入住址:";
        cin >> abs->personarray[abs->size].address;
        abs->size++;
        cout << "联系人添加成功" << endl;
    }
}

void showPerson(const addressbook *abs)
{
    if (abs->size) // 判断人数是否为零
    {
        for (int i = 0; i < abs->size; i++)
        {
            cout << "姓名:" << abs->personarray[i].name
                 << "\t性别:" << abs->personarray[i].sex
                 << "\t年龄:" << abs->personarray[i].age
                 << "\t电话号码:" << abs->personarray[i].phone
                 << "\t住址:" << abs->personarray[i].address
                 << endl;
        }
    }
    else
    {
        cout << "通讯录为空" << endl;
    }
}

int namefind(addressbook *abs)
{
    string name;
    cout << "请输入您要查找联系人的姓名" << endl;
    cin >> name;
    for (int i = 0; i < abs->size; i++) // 查找输入的联系人
    {
        if (name.compare(abs->personarray[i].name) == 0)
        {
            return i;
        }
    }
    return -1;
}

int phonefind(addressbook *abs)
{
    string phone;
    cout << "请输入您要查找联系人的电话号码" << endl;
    cin >> phone;
    for (int i = 0; i < abs->size; i++) // 查找输入的联系人
    {
        if (phone.compare(abs->personarray[i].phone) == 0)
        {
            return i;
        }
    }
    return -1;
}

int addressfind(addressbook *abs)
{
    string address;
    cout << "请输入您要查找联系人住址" << endl;
    cin >> address;
    for (int i = 0; i < abs->size; i++) // 查找输入的联系人
    {
        if (address.compare(abs->personarray[i].address) == 0)
        {
            return i;
        }
    }
    return -1;
}

void deletePerson(addressbook *abs)
{
    int n;
    cout << "请输入查询方式\n1.姓名\n2.电话号码\n3.住址" << endl;
    cin >> n;
    switch (n) // 选择查询方式
    {
    case 1:
        n = namefind(abs);
        break;
    case 2:
        n = phonefind(abs);
        break;
    case 3:
        n = addressfind(abs);
        break;
    default:
        cout << "您输入有误,请重新输入" << endl;
    }
    system("clear");
    if (n != -1)
    {
        abs->personarray[n] = abs->personarray[abs->size - 1]; // 替换将删除的联系人
        abs->size--;                                           // 通讯录人数-1
        cout << "删除成功" << endl;
    }
    else
    {
        cout << "查无此人" << endl;
    }
}

void findPerson(addressbook *abs)
{
    int n;
    cout << "请输入查询方式\n1.姓名\n2.电话号码\n3.住址" << endl;
    cin >> n;
    switch (n) // 选择查询方式
    {
    case 1:
        n = namefind(abs);
        break;
    case 2:
        n = phonefind(abs);
        break;
    case 3:
        n = addressfind(abs);
        break;
    default:
        cout << "您输入有误,请重新输入" << endl;
    }
    system("clear");
    if (n != -1)
    {
        cout << "姓名:" << abs->personarray[n].name
             << "\t性别:" << abs->personarray[n].sex
             << "\t年龄:" << abs->personarray[n].age
             << "\t电话号码:" << abs->personarray[n].phone
             << "\t住址:" << abs->personarray[n].address
             << endl;
    }
    else
    {
        cout << "查无此人" << endl;
    }
}

void modifyPerson(addressbook *abs)
{
    int n;
    cout << "请输入查询方式\n1.姓名\n2.电话号码\n3.住址" << endl;
    cin >> n;
    switch (n) // 选择查询方式
    {
    case 1:
        n = namefind(abs);
        break;
    case 2:
        n = phonefind(abs);
        break;
    case 3:
        n = addressfind(abs);
        break;
    default:
        cout << "您输入有误,请重新输入" << endl;
    }
    system("clear");
    if (n != -1)
    {
        cout << "请输入修改后的姓名:";
        cin >> abs->personarray[n].name;
        cout << "请输入修改后的性别:";
        cin >> abs->personarray[n].sex;
        cout << "请输入修改后的年龄:";
        cin >> abs->personarray[n].age;
        cout << "请输入修改后的电话号码:";
        cin >> abs->personarray[n].phone;
        cout << "请输入修改后的住址:";
        cin >> abs->personarray[n].address;
        cout << "修改成功" << endl;
    }
    else
    {
        cout << "查无此人" << endl;
    }
}

void ofaddressbook(const addressbook *abs)
{
    ofstream ofs;
    ofs.open("addressbook.txt", ios::out); // 打开文件
    ofs << "姓名\t性别\t年龄\t电话号码\t住址" << endl;
    for (int i = 0; i < abs->size; i++)
    {
        ofs << abs->personarray[i].name
            << "\t\t" << abs->personarray[i].sex
            << "\t\t" << abs->personarray[i].age
            << "\t\t" << abs->personarray[i].phone
            << "\t\t" << abs->personarray[i].address
            << endl;
    }
    ofs.close(); // 关闭文件
    cout << "备份成功" << endl;
}

void ifaddressbook(addressbook *abs)
{
    string temp;
    ifstream ifs;
    ifs.open("addressbook.txt", ios::in); // 打开文件
    if (ifs.is_open())
    {
        getline(ifs, temp); // 将文件上方的标签输入到临时字符串
        while (ifs >> abs->personarray[abs->size].name >> abs->personarray[abs->size].sex >> abs->personarray[abs->size].age >> abs->personarray[abs->size].phone >> abs->personarray[abs->size].address)
        {
            abs->size++; // 人数+1
        }
        ifs.close(); // 关闭文件
        cout << "恢复成功" << endl;
    }
    else
    {
        cout << "文件打开失败" << endl;
    }
}

void cleanPerson(addressbook *abs)
{
    abs->size = 0; // 将通讯录清空
    cout << "通讯录已清空" << endl;
}

void end()
{
    cout << "欢迎下次使用" << endl;
    exit(0); // 退出程序
}

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐