黑马C++视频笔记(基础部分)

2021-01-01  本文已影响0人  井底蛙蛙呱呱呱
//常量的定义方式:
//1、#define 定义宏常量. 宏常量定义在函数外面,无法修改;
//2、const 修饰的变量. 一般写在函数内部,无法修改。

// 定义宏常量
#define Day 7

//字符数据类型
// char ch = 'a'; 只能使用单引号单字符;

//字符串类型
// char ch[] = "asdfasdf"; C风格,使用char定义字符串变量时,必须要有[], 此时赋值的字符串也要用双引号;
// string ch = "asfasdf"; C++风格,直接使用string来定义字符串变量;需先include <string> 导入;


// 一维数组定义的三种方式:
// 1、数据类型 数组名 [数组长度];
// 2、数据类型 数组名 [数组长度] = {val1, val2, ...},初始化时未完全填充数组长度,自动填充0;
// 3、数据类型 数组名 [] = {val1, val2, ...},根据初始化值来自动确定数组长度;
// 特点:连续内存空间,相同数据类型。

/* 二维数组定义的4种方式:
 * 1、数据类型 数组名[行数][列数];
 * 2、数据类型 数组名[行数][列数] = {{val1, val2}, ... {valn, valm}};
 * 3、数据类型 数组名[行数][列数] = {val1, val2, val3, val4}; 根据shape来自动reshape;
 * 4、数据类型 数组名[][列数] = {val1, val2, ..., valn}; 自动reshape;
 *
 * 由上面可知,行数可省略,但是列数必须要在。
 * 一般推荐第二种定义方式。
 */


// 函数定义五要素:
/* (1)返回类型,特殊地,void表示不需要返回值;
 * (2)函数名;
 * (3)参数;
 * (4)函数体,即函数功能实现代码;
 * (5)返回值。
 *
 * 返回类型 函数名(参数){函数体  返回值}
 */

/* 函数的声明
 * 作用:告诉编译器函数名称以及如何调用函数。函数的实际主体可以单独定义。
 *
 * 函数声明可以有多次,但是定义只能有一次
 */

/* 函数的分文件编写
 * 作用:让代码结构更加清晰
 *
 * 函数分文件编写一般有4个步骤:
 * (1)创建后缀名为.h的头文件;
 * (2)创建后缀名为.cpp的源文件;
 * (3)在头文件中写函数声明;
 * (4)在源文件中写函数的定义。
 */


/* 指针
 * 作用:通过指针间接访问内存,利用指针变量保存地址。
 * 定义: 数据类型 * 变量名;
 * 占用内存:在32位系统中占用4个字节,而在64位系统中则是占用8个字节。
 *
 * 指针和普通变量的区别:
 * - 普通变量存放的是数据,而指针存放的是地址;
 * - 指针变量可以通过 "*" 操作符,操作指针变量指向的内存空间,这个过程称为解引用;
 *
 * 小结:
 * (1)我们可以通过 &符号获取变量的地址;
 * (2)利用指针可以记录地址;
 * (3)对指针变量解引用,可以操作指针(地址)指向的内存;
 *
 *
 * 空指针和野指针
 * 空指针:指向内存中编号为0的空间。(内存编号0~255位系统保留地址,不可访问)
 * 用途:初始化指针变量;
 * 注意:空指针指向的内存是不可以访问的。
 *
 * 野指针:指向非法的内存空间(非申请空间)。
 *
 * 空指针和野指针都不是我们申请的空间,访问会报错。
 *
 *
 * const修饰指针,分三种情况:
 * (1)const修饰指针————常量指针。const int * p,const修饰的是指针,指针指向可以改变,但是其指向的值不能改变;
 *    (可以等价理解为const *p, *p为指向的值,因此指向的值不能改变,下面理解类同)
 * (2)const修饰常量————指针常量。int * const p,const修饰的是常量,指针指向的值可以改变,但是其指向不能改变;
 * (3)const既修饰指针,又修饰常量。const int * const p,const既修饰指针又修饰常量,指针指向和指向的值都不能改变。
 *
 * 技巧:看const右侧紧跟着的是指针还是常量,是指针就是常量指针,是常量就是指针常量。
 */


/* 结构体
 * 基本概念:结构体属于用户自定义的数据类型,允许用户储存不同的数据类型;
 *
 * 结构体的定义和使用
 * 定义语法:struct 结构体名称 {结构体成员列表(可理解为属性)};
 * 通过结构体创建变量的方式有三种:
 * (1)struct 结构体名称 变量名;
 * (2)struct 结构体名称 变量名 = {成员1值,成员2值,...}
 * (3)定义结构体时顺便创建变量:struct 结构体名称 {成员列表}变量名;
 *
 * 在创建结构体变量是,关键字struct可以省略。
 *
 *
 * 结构体数组
 * 作用:将自定义的结构体放入到数组中方便维护。
 * 语法:struct 结构体名称 数组名[元素个数] = {{}, {}, ..., {}}
 *
 *
 * 结构体指针
 * 作用:通过指针访问结构体中的成员,利用操作符->可以通过结构体指针访问结构体属性。
 *
 * 嵌套结构体
 * 定义:在一个结构体中定义另一个结构体。
 * struct 结构体名称A {成员1,成员2, struct 结构体名称B(即成员3)};
 */

通讯录管理系统实战

//
// Created by shexuan on 2020/12/31.
//

#include <iostream>
#include <string>
#include<stdlib.h>
using namespace std;

#define MAX 1000 // 通讯录中最大人数

/* 创建一个通讯录管理系统,其功能主要包括:
 * 1、添加联系人:向通讯录中添加新联系人,信息包括(姓名,性别,年龄,联系电话,家庭住址),最多纪录1000人;
 * 2、显示联系人:显示通讯录中所有联系人的信息;
 * 3、删除联系人:按照姓名进行删除指定联系人;
 * 4、查找联系人:按照姓名查找指定联系人;
 * 5、修改联系人:按照姓名重新修改联系人;
 * 6、清空联系人:清空通讯录中所有信息;
 * 7、退出通讯录:退出当前使用的通讯录。
 *
 */


struct Person{
        string m_Name; // 姓名
        int m_Sex; // 性别:1男 2女
        int m_Age; // 年龄
        string m_Phone; // 电话
        string m_Addr; // 住址
};

struct Addressbooks{
    struct Person personArray[MAX]; // 通讯录中保存的联系人;
    int m_Size;
};

// 添加联系人
void addPerson(Addressbooks * abs){
    // 判断通讯录是否已满,如果满了就不再添加
    if (abs->m_Size==MAX){
        cout << "通讯录已满,无法添加!" << endl;
        return;
    }else{ // 添加具体联系人
        //姓名
        string name;
        cout << "请输入姓名:";
        cin >> name;
        abs->personArray[abs->m_Size].m_Name = name;
        // 性别
        int sex = 0;
        while (true){
            cout << "请输入性别(1--男,2--女):";
            cin >> sex;
            if (sex==1 || sex==2){
                abs->personArray[abs->m_Size].m_Sex = sex;
                break;
            }
            cout << "输入有误,请重新输入!" << endl;
        }
        // 年龄
        int age;
        cout << "请输入年龄:";
        cin >> age;
        abs->personArray[abs->m_Size].m_Age = age;
        // 电话
        string phone;
        cout << "请输入电话号码:";
        cin >> phone;
        abs->personArray[abs->m_Size].m_Phone = phone;
        // 住址
        string addr;
        cout << "请输入住址:";
        cin >> addr;
        abs->personArray[abs->m_Size].m_Addr = addr;
    }

    // 更新通讯录人数
    abs->m_Size ++;
    cout << "添加成功!" << endl;
    // system("pause"); // Windows操作系统使用此代码
    // system("cls"); // Windows操作系统使用此代码
    cin.get(); // macOS 使用此代码
    system("clear"); // macOS 使用此代码

}


// 显示联系人
void showPerson(const Addressbooks abs){
    int size = abs.m_Size;
    for (int i=0; i<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 << "\t";
        cout << endl;
    }
}

// 判断联系人是否存在
int isExist(const Addressbooks abs, string name){
    if (abs.m_Size==0){
        return -1;
    }

    for (int i=0; i<abs.m_Size; i++){
        // 若找到了联系人,则返回其index
        if (abs.personArray[i].m_Name == name){
            return i;
        }
    }
    // 遍历完都没找到,说明不存在此联系人,返回-1
    return -1;
}

// 删除联系人
void DelPerson(Addressbooks * abs, int index){
    // 数值为顺序储存,删除一个元素后,后面的元素都要前移
    for (int i=index; i<abs->m_Size-1; i++){
        abs->personArray[i] = abs->personArray[i+1];
    }
    // 现有联系人数量也要减一
    abs->m_Size--;
    cout << "删除成功!" << endl;
}


// 查找联系人
void findPerson(const Addressbooks abs, string name){
    int exist_code = isExist(abs, name);
    if (exist_code!=-1){
        cout<< "姓名:" << abs.personArray[exist_code].m_Name << "\t";
        cout<< "性别:" << (abs.personArray[exist_code].m_Sex==1?"男性":"女性") << "\t";
        cout<< "年龄:" << abs.personArray[exist_code].m_Age << "\t";
        cout<< "电话:" << abs.personArray[exist_code].m_Phone << "\t";
        cout<< "住址:" << abs.personArray[exist_code].m_Addr << "\t";
        cout << endl;
    }else{
        cout << "您所要查找的联系人不存在!" << endl;
    }
}


// 修改联系人
void modifyPerson(Addressbooks * abs, string name){
    if (abs->m_Size==0){
        cout << "您所要修改的联系人不存在!" << endl;
    }
    for (int i=0; i<abs->m_Size; i++){
        if (abs->personArray[i].m_Name==name){
            cout<< "姓名:" ;
            cin >> abs->personArray[i].m_Name;
            int sex = 0;
            while (true){
                cout << "请输入性别(1--男,2--女):";
                cin >> sex;
                if (sex==1 || sex==2){
                    abs->personArray[abs->m_Size].m_Sex = sex;
                    break;
                }
                cout << "输入有误,请重新输入!" << endl;
            }
            cout<< "年龄:";
            cin >> abs->personArray[i].m_Age;
            cout<< "电话:";
            cin >> abs->personArray[i].m_Phone;
            cout<< "住址:";
            cin >> abs->personArray[i].m_Addr;
            return;
        }
    }
    cout << "您所要修改的联系人不存在!" << endl;
}

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


int main(){

    // 创建通讯录结构体变量
    Addressbooks abs;
    abs.m_Size = 0;

    int select;
    while (true){
        showMenu();
        cout << "请选择功能:";
        cin >> select;

        switch (select){
            case 1: // 添加联系人
                addPerson(&abs);
                break;
            case 2: // 显示联系人
                showPerson(abs);
                // system("pause"); // Windows操作系统使用此代码
                // system("cls"); // Windows操作系统使用此代码
                cin.get(); // macOS 使用此代码
                system("clear"); // macOS 使用此代码
                break;
            case 3: { // 删除联系人
                string name;
                cout << "请输入待删除联系人姓名:";
                cin >> name;
                int exist_code = isExist(abs, name);
                if (exist_code==-1){
                    cout << "您要删除的联系人不存在!" << endl;
                }else{
                    DelPerson(&abs, exist_code);
                }
                break;
            }
            case 4: {// 查找联系人
                string name;
                cout << "请输入待查找联系人姓名:";
                cin >> name;
                findPerson(abs, name);
                break;
            }
            case 5: {// 修改联系人
                string name;
                cout << "请输入待修改联系人姓名:";
                cin >> name;
                modifyPerson(&abs, name);
                break;
            }
            case 6: // 清空联系人
                abs.m_Size = 0;
                cout << "通讯录已清空!";
                break;
            case 0: // 退出通讯录
                cout << "欢迎下次使用!" << endl;
                // system("pause"); windows系统的用法
                cin.get();
                return 0;
                break;
            default:
                break;

        }
    }
}

上一篇下一篇

猜你喜欢

热点阅读