3.6 常见问题与调试

1 常见错误类型

🧩 返回值错误

情景故事:小明写了一个计算平均分的函数,但总是得到奇怪的结果...

cpp 复制代码
// 有问题的函数
double calculateAverage(int a, int b) {
    int sum = a + b;
    sum / 2;  // 忘记return啦!
}

// 正确写法
double calculateAverage(int a, int b) {
    return (a + b) / 2.0;  // 注意用2.0保证小数运算
}

趣味练习:找出下面函数的错误

cpp 复制代码
string getGrade(int score) {
    if(score >= 90) 
        "A";
    else 
        return "B";
}

🔌 参数不匹配

情景故事:小红想用函数画三角形,但总提示错误...

cpp 复制代码
// 函数定义
void drawTriangle(int size, char symbol) { /*...*/ }

// 错误调用
drawTriangle('*', 5);  // 顺序反了!

记忆口诀

"参数顺序要记牢,就像穿鞋先穿袜"

🌀 递归栈溢出

情景故事:小刚的递归函数让电脑"卡死"了...

cpp 复制代码
// 危险!没有终止条件
void countDown(int num) {
    cout << num << endl;
    countDown(num - 1);  // 无限循环!
}

// 安全版本
void countDown(int num) {
    if(num < 0) return;  // 停止条件
    cout << num << endl;
    countDown(num - 1);
}

可视化理解

plain 复制代码
countDown(3)
→ 打印3
→ countDown(2)
  → 打印2
  → countDown(1)
    → 打印1
    → countDown(0)
      → 打印0
      → countDown(-1) ✋停止

2 调试技巧

🖨️ 输出中间值

侦探游戏:像侦探一样收集线索!

cpp 复制代码
int mysteryFunction(int x) {
    cout << "侦探日志:收到x=" << x << endl;  // 线索1
    
    int step1 = x * 2;
    cout << "第一步计算后:" << step1 << endl;  // 线索2
    
    int result = step1 + 5;
    cout << "最终结果:" << result << endl;  // 线索3
    
    return result;
}

实践任务:在下面的函数中添加侦探日志

cpp 复制代码
int calculate(int a, int b) {
    int sum = a + b;
    int product = a * b;
    return sum + product;
}

🧩 分步测试法

积木拆解法:把大问题拆成小积木测试

cpp 复制代码
// 原函数
int complexCalculation(int x) {
    int a = x * 2;
    int b = a + 5;
    int c = b / 3;
    return c * c;
}

// 分步测试
void testSteps() {
    int testValue = 4;
    cout << "测试第一步:" << testValue * 2 << endl;  // 应得8
    cout << "测试第二步:" << 8 + 5 << endl;         // 应得13
    // ...继续测试其他步骤
}

📝 纸笔辅助法

画图练习:用纸笔追踪变量变化

cpp 复制代码
void confusingFunction() {
    int a = 3;
    a = a + 2;
    int b = a * 4;
    a = b - 5;
    cout << a << "," << b;
}

追踪表格

行号 a的值 b的值
1 3 ?
2 5 ?
3 5 20
4 15 20

3 调试练习

🐞 有bug的求和函数

cpp 复制代码
// 这个函数应该计算1+2+...+n
int sumToN(int n) {
    int sum = 0;
    for(int i = 1; i <= n; i--) {  // 这里有错!
        sum += i;
    }
    return sum;
}

调试任务

  1. 用纸笔画出当n=3时的循环过程
  2. 添加cout输出i和sum的变化
  3. 找出并修复错误

♾️ 无限递归示例

cpp 复制代码
void countStars(int n) {
    cout << "*";
    countStars(n);  // 问题出在这里!
}

修复挑战

  1. 这个函数会输出多少个星号?
  2. 如何修改才能让它只输出n个星号?
  3. 添加什么条件可以防止无限递归?

🔄 参数传递错误案例

cpp 复制代码
void swap(int a, int b) {  // 这里有问题!
    int temp = a;
    a = b;
    b = temp;
}

int main() {
    int x = 1, y = 2;
    swap(x, y);
    cout << x << "," << y;  // 输出什么?
}

思考问题

  1. 为什么x和y的值没有交换?
  2. 如何修改swap函数才能真的交换两个数?
  3. 画图说明值传递和引用传递的区别

趣味调试游戏

🕵️‍♂️ 代码侦探社

游戏规则

  1. 老师准备5个有bug的代码片段
  2. 学生分组扮演"代码侦探"
  3. 每组用学到的调试方法找出bug
  4. 最快修复所有bug的小组获胜

示例案件

cpp 复制代码
// 案件1:这个函数应该判断数字是否是偶数
bool isEven(int num) {
    return num % 2 = 0;  // 这里有线索!
}

🧩 调试拼图

将正确代码打印在纸上并剪成碎片,学生需要:

  1. 先找出代码中的错误
  2. 然后拼出正确的代码
  3. 最后用电脑验证

家长辅助指南

家庭调试练习

cpp 复制代码
// 周末家庭任务:帮爸爸妈妈找出购物计算程序的bug
void shopping() {
    float price = 18.5;
    int quantity = 3;
    float total = price * quantity;
    
    cout << "总价:" << total << endl;
    cout << "折扣后:" << total * 0.1 << endl;  // 这里有错!
}

亲子互动

  1. 预期输出总价是55.5,折扣后应该是50
  2. 实际输出有什么问题?
  3. 一起思考如何修正

可视化学习工具推荐

  1. Python Tutor:可视化代码执行过程
  2. Code.org调试游戏:适合初学者的互动游戏
  3. Scratch调试项目:通过积木块理解调试概念

本章总结卡

错误类型 常见表现 解决方法
忘记返回值 得到随机数 检查所有路径都有return
参数顺序错 结果不对 对照函数定义检查
无限递归 程序卡死 添加终止条件

记忆儿歌

编程出错不要慌,调试技巧来帮忙

输出中间看一看,分步测试不能忘

纸笔追踪变量变,小小bug无处藏

课后实践任务

  1. 基础题:修复一个计算圆面积的函数(故意去掉π)
  2. 提高题:找出斐波那契数列函数中的逻辑错误
  3. 挑战题:调试一个错误的密码验证程序
  4. 创意题:设计自己的"找bug"游戏关卡

教师提示:可以准备一些贴纸奖励成功调试的学生,培养他们"debug小能手"的成就感!

相关推荐
CHANG_THE_WORLD4 小时前
C++ 并发编程指南 实现无锁队列
开发语言·c++·缓存·无锁队列·无锁编程
今天也好累5 小时前
C++ 小游戏:拍桌子
c++·笔记·学习·算法
CHANG_THE_WORLD5 小时前
C++ 内存模型:用生活中的例子理解并发编程
开发语言·c++·生活
钱彬 (Qian Bin)5 小时前
一文掌握工业缺陷检测项目实战(Pytorch算法训练、部署、C++ DLL制作、Qt集成)
c++·pytorch·python·qt·实战·工业缺陷检测·faster rcnn
努力努力再努力wz6 小时前
【c++进阶系列】:万字详解AVL树(附源码实现)
java·运维·开发语言·c++·redis
小张成长计划..6 小时前
C++基础知识
c++
CHANG_THE_WORLD6 小时前
C++并发编程指南 std::promise 介绍与使用
java·开发语言·c++·promise
天天代码码天天8 小时前
C++ opencv RTSP小工具 RTSP流播放、每一帧保存
开发语言·c++·opencv
linux开发之路8 小时前
C++ 音视频开发常见面试题及答案汇总
c++·ffmpeg·音视频·流媒体·音视频编解码
再睡一夏就好9 小时前
【C++闯关笔记】STL:list 的学习和使用
c语言·数据结构·c++·笔记·算法·学习笔记