PowerPoint プレゼンテーション

定数と文字列の出力
• 画面上に「Hello」と表示させる
␣␣␣␣␣␣print␣*,’Hello’
␣␣␣␣␣␣end
注)␣はスペースを表す
コンピュータへの命令
print␣*,・・・
end
プログラムの終わり
・・・(の内容)を表示
‘文字列’とすれば画面上に
文字列
があらわれる。
定数と文字列の出力
␣␣␣␣␣␣print␣*,’1’
␣␣␣␣␣␣print␣*, 1
␣␣␣␣␣␣print␣*, 1.0
␣␣␣␣␣␣end
としてプログラムをコンパイル・実行
画面上には、異なる印字位置や書式で「1」)が表示される
→ 計算機の内部では、文字列と整数と実数は
異なる方式で扱われる。
定数と文字列の出力
␣␣␣␣␣␣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
integer::i,j,k
おまじない。文頭に必ず置く。
変数「i」に「1」を代入(記憶)
変数「i」の中身を表示
変数「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
read␣*,i
上で読み込んだ「i」の数値に「1」を加えた
ものを再び「i」に代入
上で定義した変数「i」の中にキーボードから入力した数値を記憶
「i」が整数型なら整数部のみ、実数型なら実数すべてが記憶される
条件による分岐
• たとえば、変数「i」の値が0より大きければその値を
表示、0か0より小さければ警告を表示するようなプ
ログラムを考える。
if␣(条件)␣then
(条件が満たされたときの操作1)
(条件が満たされたときの操作2)
・・・
end␣if
条件による分岐
␣␣␣␣␣␣implicit␣none
␣␣␣␣␣␣integer::i
「i」が0以下のときは
␣␣␣␣␣␣read␣*,i
”end␣if”の下までスキップ
C
␣␣␣␣␣␣if␣(i>0)␣then
変数「i」の値が0より大きい場合
␣␣␣␣␣␣␣print␣*,i
␣␣␣␣␣␣end␣if
C
␣␣␣␣␣␣if␣(i<0.or.i==0)␣then
␣␣␣␣␣␣␣print␣*,’input value is not positive.’
␣␣␣␣␣␣end␣if
C
␣␣␣␣␣␣end
条件による分岐
␣␣␣␣␣␣implicit␣none
␣␣␣␣␣␣integer::i
␣␣␣␣␣␣read␣*,i
C
「i」が0より大きいのときは
␣␣␣␣␣␣if␣(i>0)␣then
”end␣if”の下までスキップ
␣␣␣␣␣␣␣print␣*,i
␣␣␣␣␣␣end␣if
変数「i」の値が0より小さい
または(.or.)
C
変数「i」の値が0に等しい場合
␣␣␣␣␣␣if␣(i<0.or.i==0)␣then
␣␣␣␣␣␣␣print␣*,’input value is not positive.’
␣␣␣␣␣␣end␣if
C
␣␣␣␣␣␣end
または(.or.)のほかに、さらに(.and.)をつかって条件を組み合わせることができる
「or」や「and」の前後を「.」(ピリオド)で挟むことを忘れない!!
条件による分岐
␣␣␣␣␣␣implicit␣none
␣␣␣␣␣␣integer::i
␣␣␣␣␣␣read␣*,i
C
␣␣␣␣␣␣if␣(i>0)␣then
␣␣␣␣␣␣␣print␣*,i
変数「i」の値が0より大きい場合の処理
␣␣␣␣␣␣else
␣␣␣␣␣␣␣print␣*,’input value is not positive.’
␣␣␣␣␣␣end␣if
そうでない場合の処理
C
␣␣␣␣␣␣end
条件による分岐
␣␣␣␣␣␣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)
cos(x)
tan(x)
abs(x)
int(x)
dble(i)
sin x の値(xの単位はラジアン)
cos x の値(xの単位はラジアン)
tan x の値(xの単位はラジアン)
x の絶対値
x の小数点以下を切り捨てて整数部を整数型として返す
整数型の変数「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
3.5
2
−
7
を計算すると? → 0 にならない
2
有効桁数の制限による誤差
判定式が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
0°をラジアンに
C
変換した値をthetaに代入
␣␣␣␣␣␣theta=(3.14159d0/180.0d0)*0
␣␣␣␣␣␣print␣*,0,sin(theta),cos(theta),tan(theta)
␣␣␣␣␣␣theta=(3.14159d0/180.0d0)*5
␣␣␣␣␣␣print␣*,5,sin(theta),cos(theta),tan(theta)
・・・
␣␣␣␣␣␣theta=(3.14159d0/180.0d0)*90
␣␣␣␣␣␣print␣*,90,sin(theta),cos(theta),tan(theta)
C
角度の値以外は
␣␣␣␣␣␣end
同じ処理の繰り返し
繰り返し
• 同じ処理を繰り返すように指示する命令
→ DOループ
do␣整数変数名=初期値,終了値
(繰り返す操作)
end␣do
␣␣␣␣␣␣implicit␣none
␣␣␣␣␣␣integer::i
C
␣␣␣␣␣␣do␣i=1,10
␣␣␣␣␣␣␣print␣*,i
␣␣␣␣␣␣end␣do
C
␣␣␣␣␣␣end
i に1を加えて上に戻る
(iが10のときは次の行に進む)
実行結果
1
2
3
4
5
6
7
8
9
10
繰り返し
• 同じような処理を繰り返し実行する場合
– たとえば、0°~90°までの三角関数を5°毎に表示
␣␣␣␣␣␣implicit␣none
␣␣␣␣␣␣integer::i
␣␣␣␣␣␣double␣precision::theta
i は0~18
C
角度は0°,5°,10°,・・・, 90°
␣␣␣␣␣␣do␣i=0,18
␣␣␣␣␣␣␣theta=(3.14159d0/180.0d0)*(i*5)
␣␣␣␣␣␣␣print␣*,i*5,sin(theta),cos(theta),tan(theta)
␣␣␣␣␣␣end do
C
␣␣␣␣␣␣end
繰り返し
• 繰り返し処理を中断する場合
– 級数
1
1
1
1
 

2
3
4
の和を5を越えるまで計算
␣␣␣␣␣␣sum = 0.0d+0
どこまで足せばよいかわからないので、十分
大きな上限を設定。
C
␣␣␣␣␣␣do␣i = 0, 10000
␣␣␣␣␣␣␣sum = sum + 1.0d+0 / dble(i)
␣␣␣␣␣␣␣if (sum > 5.0d+0) then
← 和が5を越えたら
␣␣␣␣␣␣␣␣exit
␣␣␣␣␣␣␣end if
Loopを抜けてprint文へ
␣␣␣␣␣␣end do
C
␣␣␣␣␣␣print *, sum, i
配列の利用
• 例えば、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)
→ 一次元配列
→ 二次元配列
a(10)
b(10,5)
二次元配列:b(10,5)
10×5の行列
(50個の棚)
a(1)
b(1,1)
b(1,2)
b(1,3)
b(1,4)
b(1,5)
a(2)
b(2,1)
b(2,2)
b(2,3)
b(2,4)
b(2,5)
a(3)
b(3,1)
b(3,2)
b(3,3)
b(3,4)
b(3,5)
a(4)
b(4,1)
b(4,2)
b(4,3)
b(4,4)
b(4,5)
a(5)
b(5,1)
b(5,2)
b(5,3)
b(5,4)
b(5,5)
a(6)
b(6,1)
b(6,2)
b(6,3)
b(6,4)
b(6,5)
a(7)
b(7,1)
b(7,2)
b(7,3)
b(7,4)
b(7,5)
a(8)
b(8,1)
b(8,2)
b(8,3)
b(8,4)
b(8,5)
a(9)
b(9,1)
b(9,2)
b(9,3)
b(9,4)
b(9,5)
a(10)
b(10,1)
b(10,2)
b(10,3)
b(10,4)
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
x が10-10より小さいときは”0”を返す
␣␣␣␣␣␣endif
(returnより下の処理は実行されない)
␣␣␣␣␣␣squard=x**2
␣␣␣␣␣␣end
C
␣␣␣␣␣␣implicit␣none
␣␣␣␣␣␣double␣precision::a,squard
C
␣␣␣␣␣␣read␣*,a
␣␣␣␣␣␣print␣*,squard(a)
C
␣␣␣␣␣␣end
関数の呼出しⅡ(外部関数)
• 引数は複数であっても構わない
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に1を加える
␣␣␣␣␣␣x=x+1
␣␣␣␣␣␣end
関数incは0を返す
C
␣␣␣␣␣␣implicit␣none
␣␣␣␣␣␣integer::i,inc
実行結果
␣␣␣␣␣␣i=4
4
␣␣␣␣␣␣print␣*,i
␣␣␣␣␣␣print␣*,inc(i)
0
␣␣␣␣␣␣print␣*,i
5
C
␣␣␣␣␣␣end
重要
もとの i の値
関数 inc の値
関数 inc 呼出し後の
i の値