forやwhileで繰り返し処理させてみる:無償ソフトで技術計算しよう【プログラミング基礎編】(2)(2/2 ページ)
今回は、繰り返し処理をさせるためのコマンドや、処理を中断したい場合について解説する。forコマンドでは、「最初に与えられた条件に従った回数だけ繰り返す」のに対して、whileコマンドでは「繰り返しの都度繰り返しするかどうかを指示する」ことが可能だ。
breakコマンド、continueコマンド
forやwhileループで、条件によっては処理を中断したい場合は、「break」コマンドや「continue」コマンドを用います。ヘルプの最初の行を下記に示します。
The break statement is used to exit a loop prematurely.
The continue statement is used to change the order of execution within a loop.
意味は、「breakはループを予定より早く終了させる場合に用います。continueはループ内の実行を変える(行わせない)場合に用います」となります。
ループ内にbreakコマンドを入れると、ループが終了します。一方、continueコマンドを入れると、continue以下の処理を飛ばして、ループの先頭に戻ります。通常、breakやcontinueコマンドは「if」(条件式を満たしている場合に処理)コマンドと組み合わせて使います。
例として、グラフィックス編で例題とした減衰系の強制振動での振幅倍率曲線で、振幅倍率が10となる減衰比ζを求めてみます(関連記事:曲面と曲線、2種類の3次元グラフの描き方)。減衰比を変えながら振幅倍率を求め、振幅倍率の最大値が10以上となったらループを終了させます。ex307.mがプログラムで、ifコマンドでmfの最大値が10以上で、breakコマンドを動作させています。ex307.mを動作させると、図1が得られ、図のタイトル欄にzeta=0.05とあるように、振幅倍率が10となる減衰比は0.05であることが分かります。
clear; eta=0:0.01:3; for zeta=1:-0.01:0.01 mf=1./sqrt((1-eta.^2).^2+(2*zeta*eta).^2); if max(mf)>=10 break; end end plot(eta,mf); title(['zeta=',num2str(zeta)]); xlabel('f/fn');ylabel('x/xst');grid('on');
最後に、エラーコマンドを紹介します。エラーコマンドは矛盾した計算や無意味な計算をさせないように、以降の処理を中断させるものです。error('comment');とすると、処理が終了し、commentをコマンドウィンドウに表示します。通常は、ifコマンドと組み合わせます。
例えば、下記はnが奇数か偶数かを判定するプログラムです。n/2を整数化して2倍にすると、偶数であれば、4/2*2=4となり、元の数値と等しくなります。If文で判別し、元の数値と等しい場合(==は論理演算で、両辺が等しい場合1を、等しくない場合0を返します)、even(偶数)と表示させます。一方、奇数であれば、5/2の整数は2となり、2*2=4で元の数値とは異なった値となりif文を満足せず次の行に移動します。偶数以外であれば、奇数であるので、else文(条件式を満たしていない場合に処理)で、odd(奇数)と表示させます。
clear; n=5; if(n==int32(n/2)*2) printf('%d is even\n',n); else printf('%d is odd\n',n); end
しかし偶数・奇数は0以外の整数であるため、0や小数での計算結果はプログラム上、エラーが生じないとしても、意味がありません。そこで、下記のex308.mでは、ifコマンドでnが0に等しい場合、エラーとなり、「zero is neither even nor odd」(0は偶数でも奇数でもない)と表示させるようにしています。
clear; n=0; if (n==0) error('zero is neither even nor odd'); elseif ( n ~= fix(n) ) error('expecting integer argument'); end if(n==int32(n/2)*2) printf('%d is even\n',n); else printf('%d is odd\n',n); end
また、elseifコマンドでnが小数の場合(fixコマンドで整数化した数値が元のnと等しくない。「~=」は論理演算で「等しい」の否定で、両辺が等しくない場合1を、等しい場合0を返します)、エラーとなり「expecting integer argument」(整数の引数を見込む)と表示させるようにしています。
ex308.mを動作させると、n=0であるため、最初のifコマンドのerrorコマンドが動作し、先ほどの「zero is neither even nor odd」(0は偶数でも奇数でもない)というコメントが表示されていることが分かります。
In docli(builtin) at line 4 In base(base) In base() In global() Error: zero is neither even nor odd
◇
次回は入出力変数を持つプログラム、関数mファイルについて説明します。
参考文献
- 「MATLABハンドブック」小林一行著、秀和システム刊
- 「はじめてのFreeMat」赤間世紀著、工学社刊
筆者紹介
伊藤孝宏(いとう・たかひろ)
1960年生。小型モーターメーカーのエンジニア。博士(工学)。専門は流体工学、音・振動工学。現在は、LabVIEWを使って、音不良の計測・診断ソフト、特性自動検査装置などの開発を行っている。
Copyright © ITmedia, Inc. All Rights Reserved.