通讯录管理系统
内容纲要

通讯录管理系统功能要求

file

菜单功能

file

清空联系人的方法

将当前联系人的数量清为0,做一个逻辑上的清空,让别的函数访问不了即可。

file

  • 代码如下,该部分代码属于我提前实现好基本功能,再根据黑马c++的视频优化的。
#include <iostream>
#include "string"

#define MAX 3  //最大人数

using namespace std;

struct ContactsMember {
    //int index;
    string name;
    int sex;  //1.男 2.女
    int age;
    string cellPhone;
    string location;
};

void printMenu() {
    cout << "********************************" << endl
        << "******   1、添加联系人   *******" << endl
        << "******   2、显示联系人   *******" << endl
        << "******   3、删除联系人   *******" << endl
        << "******   4、查找联系人   *******" << endl
        << "******   5、修改联系人   *******" << endl
        << "******   6、清空联系人   *******" << endl
        << "******   0、退出通讯录   *******" << endl
        << "********************************" << endl;
}
void addContacts(ContactsMember newContacts[],int arrLength,int * count) {

    //判断联系人是否超标
    if (*count == arrLength)
    {
        cout << "联系人达到最大个数!!不能再添加了" << endl;
        return;
    }
    //创建一个新的临时变量
    ContactsMember temp;

    cout << "请输入添加的联系人姓名:" << endl;
    cin >> temp.name;
    cout << "请输入添加的联系人性别:" << endl;
    cout << "1 ---- 男" << endl;
    cout << "2 ---- 女" << endl;
        for (;;) //判断性别是否正确
        {
            cin >> temp.sex;
            if (temp.sex == 1 || temp.sex == 2)
            {
                break;
            }
            cout << "请输入正确的性别!!" << endl;
        }

    cout << "请输入添加的联系人年龄:" << endl;
        while (true) //判断年龄
        {
            cin >> temp.age;
            if (temp.age < 130 && temp.age >= 0)
            {
                break;
            }cout << "请输入正确的年龄!!" << endl;
        }

    cout << "请输入添加的联系人电话:" << endl;
    cin >> temp.cellPhone;
    cout << "请输入添加的联系人住址:" << endl;
    cin >> temp.location;

    newContacts[*count] = temp;
    //size_t i = 0;
    //for (; i < arrLength; i++)
    //{
    //  if ( newContacts[i].cellPhone == "") //和空字符串相比判断该位置是否已存放联系人。
    //  {
    //      newContacts[i] = temp;
    //      break;  //这个break 语句可以跳出for 循环。
    //  }
    //}
    *count += 1;
    cout << "添加成功!当前联系人个数: " << *count << endl;
}

void showContacts(ContactsMember newContacts[], int count)
{
    if (count == 0)
    {
        cout << "当前通讯录中为空!!" << endl;
        return;
    }
    for (size_t i = 0; i < count; i++)
    {
        cout << "姓名:" << newContacts[i].name
            << "\t性别:" << (newContacts[i].sex == 1 ? "男":"女")
            << "\t年龄:" << newContacts[i].age
            << "\t电话:" << newContacts[i].cellPhone
            << "\t家庭住址:" << newContacts[i].location << endl;

    }
}

//这里使用静态数组,其实用动态数组更好。但是没操作经验。没办法。
void deletContacts(ContactsMember newContacts[], int length, int * count)
{
    string deletNumber;
    cout << "请输入要删除的联系人手机号:" << endl;
    cin >> deletNumber;
    bool judge = false;
    for (size_t i = 0; i < length; i++)
    {
        if (newContacts[i].cellPhone == deletNumber) {
            judge = true;
            for (size_t j = i; j < length - 1; j++)
            {
                newContacts[j] = newContacts[j + 1];   //这样删除后,不用担心数组空位。
            }
            *count -= 1;
        }
    }

    cout << (judge ? "删除成功" : "删除失败") << endl;

}

void findContacts(ContactsMember newContacts[],int count)
{
    string findObject;
    cout << "请输入要查找的姓名:" << endl;
    cin >> findObject;
    bool judge = false;//判断是否找到过
    for (size_t i = 0; i < count; i++)
    {

        if (newContacts[i].name == findObject) {
            judge = true;
            string showSex;
            if (newContacts[i].sex == 1)
            {
                showSex = "男";
            }
            else
            {
                showSex = "女";
            }
            cout << "姓名:" << newContacts[i].name
                << "\t性别:" << showSex
                << "\t年龄:" << newContacts[i].age
                << "\t电话:" << newContacts[i].cellPhone
                << "\t家庭住址:" << newContacts[i].location << endl;
        }
    }
    if (!judge)
    {
        cout << "查无此人!!" << endl;
    }   
}

void modifyContacts(ContactsMember newContacts[], int length)
{
    string modifyNumber;
    cout << "请输入需要对象修改的电话:" << endl;
    cin >> modifyNumber;
    for (size_t i = 0; i < length; i++)
    {
        if (newContacts[i].cellPhone == modifyNumber) {
            cout << "请输入修改的联系人姓名:" << endl;
            cin >> newContacts[i].name;
            cout << "请输入修改的联系人性别:" << endl;
            cin >> newContacts[i].sex;
            cout << "请输入修改的联系人年龄:" << endl;
            cin >> newContacts[i].age;
            cout << "请输入修改的联系人电话:" << endl;
            cin >> newContacts[i].cellPhone;
            cout << "请输入修改的联系人住址:" << endl;
            cin >> newContacts[i].location;
        }
    }
}

//void cleanAll(ContactsMember newContacts[], int length)
//{
//  //这里用的静态数组(不是new 出来的) 不用管,系统会自己回收置空的内存。
//  //newContacts = "";
//  cout << "清空对象函数调用" << endl;
//  memset(newContacts, '\0', sizeof(newContacts));
//}

void main() {

    printMenu(); //显示菜单

    int count = 0;

    //创建结构体变量
    ContactsMember newContacts[MAX]; //先创建一个数组长度为1 的通讯录联系人结构体数组。
    int length = sizeof(newContacts) / sizeof(newContacts[0]);
    //后期再在函数中扩容数组。
    while (true)
    {
        int checkNum; //定义一个数来监听键盘输入
        cin >> checkNum;
        switch (checkNum) //循环语句,判断输入的数来执行相关函数。
        {
        case 1:
            addContacts(newContacts,length,&count);
            break;
        case 2 :
            showContacts(newContacts,count);
            cout << "总共联系人个数为:" << count << endl;
            break;
        case 3 :
            deletContacts(newContacts,length,&count);
            break;
        case 4 :
            findContacts(newContacts,count);
            break;
        case 5 :
            modifyContacts(newContacts, length);
        case 6 :
            //cleanAll(newContacts,length);   
            count = 0;
            break;
        case 0 :
            return;
        default:
            cout << "你输入的有误,重新输入数字!" << endl;
            break;
        }
        system("pause");
        system("cls");
        printMenu();
    }
}

删除部分可以用 isExitst() 函数来判断是否存在。

file

  • 注意事项。指针中 count++; 和 count += 1;是不一样的。

  • system("cls"); 可以清屏。

  • 性别判断中

    string showSex;
            if (newContacts[i].sex == 1)
            {
                showSex = "男";
            }
            else
            {
                showSex = "女";
            }
            cout << "姓名:" << newContacts[i].name
                << "\t性别:" << showSex
                << "\t年龄:" << newContacts[i].age
                << "\t电话:" << newContacts[i].cellPhone
                << "\t家庭住址:" << newContacts[i].location << endl;

    用if 来判断实在是太麻烦。。不如直接用三元运算符。

    cout << "姓名:" << newContacts[i].name
    << "\t性别:" << (newContacts[i].sex == 1 ? "男":"女")
    << "\t年龄:" << newContacts[i].age
    << "\t电话:" << newContacts[i].cellPhone
    << "\t家庭住址:" << newContacts[i].location << endl;
  • case语句中,如果代码过长,编译器可能会报错,此时需要加 { } 花括号囊括该段代码。

  • 这里的删除方法,通过数组后方的数据前移,就完成了数据的删除。(我认为还可以通过count 索引把数组最后的数覆盖到删除对象上)

  • 清空联系人可以逻辑清空,不需要处理数组。这个思路绝了。。。。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇