首页 > 编程语言 >C++学习笔记(03)——通讯录管理系统设计

C++学习笔记(03)——通讯录管理系统设计

时间:2024-07-25 09:29:02浏览次数:10  
标签:03 cout 联系人 C++ 通讯录 personArray size name

记录一下利用C++来实现一个通讯录管理系统

系统中需要实现的功能如下:

  • 添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记录1000人
  • 显示联系人:显示通讯录中所有联系人信息
  • 删除联系人:按照姓名进行删除指定联系人
  • 查找联系人:按照姓名查看指定联系人信息
  • 修改联系人:按照姓名重新修改指定联系人
  • 清空联系人:清空通讯录中所有信息
  • 退出通讯录:退出当前使用的通讯录

显示菜单功能

首先创建一个cpp文件,写好基本框架:

#include <iostream>
using namespace std;

int main(){

    system("pause");
    return 0;
}

之后创建一个showMenu函数用于显示系统的菜单

实际上就是打印出提示信息,提示用户输入不同数字代表对应的功能:

void showMenu(){
    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;
}

之后在main函数中调用这个函数即可:

#include <iostream>
using namespace std;

int main(){
	showMenu();
    system("pause");
    return 0;
}

退出系统功能

定义个select变量接收用户输入,

使用switch结构分别对用户不同的输入数字进行处理,

同时在外层使用一个while循环,让程序循环执行,使用户能持续输入,

最终输入0后,直接结束程序,达到退出系统的功能。

int main(){

    int select = 0;	//用于接收用户输入的数字,对应执行不同的功能
    while (true)
    {
        showMenu();
        cin >> select;
        switch (select)
        {
            case 1:
                
                break;
            case 2:
                
                break;                
            case 3:
                
                break;
            case 4:
                
                break;
            case 5:
                
                break;
            case 6:
                
                break;
            case 0:								
                cout << "欢迎下次使用" << endl;
                system("pause");
                return 0;					//当输入0后,直接return退出程序
                break;
            default:
                cout << "你输入的是啥玩意???" << endl;
                break;
        }
    }
    system("pause");
    return 0;
}

定义人员结构体和通讯录结构体

#define MAX 1000


struct Person
{
    string name;
    int sex;
    int age;
    string phone;
    string address;
};

struct Books
{
    struct Person personArray[MAX];     //用于保存联系人信息的数组,最大人数为1000

    int p_size;     //记录通讯录中的人员个数
    
};

添加联系人

在函数最后使用system("cls");实现窗口信息清屏操作

void addPerson(struct Books * b){
    if (b->p_size == MAX)
    {
        cout << "已经满员啦!!" << endl;
        return;
    }
    else{
        //输入姓名
        string name;
        cout << "请输入姓名:" << endl;
        cin >> name;
        b->personArray[b->p_size].name = name;

        //输入性别
        cout << "请输入性别:" << endl;
        cout << "1 代表 男" << endl;
        cout << "2 代表 女" << endl;
        int sex = 0;
        while (true)
        {
            cin >> sex;
            if (sex == 1 || sex == 2)
            {
                b->personArray[b->p_size].sex = sex;
                break;
            }
            cout << "输入错误!请检查输入" << endl;
        }
        
        //输入年龄
        int age = 0;
        cout << "请输入年龄:" << endl;
        cin >> age;
        b->personArray[b->p_size].age = age;
        
        //输入电话
        string phone;
        cout << "请输入电话:" << endl;
        cin >> phone;
        b->personArray[b->p_size].phone = phone;

        //输入地址
        string address;
        cout << "请输入地址:" << endl;
        cin >> address;
        b->personArray[b->p_size].address = address;


        b->p_size++;
        cout << "添加完成" << endl;
        system("pause");
        system("cls");		//进行清屏操作,使用户完成操作后,终端只显示菜单信息

    }
    
}

查看联系人

打印出通讯录内的所有联系人信息

void showPerson(struct Books * b){
    if (b->p_size == 0)
    {
        cout << "当前记录为空!" << endl;		//检查通讯录是否为空
        system("pause");
        system("cls");
    }
    else
    {
        for (int i = 0; i < b->p_size; i++)		//打印出所有联系人信息
        {
            cout << "姓名:" << b->personArray[i].name << "\t";
            cout << "性别:" << (b->personArray[i].sex == 1 ? "男" : "女") << "\t";
            cout << "年龄:" << b->personArray[i].age << "\t";
            cout << "电话:" << b->personArray[i].phone << "\t";
            cout << "地址:" << b->personArray[i].address << endl;
        }

        system("pause");
        system("cls");
    }
}

判断联系人是否存在

这里定义了一个根据姓名判断联系人是否存在的函数,

因为后续的删除、查找、修改功能都需要先进行检查联系人是否存在,因此封装了一个额外的函数

int isExist(struct Books * b, string name){
    for (int i = 0; i < b->p_size; i++)
    {
        if (b->personArray[i].name == name)
        {
            return i;      //如果通讯录中有联系人的姓名,返回联系人信息的下标索引编号             
        }
        
    }
    return -1;              //没有则返回-1
}

删除联系人

删除联系人:只需要将后面联系人信息往前覆盖,就可以删除当前的联系人信息了

void deletePerson(struct Books * b){
    cout << "请输入需要删除的联系人姓名:" << endl;
    string name;
    cin >> name;
    if (isExist(b, name) != -1)
    {
        for (int i = isExist(b, name); i < b->p_size; i++)
        {   
            //联系人信息进行一个前移的操作,即实现删除当前联系人
            b->personArray[i] = b->personArray[i+1];    
        }
        b->p_size--;
        cout << "删除成功!" << endl;

    }
    else
    {
        cout << "查无此人,请重新输入" << endl;
    }
    system("pause");
    system("cls");
}

查找联系人

根据姓名查找联系人信息,并打印出来

void findPerson(struct Books * b){
    cout << "请输入需要查找的联系人姓名:" << endl;
    string name;
    cin >> name;
    int ret = isExist(b, name);
    if (ret != -1)
    {
        cout << "姓名:" << b->personArray[ret].name << "\t";
        cout << "性别:" << (b->personArray[ret].sex == 1 ? "男" : "女") << "\t";
        cout << "年龄:" << b->personArray[ret].age << "\t";
        cout << "电话:" << b->personArray[ret].phone << "\t";
        cout << "地址:" << b->personArray[ret].address << endl;
    }
    else
    {
        cout << "查无此人,请重新输入" << endl;
    }
    system("pause");
    system("cls");
}

修改联系人

根据姓名选择所要修改的联系人信息,把新输入的信息覆盖掉原来的信息

void modifyPerson(struct Books * b){
    cout << "请输入需要修改的联系人姓名:" << endl;
    string name;
    cin >> name;
    int ret = isExist(b, name);
    if (ret != -1)
    {
        //修改姓名
        cout << "请输入修改的姓名:" << endl;
        string name;
        cin >> name;
        b->personArray[ret].name = name;

        //修改性别
        cout << "请输入修改的性别:" << endl;
        cout << "1 代表 男" << endl;
        cout << "2 代表 女" << endl;
        int sex;
        while(true){
            cin >> sex;            
            if (sex == 1 || sex == 2)
            {
                b->personArray[ret].sex = sex;
                break;
            }
            else
            {
                cout << "输入有误,请重新输入!" << endl;
            }
        }
        
        //修改年龄
        int age = 0;
        cout << "请输入修改的年龄:" << endl;
        cin >> age;
        b->personArray[ret].age = age;
        
        //修改电话
        string phone;
        cout << "请输入修改的电话:" << endl;
        cin >> phone;
        b->personArray[ret].phone = phone;

        //修改地址
        string address;
        cout << "请输入修改的地址:" << endl;
        cin >> address;
        b->personArray[ret].address = address;

        cout << "修改成功!!" << endl;
    }
    else
    {
        cout << "查无此人,请重新输入" << endl;
    }
    system("pause");
    system("cls");
}

清空通讯录

void cleanPerson(struct Books * b){
    cout << "确定清空通讯录所有信息?" << endl;
    cout << "1 代表 确定" << endl;
    cout << "2 代表 取消" << endl;
    int n;
    while(true){
        cin >> n;            
        if (n == 1)
        {
            b->p_size = 0;  //直接把通讯录的联系人数量置为0,做逻辑清空即可
            cout << "通讯录已清空" << endl;
            break;
        }
        else if (n == 2)
        {
            cout << "已取消" << endl;
            break;
        }
        else
        {
            cout << "输入有误,请重新输入!" << endl;
        }
    }
    system("pause");
    system("cls");
}

主函数程序

在主函数中根据用户输入的数字调用不同的功能函数即可:

int main(){
    Books books;        //创建通讯录结构体
    books.p_size = 0;   //先初始化人员个数为 0

    int select = 0;
    while (true)
    {
        showMenu();
        cin >> select;
        switch (select)
        {
            case 1:
                addPerson(&books);
                break;
            case 2:
                showPerson(&books);
                break;                
            case 3:
                deletePerson(&books);
                break;
            case 4:
                findPerson(&books);
                break;
            case 5:
                modifyPerson(&books);
                break;
            case 6:
                cleanPerson(&books);
                break;
            case 0:
                cout << "欢迎下次使用" << endl;
                system("pause");
                return 0;
                break;
            default:
                cout << "你输入的是啥玩意???" << endl;
                system("pause");
                system("cls");
                break;
        }
    }
    system("pause");
    return 0;
}

标签:03,cout,联系人,C++,通讯录,personArray,size,name
From: https://www.cnblogs.com/xishiyuyuan/p/18322290

相关文章

  • 卡皮巴拉(c++)
    题目描述有一种卡皮巴拉玩偶,它有头、身体、四肢三个部分,每个部分需要使用不同的材料制作。玩具公司生产了很多批次的卡皮巴拉玩偶,每个批次的玩偶的三个部分都分别有多种款式(每种款式只需使用一种材料)。现在有`k`批次的卡皮巴拉玩偶,每个批次的玩偶的头、身体和四肢的款式分别......
  • 成员函数(c++)
    题目描述针对上一题的情形,除了在结构体外新设计一个函数 get_grade 外,我们可以用另外一种方法,给类添加一个成员函数,如下所示。structStudent{intx;inty;intz;intget_grade(){//todo}};此后,对于每一个 Student 类的对象 s,我们可以......
  • 图的最短路径算法(SPFA,Dijkstra,Bellman_Ford)(迪杰斯特拉算法,Spfa算法,贝尔曼-福特算
    目录Dijkstra迪杰斯特拉算法写法时间复杂度例题描述输入描述输出描述样例输入用例输出用例写法Spfa算法例题描述输入描述输出描述样例输入用例输出用例写法Bellman_Ford算法(贝尔曼-福特算法)写法例题描述输入描述输出描述样例输入样例输出样例......
  • selenium.webdriver.Firefox 与 FirefoxOptions().add_argument('--headless') 不返回
    我注意到Firefox中的无头选项会在后台运行Firefox,而不会附加任何窗口,而且我还没有找到一种方法可以在后台运行Firefox,同时仍保留Firefox窗口的hwnd能够使用。我开始使用pyvda来获取AppViewFirefox,但是pyvda.get_apps_by_z_order没有返回任......
  • 【知识扩展】C/C++编译原理
    C/C++编译原理一、前言二、编译原理1、预处理2、编译3、汇编4、链接三、头文件和库文件1、头文件2、库文件四、编译器1、GCC编译器1.1、编译过程1.1.1、预处理1.1.2、编译1.1.3、汇编1.1.4、链接1.2、创建静态库1.2.1、静态库源码编译成.o的文件1.2.2、编译静态库1.......
  • 【 Pro*C/C++ 】 Pro*C/C++ 编程
    ProC/C++编程1一、ProC/C++简介11.1、ProC/C++是什么11.2、ProC/C++处理流程2二、ProC/C++GCC环境配置32.1、ProC/C++预编译环境32.2、GCC编译器5三、开始编写第一个ProC++代码53.1、第一个ProC++代码53.2、ProC++代码预编译63.3、GCC编译73......
  • C++语法10:C++实现0-1背包问题的动态规划解法
    动态规划(DynamicProgramming):解锁复杂问题的钥匙在算法设计与分析的广阔领域中,动态规划(DynamicProgramming,DP)无疑是一把锋利的剑,用于斩断复杂问题中缠绕的荆棘。它通过将大问题分解为小问题,并存储子问题的解来避免重复计算,从而高效地解决了一系列看似无解的难题。本文将从......
  • Linux多线程C/C++
    文章目录前言一、线程1.线程的使用2.线程相关函数1.pthread_create()线程创建函数2.pthread_join()线程回收函数3.pthread_exit()线程退出函数4.pthread_detach()线程分离函数二、线程的同步与互斥1.互斥锁(Mutex)2.读写锁(Read-WriteLock)3.条件变量(ConditionVa......
  • cannot reclaim 52428800 bytes disk space from 4070572032 limit
    RMAN>backupdatabase;Startingbackupat24-JUL-24usingchannelORA_DISK_1channelORA_DISK_1:startingfulldatafilebackupsetchannelORA_DISK_1:specifyingdatafile(s)inbackupsetinputdatafilefilenumber=00001name=/u01/app/oracle/oradata/orcl/s......
  • c++11(3): 类型推导与智能指针
    41.两个右尖括号>在模板中不再被判定为右移,需要右移需要加圆括号()42.auto类型推导,编译时推导inta=1;autob=a;//b的类型为int1):auto不能作函数形参类型2):auto不能对结构体中的肥静态成员进行推导3):auto不能声明数组4):auto不能在实例化模板时作为......