【C++ 夯实基础】复合类型详解及题目分享(一)

复合类型: 结构



定义:

  1. 是一种比数组更灵活的数据格式,因为同一种结构可以存储多种数据类型
  2. 是 c++ OOP的基础 (oop 面向对象)
  3. 用户自定义数据类型 (定义一个结构,可以创建这种的类型的变量)

声明结构/结构变量方法:

遵循两个步骤:

  • a 定义结构描述,描述并标记了能够存储在结构种的各种数据类型
  • b 按描述创建结构变量 (结构数据对象)
  1. 不带有结构变量声明方式:

    struct <结构名>{ // 使用struct 声明结构
    // 数据类型列表:每个列表项都是一条声明语句
    [成员数据类型] [成员变量名称];

    };

  2. 带有结构变量声明方式:

    struct <结构名>{ // 使用struct 声明结构
    // 数据类型列表:每个列表项都是一条声明语句
    [成员数据类型] [成员变量名称];

    }<结构变量1>,<结构变量n>;

    // 示例:
    struct inflatable{
        char name[20];
        float volume;
        double price;
    }coat = {  // 对结构变量coat赋值
            "coat",
            4,
            30
    }; // 将结构变量和结构同时定义
    
  3. 另一种创建结构变量方式:

    struct [结构类型名] [变量名]; // c++ 中struct可省略

    //示例:  
    inflatable hat = {  
    //通过定义的结构inflable创建结构变量hat,此处struct 被省略
                "hat",
                3,
                20
        };
    
  4. 声明结构变量的位置:

a. 内部声明: 声明在main() 一开始 , 这种声明变量作用域为 只能被该声 明所属的函数使用
b. 外部声明: 声明在main() 前面 , 这种声明变量作用域为 可以被后面的任何函数调用

注意点:1. c++不提倡使用外部声明结构变量,提倡使用外部结构声明; 2. 在外部声明符号常量也提倡

结构成员:

  1. 普通结构,使用 成员运算符 访问结构成员
  2. 结构指针,使用 箭头运算符 访问结构成员

结构数组:

  1. 定义: 创建数组类型的结构变量
  2. 声明并初始化:
    a. 和初始化数组类似
    b. 结构数组中每个元素都是一个结构,因此可以使用结构初始化的方式给其提供值

小憩一刻

小练一.

/*
 * 1. 结构CandyBar 包含3个成员,
 *      第一个成员存储了糖块的品牌  ---  字符串
 *      第二个成员存储糖块的重量(可以有小数)   --- double/float
 *      第三块存储了糖块的卡路里含量(整数)   ---   int
 * 请编写一个程序,声明这个结构,创建一个名为snack的CandyBar变量,
 * 要求1 :
 *      并将其成员分别初始化 Mocha Munch   2.3    350  .
 *      初始化应在声明snack时进行
 *      最后 程序显示snack 变量的内容
 *
 * 要求2 :
 *      创建一个包含 3 个元素的CandyBar 数组, 并将他们初始化为所选择的值, 然后显示每个结构的内容
 *
 * 要求3 :  --- 考察 动态数组
 *      使用new来动态分配数组, 而不是声明一个包含3个元素的CandyBar数组
 * */
#include "iostream"
#define SIZE 20  // 定义数组长度常量

struct CandyBar{  // 结构是自定义数据类型
    char brand[20];  // 定义一个字符数组存放字符串
    double weight;
    int calorie;
};

struct CandyBar1{
    char brand[20];  // 定义一个字符数组存放字符串
    double weight;
    int calorie;
}*candyBar1 = new CandyBar1[SIZE];  // 定义动态数组

int main() {
    CandyBar snake = {   // 初始化应在声明snack时进行
            "Mocha Munch",
            2.3,
            350
    };  // 注意 : c++ 每条语句结束以 分号 结尾
    std::cout << "Snack name: " << snake.brand  // 使用 成员访问运算符访问结构成员
        << ", weight: " << snake.weight
        << ", calorie: " << snake.calorie
        << std::endl;

    CandyBar candyBar[3] ;  // 用结构定义的数组:数组中的每一个元素都是一个结构类型
    candyBar[0] = snake;  //  candyBar[0] 结构类型  snake 结构类型; 同类型之间才能赋值
    candyBar[1] = snake;
    candyBar[2] = snake;
    std::cout << "Snack name: " << candyBar[0].brand  // 使用 成员访问运算符访问结构成员: 访问结构数组candyBar中的成员
              << ", weight: " << candyBar[0].weight
              << ", calorie: " << candyBar[0].calorie
              << std::endl;
    std::cin.get(candyBar1->brand, SIZE);
    std::cin >> candyBar1->weight;
    std::cin >> candyBar1->calorie;
    candyBar1->brand[0] = 'a';
    return 0;
}

小练二.

/*
 * 2. william win-gate 从事披萨饼分析服务, 对于每个披萨饼 他都需要记录下列信息:
 * 信息如下:
 *      披萨饼公司名称  可以有多个单词组成
 *      披萨饼的直径
 *      披萨饼的重量
 * 要求1 :  --- 考察 结构
 *      请设计一个能够存储这些信息的结构, 并编写一个使用这种结构变量的程序;
 *      程序将请求用户输入上述信息, 然后显示这些信息
 * 要求2 :  --- 考察 结构指针
 *      使用 new 来为结构分配内存, 而不是声明一个结构变量.
 *      另外, 让程序在请求输入披萨饼公司名称之前输入披萨饼的直径
 * */
#include "iostream"

struct service{  // 定义 service 结构 用于存放需要记录的信息
    char company[20];  //  定义char 数组 存放公司名称
    float diameter;  // 定义float 存放直径
    int weight; // 定义 int 存放重量
}company1;  // 定义 未初始化的结构变量 company1

struct service1{
    char company[20];
    float diameter;
    int weight;
}*company2 = new service1(); // 定义一个结构指针 company2 , 并通过new分配内存
// new 是给变量分别内存, 而不是给结构成员分配内存


int main(){ // McDonald
    std::cout << "please input the name of company: ";
//    std::cin.get(company1.company, 20) ;  // 通过cin.get() 方法 输入值给 company1的成员company
    std::cin.get(company2->company, 20);  // 通过 箭头成员运算符访问结构指针成员
    std::cout << "\n" << "please input diameter of pizza (cm) : ";
    std::cin.ignore();  // 忽略前面语句留下的换行符
//    std::cin >> company1.diameter;
    std::cin >> company2->diameter;
    std::cout << "\n" << "please input weight of pizza (kg): ";
    std::cin.ignore();  // 忽略前面语句留下的换行符
//    std::cin >> company1.weight;
    std::cin >> company2->weight;
//    std::cout << "\n" << "the name of company is : " << company1.company << '\t'
//        << "diameter of pizza is " << company1.diameter << '\t'
//        << "weight of pizza is " << company1.weight << '\t' ;
    std::cout << "\n" << "the name of company is : " << company2->company << '\t'
              << "diameter of pizza is " << company2->diameter << '\t'
              << "weight of pizza is " << company2->weight << '\t' ;
    delete company2;  // 在程序结束使用delete释放new分配的内存, 避免程序导致内存泄露问题
    std::cout << "\n" << "the name of company is : " << company2->company << '\t'
              << "diameter of pizza is " << company2->diameter << '\t'
              << "weight of pizza is " << company2->weight << '\t' ;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值