6.C語(yǔ)言--循環(huán)

讓計(jì)算機(jī)數(shù)數(shù):

問(wèn)123812843267518273618273612675317 是幾位數(shù)?

怎樣讓計(jì)算機(jī)來(lái)數(shù)數(shù)?

思路:

1.讓計(jì)算機(jī)從右邊開(kāi)始數(shù)

2.對(duì)10做整除

3.不停的對(duì)10整除,直到不能整除10

while 循環(huán)


初試代碼

# include<stdio.h>

int main ()

{

int a,n = 0;

printf("請(qǐng)輸入一個(gè)數(shù)\n");

scanf("%d",&a);

while(a>+0)

{

n++;

a/= 10;

}

printf("你輸入的數(shù)有%d個(gè)數(shù)字\n", n);

return 0;

}

對(duì)比上面的兩個(gè)程序,你認(rèn)為哪個(gè)好一點(diǎn)?

do - while 循環(huán)

while 是先進(jìn)行判斷,再執(zhí)行循環(huán)體。do-while是先執(zhí)行循環(huán)體,再進(jìn)行判斷。

# include<stdio.h>

int main ()

{

int a,n = 0;

printf("請(qǐng)輸入一個(gè)數(shù)\n");

scanf("%d",&a);

do

{

n++;

a/= 10;

} while(a>0);

printf("你輸入的數(shù)有%d個(gè)數(shù)字\n", n);

return 0;

}

for循環(huán)

for(初始條件;循環(huán)條件;循環(huán)每輪的動(dòng)作)

{

......

}

用for寫死循環(huán):

for(;;)

{

......

}

for 的死循環(huán) 和 while 寫的死循環(huán),編譯器的優(yōu)化是不一樣的。for 寫的死循環(huán)優(yōu)化 比while 循環(huán)要好很多。


for(;條件;) == while (條件)

循環(huán)的選用大致可以參考一下建議:

1.循環(huán)固定次數(shù),用 for循環(huán)

2.如果必須執(zhí)行一次,用do-while

3.其他情況用while

循環(huán)之間基本是可以互換的。

例子:如何用1角、2角、5角的硬幣湊出10元以下的金額呢?

# include<stdio.h>

int main ()

{

int x;

int one ,two,five;

scanf("%d",&x);

for (one = 1;one < x*10;one ++){

? ? for (two = 1;two <x*10/2;two ++){

? ? ? for (five = 1;five <x*10/5;five ++){

? ? ? if(one + two*2+five *5 == x*10){

? ? ? printf("可以用%d個(gè)1角加%d個(gè)2角加%d個(gè)5角得到%d元\n",one,two,five,x);

}


}

? ? ? ? }

}

return 0;

}

如果得到一種結(jié)果后就跳出循環(huán)該怎么辦?

”連鎖 break“

# include<stdio.h>

int main ()

{

bool exit = 0;

int x;

int one ,two,five;

scanf("%d",&x);

for (one = 1;one < x*10;one ++){

? ? for (two = 1;two <x*10/2;two ++){

? ? ? for (five = 1;five <x*10/5;five ++){

? ? ? if(one + two*2+five *5 == x*10){

? ? ? printf("可以用%d個(gè)1角加%d個(gè)2角加%d個(gè)5角得到%d元\n",one,two,five,x);

? ? ? exit =1;

? ? ? break;

}


}

if (exit)

break;

? ? ? ? }

if (exit)

break;

}

return 0;

}

不常用的goto:用goto來(lái)跳出嵌套循環(huán)

# include<stdio.h>

int main ()

{

int x;

int one ,two,five;

scanf("%d",&x);

for (one = 1;one < x*10;one ++){

? ? for (two = 1;two <x*10/2;two ++){

? ? ? for (five = 1;five <x*10/5;five ++){

? ? ? if(one + two*2+five *5 == x*10){

? ? ? printf("可以用%d個(gè)1角加%d個(gè)2角加%d個(gè)5角得到%d元\n",one,two,five,x);

? ? ? goto out;

}


}

? ? ? ? }

}

out: return 0;

}

break vs continue

當(dāng)想要中止當(dāng)前循環(huán)時(shí),用 break,循環(huán)停止,執(zhí)行循環(huán)體后面的代碼。

continue 是跳過(guò)當(dāng)前循環(huán),執(zhí)行下一次循環(huán)。

辯證看待 goto

可以考慮使用goto的情形:1.從多重循環(huán)中直接跳出 ;2. 出錯(cuò)時(shí)清除資源; 3.可增加程序的清晰度的情況。

下列關(guān)于使用goto語(yǔ)句的原則可以供讀者參考。   1) 使用goto語(yǔ)句只能goto到同一函數(shù)內(nèi),而不能從一個(gè)函數(shù)里goto到另外一個(gè)函數(shù)里。   2) 使用goto語(yǔ)句在同一函數(shù)內(nèi)進(jìn)行g(shù)oto時(shí),goto的起點(diǎn)應(yīng)是函數(shù)內(nèi)一段小功能的結(jié)束處,goto的目的label處應(yīng)是函數(shù)內(nèi)另外一段小功能的開(kāi)始處。   3) 不能從一段復(fù)雜的執(zhí)行狀態(tài)中的位置goto到另外一個(gè)位置,比如,從多重嵌套的循環(huán)判斷中跳出去就是不允許的。   4)應(yīng)該避免像兩個(gè)方向跳轉(zhuǎn)。這樣最容易導(dǎo)致"面條代碼"。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容