プログラミング入門2 - 学術情報センター

プログラミング入門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が検索され、リンクされる。