プログラミング実習II (2026) 課題
準備として,C言語によるプログラミング 10.1 節を読むこと.
ファイルからデータを読み込んで計算を行うプログラムを作成する.
indata.txt として保存せよ.最後の 0 はデータの末尾を示す目印とする.なお,ファイルは,右に示すリンクから(右クリックで)ダウンロードすることもできる. indata.txtindata.txt 内の数値について,平均値・最大値・最小値を求めて出力するプログラムを作成せよ.(平均値 52.9,最大値 98,最小値 11 となることを確認すること)79
45
21
98
93
41
68
41
11
32
0
C言語によるプログラミング p. 354~356,および キックオフ C言語 p. 196 に目を通した上で,コマンドライン引数の扱いを理解せよ.
argc を %d で,argv[0] と argv[1] を %s で表示する printf 文を追加せよ../a.exe indata.txt" のように実行する.VS Code はこちらを参照).コマンドライン引数の個数が正しくない場合に,エラー処理が行われることも確認せよ.
#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;
}
char *argv[] は「ポインタの配列」であり,従ってこの配列の各要素はアドレスである.このアドレスは,コマンドライン引数として受け取る各文字列が格納された領域の先頭アドレスを指す.「ポインタの配列」についてはプログラミング実習IIIにて詳しく学ぶ.stdlib.h をインクルードした上で関数 atoi() で変換する必要がある.[リスト 10.3] を参考に,入力するファイルを実行時に指定できるように (T12_1) のプログラムを書き換えよ.指定されたファイルが存在しなかった場合にはその旨を表示して終了するようにせよ.
[リスト 10.4] を参考に,データの終わりを 0 で示さなくても終了を判定できるように前問を修正せよ.(T12_1) で用いたデータに対して,平均値 48.09,最大値 98,最小値 0 となることを確認せよ(末尾の 0 はデータと扱われている).
擬似乱数について理解し,以下の設問に解答せよ.
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;
}
0以上n以下の乱数を得るには
rnd = rand() % (n + 1);
m以上n以下の乱数を得るには
rnd = m + rand() % (n - m + 1);
[練習2] 上の説明に従って rand() を使い,サイコロの目(1〜6)を 10 回表示するプログラムを作成せよ.
rand関数を呼び出す際、乱数の種(シード)を指定していないためである.乱数の種を指定するには以下のように書けばよい.
srand(数値);
srand関数に入れることで,
#include <time.h>
int main( void ){
srand((unsigned int)time(NULL));
}
として,実行毎に異なる乱数列を得ることができる.
この処理はプログラムを開始するときに1回行うだけでよい.
なお,unsigned int という型にキャストしているが,これは符号なしの整数値である.
[練習3] 上の説明に従って,[練習2] のプログラムを現在時刻を乱数の種として与えるよう変更し,多数回実行することで毎回結果が変わることを確認せよ.
[設問]
(このプログラムを提出せよ)
srand を使い,サイコロを 10 回振ってランダムに出た目を表示するプログラムを作成せよ.また,何度か実行した結果を練習 1 ~ 3 の内容を含めて考察せよ.