計算機実験の課題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)