本次将介紹控制程式流的3種新方法。
●如何使用簡單的數組
●如何使用for、while和do... while循環多次執行語句
●如何嵌套程式控制語句
一.數組:基本概念:
在開始學習for語句之前,應該先了解一下數組的基本概念。
在C語言中,for語句和數組密切相關。為了幫助讀者了解稍後for語句要用到的數組,這裡先簡要地介紹什麼是數組。
數組是一組帶索引的資料存儲位置,各位置的名稱相同,以不同的下标或索引來區分。
下标(也叫作索引)指的是數組變量名後面方括号中的數字。
與其他C語言的變量類似,在使用數組之前必須先聲明它。
數組聲明要包含資料類型和數組的大小(即,數組中元素的數量)。
例如,下面這條語句聲明了一個名為data的數組,其中可容納1000個int類型的元素:
int data[1000];
通過下标區分每個元素,如data[0] 至data[999] 。
注意,第1個元素是data[0],不是data[1] 。
注意,可将索引視為偏移量。
對于數組的第1個元素,偏移為0。
對于第2個元素,需要偏移1個元素,是以索引是1。
如上例所示,數組的每個元素都相當于一個普通的int類型變量,可以像使用int類型變量一樣使用它們。
數組的下标也可以是C變量,如下所示:
intdata[1000];
int index;
index = 100;
datalindex] = 12; /*與data[100] = 12等價*/
至此,已經簡要介紹完數組。了解這些基本知識後,應該能明白本次後面程式示例中是如何使用數組的。
如果還不太清楚,别擔心,後面還會将詳細講解數組的相關知識。
注意:聲明數組時,下标不要超過實際需要的元素數量,這樣浪費記憶體。不要忘記,在C語言中,數組的第1個元素下标是0,不是1。
二.控制程式的執行:
C程式預設的執行順序是自上而下。
從main()函數的起始位置開始,逐條執行語句,直至main() 函數的末尾。
然而,在實際的C程式中,很少嚴格按這樣的順序執行。
C語言提供了各種程式控制語句,友善程式員控制程式的執行順序。
前面介紹了一種程式控制語句-if語句,接下來介紹另外3種有用的控制語句: .
●for語句;
●while語句;
●do...while語句。
2.1 for語句:
for語句是由一條或多條語句組成的塊。
for 語句有時也被稱為for循環,因為程式會循環執行for語句多次。
在前面的程式示例中使用過for語句。下面介紹for 語句是如何工作的。
for語句的結構如下:
for (初值部分;循環條件;更新部分)
語句
初值部分、循環條件和更新部分都是C語言的表達式。語句可以是C語言的任意語句。
程式執行到for語句時,将按以下步驟進行。
1.對初值部分求值。通常,初值部分是給變量設定特定值的指派表達式。
2.對循環條件求值。通常,循環條件是關系表達式。
3.如果循環條件的求值結果為假(即,該表達式等于0 ),則for語句結束,并接着執行語句後面(即,跳過語句)的第1條語句。
4.如果循環條件的求值結果為真(即,該表達式等于非0 ),則執行for語句中的語句。
5.對更新部分求值。接着傳回第2步繼續執行。
下例圖清楚地示範了執行for語句的過程。
注意,如果第1次對循環條件求值為假,則直接結束for語句,完全不執行其中的語句。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwVZnFWbp1zczV2YvJHctM3cv1Ces0zaHRGcWdUYuVzVa9GczoVdG1mWfVGc5RHLwIzX39GZhh2csATMflHLwEzX4xSZz91ZsAzMfRHLGZkRGZkRfJ3bs92YskmNhVTYykVNQJVMRhXVEF1X0hXZ0xCNx8VZ6l2cssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZwpmLjFmYmJjZ2kzYjhzNxQjZyAzNxQzMklDNwIWYmV2MyImMwMWY5E2LcdDMyIDMy8CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.jpg)
下面程式中是一個簡單的示例,用for語句列印數字1~20。
你會發現,使用for語句的代碼比使用20個printf()語句列印20個值的代碼要緊湊得多。
輸入:
//簡單的for語句例子。
#include<stdio.h>
#define MAXCOUNT 20
int count;
int main(void)
{
//列印數字1-20
for (count = 1; count <= MAXCOUNT; count++)
printf("%d\n", count);
return 0;
}
輸出:
解析:
如上所示程式示範了圖檔上面的流程進而跑起來程式;
第3行是标準輸入/輸出頭檔案。
第5行聲明了一個int類型的變量count,将用于for循環。
第11行和第12行是for循環。
程式執行到for語句時,首先對初值部分求值。
在本例中,初值部分是count = 1。
必須先初始化count或為其指派,才能在for 語句中使用它。
接着對for語句中的循環條件(count <= 20 )求值。
因為count被指派為1 (count小于20 ),是以執行for語句中的printf()函數。
執行完printf()函數後,對更新部分(count++ )求值,把count遞增1,其值為2。
現在,程式回到循環條件,并再次檢查循環條件。
如果循環條件為真,則再次執行printf(),然後把count遞增1 (此時count 的值為3)。
接着再次檢查循環條件。這一過程将一直循環下去,直至循環條件的求值結果為假。
當循環條件的求值結果為假時,程式将退出循環,并繼續執行第14行。
該行在結束程式之前傳回0。
for語句頻繁用于“向上計數”,将計數器變量的值遞增1成為另一個值,
如上例所示。也可以用for語句來“向下計數”,将計數器變量遞減1,如下所示:
for (count = 100; count > 0; count--)
遞增量或遞減量不一定是1,如下所示,每次循環把count遞增5:
for (count = 0; count < 1000; count += 5)
for語句非常靈活。例如,如果程式前面已經初始化了待測試的變量或者已給待測試變量指派,便可省略初值部分,
如下所示。但是,不能省略初值部分後面的分号分隔符。
count = 1;
for ( ; count < 1000; count++)
初值部分可以是任意有效的C表達式,隻會在程式運作至for語句時被執行一次。
如下代碼所示,Now sorting the array...隻會被列印一次:
count = 1;
for (printf ("Now sorting the array. . .") ; count < 1000; count++)
/*排序語句已省略*/
如果把更新的步驟放在for語句體中,更新部分也可以省略。
例如,要列印數字0至99,可以這樣寫:
for (count = 0; count < 100;)
printf("&d",count++);
用于判斷是否終止循環的循環條件也可以是任意C表達式。
隻要它的求值結果為真(非零),for語句會一直執行下去。
用C語言的邏輯運算符可以建構複雜的循環條件。
例如,下面的for語句列印數組array[]中的元素,在列印完所有元素後或元素的值為0時,将停止列印:
for (count = 0; count < 1000 && array[count] != 0; count++)
printf("&d", array[count]);
可以進一步簡化該for循環,如下所示:
for (count = 0; count < 1000 && array [count];)
printf("&d", array [count++]) ;
在for語句中可以使用空語句。記住,空語句指的是分号獨占一行。
如果要把數組中的1000個元素都指派為50,可以這樣寫:
for (count = 0; count < 1000; array[count++] = 50)
;
該for語句把給數組中每個元素指派50的操作放在更新部分。如果像下面這樣寫更好:
for (count = 0; count < 1000; array[count++] = 50)
{
;
{
将分号放在塊中(即,花括号中),突出for語句體中不執行任何工作的意圖。
逗号運算符常用于for語句中。
可以建立一個表達式,用逗号運算符分隔兩個子表達式。
按照從左至右的順序,依次對兩個子表達式被求值,整個表達式的值是右邊子表達式的值。
使用逗号運算符,可以讓for語句的每個部分都完成多個任務。
假設有兩個各包含1000個元素的數組a[]和b[]。
如果想把a[]中的内容倒序拷貝給b[] (即完成拷貝操作後,b[0] = a[999]、b[1] = a[998] ,以此類推),可以使用下面的for語句:
for(i=0,j=999;i<1000;1++,j--)
b[j] = a[i];
逗号運算符分隔了兩個子指派表達式,分别将0和999指派給變量i和j,然後在每次循環時分别遞增兩個變量。
文法:for語句
for (初值部分;循環條件;更新部分)
語句;
初值部分是任意有效的C表達式。通常是将變量設定為特定值的指派表達式。
循環條件是任意有效的C表達式。通常是關系表達式。
循環條件的值為假(0)時,結束for語句,并執行語句後面的第1條語句;循環條件的值為真(非0 )時,執行語句中的C語句。
更新部分是任意有效的C表達式。通常是遞增或遞減變量(已初始化的變量)的表達式。
語句是任意的C語句,隻要循環條件為真,就執行該部分的語句。
for語句是一個循環語句。語句頭包括初值部分、循環條件和更新部分。
for語句首先執行初值部分,然後檢查循環條件。
如果循環條件為真,則執行語句。執行完語句後,對更新部分求值。
然後,for語句再次檢查循環條件,确認是否繼續循環。
示例1:
// 列印0至9的值
int x;
for (x =0; x < 10; x++)
printf("\nThe value of x is %d", x);
示例2:
//擷取使用者輸入的數字,除非使用者輸入99
int nbr = 0;
for ( ; nbr != 99; )
scanf( "%d", &nbr);
示例3:
//提示使用者輸入10個整型值
//将使用者輸入的值儲存在value數組中
//如果使用者輸入的數是99,則停止循環
int value[10];
int ctr, nbr = 0;
for (ctr = 0; ctr < 10 && nbr != 99; ctr++)
{
puts("Enter a number, 99 to quit ");
scanf("%d", &nbr);
value[ctr] = nbr;
}
2.2嵌套for語句:
在一個for語句中執行另一個for語句,稱為嵌套.
利用嵌套的for語句,可以完成一些複雜的程式設計。下列程式中不是一個複雜的程式,但是它示範了如何嵌套for語句。
輸入:
//嵌套for循環的程式示例
#include <stdio.h>
void print_ttable(int outer, int inner);
int main()
{
int inner = 10;
int outer = 10;
printf("The times table:\n");
print_ttable(outer, inner);
return(0);
}
void print_ttable(int outer, int inner)
{
int a, b;
for (a = 1; a <= outer; a++)
{
for (b = 1; b <= inner; b++)
{
printf("%d\t", a*b);
}
printf("\n");
}
return;
}
輸出:
解析:
此程式示範的是乘法表使用C語言和嵌套循環,可以輕松地将它們列印出來。
最初先設定10X10的表,可以通過更改這些數字讓乘法表更小或更大(循環的代碼不會是以減少或增多)。
是以,可以建立10X5或12X9的表,但是,如果數字太大,一行容納的數字過多會影響布局的美觀。
現在先來分析程式的細節。
在程式中
第4行聲明了print_ttable() 的函數原型。
該函數需要兩個int類型的變量outer和inner,儲存乘法表顯示的尺寸。
第12行,在main()調用print_ttable()并傳遞outer變量和inner變量。
對于print_ttable() 函數,有兩點你可能不太明白。
第一為什麼要聲明局部變量a和b?
第二,為什麼要在第25行再次使用printf()函數?
仔細分析循環就會明白。
第19行開始外層(第1個) for循環。
循環開始時,将變量a指派為1,因為a小于outer (outer 的值是10 ),是以程式繼續執行到第21行。
檢視循環條件發現,在a大于outer 之前,将一直執行這個for循環。
第21行是内層(第2個)for語句。
這裡要用到第2個局部變量b,同樣為其指派為1,并與傳遞給print_ttable() 函數的第2個變量inner作比較。
因為b小于inner (inner 的值是10 ),是以程式執行到第23行,列印a*b的值和一個制表符(\t,告訴C編譯器向後移一個制表機關)。
在計算結果後面添加制表符,這樣列印出的表格式比較美觀(表格中的數字之間有一定的空白),如程式示例的輸出所示。
然後遞增b,繼續執行内層的for循環。
當b的值遞增為11時,内層循環結束。
控制轉到第25行,在螢幕上另起一行開始列印(printf() 函數的相關内容将在後面詳細介紹)。
然後,程式執行到外層for循環的末端,是以回到第19行對更新部分求值,此時a的值為2 (遞增了1 )。
然後對該行的循環條件求值,因為a仍小于outer,循環條件為真,是以轉到執行第21行。
注意,此時b的值被重新指派為1。
如果b還保留原來的值(11),b的值大于10,則該行的循環條件為假,就隻會列印乘法表的第1行。
其次;
如果要使用帶空語句的for語句,記得在for 語句後寫上分号,或者讓分号獨占一行這樣代碼更加清晰。
不要在for語句中處理太多任務。雖然可以使用逗号分隔符, 但是将一些功能放在函數體中,代碼的可讀性更高。
2.3 while語句:
while語句(也稱為while循環)不斷執行一個語句塊,直至指定的循環條件為假。
while 語句的格式如下:
while (循環條件)
語句
循環條件是任意的C表達式,語句是任意有效的C語句。程式執行到while語句時,将進行以下過程。
1.對循環條件求值。
2.如果循環條件為假(0 ),則結束while語句,程式将轉至執行語句後面的第1條語句。
3.如果循環條件為真(非0 ),則執行語句中的C語句。
4.執行将傳回第1步。
while語句的運作過程如圖所示。
程式中使用了一個while語句列印1~20 ( 與使用for語句完成的任務相同)
輸入:
//while 語句的簡單示例
#include <stdio.h>
#define MAXCOUNT 20
int count;
int main(void)
{
//列印數字1-20
count = 1;
while (count <= MAXCOUNT)
{
printf("%d\n", count);
count++;
}
return 0;
}
輸出:
解析:
該程式與for程式1完成的任務相同。
第11行,把1指派給count。
因為while語句沒有初始化變量或給變量指派的部分,是以必須在while循環之前完成初始化或指派工作。
第13行是while語句,其中包含的循環條件(count <= 20 )與程式中for語句的循環條件相同。
在while 循環中,第16行将count 遞增1。
如果遺漏了第16行會發生什麼情況?
此時,由于count始終為1(小于20 ),程式将一直循環下去不會停止。
注意,while語句實際上是沒有初值部分和循環條件的for語句,是以:
for( ; 循環條件 ; )
相當于
while (循環條件)
是以,在for 語句中完成的任何工作都能在while語句中完成。
使用while語句時,必須在while語句前面完成必要的初始化或指派工作,而且必須将更新變量值的部分放進while循環體中。
注意:記得在while循環内部的代碼塊中改變循環條件的值,否則該循環将成為一個無限循環。
如果需要初始化和更新變量,大部分經驗豐富的C語言程式員都更傾向于使用for語句而不是while語句。
這是基于源代碼的可讀性做出的選擇。
使用for語句時,初值部分、循環條件和更新部分都放在一起,便于閱讀和修改;而使用while 語句,初始化部分和更新變量部分位于不同的地方,不友善查找。
文法:while語句
while (循環條件)
語句
循環條件是任意有效的C表達式,通常是一個關系表達式。
循環條件的值為假(0 )時,結束while語句,并執行語句後面的第1條語句;
循環條件的值為真(非0 )時,執行語句中的C語句。
語句是任意的C語句,隻要循環條件為真,就執行該部分的語句。
while語句是一個循環語句。
隻要循環條件為真(非0),就重複執行語句塊中的語句。
如果循環條件為假,則完全不執行(一次也不執行)語句。
示例1:
int x = 0;
while (x < 10)
{
printf("\nThe value of x is %d", x);
x++;
}
示例2:
//擷取數字,直接輸入的數字是99
int nbr = 0;
while (nbr <= 99)
scanf("%d", &nbr);
示例3:
//提示使用者輸入10個整型值
//将使用者輸入的值儲存在value數組中
//如果使用者輸入的數是99,則停止循環
int value[10];
int ctr = 0;
int nbr;
while (ctr < 10 && nbr != 99)
{
puts("Enter a number, 99 to quit ");
scanf("%d", &nbr);
value[ctr] = nbr;
ctr++;
}
2.4嵌套while語句:
與for語句和if語句類似,while語句也可以嵌套使用。
下面程式是一個使用嵌套while語句的示例。雖然這不是使用while語句的最好示例,但是該例提供了一些新的思路。
輸入:
//嵌套while語句示例
#include <stdio.h>
int array[5];
int main(void)
{
int ctr = 0,
nbr = 0;
printf("This program prompts you to enter 5 numbers\n");
printf("Each number should be form 1 to 10\n");
while (ctr < 5)
{
nbr = 0;
while (nbr < 1 || nbr > 10)
{
printf("\nEnter number %d of 5: ", ctr + 1);
scanf("%d", &nbr);
}
array[ctr] = nbr;
ctr++;
}
for (ctr = 0; ctr < 5; ctr++)
printf("Value %d is %d\n", ctr + 1, array[ctr]);
return 0;
}
輸出:
解析:
與前面的程式相同,
第1行的注釋描述了該程式的用途。
第3行是#include指令,用于包含标準輸入/輸出頭檔案。
第5行聲明.個可儲存5個整型值的數組array。main()函數中聲明了兩個局部變量ctr和nbr(第9行和第10行)。
注意,這兩個變量在聲明的同時已初始化為0。另外,第9行将逗号運算符用作分隔符,這樣便不用重複使用int關鍵字将nbr聲明為int類型。
許多C語言的程式員都習慣用這種方式來聲明。第12行和第13行列印該程式的資訊和提示使用者輸入數字。
第15~ 26行是第1個(外層) while語句。
第18 ~22行是嵌套的while語句,它也是外層while語句的一部分。
如果ctr小于5 (第15行),就一直執行外層while循環。
隻要ctr小于5,第17行都将nbr設定為0,
第18 ~22行(嵌套的while語句)提示使用者輸入一個數字,以擷取nbr變量中的值。
第24行将擷取的數字放入array數組中,第25行把ctr 遞增1。然後再次循環,回到第15行。
是以,外層循環擷取5個數字并放入array數組中,該數組以ctr作為索引。
内層循環(第18 ~22行)很好地利用了while語句的特點,保證了使用者輸入的數字有效(該例中,隻有數字1~10是有效的)才會繼續執行程式中的語句。
内層while語句的意思是,如果nbr小于1或大于10,就列印一條消息提示使用者輸入一個有效的數字,然後擷取該數字。
第28行和第29行列印儲存在array數組中的值。
注意,因為while語句中使用ctr變量來完成循環,是以for語句也可以複用該變量。
ctr從0開始,每次循環遞增1,for語句一共循環5次。列印ctr加1的值(因為count從0開始),并列印array數組中相應的值(索引為ctr )。
另外,你可以改動程式中的兩處,作為額外的練習。
一處是程式接收的值,将1^ 10改成1 ~100;
另一處是改變程式接收值的數量,該例隻能接收5個數字,你可以嘗試改成接收10個數字。
2.5 do... while循環
C語言提供的第3個循環是do...while循環,隻要循環條件為真,便不斷執行一個語句塊。
do. . .while循環在循環底部測試循環條件,而for循環和while循環則在循環的頂部進行測試。
do.. .while循環的結構如下:
do
語句
while (循環條件);
循環條件是任意的C表達式,語句是任意的C語句。
當程式執行到do...while語句時,将進行以下步驟。
1.執行語句中的語句。
2.對循環條件求值。如果結果為真,執行将回到第1步。如果結果為假,則結束循環。
do.. .while循環的執行過程如圖所示。
do. . .while循環中的語句至少會被執行一次。
這是因為do.. .while在底部測試循環條件,而非頂部。
而for 循環和while循環都是在循環的頂部對循環條件求值,是以對于這兩個循環,如果循環條件的結果為假,則完全不會執行循環體中的語句。
do.. .while循環沒有while循環和for循環使用頻繁。
隻有在循環體中的語句要至少被執行一次,才會使用do...while循環。
當然,如果能確定在第1次執行到while循環時,其循環條件為真,也可以在while循環中完成相同的任務。
但是,使用do.. . while循環更加簡單明了。
下面程式中是do... while循環的示例。
輸入:
// 簡單的do ...while語句示例
#include <stdio.h>
int get_menu_choice(void);
int main(void)
{
int choice;
choice = get_menu_choice();
printf("You chose Menu Option %d\n", choice);
return 0;
}
int get_menu_choice(void)
{
int selection = 0;
do
{
printf("\n");
printf("\n1 - ADD a Record");
printf("\n2 - Change a record");
printf("\n3 - Delete a record");
printf("\n4 - Quit");
printf("\n");
printf("\nEnter a selection: ");
scanf("%d", &selection);
} while (selection < 1 || selection > 4);
return selection;
}
輸出:
解析:
該程式提供了一個帶有4個選項的菜單,使用者可以選擇其中一個。
然後,程式将列印使用者選擇的數字。
現在,你應該能了解該程式清單中的大部分内容,
在後面将會擴充這個程式。
main()函數(第7~16行)中的内容在前面都介紹過。
main()函數體中的代碼(第9~ 13行)可寫成一行,如下所示:
printf( "You chose Menu option %d", get_menu_option() );
如果你打算擴充該程式,并根據使用者選擇的選項執行相應的操作,就會用到get_menu_choice() 的傳回值,
是以将其賦給一個變量 (如本例中的chioce )是明智之舉。
第18^37行是get_menu_choice() 函數,該函數在螢幕上顯示一個菜單(第24 30行),然後擷取使用者輸入的選項。
因為至少要在螢幕上顯示一次菜單,使用者才能據此輸入選擇的數字,是以在這種情況下使用do...while循環很合适。
該程式會一直顯示菜單,直至使用者輸入有效的選項。
第34行 是do. . .while語句中的while部分,用于確定使用者輸入數字的有效性,是以将其使用的變量命名為selection很合适。
如果使用者輸入的值不在1~4之間,将重複顯示菜單,并提示使用者輸入新的值。
當使用者輸入了有效的選項,程式将繼續執行至第36行,傳回selection變量的值。
文法:do. .. while語句
do
{ 語句
} while (循環條件);
循環條件是任意有效的C表達式,通常是一個關系表達式。
循環條件的值為假(0 )時,結束while語句,并執行while語句後面的第1條語句;
循環條件的值為真(非0 )時,程式回到do部分,執行語句部分的C語句。
語句是任意的C語句。
程式首次執行到do... while循環.時,将執行語句,然後隻要循環條件為真,就會再次執行該部do...while語句是一個循環語句。
隻要循環條件為真(非0 ),便會重複執行其中的語句或語句塊。
與while語句不同,do...while 語句至少要執行語句一次。
示例1:
//即使循環條件為假,也會列印一次!
int x = 10;
do
{
printf("\nThe value of x is %d, x);
}while (x != 10);
示例2:
//擷取使用者鍵入的數字,除非使用者輸入的值大于99
int nbr;
do
{
scanf"%", &nbr );
}while (nbr <= 99);
示例3:
//提示使用者輸入10個整型值
//将使用者輸入的值儲存在value數組中
//如果使用者輸入的數是99,則停止循環
int value[10];
int ctr = 0;
int nbr;
do
{
puts("Enter a number, 99 to quit ");
scanf("%d",&nbr);
value[ctr] = nbr;
ctr++;
}while (ctr < 10 && nbr != 99);
三.嵌套循環:
嵌套循環指的是在一個循環中包含另一個循環。
前面紹過一些嵌套語句。
隻要外層循環中包含完整的内部循環,C語言不允許重疊循環,除此之外對其沒有其他限制。
是以,下面的寫法是不允許的:
for ( count = 1; count < 100; count++)
{
do
{
//do...while循環
} //循環結束
}while (x != 0);
如果将do. ..while循環完整地放入一個for循環中,就沒問題:
for ( count = 1; count < 100; count++)
{
do
{
//do...while循環
}while (x != 0);
} //循環結束
在使用嵌套循環時要記住,改變内層循環可能會影響外層循環。
盡管如此,還應注意到,内層循環也可能因為未使用外層循環中的變量而獨立于外層循環。
在上面的示例中,如果内層循環改動了count的值,就會影響外層for循環的執行。
良好的代碼縮進風格可提高嵌套循環的可讀性。
每一級循環應該相對于上一級循環進行縮進,讓每一級循環的代碼更加一目了然。
四.本次總結:
C語言提供3種循環語句控制程式的執行。
它們分别是
for語句、while語句和do.. .while語句。
這3種循環都能據循環條件中某個變量的情況,執行一個語句塊零次、一次或多次。
許多程式設計任務都需要重複執行這些循環中的語句。
雖然3種循環語句都能完成相同的工作,但是它們也各有不同。
for語句将初值部分、循環條件和更新部分都放在一行。
while語句在循環條件為真時,執行循環體中的語句。
do...while語句至少執行循環體中的語句一次,隻要循環條件的求值結果為真,就不斷執行循環體中的語句。
嵌套循環是把一個循環放在另一個循環中。
C語言不允許重疊嵌套,對嵌套循環沒有其他限制。
問答題
1.如何選擇程式控制語句?是選擇for語句、while 語句還是do . . .while語句?
如果你細心看完上訴的文法部分,會發現這3種循環都能解決循環問題,而且它們各有不同。
如果需要在循環中初始化和更新變量時,用for語句最好。
如果隻知道要滿足的循環條件,但是不知道需要循環多少次,while是最佳之選。
如果希望一組語句至少被執行一次,那麼最好使用do. ..while 語句。
基本上這3種語句能處理絕大多數問題
可以嵌套任意層。如果你的程式需要嵌套兩層以上的循環,就應該考慮使用函數來代替。
否則,你會發現花括号太多會影響閱讀和了解,而函數能讓代碼簡潔易讀。
2.是否可以嵌套不同的循環?
可以嵌套if 、for 、 while 、do . ..while,或其他語句。你所寫的許多程式都需要用到多個嵌套循環。
3.數組中的第1個元素的索引值是多少?
在C語言中第一個索引是0。
4.for語句和while 語句有何不同?
for語句包含初值部分和更新部分。
5.while語句和do. . .while語句有何不同?
do...while語句至少執行一次,其末尾是while語句。
6. while語句能完成for語句完成的相同工作,這句話是否正确?
正确,while語句可以完成for語句的工作。在執行while循環之前必須初始化變量,并在while循環中遞增變量。
7.嵌套語句的數量是否有限制?
嵌套語句的數量沒有限制。
8.while語句是否可以嵌套在do . . . while語句中?
可以的。
9. for語句的4個部分是什麼?
初始化部分
條件部分
遞增部分
語句部分
10.while語句的兩個部分是什麼?
條件和語句。
11.do. . .while 語句的兩個部分是什麼?
也是條件和語句。
實操題
1.聲明一個能容納50個long類型值的數組。
long array[50];
2.寫一條語句,将123.456指派給練習題1數組的第50個元素。
array[49] = 123.456;
注意上面的答案,第50個元素的下标是49。注意數組的索引從0開始即可。
3.下面的語句執行完畢後,x的值是多少?
for (x=0; x<100,x++);
x的值是100
4.下面的語句執行完畢後,x的值是多少?
for (ctr = 2; ctr<10; ctr += 3);
語句執行完畢之後,ctr的值是11(ctr從2開始,每次遞增3,直至大于或等于10為止)
5.根據以下代碼,将列印多少個x ?
for(x = 0; x< . 10; x++)
for (y= 5; y>0; y--)
puts ("X");
内層循環列印5個x,外層循環執行内層循環10次。是以總共列印50個x。
6.編寫一個for語句,從1~100,每次遞增3。
編寫如下:
int x;
for( x = 1; x <= 100; x += 3);
7.編寫一個while語句,從1~100,每次遞增3。
編寫如下:
int x = 1;
whlie( x <= 100 )
x += 3;
8.編寫一個do. . .while語句,從1~100,每次遞增3。
編寫如下:
int ctr = 1;
do
{
ctr += 3;
} whlie( ctr < 100 );
9.排錯:以下代碼段有哪些錯誤?
record = 0;
while (record< 100)
{
printf( "\nRecord %d ", record );
printf( "\nGetting next number...");
}
該程式不會結束。
record被初始化為0,然後while循環檢查record是否小于100。因為0小于100,是以執行循環,列印出兩條語句。
然後循環再次檢查條件,條件仍然成立(0小于100)是以再次循環。這一過程将不斷重複。
record++;
for (counter = l; counter < MAXVALUES; counter++ );
printf("\nCounter = %d", counter );