& 指令有什麼用呢? 現在先講一個,以後還會看到其他用處。 相對於 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 單維彰