WFU

2021年7月10日 星期六

C語言練習01:九九乘法表


#include<stdio.h>
int main(){
int answer;
int k,i,j;
for(k = 1; k < 4; k++){
for(j = 1; j < 10; j++){
for(i = 3 * k - 2; i < 3 * k + 1; i++){
answer = i * j;
if(answer <= 9) printf("%dx %d= %d     ", i, j, answer);
if(answer > 9) printf("%dx %d=%d     ", i, j, answer);
}
printf("\n");
}
printf("\n");
}
return 0;
}

這個程式是要用C語言印出九九乘法表,為了要讓它長得像上方那樣,我印的順序大概是:

1x 1= 1    =>    2x 1= 2    =>    3x 1= 3    =>    1x 2= 2    =>    2x 2= 4    這樣子下去...

而到了3x 9=27後,就變成再執行差不多的程式一次,只不過第一個數都加了三,變成:
4x 1= 4    =>    5x 1= 5    =>    5x 1= 5    =>    4x 2= 8    =>    5x 2=10......

到最下面的三列也是一樣,第一個數則又加了三:
7x 1= 7    =>    8x 1= 8    =>    9x 1= 9    =>    7x 2=14    =>    8x 2=16.....

那我們可以看出來,同樣的事情總共執行了3次,這就是最外面那個for loop在做的事情,
for (k = 0; k < 4; k++){}就是在說k只能小於4(k只能是整數),也就是k最多為3,所以當k被加到3為止就會停了,而k一開始是0,所以從k = 0開始,每次加1,總共要加3次,所以從k是0到k是3的時間,就會讓for loop裡面的程式執行3次,這就是最外圈for loop的功用。

第二個for loop是負責讓每個數字都可以從乘以1到乘以9,總共要乘以9個數,也就是執行9次,所以可以些出for (j = 1; j < 10; j++){}。j就是那個在每個式子裡的乘數,一開始等於0,最多只能等於9(因為是小於10的最大整數),j會被一路從1加到9,除了會讓同個被乘數的每個乘數不一樣之外,這個for loop也會讓裡面的程式執行9次。

最裡面的for loop就是要印出九九乘法表啦,for(i = 3 * k - 2; i < 3 * k + 1; i++){} 這行看起來比較複雜一點,i沒有在一開始就被設為某個數,而是等於3*k - 2,是因為每一段的起始的被乘數都不一樣,第一段是1,第二段是4,第三段是7,那我們就不能直接把i設成一個固定的數,假如我們先i設為1,而i要小於4,它會印出這樣:


其實就是每段都是1到3的乘法,因為它每段i都還是一樣,那我們要把i設為甚麼呢?我們先回到第一個for loop,k一開始等於1,最後會等於3。所以當k等於1時,第一個i也等於1,當k等於2時,i開始是等於4,最後k是3時,i一開始是7。我們可以發現第一個i(每一段的第一個被乘數)都是k乘以3然後減2的結果(3 x 1 - 2 = 1、3 x 2 - 2 = 4、3 x 3 - 2 = 7),所以在最內層的這個for loop的式子裡,i應該要先等於3*k-2。

那i < 3 * k + 1這條式子怎麼得出來的呢?一樣的想法,k等於1時,i應該是要小於4(因為最大值是3),k等於2時,i是小於7(最大值是6),最後k等於3時,i是要小於10(i的最大值為9),那就得出了每段的i(被乘數)都要小於3 * k + 1(3 x 1 + 1 = 4、3 x 2 + 1 = 7、3 x 3 + 1 = 10),其實也可以寫成i <= 3 * k就好。

接著我們來看最內層的for loop執行了甚麼呢?首先,先算出每一個式子的答案,所以answer這個變數等於i乘以j(i是被乘數,j是乘數)。算出來後,終於要來印出來這張九九乘法表了,為甚麼有兩行印出的程式呢?注意看一下這張九九乘法表,可以發現如果商是個位數時,商前面會有一個空格,而如果是兩位數時,就沒有,這樣才能讓每個式子都對齊。第一個式子的判斷式是當answer這個變數(商)小於等於9的時候(answer最小只可能是1,1到9都是個位數),在印出的時候,商前面有多一個空格。第二個判斷是當商answer大於9(都是整數,最小是10),在式子裡商前面沒有空格。這些就是最內層迴圈的執行內容。

其實最外面的和第二層迴圈也都有一行印出的程式,"\n"就是換行的意思,第二層的是再說只要每一行(1x 1= 1、2x 1= 2、3x 1= 3 之類的)執行完時,就會跳到下一行再繼續執行。而最外層的是當每一段(到3x 9=27、6x 9=54、9x 9=81)結束時,會跳一行。

這些大概就是這個印出九九乘法表的程式的邏輯,for loop、printf()、if else是我在這個九九乘法表裡用到比較多的程式,可以參考以下文章來了解用法。