計算機実験の課題4のページ
Cコンパイラーの基礎知識
1. 大文字と小文字は区別される。
2. ポインタと関数
変数は float a; の様に宣言されるときと、float *a; の様に宣言されるときがある。float *a の様に宣言されると、a は、値の格納されているアドレスを表し、ポインタ変数と呼ばれる。そのポインタのところにある値が *a の様に表現される。
関数の引数は通常は値のみ関数に渡される。この時は変数の値を変えることが出来ないので、関数の返り値に渡すようにする。
float nijyou(float a)
{
return(a*a);
}
実際には以下のように利用される。
float nijyou(float ); /* 関数の型宣言 float nijyou(float a); もOK*/
main()
{
float b,c;
c=nijyou(b);
.....
}
変数のアドレスを渡すとき、float a の様に宣言された変数の時は &a の様に渡し、float *a のように宣言されているときは a というように渡すことになる。アドレスを受け取る関数nijyou_test()は、次の二通りの引数の受け方がある。
float nijyou_test(float *a)
{
*a=(*a)*(*a);
}
float nijyou_test(a)
float *a;
{
*a=(*a)*(*a);
}
この関数 nijyou_test() に float a の様に宣言された変数の値を nijyou_test(a) の様に渡すことは出来ない。変数のタイプが違うというエラーがでてくる。
実際には以下のように利用される。
float nijyou_test(float *); /* 関数の型宣言 float nijyou_test(float *a); もOK*/
main()
{
float b,*c;
nijyou_test(&b);
nijyou_test(c);
}
Think Cについて
projectというファイルには、実際に使うプログラムがどれになるかを入れておく。MacTrapsというファイルが表示されているときは、MacOSのToolBox Routine が使用されると言うことである。Sourceというメニューの中のAdd file,Removeの項目を使ってprojectファイルの中にプログラムを出し入れする。その後はProjectというメニューの中のRunという項目を使って実行する。エラーがあるときは、エッラーメッセージのウインドウが表示されるので、ダブルクリックするとエラーの箇所に飛んでいってくれる。
Basic について
このプログラムは、PCのBasicのプログラムをCコンパイラを使って実行しやすいようにしたものである。図を描くにはpset(xpos,ypos,pn)関数を使う。ここでpnは、パレット番号で0=black,red=1,green=2,yellow=3,blue=4,magenta=5,cyan=6,white=7である。
課題
BasicのLINE(x0,y0)-(x1,y1),LINE(x0,y0)-STEP(x1,y1)に相当する関数を作成せよ。
DrawIt()関数を、書き換える。例えば、次のモンテカルロ計算の課題ででてくる、thetaという重み付きの乱数のヒストグラムを作ってみよう。
モンテカルロ計算について
課題
1. grand()を用いて乱数を発生させ、この分布のヒストグラムを作成せよ。これをファイルに書き込んで、カレイダグラフでそのファイルを読み込みグラフにする。さらに、分布をガウス関数でフィットし平均値と標準偏差を求めよ。グラフ作りというファイルにサンプルプログラムがある。
1. 一様乱数のプログラム、xrand()を用いて、ある点から一様に放射される放射線を、四角いカウンターで数える実験のシュミレーションを行う。カウンターの大きさは20cm角とし、線源から10cm離して置くとき、放出される粒子数と計数される粒子数の割合を求めよ。
ヒント:全方向に一様な乱数は、球座標を使って作る。この時、phiは0から2pi までの一様乱数でよいが、thetaに対してはsin(theta)の重みを付ける必要がある。この様なときは以下のようにする。
.....
x=2*xrand(iseed)-1; /* x はdoubleの変数 */
theta_rand=acos(x);
.....
この例では、theta_randがsin関数の重みのついた乱数になっている。
2. 前の問題で、さらに、崩壊する粒子がミューオンで(1+cos(theta))という関数のような重みが加わるとどうなるか。
Ryuichi Takashima(takasima@wsml.kyokyo-u.ac.jp)