Contents
演算子 'switch'
いくつかのプログラムは、アルゴリズムをいくつかのバリエーションに分岐することを暗示しています。 そのような場合、特に数十または数百のバリエーションがある場合はオペレータ 'スイッチ'を使用するのが非常に便利ですが、多くのネスト演算子を使用すると 'if'コードが膨れます。
演算子 'switch'のフォーマット
演算子 'switch'はヘッダーと実行可能な本体で構成されます。 ヘッダーには、演算子の名前とカッコで囲まれた式が含まれます。 演算子本体には、1つまたは複数のバリエーション「ケース」と1つのバリエーション「デフォルト」が含まれます。
各caseバリエーションは、キーワードcase、Constant、 ":"(コロン)、および演算子で構成されます。 変化の大小は限定されない。
バリエーション「default」は、キーワード「default」、「:」(コロン)、および演算子で構成されます。 バリエーション「default」は、最後にオペレータ 'switch'のボディに指定されますが、オペレータの体内のどこにでも配置することも、存在しなくても構いません。
switch( Expression ) //演算子ヘッダー { //オープニングブレース case定数:演算子//「case」変形の1つ case定数:演算子// 'case'のバリエーションの1つ ... [ default:演算子] //パラメータなしの変形 } //中括弧を閉じる
ExpressionおよびParametersの値は、 int型の値のみにすることができます。 Expressionには、定数、変数、関数呼び出し、または式を指定できます。 それぞれのバリエーション「ケース」は、整数定数、文字定数、または定数式によってマークすることができます。 定数式には、変数や関数呼び出しを含めることはできません。
演算子 'switch'の実行ルール
![]() |
プログラムは、Variant 'case'の ":"(コロン)の後に続く最初の演算子に制御を渡す必要があります。その定数値はExpressionの値と同じです。次に、演算子を構成するすべての演算子を1つずつ実行しますオペレータ 'スイッチ'の本体。 式と定数の間の等式の条件は、上から下、左から右の方向でテストされます。 異なるバリエーション「ケース」の「定数」の値は同じであってはなりません。 演算子 'break'は、演算子 'switch'の実行を停止し、演算子 'switch'に続く演算子に制御を渡します。 |
' case Constant:'は、コントロールが渡されるラベルを表すことが容易に分かります。 演算子 'switch'の本体を構成するすべての演算子がこのラベルから実行され始めます。 プログラムアルゴリズムが、1つのバリエーション 'case'にのみ対応する演算子のグループの実行を意味する場合、バリエーション 'case'に対応する演算子のリストの最後に演算子 'break'を指定する必要があります。 いくつかの例を使って演算子 'switch'の作業を考えてみましょう。
演算子 'switch'の例
![]() |
問題18.以下の条件が満たされているプログラムを作成する:価格が所定のレベルを超えた場合、プログラムは、超過分が単語(最大10ポイント)で記載されているメッセージを使用してトレーダに通知する必要があります。 他の場合には、プログラムは、価格が所定のレベルを超えないことを通知しなければならない。 |
以下は、オペレータ 'スイッチ'を使用した問題解決策です(Expert Advisor pricealert.mq4 )。
// ------------------------------------------------ ------------------------------------- // pricealert.mq4 //コードは教育目的でのみ使用する必要があり ます。 // ------------------------------------------------ ------------------------------------- int start () //特別な関数 'start' { ダブル レベル = 1.3200 ; //プリセット価格レベル int Delta = NormalizeDouble (( 入札 レベル ) ポイント 、 0 ) ; //余分 if ( Delta <= 0 ) //価格がレベルを超えていない { アラート ( 「価格がレベルを下回っています " ) ; //メッセージ return ; // Exit start() } // ------------------------------------------------ ------------------------------------- switch ( Delta ) // 'switch'のヘッダ { // 'スイッチ'本体の開始 ケース 1 : アラート ( "プラス1ポイント " ) ; break ; // Variations .. ケース 2 : アラート ( 「 プラス2 ポイント " ) ; 休憩 ; ケース 3 : アラート ( 「 プラス 3 ポイント " ) ; 休憩 ; ケース 4 : アラート ( 「 プラス 4 ポイント " ) ; break ; //ここに表示されます ケース 5 : アラート ( " プラス 5 ポイント " ) ; break ; // 10バリエーション 'case'、 ケース 6 : アラート ( 「 プラス 6 ポイント " ) ; break ; //しかし、一般的なケースでは、 ケース 7 : アラート ( 「 プラス 7 ポイント " ) ; break ; //バリエーション 'case'の量 ケース 8 : アラート ( 「 プラス 8 ポイント " ) ; break ; //は無制限です ケース 9 : アラート ( " プラス 9 ポイント " ) ; 休憩 ; ケース 10 : 警告 ( プラス 10 ポイント " ) ; 休憩 ; デフォルト : アラート ( 「 10点以上 」 ) 。 // 'case'と同じではありません } // 'switch'ボディの終わり // ------------------------------------------------ ------------------------------------- return ; // Exit start() } // ------------------------------------------------ -------------------------------------
この問題解決法では、オペレータ 'switch'を使用します。この場合、各バリエーション 'case'は演算子 'break'を使用します。 変数Deltaの値に応じて、コントロールはバリエーション「case」の1つに渡されます。 これにより、このバリエーションに対応する演算子が実行されます。関数Alert()と演算子 'break'。 演算子 'break'は、演算子 'switch'の実行を停止します。つまり、特殊関数start()の演算を終了させる演算子 'return'に制御を渡します。 したがって、変数Deltaの値に応じて、バリエーション「case」トリガの1つがトリガされますが、他のバリエーションは変更されません。
上記のプログラムはエキスパートアドバイザーであるため、毎回実行するために起動され、毎回現状に対応するメッセージを表示します。 もちろん、私たちはこのEAを付けているシンボル、ウィンドウの現在の価格に近い可能性のあるレベルの値を検索する必要があります。
イチジク。 EA pricealert.mq4のオペレータ 'スイッチ'のブロック図
上記のブロック図では、各バリエーション「ケース」にオペレータ 'ブレーク'が存在するため、バリエーション「ケース」のオペレータが実行された後に、オペレータ 'スイッチ'の外に制御が渡されることが明確に分かります実行される。 演算子 'switch'を使用したアルゴリズム構築の同様の原理は、クライアント端末( .. \ experts \ libraries \ stdlib.mq4 )内で配信されるstdlib.mq4という名前のファイルで利用されます。
それぞれのバリエーション「ケース」で「中断」の使用法を提供しない別の問題を考えてみましょう。
![]() |
問題19.バーが10個あります。 n番目のバーから始まるすべてのバーの番号を報告します。 |
この問題(スクリプトbarnumber.mq4 )の解決策をコード化することはむしろ簡単です。
// ------------------------------------------------ ------------------------------ // barnumber.mq4 // コードは教育目的でのみ使用する必要があり ます。 // ------------------------------------------------ ------------------------------ int start () //特殊な関数start() { int n = 3 ; //プリセット番号 アラート ( 「 バー番号は〜から始まる 」 、 n 、 「 : 」 ) ; // nに依存しない // ------------------------------------------------ ------------------------------ switch ( n ) //演算子 'switch'のヘッダ { // 'スイッチ'本体の開始 ケース 1 : アラート ( " バー1 " ) 。 //変種.. ケース 2 : アラート ( " バー 2 " ) 。 ケース 3 : アラート ( " バー 3 " ) 。 ケース 4 : アラート ( " バー 4 " ) 。 //ここには10のバリエーションがあります。 ケース 5 : アラート ( " バー 5 " ) 。 // .. 'case'は提示されましたが、一般的に.. ケース 6 : アラート ( " バー 6 " ) 。 // ..変化量.. ケース 7 : アラート ( " バー 7 " ) 。 // .. 'case'は無制限です ケース 8 : アラート ( " バー 8 " ) 。 ケース 9 : アラート ( " バー 9 " ) 。 ケース 10 : アラート ( 「 バー 10 」 ) 。 休憩 。 デフォルト : アラート ( 「 間違った番号が入力されました 」 ) 。 // 'case'と同じではありません } // 'switch'ボディの終わり // ------------------------------------------------ ------------------------------- return ; //終了する演算子start() } // ------------------------------------------------ -------------------------------
演算子 'switch'では、ExpressionがConstantと等しいことを検出するまで、バリエーション「case」を検索します。 式の値(ここでは整数3)が定数の1つ(ここではケース3)に等しい場合、コロン(ケース3 :)に続くすべての演算子が実行されます。オペレータのブレークになるまでAlert( "Bar 3")、Alert( "Bar 4")、Alert( "Bar 5"スイッチ'。
式の値がいずれの定数とも一致しない場合、コントロールは 'default'のバリエーションに対応する演算子に渡されます。
イチジク。 スクリプトbarnumber.mq4の演算子 'switch'のブロック図。
前のプログラムで実現されたアルゴリズムとは異なり、このケース(図50)では、各バリエーション「ケース」で演算子「ブレーク」を使用していません。 したがって、Expressionの値がConstantsの値の1つと等しい場合、すべての演算子は、対応するVariation 'case'の演算子から開始して実行されます。 また、バリエーション 'default'に対応する演算子が実行されないように、別の目的で最後のバリエーション 'case'で演算子 'break'を使用します。 Constantsの値のうちExpressionと等しい値がない場合、コントロールは 'default'ラベルに対応する演算子に渡されます。
したがって、プリセット変数nの値が1〜10の範囲内にある場合、すべてのバーの番号がn番目のバーから印刷されます。 nの値が上記の範囲を超えている場合、プログラムはユーザーに一致しないことを通知します。
![]() |
注意:バリエーション「ケース」の定数は、プログラムの中で大きさ順に並べる必要はありません。 バリエーション「ケース」と対応する定数がどのようにお互いに続くかの順序は、プログラムのアルゴリズムの必要性によって決まります。 |