C 語言初學教材 - 第二章 來寫個加法器

C 語言的加法運算子跟我們一般所用的加法符號一樣,都是 +

運算子功能範例
+a + b


程式如下
#include <stdio.h>

int main(void)
{
    int a = 33;
    int b = 55;
    int result = a + b;
    
    printf("這個程式計算兩個整數的和....\n");
    printf("%d + %d = %d\n", a, b, result);    
    
    return 0;
}

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:simple_adder.c
    功能:簡單的加法器
    作者:張凱慶
    時間:西元2010年7月 */


從第 5 行到第 7 行,我們分別宣告了三個變數,同時直接指派 33 給 a , 55 給 b , a + b 的結果給 result
int a = 33;
int b = 55;
int result = a + b;


因此變數 a 中就儲存了整數 33 ,變數 b 中也儲存了整數 55 ,而變數 result 得到的是 a + b 的結果,也就是說, result 中會儲存整數 88 。


我們在第 9 行呼叫函數 printf() 將三個變數值以加法算式印出
printf("%d + %d = %d\n", a, b, result);


編譯然後執行,不意外的,我們會在螢幕上看到 33 + 55 = 88



這樣加法器全部的輸入都得預先在程式碼中寫好,嗯,我們來寫個接受使用者輸入的版本吧!


C 語言標準函數庫 stdio.h 中的函數 printf() 用為格式化輸出,另外有個函數 scanf() 用為格式化輸入,其中轉換字符與 printf() 大致相同。


我們寫的接受使用者輸入的加法器版本如下
#include <stdio.h>

int main(void)
{
    int a, b, result; //宣告需要用到的變數

    printf("這個程式計算兩個整數的和....\n");
    printf("請輸入第一個整數: "); //提示使用者輸入的文字
    scanf("%d", &a);
    printf("請輸入第二個整數: "); //提示使用者輸入的文字
    scanf("%d", &b);
    result = a + b; //計算結果
    
    printf("結果如下\n");
    printf("%d + %d = %d\n", a, b, result);    
    
    return 0;
}

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:adder.c
    功能:接受使用者輸入的加法器
    作者:張凱慶
    時間:西元2010年7月 */


第 5 行,我們將所用到的變數放在一起宣告
int a, b, result; //宣告需要用到的變數


這是因為 a 、 b 需要等待使用者輸入,而 result 要等到 a 、 b 都有數值之後才能進行第 12 行的計算
result = a + b; //計算結果


如果變數只有宣告而沒有給值,那麼變數中所具有的值會是記憶體位址的殘值,因此,程式要得到預期的結果,宣告變數後就要在適當的地方指派數值給變數,或是宣告後直接給變數初值。


第 8 行及第 10 行為提示使用者輸入的文字,會額外印出這樣的訊息文字,是因為輸入函數如 scanf() 會等待使用者輸入,直到按下 return 或 Enter 鍵才會結束執行,提示訊息的目的就是告訴使用者應該怎麼跟程式互動。
printf("請輸入第一個整數: "); //提示使用者輸入的文字
printf("請輸入第二個整數: "); //提示使用者輸入的文字


第 9 行及第 11 行為呼叫函數 scanf()
scanf("%d", &a);
scanf("%d", &b);


函數 scanf() 可接受多個參數,其中第一個必須是含有轉換字符的格式化字串,後面則依轉換字符的數量接型態相符的指標變數,也就是所要儲存輸入值變數的記憶體位址。


此例中,我們用變數 a 與 b 分別記錄使用者輸入的第一個及第二個整數,利用取址運算子 & 可取得該變數的記憶體位址,因此取址運算子與變數名稱連用便是指標。


編譯然後執行,結果如下



問題與討論
  1. 請將 add.c 第 11 行的 result = a + b; 往上移到第 6 行,重新編譯執行,會得到什麼樣的結果呢?
  2. 接受使用者輸入的程式需不需要有提示訊息?
  3. 如果函數 scanf() 預期接受整數,假設輸入的是文字,這樣會發生什麼事呢?
  4. 請將 add.c 第 9 行的取址運算子 & 刪除,重新編譯,會得到什麼樣的結果呢?
  5. 請將加法器改成浮點數的版本,如果輸入的是整數會發生問題嗎?
  6. 按加法器的設計方式,請設計減法器、乘法器跟除法器。




沒有留言: