文系人間のためのシステムトレーダー養成所 メタトレーダー講義第五回 ループと分岐第一部
--------

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
2009-03-11

メタトレーダー講義第五回 ループと分岐第一部

この文章はCodersGuruさんのMQL4Lesson4の訳文です。(翻訳しての転載に本人の許可はとってあります)                
                   MQL4講座             
                   Coders'guru
                    www.forex-tsd.com                       
                         -5-
                    ループと分岐第一部

MQL4講座の第五回目の講義へようこそいらっしゃいました。

貴方が書いたプログラムの普通の流れのはステートメントからステートメントへと上から下へ実行していきます。(ステートメントとは、特定のアクションを実行または指定する言語エレメントです。while,if,for,else等)

ステートメントはコンピューターにある行動をしろと伝えるためのコード文です。

Print("hello world")
return 0;

最後についているセミコロンはシンタックスの重大な部分です。しかし、簡単に忘れてしまいまして、エラーの90%の原因がだいたいこのセミコロンのつけわすれになります。

しかし、上から下へと実行していくというケースには二つの例外がありまして、その例外にあたるのがループと分岐です。

貴方が書いた -人間が -決定する というこのようなプログラムは、環境が変わっている時にどのような反応をすればよいのでしょうか?このような場合、流れのコントローラーが、あるプログラムの部分から、他のプログラムへと飛び越します。そのような、飛び越しを起こすステートメントのことを、コントロールステートメントと呼ばれます。
そのようなコントロールにループと分岐があります。


               ループ
              --------


ループはあなたのプログラム区間をある決まった回数繰り返すことを命令します。
そしてこの繰り返しは、ある条件内に当てはまっている時は続き、ある条件に満たなくなった時に終わります。
ループが終わったとき、ループのコントロールを飛ばして、ループ区間の次のステートメントに移行します。

そしてMQL4では、二種類のループがあります。


forループ
-------


forループは最も簡単なループだと考えられています。なぜなら、すべてのコントロールエレメント(調整要素)が同じ場所に集まるからです。
forループはコード区間を決まった回数実行します。

例____________________________________________________________________________________________
int j;
for(j=0;j<15;j++)←コントロールエレメント(ループの動きを指定する要素)が同じ場所にきてますね。
print(j);
_______________________________________________________________________________________________

これはどのように働くのでしょうか?
forステートメントにはforキーワードが存在します。forの後のカッコ内の、セミコロンで分けられている三つの式がそのキーワードにあたります。

for(j=0;j<15;j++)

これらの三つの式は、前から順に初期値式、テスト式、インクレメント式になります。

j=0←初期値式    
j<15←テスト式
j++←インクレメント式 
ループ本体とは、ループの回数実行されるコードのことを言います。

Print(j);
↑が例における、15回実行されるコードなので、これがループ本体にあたります。

メモ:forステートメントは後にセミコロンがつきません。これは、forステートメントと、ループ本体はプログラムステートメントとして一緒の存在になるからです。

for(J=0;J<15;J++)
 ↑;がたしかについてないですね。

初期値式

初期値式は一回目の繰り返しの時しか実行されません。そしてループ変数に整数値(今回の例では0)を与えます。

ループ変数は、先ほどの例のように、前もってループ本体の外で宣言することもできます。

int j;

もしくは、下の例のように、ループのカッコ内で宣言することもできます。

for(int j=0;j<15;j++)

最初の例と上の例のコードはそれぞれの変数の範囲を除けば同じです。(変数の宣言と範囲については、変数講義のほうで詳しく説明します。)
外で宣言する方法は、コード全体の全ての文に変数を適応します。一方、括弧内での宣言は、forループだけに変数を適応させることになります。

下の例のようにコンマでforループを区切ることによって初期値式を増やして利用できるようになります。
____________________________________________________________________________________________
int i;
int j;
for(i=0,j=0;i<15;i++)
print(i)
____________________________________________________________________________________________

テスト式

テスト式は常に関係演算子をつかった関係式になります。(メタトレーダー講義第4回を参照なさってください。)

繰り返が行われている時はいつでも、繰り返しは続けるべきなのか止めるべきなのかの決定をするために評価している。もしも式の結果がtrue(真)ならば繰り返しは続けられるだろうし、false(偽)ならば繰り返しは止まるでしょう。

例では、ループの本体はj<15がtrueの間は i (Print(i))を出力し続けるでしょう。
i<15というのは、j=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14の時です。
そしてi15に到達したとき、ループはとまり、コントロールがループ区間を通過して、ループ区間の後のステートメントにいくでしょう。

インクレメント式
インクレメント式はループ変数(例ではjがループ変数)を1ずつ増やしていきます。
それはループの式の中で最後の段階として扱われます。初期値式でループ変数への処理がおわったら。テスト変数で条件が満ているかテストされ、ループ本体が実行されます。

このフローチャートがforループのフローチャートになります。
loop.png



初期値式のように、forループ本体の中に、一つ以上のインクレメント式もコンマで区切って挿入することができます。
____________________________________________________________________________________________
int i;
int j;
for(i=0,j=0;i<15;i++,j++)
print(i);
____________________________________________________________________________________________
でも、テスト式は一つだけしか使えません。(テスト式はfor(a;b;c)のうちのbです。一つ目の;から初まり、二つ目の;の前がおわりになります。コンマではなく、セミコロンで初期値式、テスト式、インクレメント式をわけているのを注目してください。上の例ではi<15がテスト式です。)

他にインクレメント式で注目しておくべきことは、ループ変数をふやすだけではなく、ループ変数をデクレメント(一つずつ減らす)する操作を行うこともできることです。例をみてください。
____________________________________________________________________________________________
int i;
for(i=15;i>0;i--);
Print(i);
____________________________________________________________________________________________

上の例では、iの初期値が15に設定されてループが始まります。そしてループする時に1ずつ減っていき、テスト式によってi>0であるかどうかチェックされます。
上の例では、15.14,13,12,11,10,9,8,7,6,5,4,3,2,1.が結果として生み出されるでしょう。

ループ本体の複数ステートメント

今までの例では、一つのステートメント(Print)しか使っていませんでしたが、例外もあります。
ループ本体を大括弧で区切ることによって複数のステートメントを使うことができるのです。例をみてください。
____________________________________________________________________________________________
for(int i=1;I<=15;i++)
{
Print(i);
PlaySound("alert.wav");
}
____________________________________________________________________________________________

上のループ本体のコードには二つのステートメントが含まれます。プログラムは最初のステートメント(Print)を実行し、そのあと二つ目のステートメント(Play Sound)を、ループが実行されるたびに実行するでしょう。
すべてのステートメントの後に、セミコロンを入れるのを忘れないでください。

Breakステートメント


forループ(whileループでもswitchiループでも)の中にキーワードがあると、ループの実行は終了し、ループ区間の後のステートメントにスキップします。

例_________________________________________________________________________________________
for(int i=0;i<15;I++)
{
if(i==10)
break;
Print(i);
}
____________________________________________________________________________________________
上の例では、i10に届くまでループが実行され、10になるとbreakキーワードがループを終わらせるでしょう。ですので、上のコードが生み出す値は0,1,2,3,4,5,6,7,8,9になります。

continueステートメント

breakステートメントは実行の流れをループの外に持っていきましたが、continueステートメントはループの一番上に戻させます。
例えば
____________________________________________________________________________________________
for(int i=0;i<15;I++)
{
if(i==10)continue;
Print(i);
_}
___________________________________________________________________________________________
上の例ですと、i10になるまでループを実行し、10になったら、continueキーワードがiの10回目を出力せずに、ループの先頭にループを戻します。つまり、上のコードが生み出す値は:0,1,2,3,4,5,6,7,8,9,11,12,13,14.になります。

最後に
もし貴方が望むなら、いくつかあるいはすべての式をforループから外すことができます。例えば
for(;;)
このループはテスト式がつねにtrue(真)であるというwhileループと似ています。
いまからwhileループについて説明しますね。


whileループ
---------


forループは普通、何回ループを実行するか分かっている時に使います。
もしあなたが何回ループを実行したいのか分からない時はどうしたら良いのでしょうか?
そのような時はwhileループを使用すればいいのです。

whileループはforループのようにテスト式があります。それでも、初期値式や、インクレメント式がありません。

これが例です。
____________________________________________________________________________________________
int i=0
while(i<15)
{
Print(i);
i++;
}
____________________________________________________________________________________________
この例で、あなたは次のことに注目してください。
    ・このループ変数は宣言と初期化がループ前に行われています。whileループでは、forループ
     のように宣言もしくは初期化を括弧内で行うことはできません。
    ・ここのi++ステートメントは誤解されがちなのですが、インクレメント式ではありません。しかし、
     whileループ本体には必ず何かのループ変数を変えるステートメントが存在します。そうでなければ、
     ループが終わることは永遠にないのですから。

上の例はどのように実行されるのか?

whileステートメントはテスト式しか含まれません。そして、それはすべてのループでチェックするでしょう。もしそれtrue(真)ならループは続くでしょうし、それがfalse(偽)ならループは終わり、コントロールはループセクションの次のステートメントへと移動するでしょう。

例では、ループはi16に届くまで実効するでしょう。i<15=falseになった時にループは終了します。

whileループのフローチャートがこちらになります。
whileflow.png


先ほど私は、whileループとforループは似ているといいましたね。これらは似た特徴があります。

1.breakステートメントやcontinueステートメントを使うことができます。
2.ループ本体に、ステートメントを1つで使うことも、2つ以上で使うこともできます。2つ以上で使う場合
 は、大括弧でくぎってください。
3.for(;;)while(true)は同じです。

楽しんで頂きましたでしょうか。これで今回の講義は終了になります。

それでは。
Coders'guru



以上です。最後まで読んで頂きありがとうございました。誤訳や、何かおかしいと感じられる点等ございましたら報告していただけると大変たすかります。

最後までお読み頂きありがとうございました。



押していただけると大変嬉しいです。よろしくお願いします。
人気ブログランキングへ







theme : FXでシステムトレード
genre : 株式・投資・マネー

コメントの投稿

管理者にだけ表示を許可する

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。