【C语言基础】认识do while语句和goto语句

目录

一、goto语句

二、do...while语句

1.do语句的语法

2.do语句的特点

3.do while循环中的break和continue

三、三种循环的选择

四、循环语句小练习

1.计算 n的阶乘

2.计算 1!+2!+3!+……+10!

3.(二分查找)在一个有序数组中查找具体的某个数字n

4.编写代码,演示多个字符从两端移动,向中间汇聚。

5.编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成,如果三次均输入错误,则退出程序。


一、goto语句

从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。

但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程。

例如:一次跳出两层或多层循环

多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。

for(...)
  for(...)
 {
    for(...)
   {
      if(disaster)
        goto error;
   }
 }
  …
error:
if(disaster)
    // 处理错误情况

goto语句只能在一个函数范围内跳转,不能跨函数,

二、do...while语句

1.do语句的语法

do
{
  循环语句;
} while(表达式);

2.do语句的特点

do while语法与while有一些类似,也有一些不同,类似的地方是它同样有循环体和条件表达式,但执行顺序与while不同,do while是先执行一次循环体之后再进行条件判断。注意,在do while语句的条件判断后要加上一个分号;表示语句的结束。

循环至少执行一次,使用的场景有限,所以不是经常使用

3.do while循环中的break和continue

首先看一下do while循环的常规使用方法:

当加入if语句和break之后,即在变量 i 满足条件时跳出循环:

在循环中加入continue,如图,i 在变为5之后跳入下一次循环,从而无限循环

三、三种循环的选择

结合上一篇文章,C语言的三种循环语句总结完了,那该如何选择使用呢?

若一个程序循环的次数,有固定次数就用for循环;若执行一次,用do while;其他的则用while。当然也需要具体情况具体分析。

四、循环语句小练习

1.计算 n的阶乘

(求n的阶乘,就需要得到1 -- n 的数值,用scanf进行取值。)

用do--while循环时,需要注意的就是当输入n=0时,i 和 a 的初始值要确定为1,这样只会进行一次循环,结果正确。

2.计算 1!+2!+3!+……+10!

下面这样结果是错误的,ret 的值在再进入循环时没有归一,后面的阶乘就会出错。

第二次循环结束之后,ret = 2 ,sum = 3;当n=3时进入循环,会得到ret = 2*1 *2*3 >3! ,则sum >1!+2!+3!。

修改代码

在计算n的阶乘之前,需要将ret的初始值归 1 ,不然会重复累加

简化一下代码:

由阶乘计算可以将其转为递推式,比如将3的阶乘理解为3*2的阶乘,如 3! = 3 * 2!;

sum = ret *1 +ret*1*2+ret *1*2*3+……

3.(二分查找)在一个有序数组中查找具体的某个数字n

比如有序数组 1 2 3 4 5 6 7 8 9 10,其左下标为0 1 2 3 4 5 6 7 8 9 ,每次对半找出最中间的下标对应的值进行比较

其最多查找log2 n次,查找过程如下图所示:

转换思想:

首先定义所需要的数组,数字n,定义数字的左右下标位置,确定函数式,多次利用二分查找,即使用循环语句, 最终结果找出 n 值所对应的下标。在循环语句中,结合文本要求,使用break 和 continue 让循环更加流畅。

while循环的条件为什么是 left<=right

4.编写代码,演示多个字符从两端移动,向中间汇聚。

思路:代码都在一行输出,逐行输出,中间睡眠一秒,然后清屏,再输出,依次循环;

清屏功能实现,利用 system(“cls”) 语句,即清除屏幕函数,引用头文件 windows.h

利用 sleep()语句,让屏幕存留一段时间,再进行下一步。头文件 string.h

5.编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成,如果三次均输入错误,则退出程序。

该题目其实是将两个字符串进行比较,需要使用 strcmp() 函数,其头文件 string.h

该函数的工作原理是比较的对应字符的ASII值,于是 abcde >abccdef

scanf 里的 password是数组名,这里不用&是因为数组名不带本身就是地址。故不用加 &

绿色一行的错误原因,利用 password == "123456" 进行 比较 ,只是比较的地址,没有意义。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Leeper17

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值