2011年4月1日 星期五

程式設計-從C開始之99乘法表

  1. #include <stdio.h>
  2. main()
  3. {
  4.     int i = 1;
  5.     int j;
  6.     for(j = 1;i <= 9;j++)
  7.     {
  8.         if(j <= 9)
  9.         {
  10.             printf("%d*%d=%2d  ", i, j, i * j);
  11.         }
  12.         else
  13.         {
  14.             printf("\n");
  15.             i = i + 1;
  16.             j = 0;
  17.         }
  18.     }
  19.     system("pause");
  20. }

這段程式碼可以用Dev-C來編譯,編譯出來的結果是一個9*9的乘法表。很簡單的程式但我認為是很好入門的程式。

語句解說:

  1. 第1行是載入C程式的標頭檔,但我們今天先不解釋,照打就好。
  2. 第2行的main()是C程式必寫,用來通知系統執行程式時要從這邊開始,有更複雜的用法以後有機會再提。
  3. 第3行的{跟第20行的}是一對,表示第4行到第19行的內容都是屬於main()。
  4. 第4行int i是指宣告一個變數i為int整數型態並且設為1,型態宣告以後再另開篇幅說明,這裏就先知道i只能用來表示數字,後面的;符號是用來表示一句敘述句結束就跟中文的。一樣。
  5. 第5行跟第4行不一樣在於宣告時沒有設定j是多少,就像過年拿紅包(j)你不知道裡面有多少錢(有可能有一百萬也有可能只有一塊錢),跟直接給你錢(i)的差別。
  6. 第6行的for是C程式的重複結構,以for(A;B;C)為例:
    • A為一般敘述如j = 1
    • B為條件判斷,判斷的結果為真則重複做{}裡面的內容動作,結果為否則離開重複結構,上面程式的B為i <= 9表示當i小於或等於9的時候進入重複結構否則離開重複結構。
    • C也是一般敘述,跟A不同的是A只有在for開始時執行一次,C則是每執行完結構中內容就會執行一次,上面程式的C為j++等同於j = j + 1。
  7. 第7行跟第18行的{}是for的架構標示,表示第8行到第17行是for的重複架構內容。
  8. 第8行的if是C程式的條件結構,根據小括號內容判斷真假,若為真則執行結構中動作否則不執行,上面程式則是判斷j是否小於等於9。
  9. 第9行跟第11行的{}是if的架構標示。
  10. 第10行的printf("%d*%d=%2d  ", i, j, i * j);是列印一串字在螢幕上,列印的內容在兩個"引號裡面,在這裡我們要印出變數i、*符號、變數j、=符號、變數i乘變數j的結果,而不是印出i*j=i*j這樣的一串字,於是寫成("%d*%d=%2d  ", i, j, i * j),%d跟%2d的意思都是顯示"引號結束後以逗號隔開的變數值(還有%s、%f等等可以使用,有機會再提),第一個%d就會呈現變數i的值,第二個%d就會呈現變數j的值,最後的%2d則是呈現變數i乘變數j的值,%2d的2表示如果顯示的數字小於二位數就會在前面補空格,可以嘗試更改2為其它數字試試,"引號後面的逗號區隔的可以是單一變數也可以是一句敘述,想呈現越多的變數值就用越多的逗號隔開,相反的只要顯示"引號內容的話就不用逗號了。
  11. 第12行的else必須搭配if來使用,舉個例子來說:如果肚子餓則吃飯否則睡覺,可以寫成:
    if(肚子餓)
    {
        吃飯
    }
    else
    {
        睡覺
    }
    else就是處理「否則」要做的事情。
  12. 第14行的printf("\n");是將\n顯示到螢幕上,但因為電腦會將\n當成斷行符號,所以這只是將顯示的部分斷行而已。
  13. 第15行的i = i + 1;跟16行的j = 0;只是一般的敘述句。
  14. 第19行的system("pause");是將目前的程式及畫面停住,避免程式執行太快沒看清楚就結束被windows關掉,在Mac或Linux就不需要這句。

邏輯解說:
  • 因為printf只能做橫向列印,所以我們必須先思考怎麼印出1*1=1  1*2=2  1*3=3....1*9=9
  • 要印出這麼一行只需要用:
    for(j = 1;j <= 9;j++)
    {
        printf("1*%d=%2d  ", j, 1 * j);
    }
  • 但仔細觀察後可以發現我們必須執行上面類似的動作9次才能順利印出完整的99乘法表,而這次數決定在於i,所以我們把上面的for修改成這樣:
    for(j = 1;i <= 9;j++)
    {
        printf("%d*%d=%2d  ", i, j, i * j);
    }
  • 但這樣就形成了無窮迴圈,因為在迴圈內i永遠不會變動也就永遠不會大於9,於是我們再增加if條件架構來處理讓j大於9時就斷行且將i加1於將j歸零(因為j會因為迴圈結束時會再執行j++):
    for(j = 1;i <= 9;j++)
    {
        if(j <= 9)
        {
            printf("%d*%d=%2d  ", i, j, i * j);
        }
        else
        {
            printf("\n");
            i = i + 1;
            j = 0;
        }
    }
  • 如此99乘法表就大致完成了。