第4课:复合类型

学习如何将基础的魔法盒子组合成更强大的工具,比如一整排的储物箱和能装下任何东西的混合包裹!

环节一:数组:一排同类箱子

想一次存放好几个同类型的物品?用数组吧!它就像一排连在一起的、大小完全相同的箱子。

我的成绩单

我们来创建一个能存放4门课成绩的数组。点击初始化,看看会发生什么。

最后一个箱子的编号是 3 (大小-1)。

代码解读

#include <iostream> using namespace std; int main() { // 声明一个能装4个整数的数组 // 就像预定了4个连在一起的箱子 int scores[4]; // 我们可以这样给箱子放东西 scores[0] = 95; // 第1个箱子 (索引为0) scores[1] = 88; // 第2个箱子 (索引为1) // 也可以在声明时直接初始化 // 只提供了2个值,剩下的箱子会自动填0 double rates[4] = {1.5, 2.0}; // rates[2] 和 rates[3] 的值都是 0 // 用sizeof测量整个数组占用的空间 cout << "scores数组占用的字节数: " << sizeof(scores) << endl; return 0; }

环节二:字符串:留言和智能文本

计算机用两种方式处理文字:一种是传统的手写留言条,另一种是现代的智能文本。

代码解读

#include <iostream> #include <string> // 使用string类需要此头文件 using namespace std; int main() { // 1. C-风格字符串:一个字符数组 // 必须以一个特殊的空字符 '\0' 结尾 char c_name[20] = "Bob"; // cin读取它时,遇到空格就停 // cin >> c_name; // 2. 智能的 string 类 // 更简单,更安全,推荐使用! string cpp_name = "Alice"; // 它可以轻松地用 + 号拼接 string greeting = "Hello, " + cpp_name; cout << greeting << endl; return 0; }

字符串对比

C-风格留言条 (char数组)

输入 "Hello World",看看 `cin` 如何读取。

智能文本 (string类)

现代的string用法更简单!

"Hello"
+
" World"

环节三:结构体:混合物品盒子

如果想把书名(文字)、页数(整数)、价格(小数)打包放进一个盒子里怎么办?用结构体!

打包一本新书

struct Book my_book;

string title:
int pages:
double price:

代码解读

#include <iostream> #include <string> using namespace std; // 先设计一个“书本”结构体的蓝图 struct Book { string title; // 书名 (string类型) int pages; // 页数 (int类型) double price; // 价格 (double类型) }; int main() { // 使用蓝图创建一个真正的“书本”盒子 Book first_book; // 使用点 . 运算符给里面的成员赋值 first_book.title = "C++ Primer Plus"; first_book.pages = 900; // 访问并打印成员 cout << "书名: " << first_book.title << endl; return 0; }

环节四:动态内存:按需申请的魔法空间

有时候我们事先不知道需要多大的数组。动态内存允许我们在程序运行时,按需申请一块临时空间。

代码解读

#include <iostream> using namespace std; int main() { int size; cout << "你想存多少个数字?"; cin >> size; // 1. 使用 new 申请一块动态内存 // 它会返回这块内存的“地址” int* dynamic_array = new int[size]; // 2. 像普通数组一样使用它 dynamic_array[0] = 100; cout << dynamic_array[0] << endl; // 3. 重要!用完后必须用 delete[] 归还 delete [] dynamic_array; return 0; }

内存申请与归还

指针: int* p = nullptr;

自由存储区 (Heap):

魔法师的挑战

是时候检验你的学习成果了!尝试完成下面的任务吧。

练习 1:制作简易学生档案

任务:

  • 定义一个 `Student` 结构,包含 `string` 类型的 `name` 和 `int` 类型的 `score`。
  • 声明并初始化一个包含3个 `Student` 结构的数组 `classmates`。
  • 打印第二个学生的姓名和分数。
#include <iostream> #include <string> using namespace std; struct Student { string name; int score; }; int main() { Student classmates[3] = { {"小明", 95}, {"小红", 88}, {"小刚", 92} }; cout << "第二个学生的信息:" << endl; cout << "姓名: " << classmates[1].name << endl; cout << "分数: " << classmates[1].score << endl; return 0; }
练习 2:动态字符串输入

任务:

  • 提示用户输入一个整数,表示他们想输入多少个单词。
  • 使用 `new` 动态分配一个 `string` 数组。
  • 使用循环读取用户输入的单词,并打印出所有单词。
  • 最后,释放内存。
#include <iostream> #include <string> using namespace std; int main() { int num_words; cout << "你想输入多少个单词?"; cin >> num_words; string* word_list = new string[num_words]; cout << "请依次输入 " << num_words << " 个单词:" << endl; for (int i = 0; i < num_words; ++i) { cin >> word_list[i]; } cout << "\n你输入的单词是:" << endl; for (int i = 0; i < num_words; ++i) { cout << word_list[i] << " "; } cout << endl; delete [] word_list; return 0; }