.. _basic-flow-control-lesson-label: ================== 基本的なフロー制御 ================== このレッスンは約20分で完了します。 最初のレッスンを完了しておく必要があります: * :ref:`operator-precedence-lesson-label` * :ref:`basic-coding-style-lesson-label` * :ref:`basic-code-life-cycle-lesson-label` 解説 ########### フロー制御は、ほとんどのプログラミング言語で重要な側面です。 ここでは、Mでお馴染みのFORループをカバーします。 FORループ ############ Mでのループでは、複数のフォームをとることができます。 最も簡単なフォーム =================== 最も単純なフォームは、お馴染みの構造です。 :: 変数 = 初期値 : 増分(減分) : 最終値 ここでは、増分 3 で、0から12まで数えます。 :: for i=0:3:12 do . write i,! より一般的な例を示します。 :: for i=a:b:c do . set sum=sum+i . set sqr=sqr+(i*i) これは、変数 **i** を示しています: * 値 **a** から開始 * 値 **b** でインクリメント * 値 **c** より大きくなるまで それぞれの反復は、この例では、以下のようになります: * 変数 **sum** に、 **i** の値を合計します。 * 変数 **sqr** に、**i** の値の二乗を合計します。 変数 **sqr** に加える前に、 **i** の乗算の演算子の優先順序を保証するために括弧を使用することに注意してください。 forループの本体は、**do** ステートメントで始めます。本体内のコード行は、"." 記号とその右側にインデントで示されます。 forループは次のように、ゼロから10までの偶数を出力します。ゼロと10を含みます。 :: for i=0:2:10 do . write i,! 演習 ******** triangle.m というファイルに、このコードを書きます。 :: start ; 番号10の三角形を計算 set number=10 set triangle=0 for i=1:1:number do . set triangle=triangle+i write "Triangle of ",number," is ",triangle,! quit 次に、コマンドラインからプログラムをコンパイルして実行します :: mumps triangle.m mumps -r start^triangle `55`_ と出力されるでしょう。 .. _55: http://en.wikipedia.org/wiki/55_%28number%29 論理フォーム ============ M言語のforループは、制御変数の限定した数値の代わりに論理状態で動作することも可能です。これは、 **quit** コマンドの `後置条件`_ を結合することによって行われます。 演習 ******** たとえば、10までの偶数を再度出力します。 :: for i=0:2 do quit:(i=10) . write i,! **do** コマンドと **quit** コマンドの間に、2つのスペースがあることに注意してください。式: :: quit:(i=10) 後置条件の一例です。 それは、以下のように読むことも可能です :: execute quit if (i=10) この式は、本体の実行する各サイクルの後にテストされます。したがって、この場合、値(i=10)が、既に論理後置条件が真になっている間に処理されます。 .. _後置条件: http://tinco.pair.com/bhaskar/gtm/doc/books/pg/UNIX_manual/ch05s07.html#Postconditionals バリエーション ============== forループの要素は、オプションなので、以下のバリエーションが簡単に作れます。 例 ******* ここでは、whileループと同様の構造を使用して、2のべき乗を計算します。 :: set s=0 set i=1 for do quit:(i>100) . write s,! . s=s+i . i=s ここでは、 :ref:`for-command-label` のアサインメントとインクリメントをスキップしていることに注意してください、したがって、 **for** と **do** の間に2つのスペースが必要です。変数 **i** が100よりも大きくなる時に、ループが終了します。 リスト ウォーキング ====================== forループは、項目のリストをウォークすることができます。 例 :: for x="John","Paul","Ringo","George" do . write x,! 以下のように出力されるでしょう。 :: John Paul Ringo George 次のレッスン: :ref:`basic-conditionals-lesson-label`