1.for循环💡
1.语法🔑
for(表达式1;表达式2;表达式3)
循环语句;
表达式1为初始化部分,用于初始话的循环变量的。
表达式2为条件判断部分,用于判断循环时候终止。
表达式3为调整部分,用于循环条件的调整。

for循环和while循环的小差异:
如图,for循环的i++不在循环代码块里面执行,而while循环的i++在该循环的代码块里面执行。


2.break与continue🔑
下图的continue是跳过本次循环的printf再回到前面的判断部分,所以没有打印5.
如果把continue换成break,则打印1 2 3 4 ,break是终止本次循环。

3.for语句的循环控制变量。🔑
建议:
1.不可以在for循环体内修改循环变量,防止for循环失去控制
2.建议for语句的循环控制变量的取值采用“前闭后开区间”写法
int i = 0;
//前闭后开的写法
for(i;i<10;i++)
{}
//两边都是闭区间
for(i=0;i<=9;i++)
{}
两种写法都对但是第二个写法中的9没有什么实际的意义,读起来不够直观。
4.一些for循环的变种🔑
下图判断部分省略就一直恒为真,然后就死循环了。

下图,怎么只打印3个lala而不是9个lala呢?首先先捋一下程序执行顺序1.i初始值为0进入第一个for循环2.i再进入第二个for循环并符合j<3的判断条件 3.printf执行打印第一个lala此时j=0 4.进入j++,j由0变1再继续j<3的判断并且为真 5.打印第二个lala 6.再j++,j由1变为2 7,再经过j<3的判断并且为真 8.再打印第三个lala 9.j++,j由2变3再到j<3,此时判断为假,跳回到第一个循环并进行了i++ 10.跳回第一个for循环此时i=1,为真进入下一个for循环11.由于第二个循环未初始化就默认了j=3,但是不符合j<3所以又跳回了第一个for循环并进行i++,i变成了2 12.和11.同理得i++得i=3不符合i<3最后程序停止。

下图,没有省略i=0 j=0就打印九次lala(外层执行三次,内层执行三次,三三得九打印9个lala)

小小笔试题

此代码表达式2 中k=0为假,表达式2是判断条件!!一直为假所以该循环根本不执行!!
2.do...while()循环💡
1.语法🔑
do
循环语句;
while(表达式);

2.break与continue
break直接终止本次循环

continue跳过后面的printf和i++直接跳到判断语句while(i<=10);
因为i==5,一直执行continue,然后在while与if间反复横跳,所以最后出现死循环


3.do...while的特点🔑
循环至少执行一次,使用的场景有限,所以不是经常使用。
3.练习💡
1.计算n的阶乘🔑
自己先试试

计算n的阶乘不能一上来就给特别大的数,它是有极限的

转定义可以看到整型最大值为21亿多,最小值为负21亿多。
2.计算1!+2!+3!+...+10!🔑
因为一上来输入10感觉太大,所以先把n<=10改为n<=3试试水
但是问题来了,1!+2!+3!应该等于1+2+6=9,怎么就输出15了??
看不出问题可以按F11调试检查。

程序顺序:1.第一个for循环n=1符合n<=3为真进入第二个for循环i=1符合i<=n所以ret=1乘上个1得到阶乘第一个数1! 2.同理第二次执行得到最后ret=2。 3.第三次时由于ret没有初始化到1,就默认了第二次的ret=2为第三次循环的初始化值,然后就变成2*2*3=12(按道理应该是1*2*3=6,所以问题就出现在这里)。所以最后打印了15(1+2+12=15)
上图的int ret = 1;即使定义在外面但是作用不了第二个for循环里面的ret。
所以怎么解决??显而易见那就在for里面定义ret的初始化呗!上图!

这样3的阶乘就不会出现2*2*3的情况啦~
这道题再把n<=3改为n<=10就完成了
这道题其实还可以代码优化~

3.在一个有序数组中查找具体的某个数组🔑

要是int i =100;.......

完成了!但是这样找效率很低,因为最坏的情况就是找10次
这样说可能很抽象,举个生活中的例子:比如你去买一本作业本,老板调皮地跟你说:“你1到10块一本,你猜猜多少钱?”然后你就从1开始猜到10.这个程序可以类比成这样。但是要是我第一次猜5块,这时老板说:“你再往贵里猜”这样你肯定会猜6到10的数字而绝对不会去猜1到4的数字,这样效率是不是高很多了,所以接下来就是展示改代码效率优化。
折半查找(二分查找),前提是数组有序
例子:
大白话说原理:
先来个数组 1 2 3 4 5 6 7 8 9 10,
int k = 7;(要寻找的数)
首先先定义数组中间的下标(),左下标为left,右下标为right,中间的为mid
中间的下标:(0+9)/2=4,下标4对应的元素是5,此时5和7比较7大,所以数组直接把1 2 3 4 5给排除了1 2 3 4 5 6 7 8 9 10,所以现在的左下标left为5(元素为6),右下标right为9(元素为10)。现在再来第二次得到的下标(5+9)/2=7,此时新的mid为7(元素为8)此时比我要找到元素7大,所以又缩小了范围1 2 3 4 5 6 7 8 9 10。现在的left为5,right为6,mid=(5+6)/2=5。所以现在mid下标为5,锁定的元素为6,比要找的7(元素)要小,所以现在letf,right的下标都为5,元素为6。现在1 2 3 4 5 6 7 8 9 10。看现在mid锁定的元素为6,比7小,所以在右边,mid直接取下标为6,元素为7。(6 + 6)/2=6,此时下标mid为6,所对应的元素就为7了,说明找到了!一共就用了4次,比刚刚的10省了好多!
文字看不惯就浅浅上个图:

基本原理就这样,试试敲代码吧!

注意:int mid = (left + right)/2; 一定要放到while循环里面,uu很可能在不经意间把它给放到循环外面,这样的话就只查找一次。
还有还有还有其实int mid =(left + right)/2;还是有瑕疵的,就是两个数加起来会很大,加大了数字溢出的可能性(整型最大数21亿多),所以还是可以优化一下的。
两个数先加起来再求平均值较大可能会越界。

所以优化求平均值,我不让它两加起来,直接用割的然后拼上去就用不着加了。因为当它们拼的一样高,那么这个高度就是他们的平均值!


直接上代码

4.完结撒花🌺
来来来这是今日份文章,因为之前期末考试复习去了所以两个多星期没写了有点手生,所以这是我这学期写的第一篇博客文章哈哈哈挺激动的,终于考完试可以加快更新进度啦,在接下来的这个月,小叶计划一到两天一更,想跟大家分享一下自己的小收获😇这是小叶的第5次发表文章,肯定还是有很多不足的地方,也非常期待大佬们能给小白指点指点,希望我们能够一起加油,一起进步!!