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