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小能手"的成就感!

相关推荐
报错小能手7 分钟前
C++笔记——STL list
c++·笔记
T.Ree.7 分钟前
cpp_list
开发语言·数据结构·c++·list
laocooon52385788610 分钟前
C++ 图片加背景音乐的处理
开发语言·c++
apocelipes20 分钟前
POSIX兼容系统上read和write系统调用的行为总结
linux·c语言·c++·python·golang·linux编程
No0d1es36 分钟前
2025年第十六届蓝桥杯青少组省赛 C++编程 中级组真题
c++·青少年编程·蓝桥杯·省赛
千禧皓月1 小时前
【C++】基于C++的RPC分布式网络通信框架(二)
c++·分布式·rpc
AA陈超1 小时前
虚幻引擎5 GAS开发俯视角RPG游戏 P07-08 点击移动
c++·游戏·ue5·游戏引擎·虚幻
·白小白2 小时前
力扣(LeetCode) ——209. 长度最小的子数组(C++)
c++·算法·leetcode
ohnoooo92 小时前
251106 算法
数据结构·c++·算法
卡提西亚2 小时前
C++笔记-24-文件读写操作
开发语言·c++·笔记