A ‘switch’ operátor
Néhány program algoritmusa több elágazást tartalmaz különféle variációban. Ilyen esetben nagyon kényelmes a 'switch’ operátort használni különösen ott ahol több tíz vagy több száz a variációk száma, mert az ‘if’ operátor kódja nagyon terjedelmessé válik, ha sok egymásba ágyazott operátort használunk.
A 'switch' operátor formátuma
A 'switch' operátor a fejlécből és a végrehajtható testből áll. A fejléc tartalmazza az operátor nevét és egy zárójelbe zárt kifejezést. Az operátortörzs egy vagy több 'case' variációt tartalmaz, valamint az alapértelmezett ‘default' variációt.
Mindegyik 'case' variáció a 'case' kulcsszóból, egy állandóból, egy ’:’ (kettőspontból), és operátorokból áll. A 'case' variációk száma nem korlátozott.
A ‘default' (alapértelmezett) variáció a 'default' kulcsszóból, ’:’ (kettőspontból), és operátorokból áll. Általában a 'default' variációt a 'switch' operátor törzsében utolsóként helyezzük el, de azt bárhol lokalizálhatjuk az operátortörzsön belül, vagy akár hiányozhat is.
switch ( Kifejezés ) // Operátor header
{ // Nytó kapcsoszárójel
case Paraméter: Operátorok // Egy 'case' variáció
case Paraméter: Operátorok // Egy 'case' variáció
...
[default: Operators]
} // Záró kapcsoszárójel
A Kifejezés és a parameterek értékei csak int típusú értékek lehetnek. A Kifejezés egy állandó, egy változó, egy függvényhívás vagy egy kifejezés lehet. A 'case' variációk lehetnek: egész számállandók, karakterállandók vagy állandókat tartalmazó kifejezések. Az állandó kifejezés nem tartalmazhat változókat vagy függvényhívásokat.
A ‘switch’ operátor használatának szabályai
Figyelem!
A programnak, abban az esetben, ha valamely 'case' variációban a Paraméter értéke ugyanaz, mint a fejlécben lévő kifejezés értéke, át kell adnia a vezérlést annak az első operátornak, ami a 'case' variáció ”:”-ja (kettőspont) után következik, majd azután egyenként végre kell hajtania minden operátort, amely a 'switch' operátortörzsben található. A Kifejezés és a Paraméterek közötti egyenlőség feltételét fentről és balról jobbra teszteli a program. A Paraméterek értékeinek a különböző 'case' variációkban nem szabad azonosnak lenniük. A 'break' operátor megszakíthatja a 'switch' operátor végrehajtását és átadhatja a vezérlést annak az operátornak, amely a 'switch' operátort követi.
Könnyű észrevenni, azt hogy a 'case Paraméter:' csak egy olyan címke, ami a vezérlés átvételét jelenti. A 'switch' operátor testét alkotó operátorok végrehajtása ettől a címkétől kezdődik. Ha a programalgoritmus szerint az összes variációból csak egy 'case' variációban leírt operátorcsoport végrehajtására van szükség, akkor az operátorcsoportokban az operátorok felsorolását a 'break' operátorral kell befejezni. A ‘switch' operátor használatára lássunk néhány példát!
A példák a 'switch' operátorokra
Feladat
18. feladat: Alkoss egy olyan programot, ahol a következő feltételeket kell teljesíteni: Ha az ár meghaladja az előre definiált szintet, a programnak tájékoztatnia kell erről a kereskedőt, egy szöveges üzenetben, ahol a szint túllépést szavakba jelenítjük meg (10 pontig); egyéb esetben a programnak tájékoztatnia kell arról, hogy az ár nem haladta meg előre definiált szintet.
Lent látható a probléma megoldása a 'switch' operátor alkalmazásával (Expert Advisor pricealert.mq4):
//-------------------------------------------------------------------------------------
// pricealert.mq4
// The code should be used for educational purpose only.
//-------------------------------------------------------------------------------------
int start() // Special function 'start'
{
double Level=1.3200; // Preset price level
int Delta=NormalizeDouble((Bid-Level)Point,0); // Excess
if (Delta<=0) // Price doesn't excess the level
{
Alert("The price is below the level"); // Message
return; // Exit start()
}
//-------------------------------------------------------------------------------------
switch(Delta) // Header of the 'switch'
{ // Start of the 'switch' body
case 1 : Alert("Plus one point"); break;// Variations..
case 2 : Alert("Plus two points"); break;
case 3 : Alert("Plus three points"); break;
case 4 : Alert("Plus four points"); break;//Here are presented
case 5 : Alert("Plus five points"); break;//10 variations 'case',
case 6 : Alert("Plus six points"); break;//but, in general case,
case 7 : Alert("Plus seven points"); break;//the amount of variations 'case'
case 8 : Alert("Plus eight points"); break;//is unlimited
case 9 : Alert("Plus nine points"); break;
case 10: Alert("Plus ten points"); break;
default: Alert("More than ten points"); // It is not the same as the 'case'
} // End of the 'switch' body
//-------------------------------------------------------------------------------------
return; // Exit start()
}
//-------------------------------------------------------------------------------------
Ebben a problémamegoldásban a 'switch' operátort használjuk, ahol mindegyik ‘case' variációban ‘break' operátort alkalmazunk. A Delta változó értékétől függően a vezérlés az egyik 'case' variációhoz kerül. Ennek következtében, az ebben a variációban lévő operátorokat végrehajtják: Alert() függvény és 'break' operátor. A 'break' operátor leállítja a 'switch' operátor végrehajtását, vagyis a vezérlést ezen kívül helyezi a ‘return' operátornak, amely befejezi a start() függvény. Így a Delta változó értékétől függően a 'case' variációk egy részét feldolgozzuk, míg a másik részük feldolgozatlan marad.
A fenti program egy Expert Advisor, vagyis az el fog indulni minden ticknél és ezért mindig az aktuális helyzetnek megfelelő üzenetet küldi. Természetesen nekünk esetleg módosítanunk kell a Level értékét annak a szimbólumnak a jelenlegi árához közelebbi értékre, amely szimbólum ablakához csatoljuk ezt az EA-t.
49.
ábra. A 'switch' operátor blokkdiagramja pricealert.mq4
EA-ban.
A fenti blokkdiagramban világosan láthatjuk azt, hogy a 'break' operátor jelenléte miatt ki tudunk lépni mindegyik 'case' variációból az ebben a variációban lévő operátorok végrehajtása után a 'switch' operátoron kívülre. Ennek az algoritmusszerkezetnek hasonló elve, a 'switch' operátor használatának tekintetében, mint az stdlib.mq4 fájnak, aminek az elérési útja: (..\experts\libraries\stdlib.mq4) .
Találjunk egy másikfeladatot ahol nincs mindegyik ‘case' variációban 'break’ operátor.
Feladat
19. feladat: Van 10 bár. Meg kell jeleníteni a bárok számát n-től kezdődően.
Meglehetősen könnyű kódolni ennek a feladatnak a megoldását (barnumber.mq4 script ):
//------------------------------------------------------------------------------
// barnumber.mq4
// The code should be used for educational purpose only.
//------------------------------------------------------------------------------
int start() // Special function start()
{
int n = 3; // Preset number
Alert("Bar numbers starting from ", n,":");// It does not depend on n
//------------------------------------------------------------------------------
switch (n) // Header of the operator 'switch'
{ // Start of the 'switch' body
case 1 : Alert("Bar 1"); // Variations..
case 2 : Alert("Bar 2");
case 3 : Alert("Bar 3");
case 4 : Alert("Bar 4"); // Here are 10 variations ..
case 5 : Alert("Bar 5"); // ..'case' presented, but, in general, ..
case 6 : Alert("Bar 6"); // ..the amount of variations..
case 7 : Alert("Bar 7"); // ..'case' is unlimited
case 8 : Alert("Bar 8");
case 9 : Alert("Bar 9");
case 10: Alert("Bar 10");break;
default: Alert("Wrong number entered");// It is not the same as the 'case'
} // End of the 'switch' body
//-------------------------------------------------------------------------------
return; // Operator to exit start()
}
//-------------------------------------------------------------------------------
A 'switch' operátorban, a program addig fog keresni a 'case' variációk között, amíg azt nem észleli, hogy a Paraméter egyenlő a fejlécben lévő Kifejezéssel. Mikor a Kifejezés értéke (ez esetben ez 3) egyenlő valamely Paraméterrel (itt van ilyen ez 3), minden operátort, ami az adott variációban (case 3:) a kettőspontot követ végre fogunk hajtani. Az Alert(" Bar 3”), függvényhívást, aztán a következőket Alert("Bar 4”), Alert("Bar 5”), stb. addig, amíg a 'break' operátorhoz nem érünk, amely befejezi a 'switch' operátor működését.
Ha a Kifejezés értéke nem esik egybe semelyik Paraméter értékével sem, a vezérlést megkapja az az operátor(csoport), amelyik a 'default' variációhoz tartozik:
50. ábra: A 'switch' operátor blokkdiagramja a
barnumber.mq4
scriptben.
Az előző programban megvalósított algoritmustól eltérően, ebben az esetben (50. ábra), nem használjuk a 'break' operátort mindegyik 'case' variációba. Ezért, ha az Kifejezés értéke egyenlő valamely Paraméter értékével minden operátort végre fog hajtódni, ami az egyezés utáni 'case' variációkhoz tartozik. Egy fontos feladata van az utolsó 'case' variációhoz tartozó 'break’ operátornak: megakadályozni a 'default 'variációhoz tartozó operátorok végrehajtását. Ha nincs egyezés az Kifejezés és a Paraméterek értékei között, a vezérlést a 'default' variációhoz tartozó operátorok fogják megkapni.
Ha az előre beállított n változó értéke az 1-től 10-ig tartó érték tartományon belül van, minden bár száma megjelenítésre kerül n-től kezdődően. Ha az n értéke a fenti tartományon kívül van, a program nem fog üzenetet küldeni a felhasználónak.
Figyelem!
Jegyezd meg: Nem szükséges a 'case' variációkat a Kifejezések értéke szerint rendezni a programodban. A case' variációk Kifrjezéseinek a feltételei a programod algoritmusának megfelelő sorrendben kövessék egymást.