当前课程知识点:C语言程序设计(上) > 循环结构的程序设计(一) > 4.2 至少要执行一次的循环 > 4.2.1至少要执行一次的循环
大家好
我们接下来讨论
至少要执行一次的循环
什么样的循环是这样呢
我们前面讨论过while
while说当条件满足的时候执行循环
也就是说不满足的时候
循环一次都不执行
那是while
至少要执行一次的这样的循环呢
do while
先做
做完这个循环体
再判断
流程是这样
先做循环体 做
入口处没有任何关卡
进来 到出口处
条件满足吗
注意 这时候是yes的时候
无条件的go to的入口处
条件否则的时候
下来
也就是说一开始先做
直到条件为假的时候为止
所以呢
所以我们把这种循环叫
直到型循环
c给的构建的方式是这样
里边是循环体
在哪里判断呢
花括号的外边
出口处
循环的出口处 while
来判断这个条件
yes的时候回到do
no的时候顺序往下走
我们看一个例题
成绩录入并计算平均分
比如我们还说这班上是30个人
或者我们拿少一点 10个人 来说
把这10个数
一个一个录进去
平且算它最后的平均分
大家想这个流程里边要做什么呢
是不是每次需要scanf
键盘敲入这个成绩
然后给它什么呢
求和
最后呢
把这个事情做多少次呢
你给多少人 一千人咱就做一千次
一百人就做一百次
做完了
一百次做够了吗
没做够我们再回去继续做
直到做够了为止
我们就出来
出来的时候
求平均分不就是你的和
除上谁呢
除上你的循环控制变量
你做了多少次循环你就除上多少
就是多少人
我们这里边稍微考虑一个事情
是什么事情呢
成绩的有效性
这个是在讲什么呢
大家现在开始做题了
看到你做程序的时候总有
在调试程序的时候
model的环境里给了大家
红的一条绿的一条
你在提交的时候
会看到这样的问题
那个红的绿的我们说过
它是测试用例
那测试用例 比如说
这道题目里边的测试用例应该是什么呢
大家想一想
其实每道题里边
大家可以想
它的测试用例会是什么
这道题里的测试用例会是什么呢
我想的应该是说
比如说你不小心
你想录80分
你却把减号碰进去了
你是一个负分
这是不符合常情的
这是一个无效的分数
比如说
你本来录
20
你却录成了200
也不符合常理
你这个循环里边对什么样的录入
你认为是有效的呢
如果对分数来说
假如说咱是百分制
那它一定是在0到100分
这个区间你的成绩才是有效的
所以呢我们要考虑到
成绩的有效性检验的话
我们在程序里边
你每录入一个成绩
我还要先问你一次
你这成绩有效吗
刚才的录入有效吗
无效的话我会提示你
你重新录入
这个成绩我不获取
那这一块
如果说 你什么样的情况下
程序不能检测出来呢
你小心翼翼的再录
20分就是20分
80分就是80分
这时候程序是
没有这个有效性检验它也一路畅通
没有问题
但是
这个程序
不兼顾
就是说它不能屏蔽
用户的一些不合理的输入
我们通常要求大家做的程序
是兼顾的
是对一些
非法的 不合理的数据
能够排除在外的
这就是我们测试用例
通常要考虑的问题
比如说我们要打一个图形
你考虑没考虑我这图形打0行
考虑没考虑我的一些边界值
比如说 我是
60分以下是
不及格
我60分你能判断的是
及格还是不及格呢
在这个临界点上
边界值上
这都是我们测试用例
要检测的东西
所以这道题我们专门给了一个
考虑成绩的有效性检验
是为了提示大家
当你的提交程序
你在你的环境下
你的程序一路畅通
没有问题
可是拿到我们这提交的时候呢
总说你的程序通不过
是什么原因呢
可能就是这些测试用例
没有通过
比如说
被零除你们有没有考虑
你要让它通过的话
你自己会说不被零除
但是我们一定要测这个程序
被零除你有没有考虑
所以呢大家在这一块
我们拿这个
程序
正好给大家做个例子
我们看一下这是用 while
我们回到这
这是单行循环用while
当条件满足的时候
执行下边的循环
下面的循环做什么事呢
先索取一个分数
scanf
然后我们看蓝颜色的这一块
就是我们刚才说的
做了一个成绩有效性的判断
我问
你读进来的这个s
s是我们现在要的
放成绩的
s是比0还小吗
或者是s比100还大吗
如果你是这两个里边的任意一个
我给你显示一个printf
成绩无效请你重新输入
那这时候一定到了哪了呢
到了
else底下的花括号这
这个成绩我们就无效了
就到了这个底下
这块
应该是到了什么地方呢
循环的出口处
循环的出口处在花括号的这块
那出口处应该
再回来
再到了下一个
n的这块
那么我们看
大家在这个蓝颜色的if处
n有计数吗
我们只记有效的
成绩
无效的成绩不计数
就直接到了循环的入口处
再去取一个分数
如果成绩有效我们进了else块
累加
并且 计数
累加并且计数
这是用while做的
我们把这件事用do while做
它的不同只有在这
这没有判断了
一上来先做 do
底下同样
蓝颜色判断成绩是不是有效
如果
不是无效数据
else
我们就到了累加 计数
然后在出口处
while
n小于等于10吗
如果小于等于10 yes
我们再回来 再do
再do
直到
它是
11
我就不做了
就不回去了
那个11
第11个数我是不去相加的
大家再看一下
我们在出来的时候做的
出了这个循环里边
你把这个成绩给我打印出来
是拿什么呢
拿t
t是我们求的和
除上谁呢
n-1
为什么要n-1呢
是因为我们在这n++的时候
什么时候才会
条件不满足了呢
一定不是10而是11
而我们实地上的人数
我循环了几次呢
10次啊
第11次我没有循环了
我不要了 我只要10个
我们前面说了 我们只要10个
拿
循环的这块是10
终值是10
所以呢
你在循环跳出来的时候
n里边是10还是11呢
一定是11循环才能结束
所以出来的时候是11
我们一定要把1减掉
才能得到一个正确的平均分
我们
用do while实现了这样
直到型的循环
我们也在边映环境下
调一下这个程序
我们大家看一下这个程序
在这个程序里边大家刚才
我们讲到了
在这个循环体
do 进来先做
做的时候呢
scanf了这个s以后
我们要先判断程序的有效性
然后 如果有效
我们才去做这个
输出
并且做计数
在出口处判断
n小于等于2吗
我们现在是说
咱这个事情做
只做两次
咱换一个 做3次
运行一下这个程序
运行第一个程序
70
以录入成功
输入第二个 90
输入第三个 30
现在是说
你的3个数据都给了
我们在这里边
做的事情是什么呢
仅仅是说
把你录入的成绩显示
如果说要求平均
求平均我们在这里边
应该加入什么呢
看这
我们在这里边要加入一个
比如说
现在咱是 t
给它的初值是0
我t是一个求和
那我求和应该在哪里做呢
是在
录入成功的有效数据这样做
t等于
加上我们读进来s
然后呢
在出了
判断这个条件
还要不要做
不做了 出来以后
我们平均分怎么得到的呢
就是
在这我们需要做一个
printf
输出一个平均分
这个平均分是什么呢
是我们
给一个
百分号d的一个格式
那我们现在的平均分是什么呢
是
t
大家看要除上的是多少呢
n
是除n还是除以n++
是在于
我们这里边循环是执行了
多少次
在循环结束的时候
我们n是
3还是4
是加加在前判断在后
那我们现在n就是要的这个数
运行一下看看
我们的平均分是
对吗
看一下
咱再输出显然是不对
我们刚才输出的那个数
那咱们
把n输出一下
然后再输出平均分
看我们的n是多少呢
应该是说
小于等于3
我们希望的n是
输入了3个数是除以3的
n这时候如果是4
小于等于3的时候它就回去了再做
那它能出来的时候一定是4
对不对
那这样 我们回去看一下
平均分一定是及格的
但是现在不及格
为什么呢
是4
那现在是说循环的出口处
n一定是小于等于3的
n的小于等于3循环是出不来的
必须它是n等于4
所以我们这一块
应该做的是什么呢
这除以谁呢
n-1
这样才是对的
现在平均分是61
你的n是4
但是实地上我们是
输入了3个成绩
大家看
在循环体里边
现在实地上有效数据
是在else里边完成的
那么如果走了这是无效
无效以后直接就出来了
就跳出这个循环了
跳出的循环并不是跳出循环
就到循环的出口处
然后呢
并没有计数
它回去再读一个有效数据
所以有效数据一定要拿到的是
三个
所以大家不用担心说
无效以后就跳出循环了
而是到了循环出口处
这个结构完成了这么一个流程
大家下去可以把这个程序
在自己的环境下运行一遍
-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