当前课程知识点:C语言程序设计(上) > 循环结构的程序设计(二) > 4.6 break与continue > 4.6 循环中断与继续循环——break再讨论
大家好
我们再来讨论
break与contiune
那么break我们在前面见过
在switch里边 似乎它在很多情况下
是少不了的一个句子
用来说程序的走向到哪里
那switch里边如果有了break
大家知道 它是无条件的
跳到了当前这个switch的外边
那我们现在在循环体里边如果有它呢
它的作用是什么呢
跳出当前它所在的这个循环
什么叫当前所在的循环呢
我们看一下这几个
它在c里边给的几个循环语句
while这是当型循环
当判断进入循环体
break在这循环体里边的任何
一个地方出现的话
碰到它无条件的的goto到了谁
这个当前这个循环的下边
执行后续的语句 跳出当前这个循环
如果这个循环现在在第6层
那它就是跳出第6层
当然它不能跳出第5层
它只跳出它所在的循环
那对for来说是一样的
当型循环
当条件满足的时候执行循环
break出现在这个循环体的这块
如果碰到它
无条件的跳出这个循环执行后续的
那对do while的不同呢
是说它先做
那在循环体里边出现了break
那break也是无条件的到了后边
这就是我们要强调的
break如果在循环体里边的话
一定是终断的是它当前所在的这几个循环
我们看一个例子 什么时候会用到
这样的一个 就说要
让它终断当前的这个循环呢
我们看一个例子
素数这件事情 在咱们这个课程里边呢
已经说得比较多了
可是这块有一点不同是什么呢
最大的素数
这就是我们的潜在的我们要终断这个循环
找到了最大的就不找了 剩下的就不找了
那这里边也就说
我们需要你从键盘上输入一个n
我让你找从1到这个n之间
最大的那个素数是谁
那我这里边我们先确定一下数据域
数据域是
从1到我输入的那个n
如果我那n是9 那这数据域就是1~9
那这时候我们的思路是怎么做呢
你不是要找最大的
我肯定不会从1开始找
我一定从反着找
9是最大的那个素数吗
9是我找到的第一个素数吗
不是 8是吗 不是 7 ok 是了
找到了
我前面的1~6还用做吗
不用做了
所以 在7的这块找到了
一定在这个循环这就已经break走掉了
这就是我们说循环不一定要进行到底
把你的功能实现了 就可以了
当然在下边
我们是说的找素数这件事情
顺便说 我们看
我们刚才说的是数据域
那你的查找域呢
能反着找吗
我们看 比如说
我现在找的这个数 是8
那 素数的规则是
除过1和8它自己之外 剩下的
看这些数里边能不能被整除
如果所有不能被整除
这个数 就是我们要的那个素数
每一个我要编立
除过1和8之外 我从2~7
我都要除过来 这里边不能终断
终断了谁就不准了
所以呢
我这就不是反着来了 我就是从2开始
要看你能整除吗
这每个要做一遍
所以呢 如果我们把外边这个
找出来最大的素数这件事是外循环的话
那我们从2循环到n-1
你当前的数
当前那个数 比如说外循环我是用
n控制的
那n-1就是我要做的内循环的终值
而2就是我内循环的初值
n-1就是我内循环的终值
这是一定的查找域
是这样的一个方向
我们看一下这个
刚才 我们大家说如果找在那
这个就不做了 括起来的
如果我现在是
从8去找的话 2~7这块都是要做的
大家看在这个例子里边
有两处需要终断
1处是什么呢
是外循环
当我倒着找
找到了我要找的这个最大的一个
因为这边是找一个 找到最大的一个
我剩下的循环就不做了 我需要终断
那内循环呢
是不是我必须把2~n-1都做完了呢
那是取决于说你这个数是不是素数
如果是素数 你一定是做完的
如果说这个数不是素数 比如说它是6
那我走到2的时候
他已经有被整除的了
那它就不是素数了
那做到2的时候 我后边的就已经不做了
比如说是8
那我做到2的时候它已经被整除了
这个数就肯定不是素数了
那我后边的3~7还用做吗
不用做了
所以就说 当内循环里边
你这个数已经不是素数了 被废除了
那你后边的循环就不用做了
也需要一个终断
而外边的是找到了的时候
后边的也不用做了 也需要一个终断
那我们看一下这个程序怎么写
我们看一下刚才咱们分析过的这道题目
我们刚才说数据域是
从1开始到我们给的那个数
那个数是谁呢
在程序里安排的是n 读进来的是n
那显然 我们这个大循环里边
就说我要找
从倒着找 从最后一个找
找到为止
最后一个倒着找
n一定帮我们读进来的这个数是n--的
就说这个增量一定是n--的
那循环控制变量是什么呢
那你每一次找一个
那n只要大于谁呢
>0还是>1 1肯定不用找了
那我们可以是说 只要n>1
我们就一直找
除非是你都找到1了
你还没找到这么一个素数
那就说你给的数据域里边不存在这一个数
那n的初值是什么
n是我们读进来的
所以初值在这块
表达式1是没有的
n是在之前scanf进来的
所以 这个for的构成是这样
第一个表达式省掉
n只要大于1
你就找 除非你中途找到了
那么每做一次 我们就n--一次
这是在数据域的控制是这样
那在里边 我这个查找域呢
是怎么找呢
查找域比如说我们用i来控制它
i咱从哪里开始呢
我们说 素数是
被1和它自身整除 那咱就从2开始
2 然后
i一定要小于什么呢
小于你读进来的那个n
直到n-1就可以了
那每一次 我们是i++
这个过程就说从2
到它 比它自身小1
除非是你在这个过程里边出现了什么呢
你找到一个被 被整除的数了
那这个过程就要怎么了
就是如果n和你这个循环控制变量
里边去求余
如果是等于0 那就是被整除了
那这时候我们需要做什么工作呢
break
一定是做break 跳出去
那就这个事
后边这些循环体里边的东西都不做了
否则的话 我们一直往后找
找到什么呢
我一直都找到了i=n-1了
i都走到了它最后 比如说我们是
目前这个n 当前的这个n是8
那我们都走到7了
n-1是7了
还没有被整除 还没有发现被整除
那就是找到这个数了
找到了这个数
下一个n还要找吗
不要找了 那我们就break
这是两个break用在哪里呢
就是你找到了这个数
找到了我也不再找了
这个是说 你的这个数被废掉了
在中途就发现它不是素数了
下边的事也不用做了
这两个break都是终断的
两个break都是终断了这个内循环
for这个内循环
那现在 是
我们在这 这一块呢
下面要做什么 下面要了做一个判断
a里边还是0吗 a在哪里给放在0呢
没有啊 a在一开始给它做的是1
那a如果是0的话就怎么样呢
就break 那是什么意思
是说 我们给了一个标记
如果你这个数已经找到了
找到了
你还要在继续找吗 不想继续找了
所以如果我们找到了
我们就给它赋值为0
那下边来
每做
把这 这个循环里边的两个if做完
下来会问
你这里边的标志还是1还是0啊
如果是0那就说明你刚才找到了
就break
那这个break在哪里
在内循环的外边
在这个for的外边
在外循环的里边
那也就说 这个break
这是让流程跳在哪了呢
跳到这个花括弧里
而前面这两个break
都让流程跳到了哪呢
跳到了这个花括弧的外面
跳到了内循环的外边
而这个break跳到了
红颜色的for循环的外边
这件事情就不做了 做完了
我们把这个程序运行一下看看
我们看一下这个程序的运行
刚才我们关注这边是三个break
这两个break在内循环里边
而这个break在内循环的外边
然后 我们运行一下
咱在运行一下
给一个25
那我们刚才看见了这个程序的运行
如果你给一个在大的数
那这个程序里边
其实就是我们刚才分析的时候关注的
你对外循环
外循环的控制
是控制你有没有找到这个最大的素数
那一旦找到了
你一定是要break走掉的
是让它直接跳到外循环
所以 这个break是安排在内循环的外边
外循环的里边
它才能跳出外循环
而这两个break
分别起的作用是说
这个是说 你已经不是素数了
我要终断这个内循环
这个是说我找到了这个最大的素数了
我要跳出这个内循环
是这样的一个作用
那么这里 这个程序里边呢
它比较有特点的是说
外循环里边套了内循环
内循环里边又并列了两个if
而在内循环的外边又有一个if
大家其实可以这个是锻炼的方式
然后看一下这个
我们把它展开
就是用设断点的方式
大家可以跟踪一下这个程序的流程
是对我们编程序是有帮助的
那下来 这就我们刚才
看到的这个程序
那下来我们接着
看continue的那个作用
那continue这个语句
它跟break不一样
break是可以在switch里边用
也可以在循环里边用
也就说可以在选择结构里用
也可以在循环里边用
而continue只能在循环里边用
那它的作用是什么呢
它的作用是
仅仅终断当前这一次的循环
而不是这一层的循环
是这一次的循环
当前这一次循环不做了
接着做下一轮
是这样 然后
这一块就是尤其要注意的
它跟break最大的区别
它并不是跳出它当前所在的循环
比如说这个循环是在这一块
是一个 很大的一个过程
在这个中间 遇到了continue
那continue是说下边这些句子就不做了
这一次就不做了
我到循环的出口处
然后 从出口处增量
再回到循环的入口处
那如果把它搁在这里边
看一下continue跟break的一个比较的话
continue是从这走掉了
走到哪 走到循环的入口处
而循环 这是当型循环
到循环入口处在判断
下面还要继续做这一次的循环吗
如果这块是break break就走到哪呢
从这直接出来了 到了外边了
所以 continue是继续
而不是终断
他仅仅是终断的我当前这一轮
下边的句子不做了
这是从这直接出来
到了循环的入口处
这就是 如果在这个for语句里边
它也是一样的 它是到哪去了呢
到表达式3这
做增量 增量完了以后要回去了
不是说跳出来了
continue在这个do while句子里边
也是一样的
我是到哪里呢 到循环的出口处
再去判断做下一轮
并不是跳出循环 而是继续
所以 用continue
那我们用一个例子来看一下
在这个例子里边 大家看
是说 输入了10个整数
统计这10个数里边的正数有几个
数数 数有几个
大于等于0的数
以及把这些>=0的数求一下平均值
那你就是说 我们输入一个
scanf一个数 你下来要计数
计数 并且
计数之前我们要做判断
你是>=0吗
是>=0我在计数
在相加
所以 我们看
在这个循环是从1~10的
你应定要给10个数了 给10个数
这十个数你读进来 每一次读进来问
是<=0吗
那<=0
我就不做了
就不做什么 不做计数相加
这地下这个 这计数累加
那你要是<=0就不是我要的正整数了
我就跳出去continue
但是我这一次你输进来的数不做了
我不等于下一个数不输了
所以 实际上这个continue是让它到这
到这个循环的 这个出口处
出口处增量返回来
那么i增量了一次了
i已经++了一次了 在出口处++了一次
回来问
新的i还<=10吗
如果是的
那我们还进来继续在读一个数
再去判断
所以我们看到这个continue
在这的作用是说
增量在进行新的循环
终断了当前这一轮的循环
结束了这个循环出来就输出
我们看一下这个程序
在这 scanf我们读进去
咱改一下 咱们就读进来4个数吧
我们就要4个数 那这一块
运行一下
输入4个数
那我们这个数是 应该是
大于0的数是105
直接
没有问题
大家刚才看见了说
你输入的中间我们有一个是0
有一个是-1
那就是下边这两件事
就是计数和求和都没有做了
-1.1 计算机的问题求解方法
--讨论题:数学模型
-1.1 计算机的问题求解方法--作业
-1.2 C语言与C程序
--讨论题:运算符
-1.3 C语言处理系统与程序调试运行
--例程
-1.4 程序中的人机交互
--例程
--作业讨论区
-2.1 算术运算的C程序实现
--算术混合运算.c
-2.1 算术运算的C程序实现--作业
-2.2 关系运算的C程序实现
--bukao.c
--字符比较.c
--讨论题:比较大小
-2.2 关系运算的C程序实现--作业
-第二周作业--作业
-2.3 逻辑运算的C程序实现
--计算结合性
--闰年.c
--自动购票问题.c
-2.3 逻辑运算的C程序实现--作业
-2.4 位运算的C程序实现
--讨论题:位运算
-2.5 几种很个别的运算
--讨论题
--讨论题
-2.5 几种很个别的运算--作业
-2.6 混合运算及数据类型转换
--讨论题:数据类型
-2.7 顺序结构程序实例
--Video
--三角形面积.c
--讨论题:工业产值
-2.7 顺序结构程序实例--作业
-3.1 程序中的路径选择实现
--打印学生成绩.c
--一元二次方程.c
-3.1 程序中的路径选择实现--作业
-3.2 路径中的再选择——嵌套判断
--例程
--讨论题:程序改错
-3.2 路径中的再选择——嵌套判断--作业
-3.3 复杂判断问题的C程序设计
--3.3 多级选择
--银行存款.c
--讨论题:多级选择
-3.4 多分支问题的C程序设计
--加减乘除运算.c
-3.4 多分支问题的C程序设计--作业
-3.5 GOTO的适当使用
-3.6 选择结构的程序实例
--3.6 程序展示
--计算第几天.c
--讨论题:输出奇数
--讨论题:计算税金
-3.6 选择结构的程序实例--作业
-第四周作业--作业
-4.1 需要重复执行的程序
--求和.c
--打印学生成绩.c
--统计录入速度.c
--求平均数.c
-4.1 需要重复执行的程序--作业
-4.2 至少要执行一次的循环
--n的阶乘.c
--字符分类统计.c
-4.2 至少要执行一次的循环--作业
-4.3 已知循环次数用for语句
--求和问题.c
--数列求和.c
--讨论题:循环语句
-4.3 已知循环次数用for语句--作业
-4.4 循环控制——简单循环应用
--水仙花数.c
--讨论题:死循环
--讨论题:猜数字
-循环结构的程序设计(一)--4.4 循环控制——简单循环应用
-4.5 循环的嵌套
--讨论题:程序运行
-4.5 循环的嵌套--作业
-4.6 break与continue
--最大素数.c
-4.6 break与continue--作业
-4.7 循环的综合应用
--数的排列组合.c
--鸡兔同笼.c
--打印空心字符.c
--讨论题:打印图形
--讨论题:计算闰年
-第六周作业
-第六周作业--作业
-5.1 同类有序数据处理问题
-5.2 一维数组的定义和引用
--数组定义.c
--数组初始化.c
--反向输出.c
--讨论题:对称数
-5.2 一维数组的定义和引用--作业
-5.3 一维字符串数组
--讨论题:编程
-5.4 字符串处理函数
--字符串反向.c
--字符串函数
-5.5 二维数组的定义与使用
-5.6 二维数组的输入输出
-5.6 二维数组的输入输出--作业
-5.7 二维数组的应用
--转置矩阵.c
--讨论题:修改程序
-5.8 二维字符数组
--5.8 单词排序
--单词排序.c
-5.8 二维字符数组--作业
-5.9 数组综合应用
--统计成绩.c
--统计字符次数.c
--讨论题:洗牌
-本期课程结束语
--end
-第八周编程作业
-《C语言程序设计(上)》期末复习参考
--html
-《C语言程序设计(上)》期末复习参考答案
--html