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