亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

實例講解

2019-11-17 05:16:25
字體:
來源:轉載
供稿:網友

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

  /* 預備 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 人,而是數十人的話,……天啊!簡直想都不敢想!
  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 語句;而在循環結構中,它自然是用于跳出循環,執行它之后,循環體中所有其它語句都不會再執行,整個循環就此中斷。

  學會了 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 語言的循環結構中有著舉足輕重的作用。雖然使用巧妙的結構化程序手段可以避免使用這兩個語句,但這兩個語句的確能使程序結構更加簡單明了。所以,只要能用上它們的地方,我極力推薦使用它們。
  三種循環結構都說完了,但我還要強調 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 語言的循環結構遠遠不止這些變形,只要你細心思考,一定還會發現更多"變形妙用"。哈哈哈哈,一吐為快,心中舒適多了。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩亚洲激情| 深夜精品寂寞黄网站在线观看| 国产精品中文字幕在线| 久久精品小视频| 日韩在线播放一区| 亚洲国产古装精品网站| 国产日韩一区在线| 一区二区三区久久精品| 欧美精品精品精品精品免费| 欧美主播福利视频| 国产在线拍偷自揄拍精品| 91免费欧美精品| 欧美极品第一页| 久久久久久久国产| 91久久嫩草影院一区二区| 久久精品99久久久香蕉| 久久精品视频播放| 在线精品国产欧美| 亚洲最大的av网站| 成人动漫网站在线观看| 国产成人精品久久| 日韩成人在线免费观看| 热re99久久精品国产66热| 久久男人av资源网站| 亚洲精品中文字幕av| 精品一区二区电影| 亚洲综合在线做性| 国产一级揄自揄精品视频| 久久视频这里只有精品| 久久九九全国免费精品观看| 日韩视频在线一区| 亚洲精品国产精品久久清纯直播| 国自在线精品视频| 国产亚洲欧美aaaa| 久久这里只有精品视频首页| 国产精品亚洲片夜色在线| 欧美亚洲另类视频| 欧美午夜精品伦理| 久久久精品免费| 色老头一区二区三区在线观看| 日韩视频在线免费| 久久亚洲综合国产精品99麻豆精品福利| 国产成人av在线| 精品免费在线视频| 久久久久久伊人| 亚洲第一天堂av| 日韩美女av在线| 国产精品网址在线| 国产精品专区第二| 国产成人免费91av在线| 久久亚洲国产精品成人av秋霞| 日韩人体视频一二区| 欧美性在线视频| 26uuu亚洲伊人春色| 色哟哟亚洲精品一区二区| 日韩美女视频在线观看| 亚洲精品720p| 成人久久18免费网站图片| 欧美成人午夜影院| 中日韩美女免费视频网址在线观看| 欧美一区二区三区……| 国产精品精品视频| 美女视频黄免费的亚洲男人天堂| 91精品国产成人www| 日韩免费视频在线观看| 综合激情国产一区| 国产精品久久久久久久电影| 97精品免费视频| 一本一本久久a久久精品综合小说| 精品久久久久久久久久久久久| 久久天天躁狠狠躁夜夜爽蜜月| 伊人一区二区三区久久精品| 精品自拍视频在线观看| 国产精品久久久久久超碰| 91夜夜未满十八勿入爽爽影院| 日韩福利在线播放| 国产成人精品免费久久久久| 97视频免费在线观看| 欧美一级黑人aaaaaaa做受| 国产国语刺激对白av不卡| 亚洲第一页中文字幕| 亚洲精品综合久久中文字幕| 久久韩剧网电视剧| www国产亚洲精品久久网站| 欧美丰满少妇xxxxx| 亚洲四色影视在线观看| 成人免费在线网址| 亚洲欧美中文字幕在线一区| 日韩高清免费在线| 51ⅴ精品国产91久久久久久| 国产成人精品电影久久久| 中文字幕欧美日韩va免费视频| 亚洲裸体xxxx| 夜夜狂射影院欧美极品| 欧美在线一级va免费观看| 国产精品高潮呻吟久久av黑人| 91久久国产综合久久91精品网站| 美女999久久久精品视频| 久久久久久有精品国产| 久久久久久亚洲精品不卡| 久久人91精品久久久久久不卡| 91中文精品字幕在线视频| 91日韩在线视频| 97在线视频免费观看| 亚洲国产高清自拍| 亚洲淫片在线视频| 亚洲天堂成人在线| 欧美怡红院视频一区二区三区| 久久久伊人欧美| 久久久久久国产精品三级玉女聊斋| 久久精品国产久精国产一老狼| 日韩av在线高清| 欧美大成色www永久网站婷| 欧美诱惑福利视频| 97精品一区二区三区| 精品视频久久久| 国产主播在线一区| 综合国产在线观看| 亚洲国产欧美一区二区三区同亚洲| 一区二区三区四区精品| 亚洲国产精品999| 欧美日韩国产综合新一区| 国语自产偷拍精品视频偷| 久久久久久久激情视频| 国产午夜精品视频免费不卡69堂| 5566成人精品视频免费| 久久精品99久久久香蕉| 亚洲专区在线视频| 国产亚洲人成a一在线v站| 久久久久久有精品国产| 亚洲va电影大全| 亚洲人在线视频| 国产精品爱久久久久久久| 最好看的2019的中文字幕视频| 九九热99久久久国产盗摄| 久热爱精品视频线路一| 久久久av亚洲男天堂| 91亚洲国产成人久久精品网站| 精品久久中文字幕| 91在线免费看网站| 久久久久久综合网天天| 久久久国产视频91| 久久影院在线观看| www.亚洲一区| 午夜精品99久久免费| 狠狠色噜噜狠狠狠狠97| 国产精品视频公开费视频| 欧美成aaa人片在线观看蜜臀| 日韩av在线免费看| 中文一区二区视频| 亚洲精品日韩丝袜精品| 中文字幕自拍vr一区二区三区| 欧美亚洲国产精品| 久久久伊人日本| 黄色成人在线免费| 国产欧亚日韩视频| 日韩在线观看视频免费| 福利二区91精品bt7086| 国产精品美乳一区二区免费| 国产成人精品视频在线观看| 久久精品男人天堂| 亚洲最大福利视频网| 日韩欧美精品网址| 欧美亚洲成人网|