目录
一 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. 编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则 提示登录成,如果三次均输入错误,则退出程序。
在屏幕上打印 1-10 的数字
break--跳出终止循环 其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。 所以:while中的 break是用于永久终止循环的
continue在while循环中的作用就是: continue是用于终止本次循环的,也就是本次循环 continue后边的代码不会再执行,而是直接 跳转到while语句的判断部分。进行下一次循环的入口判断。
上图光标闪烁 后边代码不在执行 而是跳到while 语句的判断部分
1 getchar -- 获取一个字符
不需要参数 返回类型为 int 整形 所以用int 接收
put char--打印一个字符
// EOF -- end of file 文件结束标志
//EOF 本质是 -1 在函数读取失败的时候返回了EOF
// scanf 函数读取成功的时候 返回的是读取到的数据的个数 读取失败返回EOF
//getchar 读取成功 返回的是字符的ASCII 码值 读取失败返回EOF
// ctral + z 让scanf 或者 getchar 返回EOF
2
出现这样情况是因为 我们输入的时候 键盘与 scanf 和 getchar 存在缓存区
123456 先进入缓冲区 我们按了一个回车 所以还有一个 \n
scanf 发现缓冲区有了东西 先拿走123456 因为\n 不是密码
scanf 后面又输入 发现缓冲区有东西 把\n 放入 Input input 不等于 Y 所以直接读取失败
所以我们想办法在scanf 再次读取的时候把 \n 拿掉 用getchar 拿掉
但是如果我们输入的密码是 123456 (空格) abc 呢?
这是因为scanf 第一次读取的时候只读取了空格前面的123456 后面的getchar 只能拿掉一个字符
所以我们要清理掉缓冲区中剩余的数组 我们可以写个while 循环
3
这个代码的作用是 只打印数字字符 跳过其他字符
表达式1 为初始化部分, 用于初始化循环变量的。
表达式2 为条件判断部分 用于判断循环时候终止。
表达式3 为调整部分 用于循环条件的调整。
顺序 初始化 ——>条件判断——>循环语句——>调整部分
我们用while 循环打印 1~10 的数字
接下来我们用for 循环打印
可以发现在while循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离 较远,这样查找修改就不够集中和方便。所以,for循环的风格更胜一筹。 for循环使用的频率也最高。
for 循环里的 continue 和 break 的意义 与 while 循环里的是一样的, 但还是有些差异 看代码:
continue:
我们来分析一下代码:我们先给 i 赋值 1(初始化), 然后进行判断 1<= 10, 为真, 进入循环语句,i 不等于 5 直接跳过 if 判断 并且打印,然后进入调整 i++, 到了 5 之后, continue, 结束后面的循环语句,直接跳到调整部分 i++, 变为6接着打印。 我们可以看到打印 5 被错过了。
所以for 循环里的continue 是跳到调整部分而不是像while 的continue 跳到 判断部分。
break:
和 while 的 break 一样, 终止后期的所有循环。
注:for 循环默认控制一条语句,如果像控制多条 要加大括号
一些建议:
1. 不可在for 循环体内修改循环变量,防止 for 循环失去控制。
我们可以看到我们在循环体内赋值 i = 5 时候出现了问题, 因为当我们打印完1的时候 i 变成5, 到 i++ 的时候变成 6,6<=10, 打印 6, 接着 i 变成 5,i++ 变成 6, 由此循环下去。
2. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
变种 1
初始化和调整部分的省略就是啥都不做
判断部分省略了,意味着判断是恒为真的
建议不要随便省略
有人会想初始化部分都是0 可不可以省略? 那我们代码验证一下
由此我们可以发现 代码出现了问题 所以不要随便使用
变种 2
循环几次?
//循环几次?
#include
int main()
{
int i = 0;
int k = 0;
for (i = 0, k = 0; k = 0; i++, k++)
k++;
return 0;
}
接下来代码验证:
循环 0 次, 因为 k = 0 并并不是 k == 0; 前者是赋值 后者是条件比较
先干 再判断
所以循环至少执行一次,使用的场景有限,所以不是经常使用。
接下来我们用do while 打印 1~10
continue:
我们可以看到这是个死循环 (光标闪烁) 因为 continue 是跳过循环里面后面的内容 但是没有跳过 while 判断语句 5 <= 10 为真 继续进入循环...
break:
终止循环 与while for 一样
C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。 从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。 但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过 程,例如一次跳出两层或多层循环。 这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。(goto 语句只能在一个函数内部跳转 不能跨函数跳转)
下面是使用goto语句的一个例子:
那我们用while 语句 也可以解决
// 计算n 的阶乘
// 5!= 1*2*3*4*5
// n! = 1~n 累计相乘
还有一种方法
但是我们可以发现就算不是有序 在乱序中也可以使用 接下来使用一种更快的方法(二分法)
2 根据left 和 right 确定中间元素下标 mid
3 根据mid 锁定的元素 和查找的元素比较 确定新的查找范围 left 和 right
首先我们先看一串代码的理论基础
我们可以发现已经符合了二分法原理 我们再加一个循环
这道题的意思就是
我们按照上题的思想可以做出简单的数组思路
如果我们想慢一点 我们可以用sleep
我们也可以清理屏幕 用cls
这次的知识很多 难度也慢慢增大 希望自己继续保持热爱 继续加油!