詳細介紹了C語言while循環(huán)結(jié)構(gòu)、do-while循環(huán)結(jié)構(gòu)、for循環(huán)結(jié)構(gòu)、循環(huán)退出語句的語法和使用方法。
1、while循環(huán)結(jié)構(gòu)
while循環(huán)循環(huán)結(jié)構(gòu)的必要性
前面討論了編程中進行判斷的各種方法,然而有些問題僅僅通過判斷還不能解決。某些情況中,為解決一個問題常常需要重復執(zhí)行一個或多個操作。例如,要求輸出從1—5分別乘以10所得的乘法表。
例: 輸出從1—5分別乘以10所得的乘法表
程序清單 sample.c
#include
int main()
{
int result1,result2,result3,result4,result5;
result1 = 1 * 10;
printf("1 * 10 = %dn",result1);
result2 = 2 * 10;
printf("2 * 10 = %dn",result2);
result3 = 3 * 10;
printf("3 * 10 = %dn",result3);
result4 = 4 * 10;
printf("4 * 10 = %dn",result4);
result5 = 5 * 10;
printf("5 * 10 = %dn",result5);
}
程序編寫5條語句計算乘積,再編寫另外5條語句顯示這些乘積。如果要求輸出1—100的數(shù)與10相乘的乘法表呢?就需要重復編寫100次這樣的語句。這樣既費時又費力。我們需要一種方法可以快速有效地執(zhí)行重復性操作。在C語言中,可以通過循環(huán)結(jié)構(gòu)來解決這類問題。
循環(huán)結(jié)構(gòu)是程序中一種很重要的結(jié)構(gòu)。其特點是,在給定條件成立時,重復執(zhí)行某程序段,直到條件不成立為止。給定的條件為循環(huán)條件,反復執(zhí)行的程序段稱為循環(huán)體。C語言提供了三種不同形式的循環(huán)結(jié)構(gòu)。
(1) while循環(huán)結(jié)構(gòu)
用于在特定條件為真的情況下重復執(zhí)行某些操作,在執(zhí)行循環(huán)體之前先檢查條件,一旦條件為假,循環(huán)就停止。
(2) do—while循環(huán)結(jié)構(gòu)
同樣用于在特定條件為真的情況下重復執(zhí)行某些任務(wù)。但是在do—while循環(huán)中,是在執(zhí)行循環(huán)語句之后再檢查條件。因此,在循環(huán)結(jié)束前,循環(huán)體內(nèi)的語句至少會被執(zhí)行一次。
(3)for循環(huán)結(jié)構(gòu)
fou循環(huán)與while循環(huán)在功能上類似,只要條件為真,就會執(zhí)行循環(huán)體中的語句。同樣,也是在執(zhí)行循環(huán)語句之前先檢查條件,但是,其語法規(guī)則與while循環(huán)有所不同。
while循環(huán)
while循環(huán)的一般語法是:
while( 表達式 )
語句;
其中,表達式是循環(huán)條件,語句為循環(huán)體。while語句的語義是:計算表達式的值,當值為真(非0)時,執(zhí)行循環(huán)體語句,一旦條件為假,就停止執(zhí)行循環(huán)體。如果條件在開始時就為假,則不執(zhí)行循環(huán)體語句直接退出循環(huán)。
循環(huán)體語句可以是空語句、單條語句或語句集。如果是語句集,則要用“{”和“}”把它們括起來,用于循環(huán)條件的表達式必須返回真或假。
例:輸出從1—10分別乘以10所得的乘法表
程序清單 sample.c
#include
int main()
{
//聲明變量num,初值為1
int num=1;
// 聲明變量result,存儲計算結(jié)果
int result;
while( num <=10 )
{
result = num * 10;
printf(" %d * 10 = %d n",num,result);
//使用自增運算符,修改循環(huán)變量
num++;
}
}
程序聲明了兩個int類型的變量num和result,分別用來存儲數(shù)字和乘積。然后,將num初始化為1,因為打算在while循環(huán)中從1開始執(zhí)行乘法運算,求出1—10的數(shù)字與10的乘積,因此將while循環(huán)的條件編寫為num<=10。這樣確保了只要num小于等于10,就執(zhí)行while循環(huán);而當此條件變?yōu)榧贂r,即num的值達到11時,就結(jié)束此循環(huán)。循環(huán)體中的第一個語句用num乘以10,將計算結(jié)果保存在變量result中。第二個語句輸出乘法表,循環(huán)體中的最后一個語句將num的值遞增1,來修改num的值。此處使用了單目自增運算符++,也可以編寫為num=num+1,來替代num++。
程序中的num++非常重要,這條語句通過修改num的值來修改循環(huán)條件,直到num的值等于11,循環(huán)條件為假時退出循環(huán)。也就是說,循環(huán)條件中的變量,需要在循環(huán)中重新賦值,以逐漸改變循環(huán)條件的值,直到循環(huán)條件為假;否則循環(huán)將永遠不會停止,這種循環(huán)稱為“死循環(huán)”或者“無限循環(huán)”。
例:無限循環(huán)
程序清單 sample.c
#include
int main()
{
int count=0;
while( count < 100 )
{
printf("這將沒完沒了,幫幫我吧?。?!");
printf("試試Ctrl+C吧");
}
}
程序功能主要是演示在while循環(huán)語句中,由于缺乏改變條件的語句而導致出現(xiàn)無限循環(huán)的問題。
程序中while循環(huán)體內(nèi)沒有修改循環(huán)變量count的值,導致循環(huán)條件一直為真,造成了無限循環(huán)。
2、do-while循環(huán)
do-while循環(huán)與while循環(huán)的不同在于:它先執(zhí)行循環(huán)體中的語句,然后再判斷條件是否為真。如果為真則繼續(xù)循環(huán),如果為假,則終止循環(huán)。因此,do-while循環(huán)至少要執(zhí)行一次循環(huán)語句。同樣當有許多語句參加循環(huán)時,要用“{”和“}”把它們括起來。
do-while循環(huán)的一般語法是:
do{
語句;
}while(條件)
注意:在do-while語句的表達式后面必須加分號。
例:do-while循環(huán)練習
編程要求:編寫一個猜數(shù)游戲,要求猜一個介于1—10之間的數(shù)字,根據(jù)用戶猜測的數(shù)與標準值進行對比,并給出提示,以便下次猜測能接近標準值,直到猜中為止。
程序清單 sample.c
int main()
{
//初始化猜數(shù)的標準數(shù)值
int number = 5;
int guess = 0;
printf("猜一個介于 1 與 10 之間的數(shù)n");
do
{
printf("請輸入您猜測的數(shù):");
scanf("%d",&guess);
if( guess > number )
printf("太大n");
else if( guess < number )
printf("太小n");
}while( guess != number );
printf("您猜中了:答案為 %dn",number);
}
程序內(nèi)部設(shè)置一個標準值(答案)存儲到變量number中,并聲明一個guess變量接收用戶猜測的數(shù)值。采用do-while結(jié)構(gòu)可以確保用戶至少能進行一次猜數(shù)操作,在循環(huán)體內(nèi),提示用戶輸入要猜的數(shù),用戶輸入猜測的數(shù)值后,利用if-else語句和正確答案進行判斷,如果用戶猜測的數(shù)值大于答案,提示用戶數(shù)太大;如果用戶猜測的數(shù)值小于答案,提示用戶數(shù)太小。while語句后面的表達式( guess != number )用于判斷循環(huán)條件是否滿足,如果用戶輸入的數(shù)值和答案不相等,該表達式返回的結(jié)果為真,繼續(xù)執(zhí)行循環(huán)體,要求用戶根據(jù)提示繼續(xù)猜數(shù),否則,表達式返回的結(jié)果為假,循環(huán)條件不滿足,程序不再執(zhí)行循環(huán)體,直接執(zhí)行循環(huán)體后面的語句。
do-while語句是一種先執(zhí)行循環(huán)體,然后判斷條件的結(jié)構(gòu),即只有在循環(huán)體中的代碼執(zhí)行之后,才會判斷循環(huán)條件??偟膩碚f,循環(huán)結(jié)構(gòu)在開始執(zhí)行的時候,先執(zhí)行循環(huán)體內(nèi)的代碼,然后通過while里面的條件進行判斷,條件成立就繼續(xù)執(zhí)行循環(huán),不成立就跳出循環(huán),循環(huán)體內(nèi)代碼至少被執(zhí)行一次。
3、嵌套循環(huán)
就像if語句可以嵌套一樣,一個循環(huán)也可以嵌套在另一個循環(huán)中,一個循環(huán)中含有另一個循環(huán)就稱為嵌套循環(huán)。
嵌套循環(huán)的工作原理如下:首先外循環(huán)的第一輪觸發(fā)內(nèi)循環(huán),然后內(nèi)循環(huán)將一直執(zhí)行到完成為止,然后,外循環(huán)的第二輪再次觸發(fā)內(nèi)循環(huán),此過程不斷重復直到外循環(huán)結(jié)束,使用嵌套循環(huán)時,只有在內(nèi)循環(huán)完全結(jié)束后,外循環(huán)才會執(zhí)行下一趟循環(huán),
一個while循環(huán)可以嵌套在另一個while循環(huán)中,示例1演示了嵌套while循環(huán)的用法。
例:while嵌套循環(huán)練習1
編程要求:用*輸出一個直角三角形圖案。
程序清單 sample.c
#include
void main()
{
int nstars=1,stars;
//外層循環(huán)控制輸出*的行數(shù)
while( nstars <= 10 )
{
stars = 1;
//內(nèi)層循環(huán)控制打印星號的數(shù)量
while( stars <= nstars )
{
printf("*");
stars++;
}
printf("n");
nstars++;
}
}
程序用外層循環(huán)控制輸出 的行數(shù),循環(huán)條件為nstars <= 10,nstars初始化為1,該條件允許輸出10行 ;內(nèi)層循環(huán)控制*輸出的數(shù)量,循環(huán)條件為stars <= nstars,內(nèi)層循環(huán)開始前,stars都被賦值為1,然后在內(nèi)層循環(huán)體內(nèi)做自增操作。
例:while嵌套循環(huán)練習2
編程要求:輸入字符序列,統(tǒng)計輸入的字符數(shù)。
程序清單 sample.c
#include
void main()
{
int x;
char ans;
ans = 'y';
do {
x = 0;
printf("請輸入字符序列:n");
do {
scanf("%c",&ans);
x++;
}while( ans != 'q');
printf("n輸入的字符數(shù)為:%d",--x);
printf("n是否需要輸入更多字符序列(Y/N)?");
scanf("%c",&ans);
}while( ans!='N' );
}
程序首先提示用戶輸入字符序列,進入內(nèi)層do-while循環(huán),接收用戶輸入的字符序列,直到用戶按下回車鍵并輸入字符q,程序?qū)⑼顺鰞?nèi)層的do-while循環(huán)。程序接著詢問用戶是否要輸入更多的字符序列,如果用戶輸入y或Y,do-while外循環(huán)的條件為真,則程序?qū)⑻崾居脩糨斎肓硪恍蛄凶址?。直到用戶按下除y或Y以外的任何鍵時,外循環(huán)才結(jié)束。
while循環(huán)和do-while循環(huán)也可以互相嵌套。例如,可以將示例1的內(nèi)層while循環(huán)修改為do-while循環(huán),或者將外層循環(huán)修改為do-while循環(huán)。
4、for循環(huán)
for循環(huán)語句是C語言提供的功能更強,使用更廣泛的一種循環(huán)語句。C語言的for循環(huán)語句使用最為靈活,不僅可以用于循環(huán)次數(shù)已經(jīng)確定的情況,而且可以用于循環(huán)次數(shù)不確定而只給出循環(huán)條件的情況,它完全可以代替while循環(huán)。
for循環(huán)的一般語法為:
for(表達式1; 表達式2; 表達式3;)
{
語句;
}
語法說明如下:
■ 表達式1:通常用來給循環(huán)變量賦初值,一般是賦值表達式,也允許在for語句外給循環(huán)變量賦初值,此時可以省略該表達式;
■ 表達式2:通常是循環(huán)條件,一般為關(guān)系表達式或邏輯表達式;
■ 表達式3:通常可用來修改循環(huán)變量的值,一般是賦值語句。
for循環(huán)中的這三部分必須用分號隔開,組成循環(huán)體的語句可以是單條語句或一個語句集(多條語句)。
一般語法中的“語句”即為循環(huán)體語句。for語句的語義是:
- 首先計算表達式1的值,通常為循環(huán)變量賦初值;
- 再計算表達式2的值,即判斷循環(huán)條件是否為真,若值為真則執(zhí)行循環(huán)體一次,否則跳出循環(huán);
- 然后再計算表達式3的值,這里通常寫更新循環(huán)變量的賦值表達式,然后轉(zhuǎn)回第二步重復執(zhí)行。
在整個for循環(huán)過程中,表達式1只計算一次,表達式2和表達式3則可能計算多次。循環(huán)體可能執(zhí)行多次,也可能一次都不執(zhí)行。
例:for循環(huán)練習1
編程要求:使用for循環(huán)求數(shù)的階乘。
程序清單 sample.c
#include
void main()
{
int number,count;
int factorial = 1;
printf("請輸入任意一個正整數(shù):");
scanf("%d",&number);
for( count=1;count<=number;count++ )
{
factorial = factorial * count;
}
printf("%d的階乘 = %d",number,factorial);
}
程序聲明了3個int類型的變量,number、count、factorial。分別用于存儲輸入的整數(shù)、循環(huán)變量的值、階乘值。For循環(huán)中表達式count=1為變量賦初值,表達式count<=number作為循環(huán)條件用來測試是否繼續(xù)執(zhí)行循環(huán),表達式count++用來修改循環(huán)變量的值。
for語句中的三個表達式都可以是逗號表達式,逗號表達式就是通過“逗號”隔開的多個表達式組成的表達式,逗號表達式從左往右計算。
例:for循環(huán)練習2
編程要求:使用for循環(huán)輸出加法表。
程序清單 sample.c
#include
void main()
{
int i,j,max;
printf("請輸入任意一個數(shù)值:");
printf("根據(jù)這個值可以輸出以下加法表n");
scanf("%d",&max);
for( i=0,j=max;i<=max;i++,j-- )
{
printf("n %d + %d = %d",i,j,i+j);
}
}
程序在for循環(huán)中,表達式1為逗號表達式,該表達式為循環(huán)變量i和j賦初值,執(zhí)行此表達式后,i被賦值為0,j被賦予max中的當前值;表達式3也是一個逗號表達式,每次循環(huán)后,i自加1,j自減1。
前面已討論,for循環(huán)中有三個表達式,for循環(huán)中的這三個表達式都可以省略,但要注意分號分割符合不能省略,下面分別討論for循環(huán)中省略部分或者全部表達式的情況。
(1)省略表達式1
for循環(huán)語句中表達式1可以省略不寫,此時,循環(huán)變量應(yīng)在循環(huán)語句之外賦值,例如如下語句:
int i = 0;
for( ; i < 10; i++ )
{
printf("n %d=", i*2)
}
程序輸出20以內(nèi)的偶數(shù),int i = 0對循環(huán)變量進行賦值,因為循環(huán)變量i已經(jīng)被賦值,此時循環(huán)語句可以省略表達式1。
(2)省略表達式2
for循環(huán)語句中的表達式2,在一定條件下也可以省略, 表達式2主要用于循環(huán)條件的判斷。如果省略表達式2,就必須要在循環(huán)體中增加循環(huán)條件判斷語句,如果不滿足循環(huán)條件,則跳出循環(huán)。跳出循環(huán)可以用break語句,break語句將在后面介紹。省略表達式2的示例語句如下:
int i;
for( i=0;; i++ )
{
if( i >=10 )
break;
printf("n %d=", i*2)
}
程序在循環(huán)體內(nèi)增加了if( i >= 10 )條件判斷語句,如果i>=10為真,則通過break語句跳出循環(huán),如果循環(huán)體內(nèi)沒有跳出循環(huán)的條件判斷語句,程序?qū)⑦M入無限循環(huán)。
(3)省略表達式3
for循環(huán)語句中的表達式3一般是用來修改循環(huán)變量的值,如果在循環(huán)體內(nèi)有修改循環(huán)變量的語句,此時表達式3可以省略。例如如下語句:
int i;
for( i=0; i< 10; )
{
i = i+1;
printf("n %d=", i*2)
}
循環(huán)體內(nèi)的i = i+1等同于for( ; i < 10; i++ )語句中的i++,每循環(huán)一次,i就進行加1操作,當i自增到10時,循環(huán)終止。
三個表達式都省略
三個表達式都省略的情況比較少見,此時,循環(huán)體為有循環(huán)變量的賦值語句,循環(huán)體內(nèi)應(yīng)有修改循環(huán)變量和循環(huán)條件判斷的語句,否則很容易形成無限循環(huán)。例如如下語句:
int i=0;
for( ;; ; )
{
i = i+1;
if( i >=10 )
break;
printf("n %d=", i*2)
}
程序中int i=0為循環(huán)變量i賦初值,循環(huán)體內(nèi)i = i+1修改循環(huán)變量i的值,if( i >= 10 )判斷循環(huán)變量i的值是否大于等于10,如果條件為真,則跳出循環(huán)。
for循環(huán)在C編程中應(yīng)用非常廣泛,它不僅可以用于循環(huán)次數(shù)已經(jīng)確定的情況,而且可以用于循環(huán)次數(shù)不確定而只給出循環(huán)條件的情況,它完全可以代替while循環(huán)。只要弄明白了for循環(huán)的三個表達式,就可以掌握for循環(huán)的用法,表達式1是進入第一次for循環(huán)之前運行,并且只會執(zhí)行一次;表示式2是for循環(huán)的執(zhí)行條件,滿足這個條件后才能進入循環(huán)里面的語句;表達式3是在執(zhí)行一次循環(huán)后執(zhí)行的語句。
5、循環(huán)跳出
有時可能不知道循環(huán)將要執(zhí)行的次數(shù),終止循環(huán)的條件可在以后確定,所以需要提供一種機制在條件滿足的時候跳出循環(huán)。有時候,我們需要根據(jù)條件跳過循環(huán)中的一些語句。Java語言提供了break和continue兩個關(guān)鍵字,用于改變程序的控制流。
break語句
break語句通常用在前面介紹過的switch語句及循環(huán)語句中。當break語句用于switch語句時,可使程序跳出switch語句而執(zhí)行switch語句之后的語句;當break語句用于while、do-while、for循環(huán)語句時,可使程序終止循環(huán)而執(zhí)行循環(huán)后面的語句。
break語句實際上就是為了使人能方便地描述從循環(huán)執(zhí)行中退出的動作。通常應(yīng)把break語句放在條件語句控制之下,以便在某些條件成立時立即結(jié)束循環(huán)。
例:break語句練習
編程要求:使用break語句退出循環(huán)。
程序清單 sample.c
#include
void main()
{
int i= 0;
while(i< 7)
{
i++;
printf("n 第%d次循環(huán)",i);
if(i==5)
{
printf("n i==5 跳出循環(huán),程序結(jié)束", i);
break;
}
}
}
該循環(huán)在變量i的值等于5時,滿足條件,然后執(zhí)行break語句,結(jié)束整個循環(huán),循環(huán)語句后面沒有其它語句可執(zhí)行,程序退出。
continue語句
continue語句只能用在循環(huán)里。continue語句的作用是跳過循環(huán)體中剩余的語句而準備執(zhí)行下一次循環(huán)。對于while和do-while循環(huán),continue執(zhí)行之后的動作是條件判斷;對于for循環(huán),隨后的動作是變量更新。
注意break語句和continue語句的差別。break語句導致循環(huán)終止,使程序控制流轉(zhuǎn)向這個循環(huán)語句之后;而continue引起的則是循環(huán)內(nèi)部的一次控制轉(zhuǎn)移,使執(zhí)行控制跳到循環(huán)體的最后,相當于跳過循環(huán)體里這個語句后面的那些語句,繼續(xù)下一次循環(huán),下圖說明了break語句和continue語句引起的控制轉(zhuǎn)移的情況。
例:continue語句練習
編程要求:求整數(shù)1—100的累加值,但要求跳過所有個位為3的數(shù)。
提示:在循環(huán)中加一個判斷,如果該數(shù)個位是3,就跳過該數(shù)不加。如何判斷1到100中的那些整數(shù)的個位是3呢,還是使用取余運算符“%”,將一個正整數(shù),除以10以后余數(shù)是3,就說明這個數(shù)的個位為3。
程序清單 sample.c
#include
void main()
{
int i;
int sum = 0;
for( i =1; i<=100; i++ )
{
if( i % 10 == 3 )
{
continue;
}
sum += i;
}
printf("sum = %d",sum);
}
程序檢查i除以10的余數(shù)是否等于3,如果是,則意味該數(shù)的個位數(shù)是3,這種情況下,將使用continue語句跳過后續(xù)語句,然后轉(zhuǎn)向for循環(huán)的表達式3更新循環(huán)變量,繼續(xù)下一次循環(huán)。
和break語句一樣,continue語句通常在循環(huán)中與條件語句一起使用,用來控制循環(huán)。在循環(huán)中遇到continue語句后,就不會執(zhí)行該循環(huán)中位于continue后的任何語句。continue語句用于結(jié)束當次循環(huán),繼續(xù)下一次循環(huán)。
6、for嵌套循環(huán)
for循環(huán)也可以嵌套,它可以和for循環(huán)結(jié)構(gòu),也可以和while循環(huán)結(jié)構(gòu)混合嵌套。
嵌套循環(huán)時,必須將被嵌套的循環(huán)語句完整地包含在外層循環(huán)的循環(huán)體內(nèi),下面給出嵌套循環(huán)的示例。
例:for循環(huán)嵌套練習
編程要求:用“*”輸出一個菱形圖案,圖案如下:
程序清單 sample.c
#include
void main()
{
int i, j, k;
// 先打印上邊的四行
for (i = 1; i <= 4; i++) {
// 控制要打印的空格數(shù)
for (j = 1; j <= 4 - i; j++)
printf(" ");
// 控制要打印的星號數(shù)
for (k = 1; k <= 2 * i - 1; k++)
printf("*");
printf("n");
}
// 打印下邊的三行
for (i = 1; i <= 3; i++) {
// 控制要打印的空格數(shù)
for (j = 1; j <= i; j++)
printf(" ");
// 控制要打印的星號數(shù)
for (k = 1; k <= 7 - 2 * i; k++)
printf("*");
printf("n");
}
}
程序分為兩部分循環(huán),第一部分循環(huán)輸出菱形圖案的上邊四行,最外層循環(huán)控制輸出的行數(shù),內(nèi)層嵌套了兩個for循環(huán),第一個嵌套循環(huán)輸出打印的空格數(shù),第二個嵌套循環(huán)輸出打印的星號數(shù);第二部分循環(huán)輸出菱形圖案的下邊三行,原理和第一部分循環(huán)相同。
例:for循環(huán)嵌套練習
編程要求:打印輸出100至200之間的全部素數(shù)。
提示:素數(shù)是指能被1和它本身整除的數(shù)。算法比較簡單,先將這個數(shù)被2除,如果能整除,且該數(shù)又不等于2,則該數(shù)不是素數(shù)。如果該數(shù)不能被2整除,再看是否能被3整除,并且該數(shù)不等于3,則該數(shù)不是素數(shù),否則再判斷是否能被4整除,依次類推,該數(shù)只要是能被小于其本身的某個數(shù)整除時,就不是素數(shù)。
程序清單 sample.c
#include
void main()
{
int i, j, n;
n = 0;
for (i = 100; i <= 200; i++) {
j = 2;
// 從2到i之間尋找第一個能被整除的數(shù)
while (i % j != 0)
j++;
// 如果第一個能被整除的數(shù)等于該數(shù)本身,則說明該數(shù)為素數(shù)
if (i == j) {
printf("%4d", i);
n++;
// 控制每行輸出8個素數(shù)
if (n % 8 == 0)
printf("n");
}
}
printf("n");
}
程序外層循環(huán)控制輸出100至200之間的數(shù),內(nèi)層的while循環(huán)用于找尋從2到該數(shù)之間第一個能被整除的數(shù),內(nèi)層循環(huán)判斷條件為i%j != 0,其中i為當前要判斷是否是素數(shù)的數(shù),j為從2開始循環(huán)遞增的數(shù),如果i%j != 0,則說明i不能被j整除,j自增后程序繼續(xù)執(zhí)行while循環(huán),如果i%j == 0,則說明i能被j整除,程序跳出while循環(huán),循環(huán)后面的if語句判斷i與j是否相等,如果相等,則說明i為素數(shù),程序輸出i。
評論
查看更多