2. MQL4 dla początkujących. Część II.

2.8. Operator pętli while

Operator pętli while służy do realizacji powtarzalnych działań dopóki warunek, zapisany w jego nagłówku, jest prawdziwy. Jeśli ten warunek staje się fałszywy to pętla zostanie przerwana i program przejdzie do kolejnego działania, zapisanego po while. W MQL4 schemat tej pętli wygląda w następujący sposób:

Kod 1
while(condition)
  {
    // powtarzalne działanie
  }

Przeanalizuj poniższy przykład.

Kod 2
>#property strict

void OnStart()
  {
   int    A = 0;
   double Result = 1.0;

//--- pętla 'while'
   while(A < 10)
     {
      Result *= 2;  // mnożenie Result na 2
      A++;          // zwiększenie A o 1
     }

//--- wyświetlić wynik
   Print("Result = " , Result);  // Result = 1024.0
  }

Najpierw tworzymy zmienną A i przypisujemy jej wartość 0, która dalej będzie pełnić rolę licznika. Następnie, tworzymy zmienną Result, która od razu ma wartość 1.0 i która dalej będzie przechowywać wynik obliczenia. W nagłówku operatora while zapisaliśmy warunek A < 10, który mówi o tym, że należy powtarzać działania zapisane w ciele pętli, tj. między { } dopóki jest on prawdziwy.

Przed realizacją 1-ej iteracji, kiedy A = 0, operator while sprawdzi czy warunek jest prawdziwy (0 < 10 - prawda) i dopiero potem umożliwi obliczenia zapisane w ciele pętli. Skrypt obliczy wynik jako 1.0 razy 2 co daje Result = 2.0. Drugą i ostatnią instrukcją w tej iteracji będzie zwiększenie licznika A o 1 (A++). Po czym A = 1. Koniec 1-ej iteracji.

Zanim while przystąpi do 2-ej iteracji, najpierw sprawdzi czy warunek nadal jest prawdziwy (1 < 10 - prawda). Ok, przystępujemy do realizacji 2 iteracji, podczas której Result będzie pomnożony na 2. Pamiętamy, że po 1-ej iteracji Result był już równy 2.0, dlatego teraz Result = 4.0, a A = 2. Koniec 2-ej iteracji.


Nie trudno się domyśleć, że ostatnie obliczenie zmiennej Result będzie miało miejsce przy A = 9 (Result = 1024.0). Pod koniec tej iteracji A już będzie równe 10 i kiedy takie A zostanie znowu podstawione do nagłówka while, wtedy warunek będzie fałszywy (10 < 10 - fałsz) i pętla zostanie przerwana.

W przypadku jeśli warunek od samego początku będzie fałszywy, to operator while w ogóle nie dopuści do realizacji żadnej iteracji. W powyższym przykładzie wpisz while(A < -1) i uruchom skrypt. W tym przypadku już przed 1-ą iteracją warunek będzie fałszywy ( 0 < -1 - fałsz). W logach terminala skrypt wydrukuje "Result = 1.0”, tj. taki sam jak przy inicjalizacji tej zmiennej.

W odróżnieniu od pętli for pętla while nie posiada wbudowanego licznika, który zatrzymuje jej działanie. while jest pętlą sterowaną warunkiem, tj. dopóki warunek jest prawdziwy dopóty pętla ma się powtarzać. W związku z tym trzeba uważać, aby nie wpaść w nieskończoną pętlę, kiedy warunek zawsze będzie prawdziwy jak w poniższym kodzie.

Kod 3
#property strict

void OnStart()
  {
   int    A = 0;
   double Result = 1.0;

//--- pętla 'while'
   while(A < 10)    // nieskończona pętla !
     {
      //--- wyświetlić wynik
      Print("Result = " , Result);
     }
//---
  }

Tutaj widać, że warunek w nagłówku while zawsze będzie prawdziwy, ponieważ nigdzie w pętli licznik A się nie zmienia. W tej sytuacji może pomóc tylko wymuszone zamknięcie terminala.

Może nasunąć się pytanie: kiedy używać for a kiedy while? Pętlę for najlepiej używać wtedy, gdy liczba iteracji (powtórzeń) jest znana, np. podczas przetwarzania tablic, gdzie znana jest liczba elementów. Natomiast pętlę while najlepiej używać wtedy, gdy liczba iteracji nie jest znana i jej przerwanie zależy od spełnienia określonego warunku.