当前课程知识点:程序设计基础 > 第三章 逻辑推理与枚举解题 > 3.3 谁做的好事——循环枚举 > 3.3.1 谁做的好事——循环枚举
运用枚举的思想呢 我们编写了程序
让计算机呢 解决了逻辑问题谁做了好事
那在这个程序中呢
由于我们枚举了四个可能的答案
所以呢,我们重复的写了四段相同的代码
如果 有400个同学呢
那我们就写400个相同的代码
那程序会有多长呢
那实际上呢,对于这种有规律的重复的代码呢
我们一般并不需要真的重复的去写
那么代码呢,只需要写一遍
但是我们可以让计算机重复的执行这段代码的指令
那这里呢,就要用到了某一类语句
我们称为叫循环的语句
顾名思义呢
循环语句就用来指挥计算机
循环重复去执行一些指令
最常用的循环语句呢,是for语句
那大家请看这for语句一个语法
那这个for语句显然跟前面的if语句相比啊
就复杂多了
那它也是有关键字,for开头
后面呢,有一对圆括号,但圆括号里头呢
它不是一个表达式了,它有三个表达式
那下面还有一个语句,那for语句是什么意义呢
请看我们的流程图
它的意义是这样的
首先呢,计算机会计算表达式一
计算完表达式一以后呢
它就计算表达式二
如果表达式二的计算结果为真
可以进行下面的语句
那当然这个语句呢
可以是分号结尾的单个的语句
也可以是大括号括起来的复合语句
那么我们把这个语句呢
称为循环体
因为它是我们循环反复执行的这么一段东西叫循环体
然后执行了循环体以后
计算机开始对表达式三开进行计算
计算完表达式三以后啊
我们看这个箭头
它会返回到表达式二的地方
意味着说,它再去算表达式二
那如果表达式二的计算结果是假的话呢
它就不会去执行这个循环体了
它将由箭头直接跳出去了
跳到这个for语句后面的一个语句上去了
所以呢
我们只要合理的去设置我们这个表达式一二三
就可以让这三个表达式相互配合
然后就让这个循环啊,就转起来
并且呢,在合适的时候
我们让这个表达式二的计算结果是假
它就可以停止这样的循环
那我们可以看一个例子
这也是我们控制这种for循环常用的技巧
我们称为叫设计一个或使用一个循环变量
在这个螺旋图中呢
我们用了个变量叫i, 我们把这个i呢
就称为循环变量
大家看一下,这个表达式一呢
我们对i进行赋值,让i等于1
表达式二呢,我们是以一个关系表达式
这里写的是:i小于等于100
然后呢,可能是一些语句
表达式三呢,我们写的是i等于i加1
那我们来看一下
这个for的语句执行起来会是什么样子呢
首先呢,我们从上面往下走
i赋值等于1,然后进行判断
那显然这个时候
i是小于等于100的
所以我们就会执行语一个语句
也就是说,当i等于1的时候呢
这个语句就会被执行第一次
执行完这个语句之后
或者说执行了这个我们叫循环体之后呢
我们就进行表达式三的计算。i=i+1
这个时候1就等于2了
然后我们沿着箭头
继续判断说,i等于i的时候
它是不是小于等于100呢
当然,它小于等于100.所以这个时候
我们就要再一次执行这个语句
那么这是我们第二次执行这个语句
大于等于三呢
也就是说,执行完语句以后
i等于i+1以后它变成3了
那么显然它还是小于等于100
那么语句又会得到执行
这时候是第三次执行这个语句了
那我们看到, i等于几
它就是第几次执行语句
所以这么一直循环下去
而且呢,表达式三每次都会让i+1
所以啊,i慢慢变大变大变大
当i等于100的时候
我们执行了表达式三
i等于100了
在看呢,它还是小于等于100
那么这个时候
我们的语句需要执行
这个时候应该就是根据规律第100次执行了
然后我们再算表达式三,i=i+1
这个时候,i就变成了101了
这个时候表达式二的计算结果就是force
那语句就不会再执行了,就直接我们叫
跳出了,或者说退出了这么一个循环
所以,一共这些语句被执行多少次呢
我们发现说,最终执行了100次
那么这样一个控制呢,我们就通过
我们的表达式一i=1,表达式二i小于等于100
和表达式三i=i+1这三个表达式来共同配合实现的
那么在我们写代码的过程中间呢
还经常把i=i+1写成i++或++i的形式
这个呢,也是我们常用的一个写法
看大家自己写代码的一个习惯,都可以
好,再回到我们刚才的这个谁做好事的这个问题上
我们现在怎么利用这个for这个语句
来避免这种重复的代码书写呢
请看我们的这个代码
我们现在用一个循环变量
就是这个goodman
我们既然是依次假设它是ABCD
所以我们现在就让goodman这个循环变量呢
初始值,我们说这个表达式一呢
就是goodman等于字符A
那么它的这个表达式二呢
是goodman小于等于字符D
因为我们知道,这个字符啊其实是一个整形
对吧。然后他们是这个顺序
我们用这个goodman小于等于D做表达式二
表达式三呢,我们这里写的是goodman++
好,中间是我们的这个计数判断
到底是不是有3个人说了真话,并且输出的
那么,根据我们刚才得这个讲解呢
我们用了这个for的语句之后
程序就会反复的执行
那依次的去假设
这个做好事是ABCD
这里还有一个小问题当然
就是如果我们已经找到答案了
那就不需要再去假设下一种情况了
不需要再枚举下面一个可能答案了
所以呢,这个时候我们再次循环
我们再去做没有意义了
那怎么让这个循环提前停下来呢
这里我们要用到一个新的语句
我们叫break
它的作用呢,就是直接从循环里头跳出来
你就别再去计算这个表达式二了
大家看这个我们这个流程图。在语句的部分
如果我们用的是break的话呢
那它根本就连表达式三都不去算了
那更不用往后再去算表达式二了
直接从这个循环里头就断开
break就断开了,跳到外面
所以呢,有了break之后
我们最终的这个代码就会写成这个样子
我们在找到了做好事的人之后
我们就直接break来退出这个循环
就不用继续尝试下去了
这样呢,我们这个完整的找谁做好事就解决了
那我们说,其实这种枚举
这种思想在计算机程序中间经常要使用的
往往呢,我们也是用循环来实现的
我们通过合理的巧妙地去设定
表达式一二三,来实现这种依次的
不遗漏的枚举所有可能的答案
然后通过循环体呢
来检验我们的答案是不是正确
-1.1 基础知识
-1.2 买菜问题
-1.3 数学运算
-1.4 补充说明
-1.5 总结
--1.5 总结
-程设论道
--程设论道
-师生问答
-第一章 编程初步--语法自测
-2.1 关于超级计算器的几点思考
-2.2 电子秤模拟 — 背景介绍及需求分析
-2.3 电子秤模拟 — 代码实现
-2.4 变量定义与变量类型
-2.5 猜数游戏与数据表示
-2.6 关于变量的讨论
--公告
-2.7 变量体现的计算思维
-程设论道
--程设论道
-师生问答
--师生问答
-第二章 变量与代数思维--语法自测
-3.1 谁做的好事——语义表示
-3.2 谁做的好事——真假检查
-3.3 谁做的好事——循环枚举
-3.4 谁是嫌疑犯——多重循环枚举
-3.5 谁是嫌疑犯——破案线索表示
-3.6 谁是嫌疑犯——用二进制枚举
-程设论道
--程设论道一
--程设论道二
--程设论道三
-师生问答
-第三章 逻辑推理与枚举解题--语法自测
-4.1 插花游戏
-4.2 筛法
-4.3 线性查找
-4.4 折半查找
--4.4.1 提问
-4.5 排序问题
-4.6 总结
--4.6.1 总结
-程设论道
--程设论道二:筛法
-师生问答
-第四章 筛法与查找--语法自测
-5.1 阶乘
-5.2 排序
-5.3 矩阵填充
-5.4 分书与八皇后
-5.5 青蛙过河
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答一
--师生问答二
-第五章 分治思想与递归--语法自测
-6.1 兔子数列问题
-6.2 分鱼问题
-6.3 橱窗的插花问题
-6.4 最长公共子序列问题
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答
-第六章 递推与动态规划--语法自测
-7.1 统计记录总数
-7.2 统计活跃用户数
-7.3 统计在线时长
--7.3.2 结构
-7.4 总结
--7.4.1 总结
-程设论道
--程设论道
-师生问答
--师生问答
-第七章 文本数据处理--语法自测
-8.1 将数据组织成链表
-8.2 提高链表访问效率 —— 哈希链表
-8.3 以二进制文件存储链表
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答
-第八章 非文本数据处理--语法自测
-9.1 自动售卖程序
-9.2 配制水果信息
-9.3 指定界面语言
-程设论道
--程设论道
-师生问答
--师生问答
-第九章 可配置的程序设计--语法自测