作用;筛选出输入字符中的所有数字并输出。
用ret判断读取的数据是否已经到缓冲区尾部,如果没到就进入循序,用ret小于字符0或大于字符0来判断跳出当前循环,若在0-9之间,则打印当前字符。
这里if判断语句也可以把字符变成其ASCII码值来判断
for循环
for循环的意义在于,其将初始状态,结束状态,加法操作集成到了一行语句上
for(int i=0;i<10;i++)
如用while表示这句话就需要
int i=10;
while(i<10)
{
i++;
}
若需要用到多出while,则需要统一在前面定义循环变量i j k,后面统一方while语句块,while一旦较多就会割裂程序间的联系。
同时,for循环内的条件建议使用左闭右开式,
比如for(i=0;i<10;i++)和for(i=0;i<=9;i++)是一个意思,
但10 表示的是十次循环,有着特殊意义
for(初始化;判断;调整)三个部分都可以省略,但省略往往会带来不一样的后果
比如:
可能我们想双层嵌套for 做到10*10 打印1-100,但是执行结果却只打印到了10,这是因为,for语句缺少初始化,在第一次大循环打印到10,进入第二次大循环时,j继承了第一次大循环的10值,无法进入第二次大循环内的十次小循环,同理,后面的八次大循环进入之后也无法进入响应的小循环。
for循环的一些变种
for语句可以变成两个变量,由输出可得,只进行了两次循环
这是因为在出第二次循环时,i=2<2为假 0,0&&任何都为0,所以跳出循环
结束条件是j=0;是赋值,j的值为0,就是假,假则一次循环都不进入。
do while
题目:输入4,则计算1!+2!+3!+4!![](https://img-blog.csdnimg.cn/58896966a6164ba99f19b9596ac5704b.png)
设计思路:拆分细化任务:输入n计算->直接计算4的阶乘和->算4的阶乘
//4的阶乘计算
int i;
int m=1;
int j=4;
for(i=0;i<4;i++)
{
m=m*j;
j--;
}
初试乘积要为1,做到1X4X3X2X1
再来计算4的阶乘和
需要注意几点:
1.外层循环最后要把m初始化1,供下一次内循环做阶乘
内部循环里的i用来控制内部循环的次数,也即4的阶乘就要计算四次,3的阶乘就要计算3次,但内部循环块里,不能m=m*i;i--,因为这样会改变i控制内循环次数的作用,i的值即使内循环次数,也是阶乘的最大项,所以需要用另一个变量来控制阶乘的最大项,也就是n
最后,把i的初始值由初始赋值变成从键盘获取即可啦!
方法改进:
问题:如果我们计算4的阶乘和,以上面代码为例,需要计算1x1,1x1x2,1x1x2x3,和1x1x2x3x4,可以发现,我们多次计算了同一部分,在每次循环中都要再计算一次1x1,1x1x2也被计算了三次,大大增加了计算量,所以,能否下一个循环使用上一个循环的结果呢?当然是可以的
相比于双层循环中需要把上一次计算的ret清零,这里保留了上一循环的ret以达到重复使用,且降低了代码的冗余度。
在一组有序数组中找到某个数字![](https://img-blog.csdnimg.cn/d4c71aea21ea441c92f8a32018020367.png)
问题:遍历过程好费时间比较大
解决:引入二分法
由于代码解释起来不容易,就不附说明啦。