我能“C”——沉浸式探索分支与循环(下)

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)

  1. 小小笔试题

此代码表达式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次发表文章,肯定还是有很多不足的地方,也非常期待大佬们能给小白指点指点,希望我们能够一起加油,一起进步!!

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

加油叶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值