計算物理学II (第６回)

今回の内容• if⽂• プログラムは上から順番に⼀⽂ずつ実⾏するが、if⽂によって特定の条件を満たしたときだけ実⾏することが可能。
• do⽂(for⽂)と組み合わせて使うことで条件が満たされるまで繰り返す、などの制御も可能。

• 詳細は講義資料の⽂法のまとめを参照

コーディングの環境について• ホームディレクトリ以外で作業してください。
• 新しいファイルができたかどうかがlsで探しにくくないですか。

• emacsは&をつけて実⾏、書き終わっても終了しない• コンパイルが⼀回で成功することはなかなかありません。
• 端末とemacs両⽅を常に使えるようにしておくと効率があがります。

• emacs起動後 C-x 1でウィンドウ領域全部を使えます。
• emacsでコードを修正したら保存(C-x C-s)
• emacsで新しいファイルを開く場合はC-x C-f、その後ファイル名を⼊⼒)

コーディングの環境について• 最近実⾏したコマンドは”↑”キーを複数回押すとたどれます。
• コンパイル、実⾏は通常何度も⾏いますので毎回gcc/gfortranを⼊⼒する必要はありません。

• 端末やemacsは複数起動できます。
• サンプルを⾒ながら書く場合はサンプルもemacsで開くとよいです。

• emacs上でTabキーを押すと補完・字下げをしてくれます。
• Fortran：end do, end programなどの⼊⼒時にはendまで⼊⼒してTabキー• 字下げが正しく⾏われない場合は⼿前で⽂法ミスがある可能性があります。

• 講義資料をpdfで開く場合もうまくサムネイルを⼩さくする、ページを拡⼤するなど⾒やすく調整をしてください。

条件⽂• 実⾏⽂は上から⼀⾏ずつ実⾏するのが原則だがよく使う例外は2つだけ• if⽂：条件を論理式で指定し条件を満たすかどうかで処理内容を変える
FortranCinteger :: i

int i;

read (*,*) i

scanf(”%d”, &i);

if ( i<0) i=-i

if (i<0) i=-i;

print *, “i = “, iprintf(“i=%d¥n”,i);条件⽂

FortranC

if (論理式) 実⾏⽂

if (論理式) 実⾏⽂;

論理式が真のときのみ実⾏⽂が実⾏される(実⾏⽂が1⾏の場合)

if (論理式) then
実⾏⽂1
実⾏⽂2
end ifif (論理式){
実⾏⽂1;
実⾏⽂2;}

論理式が真のときのみ実⾏⽂1と実⾏⽂2が実⾏される。
実⾏⽂が複数⾏ある場合はこのスタイル

if (論理式) then
実⾏⽂1
else
実⾏⽂2
end ifif (論理式){
実⾏⽂1;}else{
実⾏⽂2;}

論理式が真の場合は実⾏⽂1が実⾏され、偽の場合は実⾏⽂2が実⾏される

if (論理式1) then
実⾏⽂1
else if (論理式2) then
実⾏⽂2
else
実⾏⽂3
end ifif (論理式1){実⾏⽂1;}else if (論理式2){実⾏⽂2;}else{
実⾏⽂3;}

論理式1が真のときは実⾏⽂1を実⾏
論理式1が偽かつ論理式2が真の時は実⾏⽂2を実⾏
論理式1も論理式2も偽の場合は 実⾏⽂3を実⾏
else ifは複数あってもよい。

論理式
FortranFortranC

a == ba .eq. ba == baがbと等しい時に真 (equal)

a /= ba .ne. b

a != baがbと等しくないとき真(not equal)

a >= ba .ge. ba >= baがb以上の時に真 (greater equal)a>b

a .gt. ba>baがbより⼤きい時に真(greater than)a <= ba .le. b

a <= baがb以下の時に真(less equal)a<ba .lt. ba<baがbより⼩さい時に真(less than)等しい時は=⼀つではなく2つなので注意

Fortran
意味
論理演算⼦

使⽤例

C
論理演算⼦

意味

使⽤例

.not.

(右)以外

.not. a==b!

(右)以外! a==b.and.

かつ

a==b .and. b==c&&

かつ

a==b && b==c.or.

もしくはa==b .or. b==c||

もしくは a==b || b==c.eqv.

論理値が等しい a<0 .eqv b<0 (aとbの符号が同じ).neqv.

論理値が異なる a<0 .neqv. b<0 (aとbの符号が違う)

プログラムの終了• プログラムは最終⾏まで到達すれば終了• 条件⽂を使うと途中で終了させることも可能• Fortran: stop⽂で終了。 stop “⽂字列” とすると⽂字列が標準エラー出⼒に出⼒• プログラムの⼀番最後にstopと正常終了のメッセージを書く場合もある• C: return⽂でmain関数から抜けてプログラム終了。異常終了の場合は0でない値を返す。
Fortranread(*,*) x
if( x<0.0d0) stop “x must be zero or positive”
print *, “sqrt(x) = “, sqrt(x)! xを標準出⼒から読み込む! xが負であればプログラムを終了! xがゼロか正であれば以下の処理が⾏われるC
double x;
scanf(“%lf”, &x);// xを標準出⼒から読み込む
if( x<0.0){
fprintf(stderr, “x is negative¥n”);
return(-1);// xが負であれば-1を返してプログラムを終了}
printf(“sqrt(x) = %f¥n”, sqrt(x));// xがゼロか正であれば以下の処理が⾏われる条件⽂の例：クロネッカーのデルタ
Fortran

CFortranC

integer :: delta, i, j

int delta, i, j;

integer :: delta, i, j

int delta, i, j;read (*,*) i, j

scanf(“%d %d”, &i, &j);read(*,*) i,j

scanf(“%d %d”, &i, &j);

if (i == j) thendelta = 1
else
delta = 0
end ifif (i == j){delta = 1;}else{delta = 0;}delta = 0if(i==j) delta = 1

delta = 0;if(i==j) delta = 1;

print *, delta

printf(“delta = %d¥n”, delta);

print *, delta

printf(“delta=%d¥n”, delta);doループとif⽂の組み合わせ
無限ループ

for(x=0.1; ; x+=0.1){// ここでいろいろ計算
a = ....;
if ( a<0 ) break;}do!ここでいろいろ計算
if ( a<0 ) exit
x=x+0.10d0
end doexit/break⽂はループから抜け、ループ⽂の直後に移動
条件が満たされない場合は計算が終わらないため実⾏してみて終わらない場合は強制終了(C-c)する

cycle(Fortran), continue(C) : ループの先頭まで戻り、カウンタを次の値に進める
do i = 1, nfor( i = 0;i<n;i++){a(i) = ....ここで何かを計算する

a[i] = ....; // ここで何かを計算する

if ( a(i)>0 ) cycle!a(i)が正なら戻ってカウンタを⼀つ回す

if (a[i]>0) continue; //a[i]>0なら戻ってカウンタを⼀つ回す! a(i)が0か負の場合だけこの領域で処理が⾏われる
end do/* a[i]が0か負の場合だけこの領域で処理が⾏われる */}演習• ⾃分で書けそうなら資料を⾒て、難しそうならサンプルのプログラムを写して書いてコンパイル、実⾏してください。
• 条件⽂は第６回の(8)-(11)• 第１回のレポート締切は11⽉17⽇(⾦)です。
• 質問がある⽅はTeamsのチャットで質問してください。