国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

實例講解 - C 語言的循環結構

2019-11-17 05:20:01
字體:
來源:轉載
供稿:網友
  這一講開始之前,我們需要預備一個函數。這個函數的作用就是把一個百分制成績轉換成等級制。轉換的過程我已經在講解分支結構的時候具體闡述了,現在僅提供函數如下:

  /* 預備 grade.h */
  char grade(int score) {
   switch (score / 10) {
    case 10: case 9:
        return 'A';
    case 8:
        return 'B';
    case 7:
        return 'C';
    case 6:
        return 'D';
    case 5: case 4: case 3:
    case 2: case 1: case 0:
        return 'E';
    default:
        return 0;
   }
  }

  在講解分支結構時提出的實例都只能解決一個成績的情況。假如需要將 5 個人的成績進行轉換,最簡單的辦法如下:

  /* 例1 */
  #include "grade.h"
  #include
  void main() {
   int n;
      scanf("%d", &n);
   printf("等級為: %c", grade(n));
   printf("請輸入成績: ");
   scanf("%d", &n);
   printf("等級為: %c", grade(n));
   printf("請輸入成績: ");
   scanf("%d", &n);
   printf("等級為: %c", grade(n));
   printf("請輸入成績: ");
   scanf("%d", &n);
   printf("等級為: %c", grade(n));
   printf("請輸入成績: ");
   scanf("%d", &n);
   printf("等級為: %c", grade(n));
  }

  例1 的結構非常簡單易懂,但是書寫起來只有一個感覺--煩!同樣的三句話,居然重復了 5 次。假如這個班的人數不止 5 人,而是數十人的話,……天啊!簡直想都不敢想!
QQ病毒 騰訊QQ空間代碼專題 PPT教程專題 ADSL應用面面俱到 fireworks教程專題 計算機和網絡技術基礎知識 校園網專題 網吧技術專題
  C 語言當然不會笨得來一點方便都不給,這個"方便",就是循環結構。循環結構的目的就是減少重復代碼,減輕程序員的負擔。而其形式,在 C 語言中有三種:for 循環、while 循環和 do-while 循環。正面分別介紹如下:

  for 循環的基本格式是 for (語句1; 邏輯表達式1; 語句2) {語句組1},大括號包括其中的語句組1 也可以是一條語句。其執行過程如下:先執行語句1,然后判定邏輯表達式1。假如邏輯表達式1 的值為"真(非0)",則執行語句組1,否則結束循環。在沒結束循環的情況下,執行了語句組1 之后,執行語句2。然后再對邏輯表達式1 進行判定,再……,如此循環直到邏輯表達式1 為"假(0)"時為止。于是,例1 可以改寫如下:

  /* 例2 */
  #include "grade.h"
  #include
  void main() {
   int n, i;
   for (i = 0; i < 5; i++) {
    printf("請輸入成績: ");
    scanf("%d", &n);
    printf("等級為: %c", grade(n));
   }
  }

  嘿,這么簡潔?!知道循環結構的便利之處了吧。例2 中 i 從 0 到 4,共執行了 5 次循環體。當然,也可以跟據個人的習慣,將例2 中的 for 語句改寫為:

  for (i = 1; i <= 5; i++) {...}

  這樣或許更輕易理解,但我不推薦這樣做,因為 C 語言中的數組下標是以 0 開始的,采用例1 中的 for 語句更輕易在循環體中讀寫數組元素。就上例,假如我們要把所有成績輸入完成之后再逐一將其等級打印出來,就需要用到數組:

  /* 例3 */
  #include "grade.h"
  #include

  #define N 5

  void main() {
   int n[N], i;
   for (i = 0; i < N; i++) {
    printf("請輸入成績: ");
    scanf("%d", &n[i]);
   }
   for (i = 0; i < N; i++) {
    printf("第 %d 個成績的等級為: %c", i, grade(n[i]));
   }
  }

  例3 中,假如 i 從 1 到 N 循環的話,讀寫數組元素時就應該使用 n[i - 1] 而不是 n[i]。那么每執行一次循環體就會多一次減法運算,在一個循環 N 次的循環中,就會多進行 N 次減法運算,大大降低了程序效率。
  C 語言是一種靈活的語言。它的 for 循環也不是一成不變,必須按照它的基本格式書寫。暫時賣個關子,先看看從例3 修改過來的例4:

  /* 例4 */
  #include "grade.h"
  #include

  #define N 5

  void main() {
   int n[N], i = 0;
   for (; i < N; ) {
    printf("請輸入成績: ");
    scanf("%d", &n[i++]);
   }
   for (i = 0; ; i++) {
    if (i == N) {
     break;
    }
   printf("第 %d 個成績的等級為: %c", i, grade(n[i]));
  }
  }

  是不是很希奇,例4 中的兩個 for 循環中與上面兩個例子的 for 循環相比,都少用了一些語句,怎么回事?且聽我慢慢道來:

  第一個 for 循環中,少了 i = 0 和 i++ 兩句。其實仔細一看,這兩句也沒少。i = 0 已經在給 i 賦初值的時候就實現了,而 i++ 是在 scnaf 語句中順便實現的。所以,雖然沒有 i = 0 一句,但循環開始之前 i 的值已經是 0 了;雖然沒有 i++ 一句,但循環體中實際也改變了 i 的值。

  第二個 for 循環中少的只是那一句判定。而正是由于少了這一句判定,for 循環便不能自已結束。假如我在循環體中也不采取措施結束循環的話,這個循環將一直不停的執行下去,形成死循環。于是,我在循環體中對 i 進行判定,當它等于 N的時候執行一個 break 語句,跳出循環,填補了 for 語句中沒有邏輯表達式的缺陷。

  甚至,一個 for 語句就可以寫成 for (; ; ) {...},這樣一個 for 語句,簡單的說,就是一個死循環。

  還有一點需要說明,就是 break 語句。這個語句在講解 switch 分支結構的時候就已經見到過了。它除了能用于 switch 分枝結構之外,還能用于所有的三種循環結構。其作用就是兩個字--"跳出"。switch 分枝結構中,它用于跳出整個 switch 語句;而在循環結構中,它自然是用于跳出循環,執行它之后,循環體中所有其它語句都不會再執行,整個循環就此中斷。
QQ病毒 騰訊QQ空間代碼專題 PPT教程專題 ADSL應用面面俱到 Fireworks教程專題 計算機和網絡技術基礎知識 校園網專題 網吧技術專題
  學會了 for 循環,雖然可以簡化不少代碼,但它似乎只能解決循環次數固定的情況。假如人數不固定,又該怎么辦?比如規定如下:輸入若干 0 至 100 的成績,假如成績不在此范圍,則表式結束。請看例5,例6:

  /* 例5 */
  #include "grade.h"
  #include
  void main() {
    int n;
    printf("請輸入成績: ");
    scanf("%d", &n);
    while (grade(n) != 0) {
     printf("等級為: %c", grade(n));
     printf("請輸入成績: ");
     scanf("%d", &n);
    }
   }

  /* 例6 */
  #include "grade.h"
  #include
  void main() {
   int n;
   do {
    printf("請輸入成績: ");
    scanf("%d", &n);
    if (grade(n) != 0) {
     printf("等級為: %c", grade(n));
   }
  } while (grade(n) != 0);
  }

  例5 和例6 分別使用了 while 循環和 do-while 循環結構。兩種循環結構都是在 while 后的邏輯表達式為真時執行循環體,為假時結束循環。二者的不同在于:while 循環是先判定,再執行循環體;而 do-while 循環而是先執行循環體后再作判定。因此,使用 do-while 循環至少要執行一次循環體。至于循環的執行過程,就請讀者自己分析了。

  例6 中對于同一個 n,至少要執行兩次 grade(n),大大降低了程序的效率。雖然可以用一個 char 型變量來解決這個問題,但我不想這樣作。于是又有如下方式的改寫:

  /* 例7 */
  #include "grade.h"
  #include
  void main() {
   int n;
   do {
    printf("請輸入成績: ");
    scanf("%d", &n);
    if (grade(n) == 0) {
     break;
    }
   printf("等級為: %c", grade(n));
   } while (1);
  }

  例7 中 while 語句的邏輯表達示值始終是真(1),所以這個循環也就是一個死循環,必須在循環體中用 break 語句跳出。用一個 if 語句判定跳出的時機,這也是很好理解的,就不多說了。但是看看下面的例8,可能就不是那么明白了。

  /* 例8 */
  void main() {
  int n;
  do {
   printf("請輸入成績: ");
   scanf("%d", &n);
   if (grade(n) == 0) {
    continue;
   }
   printf("等級為: %c", grade(n));
  } while (grade(n) != 0);
  }

  例8 的和例6 的區別主要就在于一個 continue 語句。這個語句可是循環結構所特有的,其作用與 break 語句相比,即有相似之處,也有相對之處。執行了 continue 語句之后,循環體中 continue 以下的語句將不再在這次循環中執行,但循環并不中斷,而是開始下一次循環。

  如例8 中,滿足 grade(n) == 0 的條件后,執行 continue 語句。然后 printf 語句被跳過,直接到 while 語句判定是否結束循環,假如不滿足結束循環的條件,那么將會要求輸入下一個成績。不過例8 中,只要能執行到 continue 語句,while 后的條件就一定為假,循環結束。例8 和例7 的區別就在于,例8 是正常結束,而例7 是被中斷。

  break 和 continue 兩個語句在 C 語言的循環結構中有著舉足輕重的作用。雖然使用巧妙的結構化程序手段可以避免使用這兩個語句,但這兩個語句的確能使程序結構更加簡單明了。所以,只要能用上它們的地方,我極力推薦使用它們。
QQ病毒 騰訊QQ空間代碼專題 PPT教程專題 ADSL應用面面俱到 Fireworks教程專題 計算機和網絡技術基礎知識 校園網專題 網吧技術專題

  三種循環結構都說完了,但我還要強調 C 語言的靈活性。雖然循環結構有三種形式,但只使用其中仍意一種都能達到目的。例5 和例6 就展示了使用 while 和 do-while 兩種形式完成同要的任務。至于 for 循環,前面說它"似乎只能解決循環次數固定的情況",這"似乎"二字并非筆誤。它乍看只能解決循環次數固定的情況,但仔細一想,它也的確能解決循環次數不固定的情況。如例5 例6 用 for 循環的形式分別可以改寫為:

  /* 例9 */
  #include "grade.h"
  #include
  void main() {
  int n;
  printf("請輸入成績: ");
  scanf("%d", &n);
  for (; grade(n) != 0; ) {
   printf("等級為: %c", grade(n));
   printf("請輸入成績: ");
   scanf("%d", &n);
  }
  }

  /* 例10 */
  #include "grade.h"
  #include
  void main() {
  int n;
  int b = 1;
  for (; b; ) {
   printf("請輸入成績: ");
   scanf("%d", &n);
   if (grade(n) != 0) {
    printf("等級為: %c", grade(n));
   } else {
    b = 0;
   }
  }
  }


  看看例9 和例5,例10 和例6,是不是有異曲同工之妙?其實 C 語言的循環結構遠遠不止這些變形,只要你細心思考,一定還會發現更多"變形妙用"。哈哈哈哈,一吐為快,心中舒適多了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 镶黄旗| 两当县| 田东县| 桂东县| 陆河县| 禄劝| 图片| 昌平区| 达孜县| 高清| 敦煌市| 芜湖县| 休宁县| 二连浩特市| 永安市| 临海市| 河北省| 忻州市| 乌鲁木齐市| 辽源市| 巴林左旗| 永福县| 石首市| 通辽市| 凤山县| 怀仁县| 思南县| 军事| 关岭| 霍州市| 皮山县| 卢湾区| 老河口市| 那坡县| 修文县| 晋宁县| 五大连池市| 青海省| 乌恰县| 丹阳市| 睢宁县|