プログラミング実習II (2025) 課題
[E12] 第10章 ファイルと乱数
(E12_1) [リスト 10.5] を参考に,特定の名前をもつファイルからの読み込みと書き出しをするよう,[T12] で作成したプログラムに変更を加えよ([リスト 10.5] と同様,コマンドライン引数は使用しない).
(E12_2) [リスト 10.7] を参考にして,前問のプログラムを,fgets関数とsscanf関数を用いてデータを読み込むように書き換えよ.
(E12_3) 2個の整数がコマンドライン引数として入力されるとき,それらの和を表示するプログラムを作成せよ. 例えば,実行の際に "./a.exe 49 85 " のように入力される.
#include <stdio.h> #include <stdlib.h> int main( int argc, char *argv[] ) { if( argc が 3 でなければ ){ printf("使い方: %s [int] [int] \n", argv[0] ); exit(EXIT_FAILURE); } return 0; } |
(E12_4) 学生番号と得点のデータを,点数の高い順に表示するプログラムを作成する.
※fgetsで各行を文字列 string に読み込み,sscanf( string, "%d %d", &a, &b ); によって,学生番号を int 型変数 a に,点数を int 型変数 b に格納できる.
ファイルは,右に示すリンクから(右クリックで)ダウンロードできる score.txt
9001 78 9002 62 9003 95 9004 84 9005 75 9006 51 9007 97 9008 72 9009 60 9010 78 9011 75 9012 85 9013 80 9014 60 9015 40 9016 60 9017 85 9018 88 9019 93 9020 65 9021 73 9022 90 9023 55 9024 98 9025 48 9026 35 9027 69 9028 82 9029 70 9030 61 |
表示例: 9024 98 9007 97 9003 95 :
(E12_5) 0.0 〜 1.0 の値をとる一様乱数を発生させる.
#include <stdio.h> #include <stdlib.h> #include <time.h> int main( void ) { srand((unsigned int)time(NULL)); printf("RAND_MAX: %d \n", RAND_MAX); return 0; } |
(E12_6) 乱数を用いてシミュレーションや数値計算を行うモンテカルロ法という手法がある.簡単な例として,円周率πを乱数を用いて近似的に求めてみる.次の 1.
〜 4. の手順で計算を行う.
(E12_7) 0.0 〜 1.0の値をとる一様乱数を発生させたとき,それが p 未満となる確率は(当然ながら)p である.以下のプログラムを作成せよ.
表示例( p = 0.5,実行のたびに結果は変わる.3個目の数字は各得点の割合,4個目の数字が2項分布の数値を指す): ------------------------------ 0 101 0.00101 0.000977 1 1029 0.01029 0.009766 2 4560 0.04560 0.043945 3 11750 0.11750 0.117188 4 20460 0.20460 0.205078 5 24617 0.24617 0.246094 6 20546 0.20546 0.205078 7 11566 0.11566 0.117188 8 4280 0.04280 0.043945 9 994 0.00994 0.009766 10 97 0.00097 0.000977 ------------------------------ (printf の書式は %2d, %5d, %.5f, %f)
表示例( p = 0.3,4 個目の数字が 2 項分布の数値): ------------------------------ 0 2838 0.02838 0.028248 1 12171 0.12171 0.121061 2 23300 0.23300 0.233474 3 26677 0.26677 0.266828 4 19978 0.19978 0.200121 5 10299 0.10299 0.102919 6 3648 0.03648 0.036757 7 924 0.00924 0.009002 8 153 0.00153 0.001447 9 10 0.00010 0.000138 10 2 0.00002 0.000006 ------------------------------ (printf の書式は %2d, %5d, %.5f, %f)
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> int main( int argc, char *argv[] ){ double p; srand((unsigned int)time(NULL)); if( argc != 2 ){ printf("使い方: %s [double] \n", argv[0]); exit(EXIT_FAILURE); } p = atof( argv[1] ); if( p <= 0.0 || p >= 1.0 ){ printf("not a probability \n"); exit(EXIT_FAILURE); } return 0; } |