通讯录

298 阅读12分钟

通讯录

通讯录功能

作为一个通讯录要有以下基本功能

  • 创建用户
  1. 添加联系人
  2. 显示联系人
  3. 删除联系人
  4. 查找联系人
  5. 修改联系人
  6. 清空联系人
  7. 退出通讯录

通讯录的制作

首页

我们首先需要一个首页用于给用户使用方法

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

这样我们就能得到一个功能明显的页面。

使用

用分支结构来完成不同功能的选择

    //菜单的调用
        shoumenu();
        cin >> select;
        switch (select) {
            
                break;
            case 2://2、显示联系人break;
            case 3: //3、删除联系人break;
            case 4://4、查找联系人break;
            case 5://5、修改联系人break;
            case 6: //6、清空联系人break;
            case 0://0、推出通讯录
                
                break;
        }

首先将目录显示出来给用户看

用此分支结构可以通过输入不同的数字来达成不同的效果以达到目录的效果

使用0.退出通讯录

首先来想一想这么退出这个程序吧

当输入0

就代表用户想要退出

    case 0://0、推出通讯录
                cout << "欢迎下次使用" << endl;
                system("pause");//请按任意键继续
                return 0;
                break;

这样后就可以做出退出的效果

使用1.添加联系人

作为一个通讯录最基础的功能一定就是添加联系人啦

一个联系人有些什么要素呢?

  1. 姓名
  2. 性别
  3. 年龄
  4. 电话
  5. 地址

这五个要素组成了联系人,我们做一个结构体来储存这些要素

这就是联系人的结构体

struct person {
    //姓名
    string m_name;
    //性别
    int m_sex;
    //年龄
    int m_age;
    //电话
    string m_phone;
    //地址
    string m_addr;
};

我们再创立数组来接收输入的信息

这就是通讯录的结构体

struct addressbooks {
    //通讯录中保存的联系人数组
    struct person personarray[MAX];
​
    //通讯录当前记录联系人个数
    int m_size;
​
};

在这个addressbooks结构体中给person结构体创立了一个数组personarray[MAX];大小为MAX==1000

并同时定义了通讯录人员序列m_size

接下来就是进行数据的添加

//1、添加联系人
void addperson(addressbooks * abs) {
//判断通讯录是否已满,如果满了就不再添加
    if (abs->m_size == MAX) {
        cout << "通讯录已满,无法添加!" << endl;
        return;
    } else {
        //添加具体联系人//姓名
        string name;
        cout << "请输入姓名: " << endl;
        cin >> name;
        abs->personarray[abs->m_size].m_name = name;
​
        //性别
        cout << "请输入性别: " << endl;
        cout << "1 --- 男" << endl;
        cout << "2 --- 女" << endl;
        int sex = 0;
        while (1) {
            //如果输入的是正确的1或者2就可以退出再循环
            //如果输入的是错误的值就重新输入
            cin >> sex;
​
            if (sex == 1 || sex == 2) {
                abs->personarray[abs->m_size].m_sex = sex;
                break;
            }
            cout << "输入有误,请重新输入" << endl;
        }
​
        //年龄
        cout << "请输入年龄: " << endl;
        int age = 0;
        cin >> age;
        abs->personarray[abs->m_size].m_age = age;
​
​
        //电话
        cout << "请输入电话号码: " << endl;
        string phone;
        cin >> phone;
        abs->personarray[abs->m_size].m_phone = phone;
​
        //地址
        cout << "请输入家庭住址: " << endl;
        string address;
        cin >> address;
        abs->personarray[abs->m_size].m_addr = address;
​
        abs->m_size++;//更新人物数据
        cout << "添加成功" << endl;
        system("pause");//请按任意键继续
        system("cls");//清屏幕
        //这样就可以重新进行下一步步骤
    }
}
​
​
​
​

定义一个名为addperson的函数用于人员的添加

首先这个函数的输入值是addressbooks结构体并用指针形式定义abs

一进入函数就是判断人员有没有超过最大限量MAX没有就可以进入下一个阶段正式的输入首先就是

  • 姓名

    //姓名
            string name;
            cout << "请输入姓名: " << endl;
            cin >> name;
            abs->personarray[abs->m_size].m_name = name;
    

    输入name并把name的内容储存到addressbooks结构体中的abs地址指向person结构体的personarray数组的第[m_size]号数组储存于m_name位置

  • 性别

    //性别
            cout << "请输入性别: " << endl;
            cout << "1 --- 男" << endl;
            cout << "2 --- 女" << endl;
            int sex = 0;
            while (1) {
                //如果输入的是正确的1或者2就可以退出再循环
                //如果输入的是错误的值就重新输入
                cin >> sex;
    ​
                if (sex == 1 || sex == 2) {
                    abs->personarray[abs->m_size].m_sex = sex;
                    break;
                }
                cout << "输入有误,请重新输入" << endl;
            }
    ​
    

    对于性别只有两个选项1,2;分别对应男,女;如果输入其他数据就会报错并要求重新输入用一个while(1) 死循环来完成,如果输入正确就可以用break 退出循环

    定义 sex 输入sex 把输入值记录到addressbooks结构体中的abs地址指向person结构体的personarray数组的第[m_size]号数组储存于m_sex位置

  • 年龄

        //年龄
            cout << "请输入年龄: " << endl;
            int age = 0;
            cin >> age;
            abs->personarray[abs->m_size].m_age = age;
    ​
    ​
    

同上定义 age 输入age 把输入值记录到addressbooks结构体中的abs地址指向person结构体的personarray数组的第[m_size]号数组储存于m_age位置

  • 电话

    //电话
            cout << "请输入电话号码: " << endl;
            string phone;
            cin >> phone;
            abs->personarray[abs->m_size].m_phone = phone;
    ​
    
  • 地址

        //地址
            cout << "请输入家庭住址: " << endl;
            string address;
            cin >> address;
            abs->personarray[abs->m_size].m_addr = address;
    ​
    

最后展现出来的效果就是这样的

这时候就把序号增加方便记录下一个人员

当我们想进行下一步时我们应该把这些东西隐藏起来

abs->m_size++;//更新人物数据
        cout << "添加成功" << endl;
        system("pause");//请按任意键继续
        system("cls");//清屏幕
        //这样就可以重新进行下一步步骤

system("cls"); 可以将循环内显示的东西清空

效果就是这样的。到这里我们就完成了一个人员的添加

要想添加下一位成员只要再输入1

就可以输入第二位成员的信息啦。

使用2.显示联系人

作为一个通讯录,其功能必定是记录呀,记录了我们应该如何看呢。这时候我们就要把已记录的联系人给显示出来了

这时候我们就可以定义一个showperson函数将联系人地址传入用来完成显示所有联系人

//2.显示所有联系人
void showperson(addressbooks * abs) {
    //判断人员是否为0,若为0则提示记录为0
    //若不是0则显示联系人
    if (abs->m_size == 0) {
        cout << "记录为0" << endl;
    } else {
        for (int i = 0; i < abs->m_size; i++) {
            cout << "姓名: " << abs->personarray[i].m_name << "\t";
            cout << "性别: " << (abs->personarray[i].m_sex == 1 ? "男" : "女") << "\t";
            cout << "年龄: " << abs->personarray[i].m_age << "\t";
            cout << "电话: " << abs->personarray[i].m_phone << "\t";
            cout << "地址: " << abs->personarray[i].m_addr << endl;
        }
​
    }
    system("pause");//请按任意键继续,有暂停等我发令的意思
    system("cls");//清屏幕
}

//判断人员是否为0,若为0则提示记录为0,若不是0则显示联系人

这是我们首先需要做的,很简单用一个if分支就好了

接下来就是for循环把personarray的内容遍历并输出

同样的在完成这功能之后应该返回目录也就是进行屏幕的清空。

system("pause");//请按任意键继续,有暂停等我发令的意思 system("cls");//清屏幕

使用3.删除联系人
//3.删除联系人,
void deleteperson(addressbooks*abs) {
    cout << "请输入您要删除的联系人" << endl;
    string name;
    cin >> name;
    //ret==-1没查到
    //ret!=-1 查到了
    int ret = isexist(abs, name);
    if (ret != -1) {
        //查到了就删掉
        //要删除一个人可以把他后面的人的数据全都往前移动一位并覆盖要删除的人
        for (int i = ret; i < abs->m_size; i++) {
            //数据前移
            abs->personarray[i] = abs->personarray[i + 1];
        }
        abs->m_size--;
        cout << "删除成功" << endl;
    } else {
        //没查到
        cout << "查无此人" << endl;
​
    }
    system("pause");
    system("cls");
}

想要做到删除联系人要怎么办呢

比如在数组中已经有了这么几个联系人的数据

那假如我要删除‘李四’的数据,我们可以把后面的人的数据全都往前移就可以做到删除原数据的效果了,如下图:

居然是要删除其中一人我们自然想知道被删除的目标在哪里;

这时候我们就可以再创立一个isexist函数用于查找人员的位置信息,如下:

//检测联系人是否存在,返回联系人所在的具体位置,不存在返回-1
//参数1. 通讯录 参数2. 对比姓名
int isexist(addressbooks*abs, string name) {
    for (int i = 0; i < abs->m_size; i++) {
        if (abs->personarray[i].m_name == name) {
            return i;
        }
    }
    return -1;
​
}

这个函数首先要传入通讯录人员的地址,并输入要查询的人员的名字

用for循环遍历人员personarray数组找到与输入名字相同的数据所在的位置并返回这个值。没找到就返回-1;这样方便后续辨别搜索的人员是否存在于人员数组personarray中。比如后续就可以直接检测返回值是否为-1,不是的话就是可以找到这个人。

找到了要找的人在哪里之后呢,我们就可以

int ret = isexist(abs, name);

在deleteperson函数中定义一个ret用于储存刚刚找人isexist函数的返回值

并用if分支来辨别是个否找到了输入的人找到了就进行数据删除(前移)

for (int i = ret; i < abs->m_size; i++) { //数据前移 abs->personarray[i] = abs->personarray[i + 1]; }

从第i个位置开始到最后一个位置结束,把第i+1个位置的内容覆盖到第i个位置上,这样就完成了数据的删除;同样的在完成这功能之后应该返回目录也就是进行屏幕的清空。

system("pause");//请按任意键继续,有暂停等我发令的意思 system("cls");//清屏幕

使用4.查找联系人

这和2.显示联系人有什么区别呢

很简单,显示联系人是把所有的已储存的人的信息都显示;

查找就只要显示我想要找的那个人就好了;

//4.查找联系人
void findperson(addressbooks*abs) {
    cout << "请输入要查找的来联系人" << endl;
    string name;
    cin >> name;
    //判定联系人是否存在于通讯录
    int ret = isexist(abs, name);
​
    if (ret != -1) { //找到联系人
        cout << "姓名" << abs->personarray[ret].m_name << "\t";
        cout << "性别" << (abs->personarray[ret].m_sex == 1 ? "男" : "女") << "\t";
        cout << "年龄" << abs->personarray[ret].m_age << "\t";
        cout << "电话" << abs->personarray[ret].m_phone << "\t";
        cout << "地址" << abs->personarray[ret].m_addr << endl;
    } else { //找不到
        cout << "查无此人" << endl;
    }
    system("pause");
    system("cls");
}

定义一个findperson函数

进入函数之后输入想要查询的人的名字利用isexist函数找到他的位置,把其所有信息显示出来就完成了。

同样的在完成这功能之后应该返回目录也就是进行屏幕的清空。

system("pause");//请按任意键继续,有暂停等我发令的意思 system("cls");//清屏幕

5.修改指定联系人

想要修改一个人的信息,只要把他找出来并将其所有的信息重新输入一遍将原信息覆盖就好了

//5.修改指定联系人
void modifyperson(addressbooks*abs) {
    cout << "请输入要修改的联系人" << endl;
    string name;
    cin >> name;
    int ret = isexist(abs, name);
    if (ret != -1) { //找到指定的人
        //姓名
        string name;
        cout << "请输入姓名: " << endl;
        cin >> name;
        abs->personarray[ret].m_name = name;
​
        //性别
        cout << "请输入性别: " << endl;
        cout << "1 --- 男" << endl;
        cout << "2 --- 女" << endl;
        int sex = 0;
        while (1) {
            //如果输入的是正确的1或者2就可以退出再循环
            //如果输入的是错误的值就重新输入
            cin >> sex;
​
            if (sex == 1 || sex == 2) {
                abs->personarray[ret].m_sex = sex;
                break;
            }
            cout << "输入有误,请重新输入" << endl;
        }
​
        //年龄
        cout << "请输入年龄: " << endl;
        int age = 0;
        cin >> age;
        abs->personarray[ret].m_age = age;
​
​
        //电话
        cout << "请输入电话号码: " << endl;
        string phone;
        cin >> phone;
        abs->personarray[ret].m_phone = phone;
​
        //地址
        cout << "请输入家庭住址: " << endl;
        string address;
        cin >> address;
        abs->personarray[ret].m_addr = address;
    } else { //找不到
        cout << "查无此人" << endl;
    }
    system("pause");
    system("cls");
}
​

这里定义一个modifyperson函数很像1和3的结合

同样的在完成这功能之后应该返回目录也就是进行屏幕的清空。

system("pause");//请按任意键继续,有暂停等我发令的意思 system("cls");//清屏幕

6.清空联系人

听上去很复杂,好像要把所有的人的数据都覆盖

但其实有一个办法,那就是把数组的联系人数量清零就好了

//6.清空联系人
//实现思路: 将通讯录所有联系人信息清除掉,只要将通讯录记录的联系人数量置为0,做逻辑清空即可清空联系人代码:void cleanperson(addressbooks*abs) {
    abs->m_size = 0;
    cout << "通讯录已清空" << endl;
    system("pause");
    system("cls");
​
}

同样的在完成这功能之后应该返回目录也就是进行屏幕的清空。

system("pause");//请按任意键继续,有暂停等我发令的意思 system("cls");//清屏幕

收尾

功能都设计完了我们只要把各个函数安放在各选项上就好了

int main() {
    //创建通讯录结构体变量
    addressbooks abs;
    //初始化通讯录中当前人员个数
    abs.m_size = 0;
​
​
    int select = 0;//创建用户输入的变量while (1) {
        //菜单的调用
        shoumenu();
        cin >> select;
        switch (select) {
            case 1: //1、添加联系人
                addperson(&abs);//利用地址传递可以修饰实参break;
            case 2://2、显示联系人
                showperson(&abs);
                break;
            case 3: //3、删除联系人
                /*{cout<<"请输入删除联系人的名字"<<endl;
                    string name;
                   cin>>name;
                   if(isexist(&abs,name)==-1){
                       cout<<"查无此人"<<endl;
                   }else{
                       cout<<"找到此人"<<endl;
                   }
                }//case语句中一般只能加小串的代码,如果要加入一长串可以用中括号{}括起来告诉程序这是一段代码*/
                deleteperson(&abs);
                break;
            case 4://4、查找联系人
                findperson(&abs);
                break;
            case 5://5、修改联系人
                modifyperson(&abs);
                break;
            case 6: //6、清空联系人
                cleanperson(&abs);
                break;
            case 0://0、推出通讯录
                cout << "欢迎下次使用" << endl;
                system("pause");//请按任意键继续
                return 0;
                break;
        }
    }
    system("pause");
    return 0;
}

这样我们就完成了所有的步骤啦

使用示例

  • 退出

  • 输入

  • 显示

  • 删除

  • 查找

  • 修改

  • 清空

至此所有功能演示完毕u

很好心能写完这么多,我会更加努力地!QAQ