天天看點

第四節(基本程式控制)

本次将介紹控制程式流的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語句,完全不執行其中的語句。

第四節(基本程式控制)

下面程式中是一個簡單的示例,用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 );