官术网_书友最值得收藏!

3.3 循環(huán)語句

循環(huán)語句用于重復執(zhí)行特定語句塊,直到循環(huán)終止條件成立或遇到跳轉語句。程序中經(jīng)常需要將一些語句重復執(zhí)行,使用基本語句順序執(zhí)行將使開發(fā)人員重復工作,影響效率。

如1+2+3+…+100,使用順序語句需要將100個數(shù)相加;若加至1000、10000或更大的數(shù),使得數(shù)據(jù)量加大,容易出錯,不便管理。

循環(huán)語句簡化了這個過程,將指定語句或語句塊根據(jù)條件重復執(zhí)行。循環(huán)語句分為4種:

for for循環(huán)重復執(zhí)行一個語句或語句塊,但在每次重復前驗證循環(huán)條件是否成立。

do while do while循環(huán)同樣重復執(zhí)行一個語句或語句塊,但在每次重復結束時驗證循環(huán)條件是否成立。

while while語句指定在特定條件下重復執(zhí)行一個語句或語句塊。

foreach in foreach in語句為數(shù)組或對象集合中的每個元素重復一個嵌入語句組。

3.3.1 for語句

for循環(huán)在重復執(zhí)行的語句塊之前加入了循環(huán)執(zhí)行條件,循環(huán)條件通常用來限制循環(huán)次數(shù),執(zhí)行流程圖如圖3-13所示。

圖3-13 for循環(huán)流程圖

如圖3-13所示,從開始進入判斷循環(huán)條件是否成立:若成立,執(zhí)行語句塊,并重新判斷循環(huán)條件是否成立;若不成立,結束這個循環(huán)。語法格式如下:

for(<初始化>; <條件表達式>; <增量>)
{語句塊}

for語句執(zhí)行括號里面語句的順序如下:

首先是初始化的語句,如int num=0;若for循環(huán)之前已經(jīng)初始化,可以省略初始化表達式,但不能省略分號。

接著是條件表達式,如num<5;表達式?jīng)Q定了該循環(huán)將在何時終止。表達式可以省略,但省略條件表達式,該循環(huán)將成為無限死循環(huán)。

最后是增量,通常是針對循環(huán)中初始化變量的增量,如num++;增量與初始值和表達式共同決定了循環(huán)執(zhí)行的次數(shù)。增量可以省略,但省略的增量將導致循環(huán)無法達到條件表達式的終值,因此需要在循環(huán)的語句塊中修改變量值。

增量表達式后不需要分號,因for語句()內的3個表達式均可以省略,表達式間的分號不能省略,因此有以下空循環(huán)語句:

for (;;)
{
}

循環(huán)條件中的變量也可用于實際意義,如以下示例。

【練習3-5】

定義整型變量num,計算1+2+3+4+…+1000的數(shù)值并賦值給num,輸出num的值。使用for循環(huán)語句如下:

int num = 0;
for (int x = 1; x <= 1000; x++)
{
    num = num + x;
}
Console.WriteLine(num);

執(zhí)行結果為:500500。練習3-5中將1遞加至1000,相當于求等差數(shù)列的值,省略for循環(huán)中的初始值和增量,可以使用以下語句。

int num = 0;
int x = 1;
for (; x <= 100; )
{
    num = num + x;
    x++;
}
Console.WriteLine(num);

以上代碼的運行結果與練習3-5是一樣的。除了數(shù)字,條件表達式同樣可用于字符,根據(jù)字符的ASCII值順序進行,如練習3-6所示。

【練習3-6】

定義字符串變量num和字符變量x,將字符從a到z組合在一起賦值給字符串num,并輸出,使用語句如下:

string num="";
char x = 'a';
for (; x <= 'z'; )
{
    num = num + x;
    x++;
}
Console.WriteLine(num);

執(zhí)行結果如下所示:

abcdefghijklmnopqrstuvwxyz

注意

條件表達式必須是布爾值,而且不能是常量表達式,否則循環(huán)將會因無法執(zhí)行或無法結束,而出現(xiàn)漏洞或失去意義。

3.3.2 do while語句

do while循環(huán)在重復執(zhí)行的語句塊之后加入了循環(huán)執(zhí)行條件,與for循環(huán)執(zhí)行順序相反。除了條件判斷順序的不同,do while語句雖然同樣使用小括號“()”來放置條件表達式,但小括號里面只能有一條語句,不需要分號結尾。執(zhí)行流程圖如圖3-14所示。

圖3-14 do while流程圖

如圖3-14所示,程序在開始時首先執(zhí)行循環(huán)中的語句塊,在語句塊執(zhí)行結束再進行循環(huán)條件的判斷。條件成立,重新執(zhí)行語句塊;條件不成立,結束循環(huán)。語法結構如下:

do
{語句塊}
while(條件表達式);

與for循環(huán)不一樣的有:

□ do關鍵字與while關鍵字分別放在循環(huán)的開始和結束。

□ 條件表達式放在循環(huán)最后。

□ while關鍵字后的括號()內,表達式只有一個。

□ 表達式的括號后需要加分號。

與for循環(huán)相比,do while循環(huán)將初始化放在了循環(huán)之前,將條件變量的變化放在了循環(huán)語句塊內。同樣是1到1000遞加,使用do while語句過程如下。

【練習3-7】

定義整型變量num,計算1+2+3+4+…+1000的數(shù)值并賦值給num,輸出num的值。使用do while語句如下:

int num = 0;
int x=1;
do
{
    num = num + x;
    x = x + 1;
}
while (x <=1000);
Console.WriteLine(num);

執(zhí)行結果與練習3-5相同。for主要控制循環(huán)的次數(shù),而對于不確定次數(shù)的循環(huán),使用do while比較合適,如練習3-8所示。

【練習3-8】

定義整型變量num,計算143除了1以外的最小約數(shù),并賦值給num,輸出num。求約數(shù)即相除余數(shù)為0的整數(shù),只能從最小的數(shù)依次計算,則語句如下:

int num=2;
do
{
    num=num+1;
}
while(143%num!=0);
Console.WriteLine(num);

程序開始,余數(shù)都不為0,直到余數(shù)為0,循環(huán)條件不成立,就找到了143的最小約數(shù)。若使用for循環(huán),語句如下:

int num = 2;
for (; 143%num!=0; )
{
    num++;
}
Console.WriteLine(num);

執(zhí)行結果為:11。

3.3.3 while語句

while語句在條件表達式判定之后執(zhí)行循環(huán),與for循環(huán)的執(zhí)行順序一樣。不同的是語句格式和適用范圍。

while的使用比較靈活,甚至在某些情況下能替代條件語句和跳轉語句。while循環(huán)流程圖如圖3-15所示。

圖3-15 while語句流程圖

如圖3-15所示,在執(zhí)行至while語句時首先判斷循環(huán)條件是否成立:若成立,執(zhí)行語句塊,并重新判斷循環(huán)條件是否成立;若不成立,結束這個循環(huán)。語法格式如下:

while(條件表達式)
{語句塊}

從while使用格式看出,while的使用與for很接近,滿足條件表達式即進行while語句塊,否則結束循環(huán)。

while后的括號()只能使用一個條件表達式語句,若在循環(huán)中不改變條件表達式中的變量值,循環(huán)將無限進行下去,因此循環(huán)語句塊中包含改變變量值的語句。如使用while計算1到1000這1000個數(shù)字的和,如練習3-9所示。

【練習3-9】

定義整型變量num,計算1+2+3+4+…+1000的數(shù)值并賦值給num,輸出num的值。使用while循環(huán)語句如下:

int i=0,num=0;
while(i<=1000)
{
    num = num + i;
    i++;
}
Console.WriteLine(num);

運行上述代碼,其結果與練習3-5結果一樣。代碼中,i變量在循環(huán)中改變了數(shù)值,否則循環(huán)將永遠進行下去,Console.WriteLine(num);語句將無法被執(zhí)行。

3.3.4 foreach in語句

foreach in語句主要用于數(shù)組、集合等元素成員的訪問。單個變量的賦值是最為簡單的,之前介紹過。但C#中有數(shù)組、集合之類數(shù)據(jù)類型,這些數(shù)據(jù)類型變量中,不止包含一個數(shù)據(jù),而是一系列數(shù)據(jù)。對這些數(shù)據(jù)類型的訪問,可以使用foreach in語句。

使用foreach in語句,可以在不確定元素成員個數(shù)的前提下,對元素成員執(zhí)行遍歷,如數(shù)組(在本書第2章有簡單介紹)類型的元素。

數(shù)組成員的訪問需要指定成員的索引,而若要遍歷數(shù)組中所有成員,則需要知道數(shù)組成員的個數(shù)(也叫作數(shù)組長度),但使用foreach in語句可以在沒有獲取數(shù)組長度的情況下對元素成員進行遍歷。

數(shù)組中的數(shù)可多可少,若一個個賦值會加大開發(fā)人員工作量,使用foreach in語句可以對數(shù)組及對象集合成員進行操作,如賦值、讀取等。

數(shù)組中的成員數(shù)量各不相同,foreach in循環(huán)不需要指定循環(huán)次數(shù)或條件。如針對有N個成員的數(shù)組,foreach in循環(huán)流程圖如圖3-16所示。

圖3-16是foreach in循環(huán)作用的形象圖,并非標準流程圖。foreach語句為數(shù)組或對象集合中的每個元素重復一個嵌入語句組,循環(huán)訪問集合以獲取所需信息。

圖3-16 foreach in循環(huán)流程圖

嵌入語句為數(shù)組或集合中的每個元素順序執(zhí)行。當為集合中的所有元素完成操作后,控制傳遞給foreach語句塊之后的下一個語句。語法格式如下:

foreach (變量聲明 in 數(shù)組名或集合類名)
{
    語句塊   // 使用聲明的變量替代數(shù)組和集合類成員完成操作
}

foreach語句聲明的變量替代了數(shù)組成員,由于格式過于模糊、不易理解,通過練習來講解foreach語句的使用,如練習3-10所示。

【練習3-10】

定義整型數(shù)組num并賦值,定義整型變量替代num成員,輸出數(shù)組成員,使用語句如下。

int[] num = new int[] { 0, 1, 2, 3, 5, 8, 13 };
foreach (int i in num)
{
    Console.Write(i);
    Console.Write(" ");
}

執(zhí)行結果為:

0 1 2 3 5 8 13

代碼中的Console.Write();表示輸出()中的字符串,不進行換行。Console.Write(" ");語句輸出一個空格。

在foreach語句塊內的任意位置都可以使用跳轉語句跳出當前循環(huán)或整個foreach語句塊。跳轉語句在本章3.5節(jié)介紹。

注意

foreach循環(huán)不能應用于更改集合內容,以避免產生不可預知的副作用。

主站蜘蛛池模板: 织金县| 昭苏县| 福州市| 通辽市| 甘孜县| 岢岚县| 新余市| 施甸县| 呼和浩特市| 吉安市| 定结县| 蒙自县| 疏附县| 延安市| 于都县| 开鲁县| 甘孜| 宁南县| 贡觉县| 平阳县| 寻乌县| 江达县| 庐江县| 湟源县| 灵石县| 香格里拉县| 县级市| 韶关市| 静乐县| 孟村| 民权县| 屯门区| 宁武县| 望奎县| 汕头市| 房产| 三台县| 邳州市| 武夷山市| 松桃| 虎林市|