PROG 1.2 N個のデータ入力

<問題> 

Windowsでは control z (UNIXではcontrol d)まで、N個の整数を、配列に入力し、合計と平均を求めよ。


<実行結果>

3 
4
5 (このあと、control z, UNIXでは control d)
data :     3     4     5
sum = 12 
mean = 4.00 (12.0 / 3から)

<ヒント>
while(scanfにcontrolzが入力されていない間) {
    合計を続け、個数をカウント
}


解答例

#include <stdio.h>

#define N 100 /* プログラム中のNを100に置き換え。このような記法をマクロと呼ばれる。変数ではないことに注意 */

int data[N]; /* 100個入力可  data[0] - data[99] */ /* 大域変数 */

int main(void) {
    int i, n, d, sum; 
  /* nは個数(データ配列使用の長さ)、iはdata配列プリント時の添え字カウンタ dは一旦入力を受け取る変数*/

    n = 0; /* 個数を数える際の定番の初期化 */
    sum = 0; /* 合計するときの定番の初期化 掛け合わせるときの定番は 1 合計用の変数名はsum */

    /* scanfの戻り値を利用していることに注意。control zでは、scanfの戻り値がEOFになる */
    /* 100個以上 入力した場合の例外処理はしていない */
    /* 繰り返し入力の初級編の定番。EOFは、END OF FILEのこと。ファイル読み込みの記述でも定番 */
   
    while (scanf("%d",&d) != EOF) {  
        data[n] = d;
        sum = sum + data[n]; /* sum += data[n] ともかける */
        n++;
    }

    printf("data : ");
    for (i = 0; i < n ; i++)
       printf("%5d ", data[i]);
    printf("\n");

    printf("sum  = %d\n", sum);
    printf("mean = %5.2f\n", (float)sum/n); 
  /* 整数同士の演算では、小数点以下切り捨て。そこで、sumをfloatに型変換(キャスト) */

    return 0;
}