再談 printf() 的輸出格式

以前我們已經見過一些關於 printf() 的輸出格式 [printf() 與跳脫字元 \], 現在我們再詳細列出所有的輸出格式所對應的資料型態。 我們已經知道輸出格式的第一個符號必定是 %,所以底下就不寫那個符號了。

% % (不必對應一個數值)
c int,但先轉換成 unsigned char 再印出字符而非數字
s string 印出字串
d int
u unsigned int
o unsigned int 八進制數字
x unsigned int 十六進制數字,用 abcdef
X unsigned int 十六進制數字,用 ABCDEF
f double
e double 指數表達法,例如 2.56e2
E double 指數表達法,例如 2.56E2
g double 自動選擇使用 %f 還是 %e
G double 自動選擇使用 %f 還是 %E
附加以下說明。

注意,如果使用 longlong double 這種特長的資料型態來計算, 在輸出的時候,要記得寫格式 %ld%Lf 否則看不到正確答案。 此外,注意 %f 內定輸出小數點下 6 位而已。 如果想要看多一點的小數,必需明白指定,例如說 %.32Lf。 使用 %Le%Lg 亦需注意這些問題。

舉例來說,如果您的機器有支援 long double, 則可以用它來計算 2113-1。 這比使用 long 能夠處理的整數更大, 即使 unsigned long 最大只能表現 264-1。 以下的程式,將會輸出 2113-1。


#include <stdio.h>

/* 計算 $2^{113}-1$   (pow2_113.c) */
main() {
    long double x;
    int i;
    x = 1.;

    for (i=0; i<113; ++i) {
        x *= 2;
    }
    printf("%.0Lf\n", x-1);
}

習題

  1. 利用 C 的內建資料型態,寫一個計算 n! 的程式。 輸出您能夠計算之最大可能的 n 和 n!? (您可以利用 Maple 來檢驗自己的答案,但是不要叫您的程式背答案。)
  2. 寫一個符合以下規格的函式
    int choose(int, int);
    
    使得 choose(n,m) 等於 Cnm, 例如 choose(3,0) 是 1、choose(4,2) 是 6。 如果使用者輸入的 n 和 m 不在 choose() 能夠接受的範圍,令函式值是 0。 寫一個簡單的主函式來呼叫您的 choose(),並輸出前 10 列的 Pascal 三角形, 如下。
    1
    1 1
    1 2 1
    1 3 3 1
    
    注意,如果您的程式裡面使用了階乘計算,那就不妙了。 (您可以利用 Maple 來檢驗 choose() 的答案)

[ 前一節 ]‧[ 後一節 ]‧[ 回目錄 ]



注意:此處所有文件均為原著,個別的版權宣告日後會一一公布, 整體版面設計亦尚未完成。但仍請勿抄襲文字與圖片,以免觸犯著作權法。

Created: Apr 22, 2000
Last Revised: Apr 22, 2000
© Copyright 2000 Wei-Chang Shann 單維彰

shann@math.ncu.edu.tw