& 指令有什麼用呢? 現在先講一個,以後還會看到其他用處。 相對於 printf() 做格式化的輸出, C 語言的標準函式庫之中,還有一個 scanf() 做格式化的輸入。 這個函式的設計有些特別,它不能接受變數名,必須給它變數的地址。 究竟為什麼這樣?這個問題最好暫時不去碰它,讀者此時先學習正確的語法即可, 背後的道理,以後自會明白。例如以下語句
int i, k;的意思就是說,從 stdin (標準輸入裝置) 讀入一個整數, 將它儲存在變數 i 裡面。 如果 scanf() 執行成功了,k 就是 1, 如果失敗了 k 就是 0, 如果讀到了檔案結束的符號 (例如使用者鍵入 Ctrl+D) k 就是 EOF (EOF 也就是 -1)。
k = scanf("%d", &i);
常用的輸入格式如下:
#include <stdio.h> /* 測試 scanf() 及浮點數 (test-scanf.c) */ main() { float x; while (scanf("%f", &x) != EOF) printf("%f\n", x); }
prompt% a.out 1 -1.5 1.5e5 1.5e-5 1.000000 -1.500000 150000.000000 0.000015 Ctrl+D prompt%
底下,我們改寫 demo-stats.c, 使得它可以從標準輸入裝置取得一個序列的數值, 然後計算並輸出這些數的基本描述統計:個數、總和、平均、標準差、最大、最小、 超過「平均 + 標準差」的值、不到「平均 - 標準差」的值。 這個程式的寫法,有幾點值得注意之處:
#include <stdio.h> #include <math.h> /* 示範以 scanf() 輸入序列 (stats-scanf.c) */ #define DIM 512 void istats(int[], int); main() { int i, n=0, x[DIM]; while(scanf("%d", &i) != EOF) x[n++] = i; istats(x, n); } void istats(int x[], int N) { int i, sum, max, min; float mean, var, cut; sum = 0; max = -65536; min = 65536; for (i=0; i<N; ++i) { sum = sum + x[i]; if (x[i] > max) max = x[i]; if (x[i] < min) min = x[i]; } mean = (sum*1.0)/N; printf("Num = %4d\n", N); printf("Sum = %4d\n", sum); printf("MAX = %4d\n", max); printf("MIN = %4d\n", min); printf("MEAN = %7.2f\n", mean); var = 0; for (i=0; i<N; ++i) var = var + (x[i] - mean)*(x[i] - mean); var = sqrt(var / (N-1)); printf("VAR = %7.2f\n", var); printf("HIGH = "); cut = mean + var; for (i=0; i<N; ++i) if (x[i] >= cut) printf("%3d", x[i]); putchar('\n'); printf("LOW = "); cut = mean - var; for (i=0; i<N; ++i) if (x[i] <= cut) printf("%3d", x[i]); putchar('\n'); }
為了能夠重複 demo-stats.c 同樣的實驗數據, 請讀者自行下載儲存 g58.txt 這個文字檔案。 這裡面有同樣的 58 個整數, 請利用 UNIX 的檔案導向功能將這個純文字檔輸入給上述程式使用。
習題
注意:此處所有文件均為原著,個別的版權宣告日後會一一公布, 整體版面設計亦尚未完成。但仍請勿抄襲文字與圖片,以免觸犯著作權法。
Created: Feb 27, 2001
Last Revised: Mar 2, 2001
© Copyright 2001 Wei-Chang Shann 單維彰