# 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++中,我们需要包含 `` 头文件。" **代码演示**: ```cpp #include #include using namespace std; int main() { // 声明字符串变量 string name; // 只声明,未赋值 string hobby = "编程"; // 声明并初始化 string message("你好"); // 用构造函数初始化 // 输出 cout << name << endl; cout << hobby << endl; cout << message << endl; return 0; } ``` **重点讲解**: "大家注意: 1. `#include ` 是必须的,告诉编译器我们要用字符串 2. `string name;` 声明了一个空字符串 3. `string hobby = "编程";` 同时完成了声明和赋值 4. C++中有多种初始化方式,上面两种最常用" **学生练习**: "现在请在你们的电脑上尝试声明一个字符串变量来存储你们的名字,并输出出来。" (巡视指导) "卢华琛,你的代码写得很规范!" "唐钎宸,记得加上 `#include ` 哦。" --- ## 🔧 知识点三:字符串的常用操作 **老师**: "字符串有很多常用的操作,就像我们对数字可以进行加减乘除一样,字符串也有自己的操作方法。" **代码演示**: ```cpp #include #include 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 #include 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 #include 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 #include 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% **班级氛围**:积极活跃,学习效果良好