您好,歡迎進(jìn)入深圳市穎特新科技有限公司官方網(wǎng)站!
該章內(nèi)容:本章我們學(xué)習(xí)三大結(jié)構(gòu)之一:循環(huán)結(jié)構(gòu)。通常采用循環(huán)結(jié)構(gòu)來解決有規(guī)律性的重復(fù)性工作,如求學(xué)生的總成績(jī);統(tǒng)計(jì)車站某月的人流量。在程序設(shè)計(jì)中對(duì)那些需要重復(fù)執(zhí)行的操作我們采用循環(huán)結(jié)構(gòu)來完成,幾乎所有實(shí)用的程序都包含循環(huán)。c語言中有三種循環(huán)語句來構(gòu)成循環(huán)結(jié)構(gòu):while語句,do-while語句和for語句。本章是考試的重點(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í)編寫程序。最終一定要學(xué)會(huì)用循環(huán)來解決規(guī)律性的重復(fù)性工作的問題。
知識(shí)點(diǎn):while語句的執(zhí)行過程;循環(huán)體中語句書寫的位置對(duì)程序的影響;
重要程度:★★★★
程序一:
while(y++); (循環(huán)體為空,while只管后面一個(gè)語句,管多個(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++)后面有沒有分號(hào)。(這幾年考試的熱點(diǎn))
注意:while只管后面一個(gè)語句,管多個(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è)空語句,而不是printf語句。
(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語句,此時(shí)x的值為-1。答案為-1。
知識(shí)點(diǎn):do-while語句的執(zhí)行過程;do-while和while的相似和不同之處;
重要程度:★★★★
do-while語句的一般形式如下:
do
循環(huán)體
while (表達(dá)式);
圖3 do-while語句流程圖
注意:
(1)do-while循環(huán)語句的循環(huán)體至少執(zhí)行一次。
(2)在while(表達(dá)式)后的“;”不可以少。它表示do-while語句的結(jié)束。
(3)do-while語句與while語句可以相互轉(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語句及其構(gòu)成的循環(huán)結(jié)構(gòu)(重點(diǎn)章節(jié))
知識(shí)點(diǎn):for語句的執(zhí)行過程;for語句中三個(gè)表達(dá)式使用方法;for 、while、 do-while之間的聯(lián)系和區(qū)別;
重要程度:★★★★★
for(表達(dá)式1;表達(dá)式2;表達(dá)式3)
循環(huán)體語句
三個(gè)表達(dá)式要背誦的:
表達(dá)式1:作用是初始化循環(huán)的變量;(執(zhí)行一次)
表達(dá)式2:循環(huán)條件的判斷;(可執(zhí)行多次)
表達(dá)式3:作用是循環(huán)變量增值或減少。(可執(zhí)行多次)
其執(zhí)行過程如下:
(1) 求解表達(dá)式1。
(2) 求解表達(dá)式2,若其值為“真”非0,則執(zhí)行
for語句控制的循環(huán)體語句,然后執(zhí)行步驟(3)。
若為“假”0,則結(jié)束循環(huán),轉(zhuǎn)到第(5)步。
(3) 求解表達(dá)式3
(4) 返回第(2)步繼續(xù)執(zhí)行。
(5) 循環(huán)結(jié)束,執(zhí)行for語句后面的語句。
圖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語句輸出sum的值。答案選A。本例有兩種變形,請(qǐng)讀者自己分析結(jié)果。希望讀者深刻理解,循環(huán)體語句可以是一條語句,也可以是一條復(fù)合語句,甚至是條空語句。
變形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語句我們這里有幾點(diǎn)說明:
(1)for語句可以完全代替while語句:
表達(dá)式1;
while(表達(dá)式2)
{
循環(huán)體語句
表達(dá)式3;
}
(2)for后面小括號(hào)中的表達(dá)式1和表達(dá)式3都可以缺省,表達(dá)式1可以移到for語句之前,表達(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)“,”隔開。如:for(sum=0,i=1;i<=100;i++,i++)。
(3)表達(dá)式2可以缺省,此時(shí)相當(dāng)于表達(dá)式2的值永遠(yuǎn)為真,循環(huán)將無限執(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語句和switch語句的結(jié)合應(yīng)用。首先i為1,i<5為真,執(zhí)行循環(huán)體,循環(huán)體是一條switch語句,轉(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語句,執(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í)行的過程; (學(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í)行過程。內(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ù)上述過程,sum一共增加3,值為6。跳出內(nèi)層循環(huán)。外層循環(huán)的循環(huán)體執(zhí)行完畢。再次計(jì)算i++。
i的值變?yōu)?,重復(fù)以上過程,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è)變量的變化情況見圖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語句
break; 英文的意思是打破的意思。所以看到break,我們馬上要知道它是終止了循環(huán)這個(gè)過程。
例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語句在循環(huán)體中的運(yùn)用。x的初值為15,滿足while循環(huán)條件,執(zhí)行循環(huán)體。x++使x的值變?yōu)?6。進(jìn)入if語句,計(jì)算16%3的值為1,if后的表達(dá)式為真,故執(zhí)行復(fù)合語句,x自加為17,接著執(zhí)行break語句,跳出整個(gè)while循環(huán)。顯然后面的x++并不執(zhí)行。因此x的值為17,答案選C。
注意: break語句只能出現(xiàn)在switch語句體和循環(huán)結(jié)構(gòu)中。
2、continue語句
continue;英文的意思是繼續(xù)的意思.。其作用是結(jié)束本輪循環(huán),跳過本輪循環(huán)體中余下尚未執(zhí)行的語句,接著下一輪繼續(xù)進(jìn)行循環(huán)。
注意:continue語句和break語句的區(qū)別:continue語句只結(jié)束本輪循環(huán),而不是終止整個(gè)循環(huán)。而break語句則是結(jié)束整個(gè)循環(huán)。
|
|
以上兩個(gè)程序看上去是只有break和countine的差別,但是運(yùn)算起來差別很大。第一個(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語句,跳過printf語句,直接執(zhí)行n++,然后再對(duì)n<=500進(jìn)行判斷,決定是否執(zhí)行循環(huán)體。當(dāng)n能被3整除時(shí),表達(dá)式n%3!=0為假,跳過continue語句,執(zhí)行printf語句將該數(shù)輸出。
考試核心:
1、含有break和continue的程序運(yùn)算考察,習(xí)題冊(cè)上有多個(gè)經(jīng)典考題的代表。
2、break和continue的概念區(qū)別是考試愛出題的地方。
3、自己寫一下,輸出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萬眾潤(rùn)豐創(chuàng)業(yè)園A棟2樓A08