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

12 KiB
Raw Blame History

CSP03班第七节课string- 上课逐字稿

班级CSP03班
课程C++信息奥赛
课次第7课
知识点:字符串基础
日期2026年4月15日


📚 课前准备

老师 "同学们下午好欢迎大家来到今天的C++课堂。今天我们要学习一个非常有趣也非常重要的知识点——字符串。在开始之前,大家想一想,我们平时用电脑都会接触到哪些文字信息?"

学生互动 (等待学生回答)

  • "QQ聊天记录"
  • "发短信"
  • "写作文"
  • "编程代码"

老师总结 "很好!不管是聊天记录、短信还是作文,这些文字信息在计算机里都被统一称为'字符串'。今天我们就来学习如何在C++中处理这些文字信息。"


🎯 知识点导入

老师 "打开你们的PPT今天我们要学习的是字符串的基础知识。先请一位同学大声朗读这节课的5个知识点。"

学生朗读

  1. 字符串的概念
  2. 字符串的声明与初始化
  3. 字符串的常用操作
  4. 字符串的输入输出
  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;
}

重点讲解 "大家注意:

  1. #include <string> 是必须的,告诉编译器我们要用字符串
  2. string name; 声明了一个空字符串
  3. string hobby = "编程"; 同时完成了声明和赋值
  4. 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;
}

重点强调 "特别注意:

  1. 字符串拼接用 + 号,就像数学里的加法
  2. length() 函数返回字符串的字符个数
  3. 字符串的索引从0开始[0] 是第一个字符
  4. 可以直接用 == 比较字符串是否相等"

互动练习 "请写一个程序,声明两个字符串变量,分别存储你的姓和名,然后将它们拼接成完整的名字并输出。"

学生展示 "王佳琳,请展示你的代码。"

学生代码

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;
}

重点讲解 "这里有个非常重要的区别:

  1. cin >> name; 遇到空格就会停止,比如输入'张 三',只会读取'张'
  2. 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;

对比讲解 "三种方法的区别:

  1. 索引法:最直观,需要知道字符串长度
  2. 范围for循环:最简单、最安全,推荐初学者使用
  3. 迭代器:最强大,适合处理复杂的数据结构"

练习题 "请写一个程序,统计字符串中某个字符出现的次数。比如统计'Hello'中'l'出现了几次。"

学生解答过程

string s = "Hello";
char target = 'l';
count = 0;

for (char c : s) {
    if (c == target) {
        count++;
    }
}

cout << "字符'" << target << "'出现了" << count << "次" << endl;

老师点评 "很好!这就是字符串遍历的典型应用。思路清晰,代码正确。"


💡 综合案例:姓名处理程序

老师 "现在我们把这节课的知识点综合起来,做一个完整的小程序。"

需求 "编写一个程序,要求:

  1. 用户输入完整的姓名(姓和名之间可以有空格)
  2. 程序分别输出姓和名
  3. 程序输出名字的长度
  4. 程序将姓名倒序输出"

代码演示

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