Contents
サイクル演算子 'for'
別のサイクル演算子は演算子 'for'です。
演算子 'for'の書式
フルフォーマットサイクル演算子 'for'は、Expression_1、ConditionおよびExpression_2を含むヘッダーと、実行可能サイクルボディの中括弧で囲まれたヘッダーで構成されます。
for( Expression_1 ; Condition ; Expression_2 ) //サイクル演算子ヘッダー { //オープニングブレース 演算子のブロック//サイクルボディは.. いくつかの演算子のサイクル本文を構成する// } //中括弧を閉じる
'for'演算子のサイクル本体が1つの演算子のみで構成されている場合、中括弧は省略できます。
for( Expression_1 ; Condition ; Expression_2 ) //サイクル演算子ヘッダー 1つの演算子、サイクル本体//サイクル本体は1つの演算子
Expression_1、Conditionおよび/またはExpression_2は存在しない可能性があります。 いずれにせよ、分離文字「;」は、 (セミコロン)はコード内に残る必要があります。
for(; Condition ; Expression_2 ) // No Expression_1 { //オープニングブレース 演算子のブロック//サイクルボディは.. いくつかの演算子のサイクル本文を構成する// } //中括弧を閉じる // ----------------------------------------------- ---------------------------------- for( Expression_1;; Expression_2 ) //条件なし { //オープニングブレース 演算子のブロック//サイクルボディは.. いくつかの演算子のサイクル本文を構成する// } //中括弧を閉じる // ----------------------------------------------- ---------------------------------- for( ;; ) //式や条件がない { //オープニングブレース 演算子のブロック//サイクルボディは.. いくつかの演算子のサイクル本文を構成する// } //中括弧を閉じる
オペレータ用実行ルール 'for'
![]() |
コントロールが演算子 'for'に渡されると、プログラムはExpression_1を実行します。 'for'演算子の条件が真である限り、コントロールをサイクル本体の最初の演算子に渡します。 サイクル本体内のすべての演算子が実行されると、プログラムはExpression_2を実行し、条件が真であるかどうかをテストするためにコントロールをヘッダーに渡す必要があります。 'for'の演算子の条件が偽の場合、プログラムは演算子 'for'に続く演算子に制御を渡す必要があります。 |
サイクル演算子forがどのように機能するかを考えてみましょう。 このために、問題を解決しましょう。
![]() |
問題13私たちは整数のシーケンスを持っています:1 2 3 4 5 6 7 8 9 10 11 ... N1から始まりN2で終了するこのシーケンスの要素の合計を計算するプログラムを作成します。 |
この問題は、数学的に解くのは簡単です。 3番目から7番目までの要素の合計を計算したいとします。 解は、3 + 4 + 5 + 6 + 7 = 25となる。しかし、この解は、和を構成する最初の要素と最後の要素の数がそれぞれ3と7に等しい特定の場合にのみ有効である。 この問題を解決するプログラムは、シーケンスの別の区間(例えば、15番目から23番目の要素)内の合計を計算したい場合は、その要素の数値を簡単に置き換えることができるように構成する必要があります他の場所にあるプログラム行を変更することなく、プログラム内の場所を指定します。 以下はそのようなプログラムのバージョンの1つです(スクリプトsumtotal.mq4 )。
// ------------------------------------------------ ----------------------------- // sumtotal.mq4 // コードは教育目的でのみ使用する必要があり ます。 // ------------------------------------------------ ----------------------------- int start () //特殊な関数start() { // ------------------------------------------------ ----------------------------- int Nom_1 、 //最初の要素の番号 Nom_2 、 // 2番目の要素の番号 Sum 、 //数値の合計 i ; //正式なパラメータ(カウンタ) // ------------------------------------------------ ----------------------------- Nom_1 = 3 ; //数値を指定する Nom_2 = 7 ; // 数値を指定する for ( i = Nom_1 ; i <= Nom_2 ; i ++ ) //サイクル演算子ヘッダー { //ブレースがサイクル本体を開く Sum = Sum + i ; //合計は累積されます 警告 ( " i = " 、 i 、 " Sum= " 、 Sum ) ; //画面に表示する } // サイクルボディを閉じるブレース // ------------------------------------------------ ------------------------------ アラート ( 「 サイクルを終了した後、i = 」 、 i 、 「 Sum= 」 、 Sum ) ; //画面に表示する return ; // Exit start() } // ------------------------------------------------ ------------------------------
プログラムの最初の行では、変数が宣言されています(コメントは各変数の意味を説明しています)。 ラインでは
Nom_1 = 3 ; // 数値を指定する Nom_2 = 7 ; // 数値を指定する
範囲の最初と最後の要素の数値が定義されます。 これらの値は、プログラム内のどこにも指定されていないことに注意してください。 必要に応じて、他の行のコードを変更せずにこれらの値を(1か所で)簡単に変更して、別の範囲で問題を解決することができます。 最後の演算子が実行された後、制御は 'for'というサイクル演算子に渡されます。
for ( i = Nom_1 ; i <= Nom_2 ; i ++ ) // サイクル演算子ヘッダー { // ブレースがサイクル本体を開く Sum = Sum + i ; // 合計は累積されます 警告 ( " i = " 、 i 、 " Sum= " 、 Sum ) ; // 画面に表示する } // サイクルボディを閉じるブレース
キー・フレーズ - 演算子 'for'の実行ルールは次のとおりです: "..から始まり、..、ステップ..、以下を実行します:.." 。 Expression_2として、i ++илиi = i + 2などのストレージカウンタを使用すると、「ステップ..」の使用が可能です。 この例では、キーフレーズは次のとおりです。iがNom_1と同じで、iがNom_2(手順1)以下の場合は、次の手順を実行します(サイクル本体の解析)。
演算子 'for'の実行ルールに従って、このブロックのプログラムで以下が実行されます。
1. Expression_1の実行:
i = Nom_1
変数iは、変数Nom_1の数値、すなわち整数3をとります.Expression_1は、コントロールが演算子 'for'に渡されたときに一度だけ実行されます。 Expression_1は後続のイベントには関係しません。
2.条件がテストされます:
i <= Nom_2
最初の反復で変数Nom_2の値は整数7ですが、変数iの値は3になります。これはConditionが真(3が7より小さい)であることを意味します。つまり、コントロールはサイクルに渡されます体を実行する。
3.この例では、サイクル本体は、1つずつ実行される2つの演算子で構成されています。
Sum = Sum + i ; // 合計は累積されます 警告 ( " i = " 、 i 、 " Sum= " 、 Sum ) ; // 画面に表示する
Variable Sumは初期化時に初期値を取らなかったので、最初の反復が始まる前にその値はゼロに等しくなります。 計算中、変数Sumの値はiの値だけ増加します。したがって、最初の反復の終了時には3に等しくなります。 この値はAlert()関数のボックスで確認できます。
i = 3 Sum = 3 |
4.サイクル演算子の実行中に発生する最後のイベントは、Expression_2の実行です。
i ++
変数iの値が1増加します。 これは最初の反復の終わりであり、条件をテストするために制御が渡されます。
次に、第2の反復が開始される。 計算中、変数は新しい値をとります。 特に、2番目の反復では、変数iの値は4に等しく、Sumは7に等しくなります。対応するメッセージも表示されます。 一般に、プログラムは以下のブロック図に従って開発されます:
イチジク。 【図43】プログラムsumtotal.mq4における演算子「for」実行のブロック図。
プログラムは、Conditionがfalseになるまで周期的にサイクル演算子の実行を繰り返します。 これは、変数iの値が8に等しいとすぐに、すなわち変数Nom_2のプリセット値7を超えるとすぐに起こります。 この場合、コントロールは演算子 'for'の外、つまり行に渡されます。
Alert ( " After exiting the cycle, i= " , i , " Sum= " , Sum ) ; // 画面に表示する
さらに特殊関数start()の演算を終了する演算子returnの実行に移る。
このプログラムを使用して、他の値の範囲の合計を計算することができます。 たとえば、定数3と7をそれぞれ10と15に置き換えると、プログラムの実行によってこの範囲内の合計値が計算されます。
いくつかのプログラミング言語では、サイクルオペレータヘッダで指定された変数は、サイクル終了後に値を失います。 MQL4ではそうではありません。 計算に関係するすべての変数は有効であり、サイクルを終了した後にその値を保持します。 同時に、計算に関係する変数の値にはいくつかの特殊性があります。
すべての計算が完了し、スクリプトがアンロードされた後に残っている最後の2つのメッセージング行に注意してください。
i = 7 Sum = 25 |
サイクルを出た後、i = 8 Sum = 25 |
上記の2つのメッセージの前者は、サイクルが完了する前の最後の反復の段階で現れましたが、後者は、プログラムが終了する前に最後の関数Alert()によって与えられていました。 これらの行は変数iの異なる値を表示することは注目に値する。 サイクル実行中、この値は7に等しくなりますが、サイクル終了後には8に等しくなります。 それがなぜこのように起こるのかを理解するために、図1を参照してみましょう。 43もう一度。
最後の(この場合は5番目の)反復は、条件のテストから始まります。 この時点でiの値は7に等しい。 7は変数Nom_2の値を超えないため、Conditionは真であり、サイクル本体が実行されます。 サイクル本体を構成する演算子が実行されると直ちに、最後の演算が実行されます。Expression_2が実行されます。 これはもう一度強調しなければなりません:
![]() |
operator-forforの各反復で行われる最後のイベントは、Expression_2の計算です。 |
この結果、変数iの値が1増加し、この値は8に等しくなります。次の繰り返しテストの開始時に、条件がfalseになったことが確認されます。 このため、コントロールはテスト後にサイクル演算子の外に渡されます。 同時に、変数iはサイクル演算子を値8で終了し、変数Sumの値は25に等しくなります。これは、サイクル本体がこの段階で実行されないためです。これは、反復の量が事前にわかっていない状況で考慮しなければならないため、プログラマはExpression_2で計算された変数の値によって推定することになります。
我々は例外的なケースであるループを生成する状況を考慮することができます。 これは様々なエラーで可能になります。 たとえば、次の演算子をExpression_2としてエラーで使用するとします。
i--
各反復でのカウンタの値が減少し、条件が決して偽にならないようにする。
別のエラーは、誤って合成された状態になる可能性があります。
for ( i = Nom_1 ; i > = Nom_1 ; i ++ ) // サイクル演算子ヘッダー
この場合、変数iの値は変数Nom_1の値を常に上回るか等しいので、条件は常に真です。
サイクルオペレータの互換性 'whileと' for '
1つのオペレータまたは別のオペレータの使用は、プログラマが行った決定に完全に依存する。 私たちが注目するのは、これらの演算子は互換性があるということだけです。 プログラムのコードに別のブラシを付けるだけでよいことがよくあります。
たとえば、問題13を解くために 'for'というサイクル演算子を使用しました。
for ( i = Nom_1 ; i <= Nom_2 ; i ++ ) // サイクル演算子ヘッダー { // ブレースがサイクル本体を開く Sum = Sum + i ; // 合計は累積されます 警告 ( " i = " 、 i 、 " Sum= " 、 Sum ) ; // 画面に表示する } // サイクルボディを閉じるブレース
以下は、演算子 'while'を使用すると、コードの同じ部分がどのように見えるかを示す例です。
i = Nom_1 ; //Операторприсваивания while ( i <= Nom_2 ) // サイクル演算子ヘッダー { // ブレースがサイクル本体を開く Sum = Sum + i ; // 合計は累積されます 警告 ( " i = " 、 i 、 " Sum= " 、 Sum ) ; // 画面に表示する 私は + +; //要素番号のインクリメント } // サイクルボディを閉じるブレース
見やすく、Expression_1をサイクル演算子の前の行に移動するだけで十分ですが、Expression_2はサイクル本体の最後に指定する必要があります。 あなたは模範的なプログラムを自分で変更し、実行のために起動して、結果が両方のバージョンで同じであることを確認することができます。