logo

Wednesday 23rd of May 2012

廣告

廣告贊助商

首頁 C語言教學 C語言教學 三大控制結構
三大控制結構 PDF 列印 E-mail
作者是 Victor   
週三, 11 二月 2009 23:54

魔法的三元素

C語言就像是魔法一樣,想像一下程式語言就像是魔法的咒語,魔法有一些最基本的元素,不管是金木水火土、光、闇,只要能夠掌握所有元素,就能夠變幻出任何想要的事物,常見的程式語言也一樣,通常都由三種結構組成,只要能掌握這三之種結構,就能夠寫出任何程式,以下我們介紹結構化程式語言的三大結構

循序

一件一件事情接續著做下去,這就是三大結構之一的循序,如下圖所示

循序結構圖

C語言程式示範一個循序的範例

#include <stdio.h>
#include <stdlib.h>

int main()
{
    printf("Hi");
    printf("前面的");
    printf("美媚");
    printf("給虧嗎");
    system("pause")
    return 0;
}

它以循序的圖來表示就像這樣

循序結構範例圖

所以以上程式就會印出

Hi前面的美媚給虧嗎

的字樣,在這裡我們要強調的是它是一行接著一行的執行

選擇

由一定的條件決定要執行哪部份的程式,這樣的結構就是選擇,如下圖所示

選擇結構圖

C語言程式示範選擇

#include <stdio.h>
#include <stdlib.h>

int main()
{
    if(1 + 1 == 2) {
        printf("1 + 1 真的等於 2!!!\n");
    } else {
        printf("1 + 1 不等於 2!\n");
    }
    system("pause");
    return 0;
}

選擇的圖形表示就像這樣

選擇結構範例圖

由於1 + 1永遠等於2,所以只有右手邊的描述會被選擇並且執行,事實上我們可以判斷可以改變的數字,例如讓使用者輸入一組三角形的邊長,然後判斷這組邊長到底是否可以構成三角形

重覆

在一定的條件之下重覆某部份程式,就是重覆結構,如下圖所示

重覆結構圖

C語言程式示範重覆

#include <stdio.h>
#include <stdlib.h>

int main()
{
    // 計數器變數
    int i = 1;

    // 加總變數
    int sum = 0;

    // 如果 i 小於或等於 10 就執行以下 {} 中程式
    // 否則跳到 {} 後繼續執行
    while(i <= 10) {
        // 總合變數 加上 i
        sum += i;

        // i的值遞增1
        ++i;
    }
    // 印出總合
    printf("Sum : %d\n", sum);
    system("pause");
    return 0;
}

重覆結構範例圖

以上程式的目的是計算

1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10

的結果,就是重覆結構的一個例子,它每次增加 i 的值1,然後又用 i 增加 sum 的值,最重要的是它判斷條件 i 小於或等於 10 是否成立,來決定要不要繼續重覆執行同樣的程式碼片段

魔法元素的結合

事實上上面的各種結構都可以放置其它的結構所組成,你可以發現我們在重覆的結構裡,我們把某些結構用循序的結構去組合而成,如你所見,你可以組合任何結構,來放在這三種結構的每個結構的位置上

有了這三種元素,就可以組合出任何想要的程式,但是一般程式語言會提供多於這三種的結構,其目的是為了使用方便,或許會讓人覺得奇怪,不是說只有三種,為何還有其它結構,事實上那些其它結構都是從這三種結構變形或組合出來的,本質上還是一樣

與惡魔諦結契約

事實上,C/C++語言有提供一種不在以上三種結構範圍內的結構,叫做

goto label;

它可以跳到整個程式的任意一個點,自從前面三種元素被證明可以寫出任何程式之後,goto就漸漸地與邪惡、惡魔劃上等號,也就是,使用了goto會下地獄! 不是真正的地獄,而是程式設計與維護上的地獄,曾經有人形容用goto寫出來的程式像是一盤義大利麵,程式碼片段間不停的跳躍,每一行程式碼都有可能是進入點和出口,在這樣錯縱複雜的goto使用之下,程式碼變得難以理解和維護,而後來有偉大的人,證明了goto能寫出來的程式,使用以上三種結構都一樣可以寫出來,自此之後人們就和邪惡的goto漸行漸遠,但是C語言在那個時代下還沾染了這樣邪惡的特性,雖然你一樣可以使用它,但是請當做沒有這樣的邪惡語法存在,記住,否則你會下地獄

相較之下

相較之下,結構化程式設計只有單一個進入點,單一個出口,就像一個房間一樣,你得從入口進入,從出口離開,哪裡發生命案(錯誤、bug之類的),只要把進出的可能性都考慮過,就很容易可以找到兇手到底是誰,但是惡魔的做法並不是如此,goto就像是可以穿牆的人,他自由進出每個房間,你難以得知到底有哪個goto來過這裡,還有他何去何從,在這樣的程式裡發現了錯誤或bug,你難以得知兇手到底是誰,因為整個世界的人都有嫌疑,他們都可能穿牆進入房間謀殺了某個人然後揚長而去,這就是goto邪惡的原因

 

 

核心是 Joomla!. Designed by: Free Joomla Theme, whois protect. Valid XHTML and CSS.