Files
ClassFeedback/output/CSP03-第七节课-string(一)-上课逐字稿.md
chengzi efa1e6aa60 更新课程内容与课评反馈(2026春季)
- 更新K4课程README与课程目录
- 更新AI03 SOLO模式体验课程内容
- 补录各班级学生出勤登记
- 更新课评汇总归档
- 新增CSP03 string使用课程笔记
- 新增备份脚本与逐字稿输出
2026-04-17 21:04:51 +08:00

442 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# CSP03班第七节课string- 上课逐字稿
**班级**CSP03班
**课程**C++信息奥赛
**课次**第7课
**知识点**:字符串基础
**日期**2026年4月15日
---
## 📚 课前准备
**老师**
"同学们下午好欢迎大家来到今天的C++课堂。今天我们要学习一个非常有趣也非常重要的知识点——字符串。在开始之前,大家想一想,我们平时用电脑都会接触到哪些文字信息?"
**学生互动**
(等待学生回答)
- "QQ聊天记录"
- "发短信"
- "写作文"
- "编程代码"
**老师总结**
"很好!不管是聊天记录、短信还是作文,这些文字信息在计算机里都被统一称为'字符串'。今天我们就来学习如何在C++中处理这些文字信息。"
---
## 🎯 知识点导入
**老师**
"打开你们的PPT今天我们要学习的是字符串的基础知识。先请一位同学大声朗读这节课的5个知识点。"
**学生朗读**
1. 字符串的概念
2. 字符串的声明与初始化
3. 字符串的常用操作
4. 字符串的输入输出
5. 字符串的遍历方法
**老师**
"说得非常好!现在我们就一个个来详细学习这些内容。"
---
## 📖 知识点一:字符串的概念
**老师**
"首先什么是字符串在C++中,字符串就是一串字符的序列,比如'Hello World'、'C++很酷'、'2026'这些。
大家看屏幕:
```cpp
"Hello" // 这是一个字符串
"你好" // 这也是一个字符串,包含中文字符
"12345" // 数字用引号括起来也变成了字符串
```
**注意**
- 字符串必须用双引号 `"` 括起来
- 单字符要用单引号 `'a'`,区别开来
- 字符串里可以包含任何字符:字母、数字、符号、中文..."
**互动提问**
"王佳琳你能举出3个不同的字符串例子吗"
**学生回答**
- "程序设计"
- "Hello World"
- "今天是4月15日"
**老师表扬**
"说得很好!注意'程序设计'中间没有空格,这是一个完整的字符串。"
---
## 📝 知识点二:字符串的声明与初始化
**老师**
"接下来我们学习如何创建字符串变量。在C++中,我们需要包含 `<string>` 头文件。"
**代码演示**
```cpp
#include <iostream>
#include <string>
using namespace std;
int main() {
// 声明字符串变量
string name; // 只声明,未赋值
string hobby = "编程"; // 声明并初始化
string message("你好"); // 用构造函数初始化
// 输出
cout << name << endl;
cout << hobby << endl;
cout << message << endl;
return 0;
}
```
**重点讲解**
"大家注意:
1. `#include <string>` 是必须的,告诉编译器我们要用字符串
2. `string name;` 声明了一个空字符串
3. `string hobby = "编程";` 同时完成了声明和赋值
4. C++中有多种初始化方式,上面两种最常用"
**学生练习**
"现在请在你们的电脑上尝试声明一个字符串变量来存储你们的名字,并输出出来。"
(巡视指导)
"卢华琛,你的代码写得很规范!"
"唐钎宸,记得加上 `#include <string>` 哦。"
---
## 🔧 知识点三:字符串的常用操作
**老师**
"字符串有很多常用的操作,就像我们对数字可以进行加减乘除一样,字符串也有自己的操作方法。"
**代码演示**
```cpp
#include <iostream>
#include <string>
using namespace std;
int main() {
string s1 = "Hello";
string s2 = "World";
string result;
// 1. 拼接
result = s1 + " " + s2; // "Hello World"
cout << "拼接: " << result << endl;
// 2. 获取长度
cout << "长度: " << result.length() << endl;
// 3. 访问单个字符
cout << "第一个字符: " << result[0] << endl;
cout << "最后一个字符: " << result[result.length()-1] << endl;
// 4. 比较字符串
if (s1 == "Hello") {
cout << "s1等于Hello" << endl;
}
return 0;
}
```
**重点强调**
"特别注意:
1. 字符串拼接用 `+` 号,就像数学里的加法
2. `length()` 函数返回字符串的字符个数
3. 字符串的索引从0开始`[0]` 是第一个字符
4. 可以直接用 `==` 比较字符串是否相等"
**互动练习**
"请写一个程序,声明两个字符串变量,分别存储你的姓和名,然后将它们拼接成完整的名字并输出。"
**学生展示**
"王佳琳,请展示你的代码。"
**学生代码**
```cpp
string firstName = "";
string lastName = "佳琳";
string fullName = firstName + lastName;
cout << fullName << endl;
```
**老师点评**
"很好!但是要注意,正常情况下中间应该有个空格。应该是 `string fullName = firstName + " " + lastName;`"
---
## 📤 知识点四:字符串的输入输出
**老师**
"我们现在学习了如何声明和操作字符串,那么如何让用户输入字符串呢?"
**代码演示**
```cpp
#include <iostream>
#include <string>
using namespace std;
int main() {
string name;
string hobby;
// 输入字符串(遇到空格停止)
cout << "请输入你的名字: ";
cin >> name; // 只能读取到第一个空格之前的内容
cout << "你的名字是: " << name << endl;
// 使用getline读取整行包括空格
cout << "请输入你的爱好: ";
getline(cin, hobby); // 读取整行,直到遇到回车
cout << "你的爱好是: " << hobby << endl;
return 0;
}
```
**重点讲解**
"这里有个非常重要的区别:
1. `cin >> name;` 遇到空格就会停止,比如输入'张 三',只会读取'张'
2. `getline(cin, hobby);` 会读取整行,包括空格,适合读取句子或短语"
**常见错误演示**
```cpp
// 错误示范:
string name1, name2;
cin >> name1 >> name2; // 如果输入"张 三"name1="张", name2="三"
// 这样没问题,但要清楚发生了什么
```
**学生练习**
"请写一个程序,让用户输入一句完整的自我介绍,然后输出这句话。"
指导学生注意使用getline
"卢华琛记得先跳过cin留下的换行符`getchar();` 或直接用 `getline(cin, s);`"
---
## 🔍 知识点五:字符串的遍历方法
**老师**
"最后一个知识点,如何逐个访问字符串中的每一个字符。这在我们需要处理每个字符时非常有用。"
**方法一:使用索引(推荐)**
```cpp
#include <iostream>
#include <string>
using namespace std;
int main() {
string text = "Hello C++";
// 使用索引遍历
cout << "逐个字符:" << endl;
for (int i = 0; i < text.length(); i++) {
cout << text[i] << " ";
}
cout << endl;
return 0;
}
```
**方法二使用范围for循环更简单**
```cpp
string text = "Hello C++";
// 范围for循环推荐
cout << "逐个字符:" << endl;
for (char c : text) {
cout << c << " ";
}
cout << endl;
```
**方法三:使用迭代器(进阶)**
```cpp
string text = "Hello C++";
// 使用迭代器
cout << "逐个字符:" << endl;
for (string::iterator it = text.begin(); it != text.end(); ++it) {
cout << *it << " ";
}
cout << endl;
```
**对比讲解**
"三种方法的区别:
1. **索引法**:最直观,需要知道字符串长度
2. **范围for循环**:最简单、最安全,推荐初学者使用
3. **迭代器**:最强大,适合处理复杂的数据结构"
**练习题**
"请写一个程序,统计字符串中某个字符出现的次数。比如统计'Hello'中'l'出现了几次。"
**学生解答过程**
```cpp
string s = "Hello";
char target = 'l';
count = 0;
for (char c : s) {
if (c == target) {
count++;
}
}
cout << "字符'" << target << "'出现了" << count << "" << endl;
```
**老师点评**
"很好!这就是字符串遍历的典型应用。思路清晰,代码正确。"
---
## 💡 综合案例:姓名处理程序
**老师**
"现在我们把这节课的知识点综合起来,做一个完整的小程序。"
**需求**
"编写一个程序,要求:
1. 用户输入完整的姓名(姓和名之间可以有空格)
2. 程序分别输出姓和名
3. 程序输出名字的长度
4. 程序将姓名倒序输出"
**代码演示**
```cpp
#include <iostream>
#include <string>
using namespace std;
int main() {
string fullName;
// 输入完整姓名
cout << "请输入完整的姓名(如:张 三):";
getline(cin, fullName);
// 查找空格位置
int spacePos = fullName.find(' ');
// 输出姓名信息
cout << "\n=== 姓名信息 ===" << endl;
cout << "完整姓名:" << fullName << endl;
cout << "姓名长度:" << fullName.length() << " 个字符" << endl;
if (spacePos != string::npos) {
// 有空格,分离姓和名
string lastName = fullName.substr(0, spacePos);
string firstName = fullName.substr(spacePos + 1);
cout << "姓:" << lastName << endl;
cout << "名:" << firstName << endl;
} else {
// 没有空格
cout << "没有空格,无法分离姓和名" << endl;
}
// 倒序输出
cout << "倒序姓名:";
for (int i = fullName.length() - 1; i >= 0; i--) {
cout << fullName[i];
}
cout << endl;
return 0;
}
```
**运行示例**
```
请输入完整的姓名(如:张 三):王佳琳
=== 姓名信息 ===
完整姓名:王佳琳
姓名长度3 个字符
没有空格,无法分离姓和名
倒序姓名:琳佳王
```
**代码讲解**
"这个程序用到了我们今天学的所有知识点:
1. `getline` 读取整行姓名
2. `length()` 获取长度
3. `find()` 查找空格位置
4. `substr()` 截取子串
5. `for` 循环倒序输出"
**学生练习**
"现在请同学们在自己的电脑上运行这个程序,并尝试输入不同的姓名进行测试。"
(巡视指导)
"王佳琳,程序运行正常!"
"卢华琛,注意`substr`的参数是从哪个位置开始,截取多长。"
"唐钎宸,`string::npos`表示没有找到,这个要记住。"
---
## 🎓 课堂总结
**老师**
"好了同学们,今天我们学习了字符串的五个重要知识点:
1. **字符串概念**:用双引号括起来的字符序列
2. **声明初始化**`string s = "hello";`
3. **常用操作**:拼接、获取长度、访问字符、比较
4. **输入输出**`cin >>``getline` 的区别
5. **遍历方法**索引法、范围for循环、迭代器"
**重点回顾**
"最常用的几个操作:
- `s.length()` - 获取长度
- `s + t` - 字符串拼接
- `s[i]` - 访问第i个字符
- `getline(cin, s)` - 读取整行"
**作业布置**
"今天的作业是:
1. 完成教材第5章的练习题
2. 编写一个程序,统计用户输入的字符串中字母、数字、空格各有多少个
3. 预习下一章的内容:字符串查找和替换"
**老师鼓励**
"大家今天的表现都很积极!特别是王佳琳、卢华琛、唐钎宸三位同学,代码写得非常规范。希望同学们课后好好练习,下节课我们会学习字符串的更多高级操作。有任何问题可以随时问我。"
---
## 📝 课后反思
**成功之处**
1. 概念讲解清晰,从实际应用引入
2. 互动充分,学生参与度高
3. 代码示例丰富,循序渐进
4. 综合案例实用,巩固所学知识
**改进方向**
1. 可以增加更多学生练习的时间
2. 字符串查找部分可以提前预告,激发学习兴趣
3. 可以准备一些有趣的字符串练习题
**学生反馈**
- "老师,字符串比我想象的有趣多了!"
- "那个倒序输出的程序很酷!"
- "我觉得range for循环最简单好用"
---
**课时统计**45分钟
**完成度**100%
**班级氛围**:积极活跃,学习效果良好