MQL4ブック MT4

演算子 'continue'

スポンサードリンク

Contents

演算子 'continue'

 

場合によっては、コード内でサイクルを使用すると、現在の繰り返しの処理を早期に終了し、サイクル本体を構成する残りの演算子を実行せずに次の処理に進む必要があります。 そのような場合は、演算子 'continue'を使用する必要があります。

演算子 'continue'の形式

 

演算子 'continue'は1語で構成され、 ";"で終わります。 (セミコロン)。

 continue ;        //オペレータ 'continue'

演算子の実行ルール「続行」

 

演算子 'continue'は、最も近いサイクル演算子 'while'または 'for'の現在の反復の実行を停止します。 演算子 'continue'の実行は、最も近いサイクル演算子 'while'または 'for'の次の繰り返しになります。 演算子 'continue'は、上記のサイクル演算子の本体でのみ使用できます。

演算子 'continue'を実際にどのように使用できるかを考えてみましょう。

問題16.最初の農場には羊1000頭があります。 最初の農場の羊の量は1日1%増加します。 月末に羊の量が50,000を超えると、羊の10%が第2の養殖場に移されます。 第2農場の羊の量はいつのうちに35,000に達するでしょうか? (私たちは月に30営業日かかると考えています。)

この問題を解決するアルゴリズムは明らかです。最初のファームで羊の総量を計算するサイクルを構成する必要があります。 問題の声明によると、羊は月末に2番目の農場に移されます。 それは、今月の羊の蓄積が計算されるもう1つの(内部)サイクルを作り出さなければならないことを意味します。 次に、50,000頭の羊の限界を超えているかどうかを、月末に点検する必要があります。 そうであれば、2番目の農場に移す羊の量を月末に、2番目の牧場の羊の総量を計算する必要があります。

検討中のアルゴリズムは、スクリプトsheep.mq4で実現されています。 演算子 'continue'は、外部サイクルで計算を行うためにここで使用されます。

 // ------------------------------------------------ ------------------------------------- 
  // sheep.mq4 
  // コードは教育目的でのみ使用する必要があり ます。 
  // ------------------------------------------------ ------------------------------------- 
  int start () //特殊な関数start() 
  { 
  // ------------------------------------------------ ------------------------------------- 
  int 
  day  //その月の現在の日 
  Mons ;  //検索月数 
  ダブル 
  One_Farm = 1000.0  //第1ファームの羊 
  Perc_day = 1  //毎日の増加率(% 
  One_Farm_max = 50000.0  //シープリミット 
  Perc_exit = 10  //月単位の出力(%単位) 
  Purpose = 35000.0  //ファーム2の所要量 
  Two_Farm ;  //ファーム2の現在の量 
  // ------------------------------------------------ ------------------------------------- 
  while  Two_Farm < 目的  //履歴の外部サイクル 
  { //外部サイクル本体の開始 
  // ------------------------------------------------ ------------------------------- 
  for  day = 1 ; day <= 30 ; day ++  //月のサイクル 
  One_Farm = One_Farm *  1 + Perc_day / 100  ;  //第1農場での累積 
  // ------------------------------------------------ ------------------------------- 
  Mons ++;  //月を数える 
  if  One_Farm < One_Farm_max  //量が上限を下回っている場合。 
  続ける ;  // ..羊を移さない 
  Two_Farm = Two_Farm + One_Farm * Perc_exit / 100 ;  //第2農場の羊 
  One_Farm = One_Farm *  1 - Perc_exit / 100  ;  //第1ファームの残り 
  } //外部サイクル本体の終わり 
  // ------------------------------------------------ ------------------------------------- 
  Alert " 目標は " , Mons, " 月以内に 達成される "  ;  //画面に表示する 
  return ;  //終了関数start() 
  } 
  // ------------------------------------------------ -------------------------------------

プログラムの開始時には、通常、変数が記述されコメントされます。 計算自体は 'while'サイクルで実行されます。 実行後、対応するメッセージが表示されます。 目的が達成されるまで、すなわち第2農場の羊の総量が期待値35 000に達するまで、外部サイクル「while」の計算が実行されます。

'for'の内部サイクルは非常に簡単です:毎日天秤の値が1%増加します。 問題の声明によれば、ヒツジは月末にのみ譲渡することができるため、このサイクルでは合計分析は行われません。 したがって、「for」サイクルを終了した後、変数One_Farmは、第1のファーム上のヒツジの量と等しい値を有する。 その直後に、変数Monsの値が計算されます。これは、外部サイクル 'while'の各繰り返しの実行時に1ずつ増加します。

最初の農場での現在の羊の量に応じて、以下の2つの処置のうちの1つが実行されます。

  • 第1農場の羊の量が制限値50 000を超える場合、第1農場の羊の10%を第2農場に移す必要があります。
  • さもなければ、最初の農場の羊は最初の農場に留まり、さらに飼育されます。

アルゴリズムは演算子 'if'を使用して分岐されます。

  if  One_Farm < One_Farm_max  // 量が上限を下回っている場合 、。 
      continue ;  // .. 羊を移さない

これらのコード行は、次のように特徴付けられます。最初のファームのヒツジの量が制限値50 000を下回っている場合は、演算子 'if'の本体を構成する演算子を実行します。 最初の反復では、最初の農場の羊の量は制限値よりも小さくなるので、コントロールは演算子 'if'の本体、つまり演算子 'continue'に渡されます。 演算子 'continue'の実行は、次のことを意味します。最も近い実行サイクルの現在の反復を終了します(この場合は、演算子 'while'のサイクルです)、サイクル演算子のヘッダーに制御を渡します。 サイクルオペレータの 'while'ボディの一部でもある次のプログラム行は実行されません。

  Two_Farm = Two_Farm + One_Farm * Perc_exit / 100 ;  // 第2農場の羊 
  One_Farm = One_Farm *  1 - Perc_exit / 100  ;  // 第1ファームの残り

これらの上の行では、第2の農場でのヒツジの到達量と第1の農場での残りのヒツジが計算されます。 最初の農場で50,000頭の羊の限界にまだ達していないので、最初の反復でこれらの計算を行うことは不可能です。 これは、現在の反復でそれらを実行せずにこれらの行をスキップすることからなるオペレータ '継続'の本質です。

演算子 'continue'が実行されると、サイクル演算子 'while'のヘッダーに制御が渡されます。 次に、サイクル演算子の条件がテストされ、次の繰り返しが開始されます。 最初のファームのヒツジの量が所定の限界に達するまで、サイクルは同じアルゴリズムに従って実行され続けます。 Monsの値は繰り返しごとに累積されます。

計算の特定の段階で、第1の牧場の羊の量は、50,000頭の所定限界に達するか、またはそれを超える。 この場合、演算子 'if'の実行時に条件(One_Farm <One_Farm_max)が偽になるので、演算子 'if'の本体に制御は渡されません。 つまり、演算子 'continue'は実行されませんが、コントロールはサイクルの最後の2行の最初の行に渡されます。まず、プログラムは2番目のファームの羊の量を計算します最初の農場での羊の残りの量。 これらの計算が完了すると、 'while'サイクルの繰り返しが終了し、コントロールが再びサイクルヘッダーに渡されます。 以下は、スクリプトsheep.mq4で実現されるアルゴリズムのブロック図です。

イチジク。 オペレータ '続行'が外部サイクル( sheep.mq4 )の反復を中断するプログラムのブロック図。

この図では、演算子 'if'の条件の実行に応じて、制御がすぐにサイクル 'while'のヘッダーに渡されることがわかります(演算子 'continue'の実行の結果として) )、またはいくつかの演算子が最初に実行され、その後、コントロールはサイクル 'while'のヘッダーに引き続き渡されます。 いずれの場合も、サイクルの実行は終了しません。

サイクル本体にオペレータ 'continue'が存在しても、必ずしも現在の反復が終了するとは限りません。 これは、実行する場合、つまりコントロールが渡された場合にのみ発生します。

サイクル演算子 'while'の各次の反復で、変数Two_Farmの新しい到達値が計算されます。 この値があらかじめ定義された制限(35 000)を超えると、サイクル演算子 'while'の条件は偽になります。したがって、サイクル中の計算はもう実行されませんが、コントロールはパスされますサイクル演算子に続く最も近い演算子に転送します。

  Alert " 目的は    ", Mons , " 月。  "  ; //画面に表示する

Alert()関数を実行すると、次の行が表示されます。

目標は17ヶ月以内に達成される。

演算子 'return'は特殊関数start()の実行を完了します。この結果、制御はクライアント端末に渡されますが、スクリプトの実行は完了し、シンボルウィンドウからアンロードされます。

上記のアルゴリズムはまた、サイクル 'while'からの標準的な終了を提供する。 より一般的なケースでは、サイクルの終了は演算子 'break'(特別な終了)の実行から生じることがあります。 しかし、サイクルを閉じるための方法も他の方法も、演算子 'continue'を使用した現在の反復の中断に関連していません。

演算子「実行」の実行ルールでは、「最も近い演算子」というフレーズが使用されます。 それはプログラムラインが互いに近くにあることを意味するものではありません。 スクリプトsheep.mq4のコードを見てみましょう。 演算子 'for'は、サイクル 'while'のヘッダよりも演算子 'continue'に「近い」。 しかし、これは何も意味するものではありません。演算子 'continue'は、体の外側にあるため、 'for'サイクルとは関係ありません。 一般的なケースでは、プログラムは複数の入れ子になったサイクル演算子を含むことができます。 演算子 'continue'は、常にその1つの本体にあります。 同時に、内部サイクル演算子の一部としての演算子「continue」は、もちろん、外部サイクル演算子の内部にもあります。 「最も近いサイクルオペレータの現在の反復の実行を停止する」というフレーズは、オペレータ 'continue'が、オペレータ 'continue'が位置する本体内の最も近いサイクルオペレータに影響を及ぼすことを意味するべきである。 それを視覚化するために、問題文を少し変更しましょう。

 

問題17. 1つの農場に1000頭のヒツジがあります。 この最初の農場での羊の量は毎日1%増加します。 その日、最初の農場の羊の量が50,000に達すると、羊の10%が2番目の牧場に移されます。 第2農場の羊の量はいつのうちに35,000に達するでしょうか? (私たちは月に30営業日かかると考えています。)

問題17の解決策は、スクリプトothersheep.mq4で実現されています。 この場合、演算子 'continue'は外部サイクルと内部サイクルの両方の計算に使用されます。

  // ----------------------------------------------------- -------------------- 
  // othersheep.mq4 
  // コードは教育目的のみに使用する必要があります    
  // ----------------------------------------------------- -------------------- 
  int start () //特殊な関数start() 
  { 
  // ----------------------------------------------------- -------------------- 
  int 
  day  // その月の現在の日 
  Mons ;  // 検索月数 
  ダブル 
  One_Farm = 1000.0  // 第1ファームの羊 
  Perc_day = 1  // 毎日の増加率(% 
  One_Farm_max = 50000.0  // シープリミット 
  Perc_exit = 10  // 1回限りの出力(% 
  Purpose = 35000.0  // ファーム2の所要量 
  Two_ファーム ;  // ファーム2の現在の量 
  // ----------------------------------------------------- -------------------- 
  while  Two_Farm < 目的  //目的が達成されるまで 
  { // 外部サイクル本体の開始 
  // ------------------------------------------------ -------------- 
  for  day = 1 ; day <= 30 && Two_Farm < 目的 ; day ++  //日単位のサイクル 
  { 
  One_Farm = One_Farm *  1 + Perc_day / 100  ;  //ファーム1で累積されます 
  if  One_Farm < One_Farm_max  // 量が上限を下回っている場合 、。 
  続ける ;  // .. 羊を移さない 
  Two_Farm = Two_Farm + One_Farm * Perc_exit / 100 ;  // ファーム 2で 累積 
  One_Farm = One_Farm *  1 - Perc_exit / 100  ;  // ファーム1の残り 
  } 
  // ------------------------------------------------ -------------- 
  if  Two_Farm > = 目的  //目的が達成されたら.. 
  続ける ;  // ..月を数えません 
  Mons ++;  //月を数えます 
  } //外部サイクル本体の終わり 
  // ----------------------------------------------------- -------------------- 
  アラート   目的は           」の  に達成され ます   
  return ;  //終了関数start() 
  } 
  // ----------------------------------------------------- --------------------

この問題を解決するには、毎日の羊の量を分析する必要があります。 この目的のために、

  if  One_Farm < One_Farm_max  // 量が上限を下回っている場合 、。 
  続ける ;  // .. 羊を移さない 
  Two_Farm = Two_Farm + One_Farm * Perc_exit / 100 ;  // ファーム 2で 累積 
  One_Farm = One_Farm *  1 - Perc_exit / 100  ;  // ファーム1の残り

月の日に編成された内部サイクルに移行されます。 特定の量のヒツジが第2の農場に移されることは明らかであり、この場合は月末ではなく、第1の農場のヒツジの量が所定の値に達する日である。 ここで演算子 'continue'を使用する理由は同じです:1つのファームから別のファームへの羊の移動に関連する計算を含む行をスキップします。つまり、これらの行を実行したくありません。 オペレータ 'continue'は、最も近いサイクルオペレータ、この場合はサイクルオペレータ 'for'に影響を与えるため、シープが転送されたかどうかにかかわらず、月の日に作成されたサイクル 'while'は独立して中断されません。

サイクル演算子forの条件として複雑な式を使用しました。

  for  day = 1 ; day <= 30 && Two_Farm < 目的 ; day ++  //日単位のサイクル

&&( "and")演算を使用すると、両方の条件が真である限りサイクルが実行されます。

  • 月がまだ終了していない、すなわち、変数 'day'の範囲は1から30です。 そして
  • 第2の農場の羊の量は、まだ所定の値に達していない。すなわち、変数Two_Farmが目的(35 000)より小さい。

少なくとも1つの条件が満たされない(偽になる)と、サイクルは停止します。 'for'サイクルの実行が(何らかの理由で)停止されている場合、コントロールは演算子 'if'に渡されます。

  if  Two_Farm > = 目的  // 目的が達成され たら.. 
  続ける ;  // .. 月を数えません 
  Mons ++;  //月を数えます

2番目のファームのヒツジの量が期待値を下回っている場合にのみ、プログラムは数ヶ月のカウントを続ける必要があります。 目標がすでに達成されている場合、変数Monsの値は変更されませんが、制御(「継続」の実行の結果として)は、最も近いサイクル演算子のヘッダーに渡されます。サイクル演算子 'while'。

入れ子になったサイクルでの演算子 'continue'の使用を図4に示します。 以下の48。

イチジク。 ネストされたサイクルに基づくアルゴリズムのブロック図。 各サイクル本体には演算子 'continue'( othersheep.mq4 )が含まれています。

上記の例では、各サイクル(外部および内部)に、その「独自の」最も近いサイクルにのみ影響するが、他のサイクルではイベントに影響を及ぼさない1つの演算子「継続」があります。 一般に、サイクル本体では、条件の合致の結果として現在の反復を中断することができるいくつかの演算子「continue」を使用することができます。 サイクル本体内の演算子「継続」の量は制限されません。

スポンサードリンク

-MQL4ブック, MT4
-,

© 2024 FX・ビットコイン・オプションのシステムトレード開発と取引録 Powered by AFFINGER5