プログラミング入門2 第13回、14回 総合演習 情報工学科 篠埜 功 次回について • 次回は1/14(木)です。 今日と次回の内容 • これまでの学習内容を用いて、少し複雑な問題 を3問解く。 • TAに確認してもらう期限: 第14回の終了時 (16:10)までとする。これまでの課題についても 第14回の終了時まで受け付ける。 期末試験について • • • • • 日時 第15回 1/18(月) 3限のみ 場所 3409教室 持ち込み不可 出題範囲: 第1回から第14回まですべて 出題形式:中間試験と同様とする予定。 総合演習課題1(円周率近似値計算) モンテカルロ法による円周率の近似値の計 算を行うプログラムを書け。 生成する点の個数はキーボードから受け取 るようにせよ。 乱数の生成にはMersenne twisterを用いよ。 (実行例) [sasano@oli004 13kai]$ ./a.out 点の生成回数: 1000000 円周率=3.141200 [sasano@oli004 13kai]$ 総合演習課題2(統計処理) 100名分の学生の学籍番号と点数(100点満点)が 格納されているデータファイル(score.txt 、HPか らダウンロード)を読み込み、これらのデータに対 して以下を行うプログラムを作成せよ。 右のように10点刻みで分布グラフを(文字で)画面 に表示し、平均点、最高点、最低点、標準偏差 を画面に表示する。 全員分の偏差値をファイル(ファイル名は自由)に出 力する。その際、学籍番号と点数も一緒に以下 の順で書きだす。 学籍番号 点数 偏差値 ○分散 = (データを2乗した値の総和 - (データの総 和の2乗 /データ数)) / データ数 ○標準偏差:分散の正の平方根 ○偏差 = 個々の値 - 平均値 ○偏差値 = (偏差 / 標準偏差) * 10 + 50 0-10 : **** 11-20 : ******* ・・・ 91-100 : ** 総合演習課題3(積分近似計算) • 二次関数 f(x) = x2 について、x=0から3までの定積分を求め たい。区分求積法により、この積分の近似値を求めよ。 x軸方向の刻み幅Δxを大→小へと変化させ、近似の精度が 良くなることを確認せよ。 y 0 3 Δx x チャレンジ課題 • 課題3において、積分範囲をキーボードから 受け取れるようにせよ。 Mersenne Twisterの使い方 http://www.math.sci.hiroshima-u.ac.jp/~mmat/MT/MT2002/mt19937ar.html のページから、mt19937ar.sep.tgzをダウンロード する。ダウンロードしたtgzファイルを適当なディレ クトリにおき、以下のようにして展開する。 $ tar zxvf mt19937ar.sep.tgz ファイルがそのディレクトリに5つ展開される。そ の中のmt19937ar.cとmt19937ar.hを用いる。 この演習では、mt19937ar.c中のgenrand_real2() という関数を用いることとする。これは0以上1未 満の乱数を生成する。 Mersenne Twisterの使い方(続き) genrand_real2()関数を呼び出すプログラムの先頭において、 #include "mt19937ar.h“ を記述する。(genrand_real2()のプロトタイプ宣言を読み込む 為。)これまでは#include <stdio.h>のように< >の中にヘッダー ファイル名を書いていたが、これは定められたディレクトリから 探してくるという意味である。カレントディレクトリにあるヘッ ダーファイルを読み込む場合は” “で囲む。 コンパイルは、genrand_real2()関数を使っているファイルの名 前をkadai1.cとすると、 $ gcc kadai1.c mt19937ar.c のように行う。 (参考)Mersenne Twisterの改良版SFMTも公開されている。 Mersenne Twisterの使い方(続き) 実行毎に生成する乱数列を変えたい場合は、 init_genrand (time(0));のように、time関数の返り値を初期化 関数に与えるようにすればよい。 (init_genrand関数を最初に一度呼び出してから、 genrand_real2()関数を必要な回数呼び出せばよい。) 円周率の近似値の計算 y (0,1) (0,0) (1,1) (1,0) x 0から1の範囲の乱数を2つ生成すると、それらは 上記の正方形の範囲内の1つの座標と見ること ができる。 点をN個生成し、そのうちn個が円の中に入ってい た場合は、(n/N)*4が円周率の近似値となる。 課題2補足説明 • score.txtからの学籍番号、点数の読み取り方法につ いて – まず、ファイルをオープンする。 • scoreFile = fopen (“score.txt”, “r”); – 次に、fscanfで一行ずつデータを読み込む。 • fscanf (scoreFile, “%s%d”, …………); • 平方根について – 数学ライブラリlibm.so中のsqrt関数を用いる。(double型を 受け取り、その平方根をdouble型で返す) – #include <math.h>を先頭に加える。 – コンパイル時に、$ gcc kadai2.c -lm のようにすることにより、 libm.soが検索され、リンクされる。
© Copyright 2024 ExpyDoc