美文网首页
黑马C++视频笔记(基础部分)

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

作者: 井底蛙蛙呱呱呱 | 来源:发表于2021-01-01 14:50 被阅读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;
    
            }
        }
    }
    
    

    相关文章

      网友评论

          本文标题:黑马C++视频笔记(基础部分)

          本文链接:https://www.haomeiwen.com/subject/pqjjoktx.html