您好,歡迎進(jìn)入深圳市穎特新科技有限公司官方網(wǎng)站!
該章內(nèi)容:本章我們學(xué)習(xí)三大結(jié)構(gòu)之一:循環(huán)結(jié)構(gòu)。通常采用循環(huán)結(jié)構(gòu)來(lái)解決有規(guī)律性的重復(fù)性工作,如求學(xué)生的總成績(jī);統(tǒng)計(jì)車(chē)站某月的人流量。在程序設(shè)計(jì)中對(duì)那些需要重復(fù)執(zhí)行的操作我們采用循環(huán)結(jié)構(gòu)來(lái)完成,幾乎所有實(shí)用的程序都包含循環(huán)。c語(yǔ)言中有三種循環(huán)語(yǔ)句來(lái)構(gòu)成循環(huán)結(jié)構(gòu):while語(yǔ)句,do-while語(yǔ)句和for語(yǔ)句。本章是考試的重點(diǎn)章節(jié)。
學(xué)習(xí)方法:先了解循環(huán)結(jié)構(gòu)相關(guān)的基礎(chǔ)知識(shí),熟悉三種循環(huán)結(jié)構(gòu)的特點(diǎn),先讀懂循環(huán)的程序,再慢慢學(xué)習(xí)編寫(xiě)程序。最終一定要學(xué)會(huì)用循環(huán)來(lái)解決規(guī)律性的重復(fù)性工作的問(wèn)題。
知識(shí)點(diǎn):while語(yǔ)句的執(zhí)行過(guò)程;循環(huán)體中語(yǔ)句書(shū)寫(xiě)的位置對(duì)程序的影響;
重要程度:★★★★
程序一:
while(y++); (循環(huán)體為空,while只管后面一個(gè)語(yǔ)句,管多個(gè)用大括號(hào)。。。
printf(“%d”,y);
----------------------------------------
程序二:
while(y++) (循環(huán)體為printf(“%d”,y);)
printf(“%d”,y);
當(dāng)以上兩個(gè)程序的y初始化為-2的時(shí)候,兩個(gè)程序運(yùn)算的結(jié)果是不同的,請(qǐng)注意原因就是:程序二中的while(y++)后面有沒(méi)有分號(hào)。(這幾年考試的熱點(diǎn))
注意:while只管后面一個(gè)語(yǔ)句,管多個(gè)要用大括號(hào)。。ǹ荚嚐狳c(diǎn))
圖1 while循環(huán)流程圖
例1:以下程序的輸出結(jié)果是________(for、while這些循環(huán)都只管后面一個(gè)分號(hào))
main( )
{ int x=2;
while(x- -);
printf("%d",x);
}
分析:本題需要特別注意的是while(x--)后面緊跟一個(gè)分號(hào),它表示while循環(huán)的循環(huán)體部分是一個(gè)空語(yǔ)句,而不是printf語(yǔ)句。
(1)程序首先將x的值初始化為2。進(jìn)入while循環(huán)后,表達(dá)式x--的值為2,為真,執(zhí)行空循環(huán)體,此時(shí)x的值為1。第一輪循環(huán)結(jié)束。
(2)進(jìn)入第二輪循環(huán),x--的值為1,表達(dá)式仍然為真,繼續(xù)執(zhí)行空循環(huán)體,此時(shí)x的值為0。第二輪循環(huán)結(jié)束。
(3)進(jìn)入第三輪循環(huán),x--的值為0,表達(dá)式仍然為假,跳出循環(huán),執(zhí)行printf語(yǔ)句,此時(shí)x的值為-1。答案為-1。
知識(shí)點(diǎn):do-while語(yǔ)句的執(zhí)行過(guò)程;do-while和while的相似和不同之處;
重要程度:★★★★
do-while語(yǔ)句的一般形式如下:
do
循環(huán)體
while (表達(dá)式);
圖3 do-while語(yǔ)句流程圖
注意:
(1)do-while循環(huán)語(yǔ)句的循環(huán)體至少執(zhí)行一次。
(2)在while(表達(dá)式)后的“;”不可以少。它表示do-while語(yǔ)句的結(jié)束。
(3)do-while語(yǔ)句與while語(yǔ)句可以相互轉(zhuǎn)換。
例1:有如下程序
main( )
{ int x=23;
do
{ printf("%d",x--);}
while(!x);
}
該程序的執(zhí)行結(jié)果是 ( )。
A) 321 B) 23 C) 不輸出任何內(nèi)容 D) 陷入死循環(huán)
分析:本例就是告訴大家do-while循環(huán)至少執(zhí)行一次循環(huán)體。
首先執(zhí)行循環(huán)體,將表達(dá)式x--的值輸出,其值為23。接著判斷!x為假,因此跳出do-while循環(huán)。最后得到輸出結(jié)果為23,答案選擇B。不要先去判斷表達(dá)式!x的真假,這樣容易選到C。
例2:有以下程序(注:字符a的ASCIl碼值為97)
#include
main()
{char*s={"abe");
do
{printf(”%d”,*s%10);++s;)
while(*s);
)
程序運(yùn)行后的輸出結(jié)果是( )。B
A)abc
B)789
C)7890
D)979899
第三節(jié) for語(yǔ)句及其構(gòu)成的循環(huán)結(jié)構(gòu)(重點(diǎn)章節(jié))
知識(shí)點(diǎn):for語(yǔ)句的執(zhí)行過(guò)程;for語(yǔ)句中三個(gè)表達(dá)式使用方法;for 、while、 do-while之間的聯(lián)系和區(qū)別;
重要程度:★★★★★
for(表達(dá)式1;表達(dá)式2;表達(dá)式3)
循環(huán)體語(yǔ)句
三個(gè)表達(dá)式要背誦的:
表達(dá)式1:作用是初始化循環(huán)的變量;(執(zhí)行一次)
表達(dá)式2:循環(huán)條件的判斷;(可執(zhí)行多次)
表達(dá)式3:作用是循環(huán)變量增值或減少。(可執(zhí)行多次)
其執(zhí)行過(guò)程如下:
(1) 求解表達(dá)式1。
(2) 求解表達(dá)式2,若其值為“真”非0,則執(zhí)行
for語(yǔ)句控制的循環(huán)體語(yǔ)句,然后執(zhí)行步驟(3)。
若為“假”0,則結(jié)束循環(huán),轉(zhuǎn)到第(5)步。
(3) 求解表達(dá)式3
(4) 返回第(2)步繼續(xù)執(zhí)行。
(5) 循環(huán)結(jié)束,執(zhí)行for語(yǔ)句后面的語(yǔ)句。
圖4 for循環(huán)流程圖
例1:如有以下程序
main()
{
int i , sum=0;
for(i=1;i<6;i++) sum+=i;
printf("%d\n",sum);
}
執(zhí)行后sum的值是(。
A)15 B)14 C) 不確定 D)0
分析:本例用一個(gè)for循環(huán)實(shí)現(xiàn)了1到5的累加。首先i為1,sum為0,i<6為真,執(zhí)行sum+=i;使sum的值變?yōu)?,然后執(zhí)行i++,使i的值變?yōu)?,i<6仍然為真,繼續(xù)執(zhí)行循環(huán)體sum+=i;,使sum的值變?yōu)?,再執(zhí)行i++,使i的值變?yōu)?。如此反復(fù),直到i為6,i<6為假,跳出循環(huán),執(zhí)行printf語(yǔ)句輸出sum的值。答案選A。本例有兩種變形,請(qǐng)讀者自己分析結(jié)果。希望讀者深刻理解,循環(huán)體語(yǔ)句可以是一條語(yǔ)句,也可以是一條復(fù)合語(yǔ)句,甚至是條空語(yǔ)句。
變形1:main() 變形2:main()
{ {
inti , sum=0; int i , sum=0;
for(i=1;i<6;i++); for(i=1;i<6;i++)
sum+=i; {sum+=i;
printf("%d\n",sum); printf("%d\n",sum);}
} }
關(guān)于for語(yǔ)句我們這里有幾點(diǎn)說(shuō)明:
(1)for語(yǔ)句可以完全代替while語(yǔ)句:
表達(dá)式1;
while(表達(dá)式2)
{
循環(huán)體語(yǔ)句
表達(dá)式3;
}
(2)for后面小括號(hào)中的表達(dá)式1和表達(dá)式3都可以缺省,表達(dá)式1可以移到for語(yǔ)句之前,表達(dá)式3可以移到for循環(huán)體的尾部,但分號(hào)一定不能省。如:
i=1;
for(;i<=100;)
{
sum=sum+i;
i++;
}
同理表達(dá)式1和表達(dá)式3既可以是單個(gè)的表達(dá)式,也可以是由多個(gè)表達(dá)式構(gòu)成,中間用逗號(hào)“,”隔開(kāi)。如:for(sum=0,i=1;i<=100;i++,i++)。
(3)表達(dá)式2可以缺省,此時(shí)相當(dāng)于表達(dá)式2的值永遠(yuǎn)為真,循環(huán)將無(wú)限執(zhí)行下去,一般就會(huì)形成死循環(huán)。這樣就會(huì)出現(xiàn)三個(gè)表達(dá)式都缺省的情況。如 for(;;),等同于while(1)。
(4)看懂:for(sum=0,i=1;i<=100,sum=sum+i; i++)這個(gè)長(zhǎng)得很特殊的循環(huán)的程序。
例2:以下程序的輸出結(jié)果是(。。
main()
{ int a=0,i;
for(i=1;i<5;i++)
{
switch(i)
{ case0:
case 3:a+=2;
case 1:
case 2:a+=3;
default:a+=5;
}
}
printf("%d\n",a);
}
A) 31 B)13 C) 10 D) 20
分析:本例是for語(yǔ)句和switch語(yǔ)句的結(jié)合應(yīng)用。首先i為1,i<5為真,執(zhí)行循環(huán)體,循環(huán)體是一條switch語(yǔ)句,轉(zhuǎn)到case 1它不做任何操作,特別注意它后面的case也要執(zhí)行,因此執(zhí)行a+=3;和a+=5;,此時(shí)a為8了。接著執(zhí)行i++,i變?yōu)?,i<5為真,繼續(xù)執(zhí)行循環(huán)體switch語(yǔ)句,執(zhí)行case2和后面的default,此時(shí)a變?yōu)?6。如此反復(fù),直到i為5,i<5為假,跳出循環(huán)。最后結(jié)果為31。答案選A。
例3:有以下程序
#include <stdio.h>
double f(double x);
main()
{double a=0;int i;
for(i=0;i<30;i+=10)a+=f((double)i);
printf("%5.0f\n",a);
}
double f(double x)
(return x*x+1;)
程序運(yùn)行后的輸出結(jié)果是( )。
A)503
B)401
C)500
D)1404
知識(shí)點(diǎn):嵌套循環(huán)的執(zhí)行的過(guò)程; (學(xué)會(huì)做題目,掌握循環(huán)的方法)
重要程度:★★★★
例1:
有以下程序
main( )
{
int i,j,sum=0;
for(i=1;i<5;i++)
for(j=1;j<4;j++)
sum++;
printf("%d",sum);
}
程序的輸出結(jié)果是_______
分析:本題考察點(diǎn)在嵌套的for循環(huán)中,內(nèi)層和外層循環(huán)的執(zhí)行過(guò)程。內(nèi)層循環(huán)結(jié)構(gòu)的循環(huán)體是sum變量的自加,外層循環(huán)的循環(huán)體是內(nèi)層的for循環(huán)結(jié)構(gòu)。首先i的值為1,進(jìn)入循環(huán)體(內(nèi)層for循環(huán)結(jié)構(gòu)),j的值為1,sum的值變?yōu)?;內(nèi)層循環(huán)繼續(xù)執(zhí)行,j為2,sum再次自加為2;j自加為3,sum也為3;j自加為4的時(shí)候,j<4為假,因此跳出內(nèi)層循環(huán)。外層循環(huán)的循環(huán)體執(zhí)行完畢一次,下面計(jì)算i++。
i的值變?yōu)?,進(jìn)入循環(huán)體,重復(fù)上述過(guò)程,sum一共增加3,值為6。跳出內(nèi)層循環(huán)。外層循環(huán)的循環(huán)體執(zhí)行完畢。再次計(jì)算i++。
i的值變?yōu)?,重復(fù)以上過(guò)程,sum的值增加3。i的值變?yōu)?,sum繼續(xù)增加3。當(dāng)i的值變?yōu)?的時(shí)候,i<5為假,跳出外層循環(huán)。輸出sum的值。由于外層循環(huán)每執(zhí)行一次,sum要自加3次,所以一共sum自加12次。最后sum的值為12。各個(gè)變量的變化情況見(jiàn)圖5所示。
i 1 2 3 4
j 1 2 3 1 2 3 1 2 3 1 2 3
sum 1 2 3 4 5 6 7 8 9 10 11 12
圖5 例6中各變量的變化情況
考試核心:
1、 近幾年是考試的重點(diǎn),復(fù)習(xí)時(shí)候,把習(xí)題冊(cè)上最近三年的嵌套循環(huán)完成就可以了。
2、 嵌套循環(huán)是上機(jī)考試天空題目的重點(diǎn)。
3、 一定要知道嵌套循環(huán)的實(shí)質(zhì),和運(yùn)算的整個(gè)流程。
sum = 0;
for(i=1;i<=10;i++){
for(j=2;j<=5;j++) sum++;
}
這個(gè)程序中,sum就一共執(zhí)行了10(外層循環(huán)次數(shù))乘以4(嵌套的二次循環(huán))等于40次。
知識(shí)點(diǎn):break和continue的區(qū)別; break和continue的使用范圍;
重要程度:★★★★★
1、break語(yǔ)句
break; 英文的意思是打破的意思。所以看到break,我們馬上要知道它是終止了循環(huán)這個(gè)過(guò)程。
例1:以下程序運(yùn)行后的輸出結(jié)果是
main()
{ int x=15;
while(x>10)
{ x++;
if(x%3) {x++;break;} //誤區(qū),break是打破一層循環(huán),不是一層括號(hào)!!
x++;
}
printf(“%d\n”,x);
}
A)15 B)16 C)17 D)18
分析:本例是break語(yǔ)句在循環(huán)體中的運(yùn)用。x的初值為15,滿足while循環(huán)條件,執(zhí)行循環(huán)體。x++使x的值變?yōu)?6。進(jìn)入if語(yǔ)句,計(jì)算16%3的值為1,if后的表達(dá)式為真,故執(zhí)行復(fù)合語(yǔ)句,x自加為17,接著執(zhí)行break語(yǔ)句,跳出整個(gè)while循環(huán)。顯然后面的x++并不執(zhí)行。因此x的值為17,答案選C。
注意: break語(yǔ)句只能出現(xiàn)在switch語(yǔ)句體和循環(huán)結(jié)構(gòu)中。
2、continue語(yǔ)句
continue;英文的意思是繼續(xù)的意思.。其作用是結(jié)束本輪循環(huán),跳過(guò)本輪循環(huán)體中余下尚未執(zhí)行的語(yǔ)句,接著下一輪繼續(xù)進(jìn)行循環(huán)。
注意:continue語(yǔ)句和break語(yǔ)句的區(qū)別:continue語(yǔ)句只結(jié)束本輪循環(huán),而不是終止整個(gè)循環(huán)。而break語(yǔ)句則是結(jié)束整個(gè)循環(huán)。
|
|
以上兩個(gè)程序看上去是只有break和countine的差別,但是運(yùn)算起來(lái)差別很大。第一個(gè)程序運(yùn)算的結(jié)果為2,第二個(gè)程序運(yùn)算的結(jié)果為3。
例2:把100~500之間的能3整除的數(shù)輸出。(深刻理解)
main( )
{ int n;
for(n=100;n<=500;n++)
{ if(n%3!=0) continue;
printf("%3d",n);
}
}
分析:當(dāng)n不能被3整除時(shí),表達(dá)式n%3!=0為真,執(zhí)行continue語(yǔ)句,跳過(guò)printf語(yǔ)句,直接執(zhí)行n++,然后再對(duì)n<=500進(jìn)行判斷,決定是否執(zhí)行循環(huán)體。當(dāng)n能被3整除時(shí),表達(dá)式n%3!=0為假,跳過(guò)continue語(yǔ)句,執(zhí)行printf語(yǔ)句將該數(shù)輸出。
考試核心:
1、含有break和continue的程序運(yùn)算考察,習(xí)題冊(cè)上有多個(gè)經(jīng)典考題的代表。
2、break和continue的概念區(qū)別是考試愛(ài)出題的地方。
3、自己寫(xiě)一下,輸出1-100之間被三整除的數(shù),并且每行輸出三個(gè)數(shù)字的程序。
main( )
{ int n=1,count=0;
for(n=1;n<=100;n++)
{ if(n%3==0){printf("%3d",n);count++;}
if(count%3==0)printf(“\n”);
}}
掃碼關(guān)注我們
傳真:0755-82591176
郵箱:vicky@yingtexin.net
地址:深圳市龍華區(qū)民治街道民治大道973萬(wàn)眾潤(rùn)豐創(chuàng)業(yè)園A棟2樓A08