270 likes | 416 Views
定数と文字列の出力. 画面上に 「 Hello 」と表示させる. ␣␣␣␣␣␣ print ␣ *,’Hello’ ␣␣␣␣␣␣ end. 注) ␣ はスペースを表す. コンピュータへの命令. print ␣ *, ・・・. ‘ 文字列 ’ とすれば画面上に 文字列 があらわれる。. ・・・(の内容)を表示. end. プログラム の 終わり. 定数と文字列の出力. ␣␣␣␣␣␣ print ␣ *,1+1 ␣␣␣␣␣␣ end. としてプログラムをコンパイル・実行. 画面上には、「 1+1 」ではなく 「 2 」(計算結果)が表示される.
E N D
定数と文字列の出力 • 画面上に「Hello」と表示させる ␣␣␣␣␣␣print␣*,’Hello’ ␣␣␣␣␣␣end 注)␣はスペースを表す コンピュータへの命令 print␣*,・・・ ‘文字列’とすれば画面上に 文字列 があらわれる。 ・・・(の内容)を表示 end プログラムの終わり
定数と文字列の出力 ␣␣␣␣␣␣print␣*,1+1 ␣␣␣␣␣␣end としてプログラムをコンパイル・実行 画面上には、「1+1」ではなく「2」(計算結果)が表示される print␣*,・・・ ・・・(の内容)を表示 数式を入れれば画面上に 計算結果 があらわれる。
定数と文字列の出力 ␣␣␣␣␣␣print␣*,1/3*3 ␣␣␣␣␣␣end としてプログラムをコンパイル・実行 1/3*3 → 1÷3×3の意味 画面上には、「1」ではなく「0」が表示される Fortranでは、「整数」と「実数」を厳密に区別する 1 は整数 1. は実数 整数同士の計算結果は整数となる → 1÷3(=0.333・・・)は「0」 整数と実数の計算結果は実数となる 「1/3*3」の部分を に変えてそれぞれコンパイル・実行 結果は? 1/3*3. 1/3.*3 1./3*3
実数の表し方 「1.」と書くよりは「1.d0」と書く方が良い 「10.」は「10.d0」または「1.d1」 「0.1」は「0.1d0」または「1.d-1」 1.23d2 → 1.23×102の意味 倍精度の実数である (有効桁数が単精度に比べて倍) 「1.23e2」は単精度の実数 倍精度を使った方が打ち切りによる誤差が小さくなる
変数の利用 • 変数:数値を記憶しておく箱 ␣␣␣␣␣␣implicit␣none ␣␣␣␣␣␣integer::i ␣␣␣␣␣␣i=1 ␣␣␣␣␣␣print␣*,i ␣␣␣␣␣␣end おまじない。文頭に必ず置く。 変数「i」に「1」を代入(記憶) 変数「i」の中身を表示 integer::i,j,k 変数「i」「j」「k」(::の後ろの文字)を「整数型」として定義 「i」「j」「k」の中には整数(部)しか入らない
変数の利用 • 変数:数値を記憶しておく箱 ␣␣␣␣␣␣implicit␣none ␣␣␣␣␣␣integer::i ␣␣␣␣␣␣i=1.6d0 ␣␣␣␣␣␣print␣*,i ␣␣␣␣␣␣end おまじない。文頭に必ず置く。 変数「i」に「1.6」を代入(記憶) 変数「i」の中身を表示 結果は? 「i」の中には整数部しか入らない(0.6は切り捨てられる)
変数の利用 • 変数:数値を記憶しておく箱 ␣␣␣␣␣␣implicit␣none ␣␣␣␣␣␣double␣precision::a ␣␣␣␣␣␣a=1.6d0 ␣␣␣␣␣␣print␣*,a ␣␣␣␣␣␣end おまじない。文頭に必ず置く。 変数「a」に「1.6」を代入(記憶) 変数「a」の中身を表示 double␣precision::a,b,c 変数「a」「b」「c」(::の後ろの文字)を「倍精度実数型」として定義 「a」「b」「c」の中には実数が入る
変数の利用(データの読み込み) • 変数を利用するとデータを外から入れることができる ␣␣␣␣␣␣implicit␣none ␣␣␣␣␣␣integer::i ␣␣␣␣␣␣read␣*,i ␣␣␣␣␣␣i=i+1 ␣␣␣␣␣␣print␣*,i ␣␣␣␣␣␣end 上で読み込んだ「i」の数値に「1」を加えたものを再び「i」に代入 read␣*,i 上で定義した変数「i」の中にキーボードから入力した数値を記憶 「i」が整数型なら整数部のみ、実数型なら実数すべてが記憶される
条件による分岐 • たとえば、変数「i」の値が0より大きければその値を表示、0か0より小さければ警告を表示するようなプログラムを考える。 if␣(条件)␣then (条件が満たされたときの操作1) (条件が満たされたときの操作2) ・・・ end␣if
条件による分岐 ␣␣␣␣␣␣implicit␣none ␣␣␣␣␣␣integer::i ␣␣␣␣␣␣read␣*,i C ␣␣␣␣␣␣if␣(i>0)␣then ␣␣␣␣␣␣␣print␣*,i ␣␣␣␣␣␣end␣if C ␣␣␣␣␣␣if␣(i<0.or.i==0)␣then ␣␣␣␣␣␣␣print␣*,’input value is not positive.’ ␣␣␣␣␣␣end␣if C ␣␣␣␣␣␣end 「i」が0以下のときは ”end␣if”の下までスキップ 変数「i」の値が0より大きい場合
条件による分岐 ␣␣␣␣␣␣implicit␣none ␣␣␣␣␣␣integer::i ␣␣␣␣␣␣read␣*,i C ␣␣␣␣␣␣if␣(i>0)␣then ␣␣␣␣␣␣␣print␣*,i ␣␣␣␣␣␣end␣if C ␣␣␣␣␣␣if␣(i<0.or.i==0)␣then ␣␣␣␣␣␣␣print␣*,’input value is not positive.’ ␣␣␣␣␣␣end␣if C ␣␣␣␣␣␣end 「i」が0より大きいのときは ”end␣if”の下までスキップ 変数「i」の値が0より小さい または(.or.) 変数「i」の値が0に等しい場合 または(.or.)のほかに、さらに(.and.)をつかって条件を組み合わせることができる 「or」や「and」の前後を「.」(ピリオド)で挟むことを忘れない!!
条件による分岐 ␣␣␣␣␣␣implicit␣none ␣␣␣␣␣␣integer::i ␣␣␣␣␣␣read␣*,i C ␣␣␣␣␣␣if␣(i>0)␣then ␣␣␣␣␣␣␣print␣*,i ␣␣␣␣␣␣else ␣␣␣␣␣␣␣print␣*,’input value is not positive.’ ␣␣␣␣␣␣end␣if C ␣␣␣␣␣␣end 変数「i」の値が0より大きい場合の処理 そうでない場合の処理
条件による分岐 ␣␣␣␣␣␣implicit␣none ␣␣␣␣␣␣integer::i ␣␣␣␣␣␣read␣*,i C ␣␣␣␣␣␣if␣(i>0)␣then ␣␣␣␣␣␣␣print␣*,i ␣␣␣␣␣␣else ␣␣␣␣␣␣␣print␣*,’input value is not positive.’ ␣␣␣␣␣␣end␣if C ␣␣␣␣␣␣end if␣(条件)␣then (条件が満たされたときの操作) else (条件が満たされなかったときの操作) end␣if
関数の呼出しⅠ(組み込み関数) • 数学でよく使われる関数 • sin, cos, log, ルート(平方根), 絶対値, ・・・ FORTRANでは、あらかじめ組み込み関数として用意されている 関数名(引数) a = sqrt(2.0d0) → 変数「a」の中に2の平方根(=1.4142…)が代入される sin(x) sin x の値(xの単位はラジアン) cos(x) cos x の値(xの単位はラジアン) tan(x) tan x の値(xの単位はラジアン) abs(x) x の絶対値 int(x) x の小数点以下を切り捨てて整数部を整数型として返す dble(i) 整数型の変数「i」を実数型に変換
関数の呼出しⅠ(組み込み関数) sin 45°を表示するプログラムの例 ␣␣␣␣␣␣implicit␣none ␣␣␣␣␣␣double␣precision::a ␣␣␣␣␣␣a=45.0d0*3.14d0/180.0d0 ␣␣␣␣␣␣print␣*,’Sin(45deg.) =‘,sin(a) ␣␣␣␣␣␣end 45°をラジアンに 変換した値をaに代入 または ␣␣␣␣␣␣print␣*,’Sin(45deg.) =‘,sin(45.0d0*3.14d0/180.0d0) ␣␣␣␣␣␣end
基本問題6:判別式の注意点 • 計算機は「無理数」を扱えない(有効数字16ケタ) ␣␣␣␣␣␣print␣*,sqrt(3.5d0)/sqrt(2.d0)-sqrt(7.d0)/2.d0 ␣␣␣␣␣␣end を計算すると? → 0 にならない 有効桁数の制限による誤差 判定式が0かどうかを判断するときに注意が必要!
基本問題6:判別式の注意点 判定式をDとしたとき ␣␣␣␣␣␣if␣(D==0.d0)␣then ␣␣␣␣␣␣(重根の解を表示) ␣␣␣␣␣␣end␣if とすると、計算誤差の影響で重根を見落とす可能性あり! その回避策として ␣␣␣␣␣␣if␣(abs(D)<1.d-10)␣then ␣␣␣␣␣␣(重根の解を表示) ␣␣␣␣␣␣end␣if Dの絶対値が10-10より小さければDは0とみなす どの程度の値が適当なのかはケースbyケース
繰り返し • 同じような処理を繰り返し実行する場合 • たとえば、0°~90°までの三角関数を5°毎に表示 ␣␣␣␣␣␣implicit␣none ␣␣␣␣␣␣double␣precision::theta C ␣␣␣␣␣␣theta=(3.14159d0/180.d0)*0 ␣␣␣␣␣␣print␣*,0,sin(theta),cos(theta),tan(theta) ␣␣␣␣␣␣theta=(3.14159d0/180.d0)*5 ␣␣␣␣␣␣print␣*,5,sin(theta),cos(theta),tan(theta) ・・・ ␣␣␣␣␣␣theta=(3.14159d0/180.d0)*90 ␣␣␣␣␣␣print␣*,90,sin(theta),cos(theta),tan(theta) C ␣␣␣␣␣␣end 0°をラジアンに 変換した値をthetaに代入 角度の値以外は 同じ処理の繰り返し
繰り返し • 同じ処理を繰り返すように指示する命令 → DOループ do␣整数変数名␣初期値,終了値 (繰り返す操作) end␣do 実行結果 1 2 3 4 5 6 7 8 9 10 ␣␣␣␣␣␣implicit␣none ␣␣␣␣␣␣integer::i C ␣␣␣␣␣␣do␣i=1,10 ␣␣␣␣␣␣␣print␣*,i ␣␣␣␣␣␣end␣do C ␣␣␣␣␣␣end iに1を加えて上に戻る (iが10のときは次の行に進む)
繰り返し • 同じような処理を繰り返し実行する場合 • たとえば、0°~90°までの三角関数を5°毎に表示 ␣␣␣␣␣␣implicit␣none ␣␣␣␣␣␣integer::i ␣␣␣␣␣␣double␣precision::theta C ␣␣␣␣␣␣do␣i=0,18 ␣␣␣␣␣␣␣theta=(3.14159d0/180.d0)*(i*5) ␣␣␣␣␣␣␣print␣*,i*5,sin(theta),cos(theta),tan(theta) C ␣␣␣␣␣␣end iは0~18 角度は0°,5°,10°,・・・,90°
配列の利用 • 例えば、3つの箱を用意して、ユーザーが入力した番号の箱の中身を表示する ␣␣␣␣␣␣implicit␣none ␣␣␣␣␣␣integer::i ␣␣␣␣␣␣double␣precision::a1,a2,a3 C ␣␣␣␣␣␣a1=0.d0 ␣␣␣␣␣␣a2=2.d0 ␣␣␣␣␣␣a3=5.d0 C ␣␣␣␣␣␣read␣*,i C ␣␣␣␣␣␣if␣(i==1)␣then ␣␣␣␣␣␣␣print␣*,a1 ␣␣␣␣␣␣end␣if C (続き) ␣␣␣␣␣␣if␣(i==2)␣then ␣␣␣␣␣␣␣print␣*,a2 ␣␣␣␣␣␣end␣if C ␣␣␣␣␣␣if␣(i==3)␣then ␣␣␣␣␣␣␣print␣*,a3 ␣␣␣␣␣␣end␣if C ␣␣␣␣␣␣end 箱が増えると、 同じ処理を何度も書く必要がある
配列の利用 • 箱を何個も用意するのではなく、棚を利用する 棚の引き出しの数=箱の個数 ␣␣␣␣␣␣implicit␣none ␣␣␣␣␣␣integer::i ␣␣␣␣␣␣double␣precision::a(3) C ␣␣␣␣␣␣a(1)=0.d0 ␣␣␣␣␣␣a(2)=2.d0 ␣␣␣␣␣␣a(3)=5.d0 C ␣␣␣␣␣␣read␣*,i C ␣␣␣␣␣␣print␣*,a(i) C ␣␣␣␣␣␣end 3つの引き出しの棚(配列) それぞれの棚に値を代入 i番目の棚の値を表示
配列の利用 • 配列の定義: a(10)→ 一次元配列 b(10,5) → 二次元配列 10×5の行列 (50個の棚) 一次元配列:a(10) 二次元配列:b(10,5)
関数の呼出しⅡ(外部関数) • FORTRANでは自分で関数を定義できる • sin(x)やcos(x)と同じように、自分で作成した関数をプログラムから呼び出すことができる C ␣␣␣␣␣␣function␣squard(x) ␣␣␣␣␣␣implicit␣none ␣␣␣␣␣␣double␣presicion::x,squard ␣␣␣␣␣␣squard=x**2 ␣␣␣␣␣␣end C ␣␣␣␣␣␣implicit␣none ␣␣␣␣␣␣double␣precision::a,squard C ␣␣␣␣␣␣read␣*,a ␣␣␣␣␣␣print␣*,squard(a) C ␣␣␣␣␣␣end 関数squardを定義(引数 x) 関数squardと引数 xの型を定義 主プログラム内で 関数squardの型を定義 関数squardの呼び出し
関数の呼出しⅡ(外部関数) • 外部関数では処理を途中でやめて値を返すことができる C ␣␣␣␣␣␣function␣squard(x) ␣␣␣␣␣␣implicit␣none ␣␣␣␣␣␣double␣presicion::x,squard ␣␣␣␣␣␣if␣(x<1.d-10)␣then ␣␣␣␣␣␣␣squard=0.d0 ␣␣␣␣␣␣␣return ␣␣␣␣␣␣endif ␣␣␣␣␣␣squard=x**2 ␣␣␣␣␣␣end C ␣␣␣␣␣␣implicit␣none ␣␣␣␣␣␣double␣precision::a,squard C ␣␣␣␣␣␣read␣*,a ␣␣␣␣␣␣print␣*,squard(a) C ␣␣␣␣␣␣end x が10-10より小さいときは”0”を返す (returnより下の処理は実行されない)
関数の呼出しⅡ(外部関数) • 引数は複数であっても構わない C ␣␣␣␣␣␣function␣multiply(x,y) ␣␣␣␣␣␣implicit␣none ␣␣␣␣␣␣double␣presicion::x,y,multiply ␣␣␣␣␣␣multiply=x*y ␣␣␣␣␣␣end C ␣␣␣␣␣␣implicit␣none ␣␣␣␣␣␣double␣precision::a,b,multiply C ␣␣␣␣␣␣read␣*,a,b ␣␣␣␣␣␣print␣*,multiply(a,b) C ␣␣␣␣␣␣end
関数の呼出しⅡ(外部関数) • 外部関数で引数の値を変える →主プログラム内での引数の値も変わる 重要 C ␣␣␣␣␣␣function␣inc(x) ␣␣␣␣␣␣implicit␣none ␣␣␣␣␣␣integer::x,inc ␣␣␣␣␣␣inc=0 ␣␣␣␣␣␣x=x+1 ␣␣␣␣␣␣end C ␣␣␣␣␣␣implicit␣none ␣␣␣␣␣␣integer::i,inc ␣␣␣␣␣␣i=4 ␣␣␣␣␣␣print␣*,i ␣␣␣␣␣␣print␣*,inc(i) ␣␣␣␣␣␣print␣*,i C ␣␣␣␣␣␣end 引数 xに1を加える 関数incは0を返す 実行結果 4 0 5 もとの i の値 関数 inc の値 関数 inc呼出し後のi の値