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