- 更新K4课程README与课程目录 - 更新AI03 SOLO模式体验课程内容 - 补录各班级学生出勤登记 - 更新课评汇总归档 - 新增CSP03 string使用课程笔记 - 新增备份脚本与逐字稿输出
442 lines
12 KiB
Markdown
442 lines
12 KiB
Markdown
# 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%
|
||
**班级氛围**:积极活跃,学习效果良好 |