C语言学习笔记 - 61.流程控制15 - 复习算法思维与程序掌握方法 一、本节学习定位本节内容是对上一节知识的回顾与方法总结重点不是新增复杂语法而是明确 C 语言学习中的一个核心问题程序不是单纯由语法堆砌而成程序设计首先依赖算法思路其次才是用 C 语言语法表达算法。在 C 语言入门阶段很多题目看起来只是简单的数字处理例如对三个数排序交换两个变量的值判断条件后执行不同语句按一定流程修改变量。这些题目虽然代码不长但都需要先明确算法步骤。如果算法没有想清楚直接动手写代码往往很难写出正确程序。二、程序设计的核心算法优先1. 程序设计的基本认识从学习角度看一个程序可以理解为程序 算法 可执行的程序语言表达其中算法是解决问题的步骤和方法C 语言是表达算法的工具。也就是说写程序时不能只关注语法是否会写还要先解决以下问题题目要解决什么问题输入数据是什么输出结果是什么中间需要经过哪些处理步骤每一步之间的先后顺序是什么是否需要判断、循环、交换、排序等操作。如果没有清晰的解题思路通常不应急着写代码。三、例 1两个变量的值互换1. 问题描述给定两个变量a和b要求交换它们的值。例如交换前a 3, b 5 交换后a 5, b 32. 错误交换方式初学者容易写出如下代码a b; b a;这段代码是错误的。原因是执行第一句后a的原值已经丢失。假设初始值为a 3, b 5执行过程如下步骤语句a 的值b 的值说明初始-35原始数据第 1 步a b;55a的原值 3 丢失第 2 步b a;55b仍然得到 5最终结果不是交换而是两个变量都变成了b的原值。3. 正确交换方式借助第三个变量交换两个变量时必须先用第三个变量保存其中一个变量的原值。int t; t a; a b; b t;这三句代码应当熟练掌握因为变量交换在排序、数组处理和算法题中经常使用。4. 完整示例程序#include stdio.h int main(void) { int a; int b; int t; printf(请输入两个整数); scanf(%d%d, a, b); printf(交换前a %d, b %d\n, a, b); t a; // 第一步保存 a 的原值 a b; // 第二步把 b 的值赋给 a b t; // 第三步把原来 a 的值赋给 b printf(交换后a %d, b %d\n, a, b); return 0; }5. 程序执行过程分析假设输入3 5变量变化如下步骤执行语句abt说明初始输入后35未确定a和b保存输入值第 1 步t a;353用t保存a的原值第 2 步a b;553将b的值赋给a第 3 步b t;533将原来a的值赋给b最终实现交换a 5, b 3四、例 2对三个整数从小到大排序1. 问题描述输入任意三个整数a、b、c要求按照从小到大的顺序输出。例如输入8 3 5 输出3 5 8这个问题的关键不是printf或scanf而是要先明确排序算法。2. 基本算法思路可以通过多次比较和交换完成排序如果a b交换a和b保证a b如果a c交换a和c保证a是三个数中较小的如果b c交换b和c保证b c最终得到a b c。3. 完整示例程序#include stdio.h int main(void) { int a; int b; int c; int t; printf(请输入三个整数); scanf(%d%d%d, a, b, c); if (a b) { t a; a b; b t; } if (a c) { t a; a c; c t; } if (b c) { t b; b c; c t; } printf(从小到大排序结果%d %d %d\n, a, b, c); return 0; }4. 程序讲解代码片段功能scanf(%d%d%d, a, b, c);输入三个整数if (a b)判断a和b是否逆序t a; a b; b t;交换两个变量的值if (a c)保证a不大于cif (b c)保证b不大于cprintf(...)输出排序后的结果5. 示例跟踪输入8 3 5执行过程步骤abc说明初始835输入原始数据判断a b3858 3交换a和b判断a c3853 5 不成立不交换判断b c3588 5交换b和c最终输出3 5 8五、看懂程序的三步法看懂程序和掌握程序不是同一个概念。看懂程序是掌握程序的前提但仅仅看懂还不等于能够独立写出程序。看懂一个程序可以按三步进行。1. 第一步看流程流程是指程序中语句的执行顺序即先执行哪一句后执行哪一句。例如if (a b) { t a; a b; b t; }阅读这段程序时应先明确流程先判断a b是否成立如果条件成立执行花括号中的三条交换语句如果条件不成立跳过花括号中的语句程序继续执行后面的代码。如果不清楚程序流程就无法真正理解程序。2. 第二步看每条语句的功能知道执行顺序之后还要理解每条语句的具体作用。例如t a; a b; b t;这三条语句不能只看作普通赋值而要理解其功能语句功能t a;保存a的原值a b;把b的值赋给ab t;把原来a的值赋给b其中是赋值运算符表示把右边表达式的值赋给左边变量。3. 第三步代入数据试运行如果仍然不理解程序可以选择一组具体数据逐句跟踪变量变化。例如对三个数排序程序可以代入a 8, b 3, c 5然后逐句分析每个if是否成立以及变量值如何变化。通过代入数据可以把抽象代码转化为具体过程更容易发现程序逻辑。六、看懂程序与掌握程序的区别对比项看懂程序掌握程序核心目标明白程序为什么这样写能够独立写出并调试程序主要方式阅读、分析、代入数据修改、敲写、调试、复现判断标准能解释每条语句的作用不看答案也能写出正确代码常见问题以为看懂就会写实际敲代码时仍然出错正确做法先理解流程和语句功能再通过多次练习形成熟练度结论看懂只是第一步真正掌握必须经过实际敲代码和调试。七、掌握一个小算法程序的六步法对于涉及算法的小程序建议按以下步骤学习。1. 尝试独立解决拿到题目后先自己分析输入是什么输出是什么是否需要比较是否需要交换是否需要循环是否需要辅助变量程序流程如何安排。如果能够独立写出程序说明算法思路比较清晰。2. 无法解决时查看答案如果程序涉及算法而自己短时间内没有思路不必长时间死磕。此时可以查看参考答案。重点不是抄答案而是理解答案为什么这样设计每个变量起什么作用每个判断条件为什么这样写每次交换、赋值、循环的目的是什么代码执行后变量如何变化。3. 把答案看懂看答案时应按“三步法”分析看程序流程看每条语句的功能代入具体数据试运行。例如两数交换程序不仅要记住t a; a b; b t;还要明白为什么必须先执行t a;。4. 尝试修改程序并观察结果看懂答案后不应马上闭着眼睛默写而应尝试修改代码观察输出变化。例如可以修改排序程序中的条件if (a b)改为if (a b)然后观察当两个数相等时程序是否仍然正确。也可以尝试去掉花括号if (a b) t a; a b; b t;这段代码看起来相似但实际上只有t a;受if控制后两句会无条件执行因此逻辑会出错。5. 照着答案敲写并调试理解答案后要亲自敲一遍代码。实际敲代码时可能出现拼写错误分号遗漏花括号不匹配scanf中少写条件判断写错变量名写错输出格式不匹配。调试错误是学习 C 语言不可缺少的过程。程序能运行不代表过程没有意义程序出错时正是理解语法细节和程序流程的机会。6. 不看答案独立复现最后一步是不看答案独立把程序写出来。如果当天能写出说明已经初步掌握但还需要隔几天再次练习。第一次复现通常最困难第二次会明显轻松后续通过复习逐步形成稳定记忆。八、极少数无法理解的程序如何处理如果某个程序经过分析、代入数据、修改实验和调试后仍然无法完全理解可以先记住其基本结构后续学习更多语法和算法后再回头理解。但这种情况不应太多。对于入门阶段的大多数程序只要按以下顺序处理通常都可以理解理清流程理解语句功能代入数据修改验证敲写调试独立复现。九、在 VSCode 中练习本节代码的建议使用 VSCode 配置好 C/C 环境后可以按以下流程练习本节程序。1. 新建 C 源文件建议文件名swap.c或sort_three_numbers.c2. 编写代码将示例代码复制到.c文件中注意文件扩展名必须是.c。3. 使用终端编译Windows 下如果使用 GCC可在 VSCode 终端中执行gcc swap.c -o swap.exe或者gcc sort_three_numbers.c -o sort_three_numbers.exe4. 运行程序./swap.exe或者./sort_three_numbers.exe5. 修改程序并重新运行建议尝试修改输入数据修改if条件故意去掉花括号观察逻辑错误故意漏写观察scanf的错误调换交换语句顺序观察变量值变化。这种练习方式可以帮助理解“看懂”和“掌握”的区别。十、本节要点总结C 语言程序设计不能只学语法更要先有算法思路。对三个数排序、两个数交换等题目核心都在于先明确处理步骤。两个变量交换必须借助第三个变量典型写法是t a; a b; b t;看懂程序可分为三步看流程、看语句功能、代入数据试运行。看懂程序不等于掌握程序掌握程序还需要修改、敲写、调试和独立复现。学习小算法程序时不必长时间盲目死磕如果没有思路应通过可靠答案学习算法。调试错误不是浪费时间而是加深理解的重要环节。程序需要隔几天重复练习才能真正形成稳定掌握。参考出处《C程序设计第五版》谭浩强第 3 章“最简单的 C 程序设计——顺序程序设计”《C程序设计第五版》谭浩强第 4 章“选择结构程序设计”郝斌《C语言自学入门教程》对应内容算法意识、两数交换、三数排序、程序阅读方法与程序掌握方法。