next up previous contents
Next: 陣列 Up: 函式 Previous: 遞迴   Contents   DYWANG_HOME

實機練習題

  1. 共同要求:
    1. 在家目錄下建立 zzz 目錄。
    2. 切換工作目錄到 zzz,所有練習皆存在此目錄。
    3. 題目沒要求的,不要多做,除題目輸出範例要求的空白外,不要多加任何空白或空白行。
    4. main 函式結束,必須回傳 0。
  2. 撰寫 C 語言程式
    1. 程式 func1.c 以 scanf 從鍵盤輸入兩個整數 a 及 b,中間以空白隔開,依序做以下三個獨立判斷。
      1. 如果 a>b 則 a, b 對調。
      2. 如果 a<=0 (此時的 a 是比較小的數字) 則從 1 開始累加。
      3. 如果 b<=0 (此時的 b 是比較大的數字) 或 b>=20 則累加到 20。
      再設計一 sum 函式傳入 a 及 b 兩個數字,回傳從 a 累加到 b 的總和,編譯成可執行檔 func1。測試範例如下:
      [dywang@dywmsi zzz]$ ./func1
      Enter TWO integers: 6 12
      6+...+12=63
      [dywang@dywmsi zzz]$ ./func1
      Enter TWO integers: 12 5
      5+...+12=68
      [dywang@dywmsi zzz]$ ./func1
      Enter TWO integers: -3 45
      1+...+20=210
      [dywang@dywmsi zzz]$ ./func1
      Enter TWO integers: -2 -9
      1+...+20=210
      [dywang@dywmsi zzz]$ echo $?
      0
      
    2. 承上題 func1.c,程式 func2.c 再設計一函式 swap,將兩數字 a, b 位址傳入 swap,如果 a>b,則將其對調,swap 回傳 void。編譯成可執行檔 func2。
    3. 程式 func3.c 在下命令時傳送參數到執行的程式,計算 (全部偶數累加總和) 除以 (全部奇數累加總和),當奇數總和 0 時,回傳 999999,輸出取小數點 3 位。 例如:執行 ./func3 1 2 3 4,輸出,輸出「(2+4)/(1+3)=1.500」,印出結束要換行,編譯成可執行檔 func3。 提示:利用字串函式 strlen, strcat, strcpy 暫存要輸出的數學式,程式碼要有這三個字串函式。
    4. 程式 func4.c 設計一可變參數個數的函式 sum,將下命令時傳送的參數傳入函式 sum,計算其總和並回傳 tyep int,只考慮參數個數 2, 3, 4 三種狀況,其餘狀況總和都設定為 0,編譯成可執行檔 func4。輸入輸出範例如下,浮點數輸出只取小數點 3 位。
      [dywang@dywmsi zzz]$ ./func4 100
      0/1=0.000
      [dywang@dywmsi zzz]$ ./func4 100 -22 33
      111/3=27.750
      [dywang@dywmsi zzz]$ ./func4 100 -22 33 10
      121/4=24.200
      [dywang@dywmsi zzz]$ ./func4 100 -22 33 10 20
      0/5=0.000
      
    5. 承上題 func4.c,程式 func5.c 修改可變參數個數的函式 sum 回傳 void,而使用全域變數 total (初始值 0) 存加總結果,編譯成可執行檔 func5。
    6. 使用講義 function8.c 的遞迴函式,寫一程式 func6.c,編譯成可執行檔 func6。從命令列讀入一數字 num,計算 num 的階層並輸出,當命令列參數包含非正整數字元時印出錯誤訊息到 stderr,並回傳非 0 的錯誤碼,階層回傳數字很大,一不小心就造成溢位。所以把 factorial 函式的傳入及回傳參數 type 改為 unsigned long,即使改 unsigned long,最多也只能算到 20 的階層,所以當輸入數字 num>20 時,輸出 20 的階層,輸出範例如下,其中 -(1) 表示第 1 個字元減號 '-',B(2) 表示第 2 個字元 B ,這些都不是正整數該有的數字字元:
      [dywang@dywmsi zzz]$ ./func6 -3 > /dev/null
      -(1), Not a Number!
      [dywang@dywmsi zzz]$ ./func6 2B3 > /dev/null
      B(2), Not a Number!
      [dywang@dywmsi zzz]$ ./func6 6
      Factorial of 6 is 720
      [dywang@dywmsi zzz]$ ./func6 20
      Factorial of 20 is 2432902008176640000
      [dywang@dywmsi zzz]$ ./func6 30
      Factorial of 20 is 2432902008176640000
      


De-Yu Wang 2021-01-11