C语言—循环语句

目录

一 while 循环

1 while 使用

2 while 语句中的break 和 continue

3 get char/ putchar

二 for 循环

1 for 的基本使用

2 continue 和 break 在 for 循环里的作用

 3 for 循环的一些变种

 4 小练一题

三 do while 循环

1 do while 的基本使用

 2  do while 中的 continue 和 break

四 goto 语句

五 练习

1 计算 n 的阶乘?(不考虑溢出)

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

 3. 在一个有序数组中查找具体的某个数字n。 编写int binsearch(int x, int v[], int n); 功能:在v[0] <=v[1]<=v[2]<= ….<=v[n-1]的数组中查找x.

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

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

一 while 循环

1 while 使用

在屏幕上打印 1-10 的数字

C语言—循环语句_第1张图片

2 while 语句中的break 和 continue

break--跳出终止循环 其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。 所以:while中的 break是用于永久终止循环的

C语言—循环语句_第2张图片

  continue在while循环中的作用就是: continue是用于终止本次循环的,也就是本次循环 continue后边的代码不会再执行,而是直接 跳转到while语句的判断部分。进行下一次循环的入口判断。

C语言—循环语句_第3张图片

上图光标闪烁 后边代码不在执行 而是跳到while 语句的判断部分

C语言—循环语句_第4张图片

3 get char/ putchar

1 getchar -- 获取一个字符

不需要参数 返回类型为 int 整形 所以用int 接收

C语言—循环语句_第5张图片

put char--打印一个字符

C语言—循环语句_第6张图片

C语言—循环语句_第7张图片

// EOF -- end of file 文件结束标志

//EOF 本质是 -1 在函数读取失败的时候返回了EOF 

// scanf 函数读取成功的时候 返回的是读取到的数据的个数 读取失败返回EOF

//getchar 读取成功 返回的是字符的ASCII 码值 读取失败返回EOF

// ctral + z 让scanf 或者 getchar 返回EOF

2

C语言—循环语句_第8张图片

 出现这样情况是因为 我们输入的时候 键盘与 scanf 和 getchar 存在缓存区

C语言—循环语句_第9张图片

123456 先进入缓冲区 我们按了一个回车 所以还有一个 \n

scanf 发现缓冲区有了东西 先拿走123456 因为\n 不是密码

scanf 后面又输入 发现缓冲区有东西 把\n 放入 Input input 不等于 Y 所以直接读取失败

所以我们想办法在scanf 再次读取的时候把 \n 拿掉 用getchar 拿掉
C语言—循环语句_第10张图片

但是如果我们输入的密码是 123456 (空格) abc 呢?

 C语言—循环语句_第11张图片

 这是因为scanf 第一次读取的时候只读取了空格前面的123456 后面的getchar 只能拿掉一个字符

所以我们要清理掉缓冲区中剩余的数组 我们可以写个while 循环

C语言—循环语句_第12张图片

3

C语言—循环语句_第13张图片

这个代码的作用是 只打印数字字符 跳过其他字符

二 for 循环

1 for 的基本使用

 

表达式1 为初始化部分, 用于初始化循环变量的。

表达式2 为条件判断部分 用于判断循环时候终止。

表达式3 为调整部分 用于循环条件的调整。

顺序 初始化 ——>条件判断——>循环语句——>调整部分

我们用while 循环打印 1~10 的数字

C语言—循环语句_第14张图片

接下来我们用for 循环打印

C语言—循环语句_第15张图片

 可以发现在while循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离 较远,这样查找修改就不够集中和方便。所以,for循环的风格更胜一筹。 for循环使用的频率也最高。

2 continue 和 break 在 for 循环里的作用

for 循环里的 continue 和 break 的意义 与 while 循环里的是一样的, 但还是有些差异 看代码:

continue:

C语言—循环语句_第16张图片

 我们来分析一下代码:我们先给 i 赋值 1(初始化), 然后进行判断 1<= 10, 为真, 进入循环语句,i 不等于 5 直接跳过 if 判断 并且打印,然后进入调整 i++, 到了 5 之后, continue, 结束后面的循环语句,直接跳到调整部分 i++, 变为6接着打印。 我们可以看到打印 5 被错过了。

所以for 循环里的continue 是跳到调整部分而不是像while 的continue 跳到 判断部分。

break:

C语言—循环语句_第17张图片

 和 while 的 break 一样, 终止后期的所有循环。

注:for 循环默认控制一条语句,如果像控制多条 要加大括号

一些建议:

1. 不可在for 循环体内修改循环变量,防止 for 循环失去控制。

C语言—循环语句_第18张图片

我们可以看到我们在循环体内赋值  i = 5  时候出现了问题, 因为当我们打印完1的时候 i 变成5, 到 i++ 的时候变成 6,6<=10, 打印 6, 接着 i 变成 5,i++ 变成 6, 由此循环下去。

2. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。

C语言—循环语句_第19张图片

 3 for 循环的一些变种

变种 1

C语言—循环语句_第20张图片

初始化和调整部分的省略就是啥都不做

判断部分省略了,意味着判断是恒为真的

建议不要随便省略

C语言—循环语句_第21张图片

 有人会想初始化部分都是0 可不可以省略? 那我们代码验证一下

C语言—循环语句_第22张图片

由此我们可以发现 代码出现了问题 所以不要随便使用

 变种 2

C语言—循环语句_第23张图片

 4 小练一题

循环几次?

//循环几次?
#include
int main()
{
	int i = 0;
	int k = 0;
	for (i = 0, k = 0; k = 0; i++, k++)
		k++;
	return 0;
}

接下来代码验证:

C语言—循环语句_第24张图片

 循环 0 次, 因为 k = 0 并并不是 k == 0; 前者是赋值 后者是条件比较

三 do while 循环

1 do while 的基本使用

先干 再判断

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

接下来我们用do while 打印 1~10

C语言—循环语句_第25张图片

 2  do while 中的 continue 和 break

continue:

C语言—循环语句_第26张图片

 我们可以看到这是个死循环 (光标闪烁) 因为 continue 是跳过循环里面后面的内容 但是没有跳过 while 判断语句 5 <= 10 为真 继续进入循环...

break:

C语言—循环语句_第27张图片

终止循环 与while for 一样 

四 goto 语句

C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。 从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。 但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过 程,例如一次跳出两层或多层循环。 这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。(goto 语句只能在一个函数内部跳转 不能跨函数跳转)

下面是使用goto语句的一个例子:

C语言—循环语句_第28张图片

那我们用while 语句 也可以解决

 C语言—循环语句_第29张图片

 C语言—循环语句_第30张图片

五 练习

1 计算 n 的阶乘?(不考虑溢出)

C语言—循环语句_第31张图片

// 计算n 的阶乘

// 5!= 1*2*3*4*5

// n! = 1~n 累计相乘 

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

C语言—循环语句_第32张图片 

 

还有一种方法

C语言—循环语句_第33张图片

 3. 在一个有序数组中查找具体的某个数字n。 编写int binsearch(int x, int v[], int n); 功能:在v[0] <=v[1]<=v[2]<= ….<=v[n-1]的数组中查找x.

C语言—循环语句_第34张图片

 C语言—循环语句_第35张图片

 但是我们可以发现就算不是有序 在乱序中也可以使用 接下来使用一种更快的方法(二分法)

C语言—循环语句_第36张图片

 C语言—循环语句_第37张图片

 C语言—循环语句_第38张图片1 确定被范围的左右下标left 和 right

2 根据left 和 right  确定中间元素下标 mid

3 根据mid 锁定的元素 和查找的元素比较 确定新的查找范围 left 和 right

首先我们先看一串代码的理论基础

C语言—循环语句_第39张图片

 C语言—循环语句_第40张图片

 我们可以发现已经符合了二分法原理 我们再加一个循环

C语言—循环语句_第41张图片

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

这道题的意思就是

C语言—循环语句_第42张图片

 我们按照上题的思想可以做出简单的数组思路

C语言—循环语句_第43张图片

 C语言—循环语句_第44张图片

 C语言—循环语句_第45张图片

 如果我们想慢一点 我们可以用sleep

C语言—循环语句_第46张图片

我们也可以清理屏幕 用cls

C语言—循环语句_第47张图片

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

C语言—循环语句_第48张图片

 我们要注意的是字符串比较的时候 是比较对应的ASCII值C语言—循环语句_第49张图片

 这次的知识很多 难度也慢慢增大 希望自己继续保持热爱 继续加油!

你可能感兴趣的:(c语言,开发语言)