プログラミング実習II (2026) 課題

[T12] 第10章 ファイルと乱数

(T12_0)

準備として,C言語によるプログラミング 10.1 節を読むこと.

(T12_1)

ファイルからデータを読み込んで計算を行うプログラムを作成する.

79
45
21
98
93
41
68
41
11
32
0
(T12_2)

C言語によるプログラミング p. 354~356,および キックオフ C言語 p. 196 に目を通した上で,コマンドライン引数の扱いを理解せよ.

#include <stdio.h>
#include <stdlib.h>

int main( int argc, char *argv[] )
{
    if( argc != 2 ){
        printf("使い方: %s filename \n", argv[0]);
        exit(EXIT_FAILURE);
    }

    return 0;
}
(参考)
(T12_3)

[リスト 10.3] を参考に,入力するファイルを実行時に指定できるように (T12_1) のプログラムを書き換えよ.指定されたファイルが存在しなかった場合にはその旨を表示して終了するようにせよ.

(T12_4)

[リスト 10.4] を参考に,データの終わりを 0 で示さなくても終了を判定できるように前問を修正せよ.(T12_1) で用いたデータに対して,平均値 48.09,最大値 98,最小値 0 となることを確認せよ(末尾の 0 はデータと扱われている).

(T12_5)

擬似乱数について理解し,以下の設問に解答せよ.

C言語には、疑似乱数を作る rand 関数が用意されている. なお、rand関数を使うには <stdlib.h>#include する必要がある.
変数 = rand();
rand関数には、特にパラメータなどを渡す必要はなく、そのまま使うだけでランダムな値を計算する.

[練習1] 上の説明に従って,0 以上 RAND_MAX 以下の乱数を 10 個生成するプログラム(program1)を複数回実行して結果を比較せよ.

// program1.c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
        for ( int i = 0; i < 10; i++ ) {
                printf("%d\n", rand() ); 
        }

        return 0;
}
乱数の範囲を限定するには
  1. 0以上n以下の乱数を得るには rnd = rand() % (n + 1);
  2. m以上n以下の乱数を得るには rnd = m + rand() % (n - m + 1);
とすればよい(理由を考察せよ).

[練習2] 上の説明に従って rand() を使い,サイコロの目(1〜6)を 10 回表示するプログラムを作成せよ.

[練習1] のプログラムは,何回実行しても同じ値の乱数が発生される.これは、rand関数を呼び出す際、乱数の種(シード)を指定していないためである.乱数の種を指定するには以下のように書けばよい.
srand(数値);
上の方法では,実行のたびに同じ乱数の種が適用され,同じ乱数列が得られてしまう. そこで,実行時点の秒単位の現在時刻をsrand関数に入れることで,
#include <time.h>

int main( void ){

    srand((unsigned int)time(NULL));

}
として,実行毎に異なる乱数列を得ることができる. この処理はプログラムを開始するときに1回行うだけでよい. なお,unsigned int という型にキャストしているが,これは符号なしの整数値である.

[練習3] 上の説明に従って,[練習2] のプログラムを現在時刻を乱数の種として与えるよう変更し,多数回実行することで毎回結果が変わることを確認せよ.

[設問]
(このプログラムを提出せよ) srand を使い,サイコロを 10 回振ってランダムに出た目を表示するプログラムを作成せよ.また,何度か実行した結果を練習 1 ~ 3 の内容を含めて考察せよ.