更新课程内容与课评反馈(2026春季)

- 更新K4课程README与课程目录
- 更新AI03 SOLO模式体验课程内容
- 补录各班级学生出勤登记
- 更新课评汇总归档
- 新增CSP03 string使用课程笔记
- 新增备份脚本与逐字稿输出
This commit is contained in:
chengzi
2026-04-17 21:04:51 +08:00
parent 760a52830f
commit efa1e6aa60
49 changed files with 1635 additions and 79 deletions

View File

@@ -0,0 +1,442 @@
# 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%
**班级氛围**:积极活跃,学习效果良好