目录
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" 进行 比较 ,只是比较的地址,没有意义。