Přejít na obsah

Ternární/podmíněný operátor [**]

ternární podmíněný operátor tut tutorial samp pawn vEnd operand

  • Pokud chcete odpovědět, přihlaste se
7 odpovědí

#1
vEnd

vEnd

    Marc Wayne "B-Dup"

  • Globální moderátor
  • Příspěvků: 447
  • Je tu celkem: 38d 21h 6m 16s

*
POPULÁRNÍ

Původně jsem to v plánu neměl, ale rozhodl jsem se, že tu trochu objasním, jak funguje ternární operátor ? :

 

Obtížnost: :2:

 

Jak to funguje

Nejprve trochu nezbytné teorie, tento operátor se nazývá ternární, protože, jako jediný v pawn, pracuje se třemi operandy.

první operand ? druhý operand : třetí operand

_

Operandem nazýváme výraz, se kterým operátor pracuje. Tohle by myslím stačilo, teď se podívejme na to, jak funguje.

logický výraz ? pravda : nepravda

_

Operátor nejprve vyhodnotí logický výraz, pokud je tento výraz pravdivý (true), vrátí to, co je za otazníkem. Pokud je výraz nepravdivý (false), tak vrátí to, co je za dvojtečkou. Uvedu příklad:

#define CERVENA 0xFF0000FF
#define MODRA 0x0000FF00

new color;

color = GetPlayerTeam(playerid) == 1 ? CERVENA : MODRA;

Nejprve dojde k vyhodnocení logického výrazu, kterým je GetPlayerTeam(playerid) == 1. Pokud hráčův tým je skutečně tým s ID 1, tak se do proměnné color uloží hodnota za otazníkem, tedy CERVENA. Pokud ovšem má hráčův tým jiné ID, uloží se do proměnné hodnota za dvojtečkou, tedy MODRA.

 

Využití v praxi

Ne všechno se dá pochopit z teorie, proto je lepší to ukázat na několika příkladech z praxe.

 

Hráčův tým

Vezměme si ještě jednou příklad seshora a trochu jej upravme. Budeme chtít, aby se proměnné color nastavila CERVENA, pokud bude hráčův tým mít ID v rozmezí od 1 do 10. Pokud ne, nastaví se proměnné hodnota MODRA. Jak to lze řešit přes podmínky:

if(GetPlayerTeam(playerid) >= 1 && GetPlayerTeam(playerid) <= 10) color = CERVENA;
else color = MODRA;

_

Jak my to vyřešíme šikovně přes ternární operátor:

color = GetPlayerTeam(playerid) >= 1 && GetPlayerTeam(playerid) <= 10 ? CERVENA : MODRA;

GetPlayerTeam(playerid) >= 1 && GetPlayerTeam(playerid) <= 10 - logický výraz

CERVENA - hodnota, která se uloží, když je logický výraz pravdivý/true

MODRA - hodnota, která se uloží, když je logický výraz nepravdivý/false

 

Pokud se v tom pomalu ztrácíte a přijde vám to nepřehledné, můžete si to ozávorkovat:

color = (GetPlayerTeam(playerid) >= 1 && GetPlayerTeam(playerid) <= 10) ? (CERVENA) : (MODRA);

_

Else if?

Někteří z vás si možná řeknou "A co když potřebuji další podmínku, tedy else if?!" I tohle je samozřejmě pomocí ternárního operátoru možné, ale předem vás varuji, že se v tom možná začnete ztrácet. Zadání je následující: pokud má hráčův tým ID 1, nastaví se CERVENA, pokud má ID 2, nastaví se MODRA, pokud má jiné ID, nastaví se ZELENA.

color = (GetPlayerTeam(playerid) == 1) ? (CERVENA) : ((GetPlayerTeam(playerid) == 2) ? (MODRA) : (ZELENA));

Za dvojtečku jsme přidali další ternární operátor. Pokud se ID rovná jedné, není problém, nastaví se CERVENA. Pokud se jedné nerovná, přeskočí za dvojtečku, zde narazí na další ternární operátor. Vyhodnotí další logický výraz. Pokud se ID rovná dvěma, nastaví se hodnota MODRA. Pokud to nebude ani jedna a ani dva, tak je to logicky jiné ID => nastaví se ZELENA.

 

Šlo by to takhle větvit i dál, vždy by se za dvojtečku přidal další ternární operátor, ale při větším počtu bude lepší využít klasických podmínek, popř. switche. :)

 

Příklad na závěr

A dáme si ještě příklad na závěr. Skloňování v češtině programátorům leckdy dost komplikuje práci, výsledek výpisu hlášek se nám mnohdy nelíbí, například tady:

new pocetHracu = 3,str[145];

format(str,sizeof str,"%i hráčů na serveru.",pocetHracu);
SendClientMessageToAll(-1,str);

_

Server nám vypíše tohle:

3 hráčů na serveru.

_

Ale my chceme, aby vypisoval:

1 hráč na serveru.
2/3/4 hráči na serveru.
5/6/atd. hráčů na serveru.

_

Zkrátka aby to vypsalo správný tvar slova hráč podle počtu. Lze to řešit přes podmínky nebo switch:

switch(pocetHracu)
{
    case 1: format(str,sizeof str,"%i hráč na serveru.",pocetHracu);
    case 2,3,4: format(str,sizeof str,"%i hráči na serveru.",pocetHracu);
    default: format(str,sizeof str,"%i hráčů na serveru.",pocetHracu);
}

_

Ale my si to zkrátíme na jeden řádek pomocí ternárního operátoru. :)

format(str, sizeof str,"%i %s na serveru.",pocetHracu,(pocetHracu == 1) ? ("hráč") : ((pocetHracu < 5) ? ("hráči") : ("hráčů")));

Za specifikátor %s se dosadí jeden z tvarů slova hráč. Je to také krásná ukázka toho, že ternární operátor lze použít i v parametru funkce. Ještě jedno upozornění na závěr, když má tento operátor vracet řetězec, tak jej uzavřete do závorek vždy! Nevím, zda problém stále trvá, ale dříve byly problémy s tím, že když to nebylo v závorkách, pawno mohlo spadnout. Edit: Potvrzeno, problém stále trvá, pokud řetězec do závorek neuzavřete, kompilátor přestane pracovat.

 

 

Tímto ukončuji návod, doufám, že si z něj někteří něco odnesou a že vám tento operátor třeba v něčem ulehčí nebo pomůže. Pokud jste narazili na nějakou chybu nebo se chcete na něco zeptat nebo se jen vyjádřit, pište.

 

Ověřený návod

Tento návod prošel validací, a lze ho proto považovat za ověřený.


  • 7

96b259ac47244701b5097887d9439120.png

I always enjoy meeting people more chemically imbalanced than myself. -Trevor Philips
Roses are gay, violets are gayer, fuck the poem and listen to Slayer.

Roses are red. Violets are blue. When I Listen to Metallica My neighbors do too!

Unix is user friendly. It just happens to be very selective about who it decides to make friends with.

What's the object-oriented way to become wealthy? Inheritance.


#2
Mort

Mort

    The Truth

  • Uživatel
  • Příspěvků: 340
  • :

Zkráceně, ternární operátor je podmínka, ze které musí vést i záporná větev.

Pěkný návod  8-) rep+

 

P.S.

 

 

Ještě jedno upozornění na závěr, když má tento operátor vracet řetězec, tak uzavřete ho do závorek vždy! Nevím, zda problém stále trvá, ale dříve byly problémy s tím, že když to nebylo v závorkách, pawno mohlo spadnout.

Ano, kompilátor přestane pracovat.


  • 0

#3
vEnd

vEnd

    Marc Wayne "B-Dup"

  • Globální moderátor
  • Příspěvků: 447
  • Je tu celkem: 38d 21h 6m 16s

Zkráceně, ternární operátor je podmínka, ze které musí vést i záporná větev.

Pěkný návod  8-) rep+

 

P.S.

Ano, kompilátor přestane pracovat.

je fajn, že jsi to potvrdil, část o řetězci a závorkách upravena

 

jinak k té zkrácené verzi, jako resumé je to fajn :d a díky


  • 0

96b259ac47244701b5097887d9439120.png

I always enjoy meeting people more chemically imbalanced than myself. -Trevor Philips
Roses are gay, violets are gayer, fuck the poem and listen to Slayer.

Roses are red. Violets are blue. When I Listen to Metallica My neighbors do too!

Unix is user friendly. It just happens to be very selective about who it decides to make friends with.

What's the object-oriented way to become wealthy? Inheritance.


#4
eXistenz

eXistenz

    The Truth

  • Uživatel
  • Příspěvků: 322
  • Je tu celkem: 1h 57m 28s

Takto má vyzerať návod, rep+


  • 0

#5
ATomas

ATomas

    RZE for life, SP for ever !

  • Uživatel
  • Příspěvků: 2 770
  • Je tu celkem: 1d 2h 6m 55s

Jen takovy mini detail :d

format(str, sizeof str,"%i %s na serveru.",pocetHracu,(pocetHracu == 1) ? ("hráč") : (pocetHracu > 5) ? ("hráčů") : ("hráči")));

Aby jsi zbytecne nemusel vyhodnocovat podminky tri staci misto ni dat jednu :d

Samozrejme pak kod napsat s tim ohledem jestli se casteji stava ze je hrac 1 nebo jich je vic jak 5 atp..

 

Ja abych pravdu rekl nerad skladam terarni operatory zasebou, protoze pak je dost neprehledy a dost mi to pripomina kdyz v exelu pises vsechnu tu slataninu do jednoho radku :d Pokud teda nejdes pres makro :d


Upraveno uživatelem ATomas: 07 únor 2015 - 23:00:34

  • 0

play.superparba.eu:7777

www.superparba.eu

pawno.cz kazí dva typy lidí:

1. "Najdi do to na googlu/wiki" <- sakra tak od toho je tu ta sekce help ne ? Protože to asi nenašel / nepochopil / neví

2. Ovce. <- Člověk by se mohl smát kdyby to nebylo tak smutné jak tu někdo zavedl termín kid/děcko a všichni ho začali bezhlavě používat na každého, kdo se jenom opováží na něco zeptat nebo projevit svůj nazor.

 


#6
vEnd

vEnd

    Marc Wayne "B-Dup"

  • Globální moderátor
  • Příspěvků: 447
  • Je tu celkem: 38d 21h 6m 16s

Jen takovy mini detail :d

format(str, sizeof str,"%i %s na serveru.",pocetHracu,(pocetHracu == 1) ? ("hráč") : (pocetHracu > 5) ? ("hráčů") : ("hráči")));

Aby jsi zbytecne nemusel vyhodnocovat podminky tri staci misto ni dat jednu :d

Samozrejme pak kod napsat s tim ohledem jestli se casteji stava ze je hrac 1 nebo jich je vic jak 5 atp..

upraveno


  • 0

96b259ac47244701b5097887d9439120.png

I always enjoy meeting people more chemically imbalanced than myself. -Trevor Philips
Roses are gay, violets are gayer, fuck the poem and listen to Slayer.

Roses are red. Violets are blue. When I Listen to Metallica My neighbors do too!

Unix is user friendly. It just happens to be very selective about who it decides to make friends with.

What's the object-oriented way to become wealthy? Inheritance.


#7
jenkings

jenkings

    Frajer s.r.o

  • Uživatel
  • Příspěvků: 839
  • Je tu celkem: 1d 15h 53m 30s

 #define CERVENA 0xFF0000FF
 
#define MODRA 0x0000FF00

new color;

color = GetPlayerTeam(playerid) == 1 ? RED : MODRA;

 

 

 

 

Možná by to chtělo udělat si v tom trochu pořádek ;)


  • 0

c39184173ac10a90f8b682f9e7533036.gif


#8
vEnd

vEnd

    Marc Wayne "B-Dup"

  • Globální moderátor
  • Příspěvků: 447
  • Je tu celkem: 38d 21h 6m 16s

 #define CERVENA 0xFF0000FF
 
#define MODRA 0x0000FF00

new color;

color = GetPlayerTeam(playerid) == 1 ? RED : MODRA;

 

 

 

 

Možná by to chtělo udělat si v tom trochu pořádek ;)

vidím vidím, chtěl jsem mít všechny identifikátory v češtině, ale můj návyk zapisovat je anglicky nakonec vyhrál :d upraveno


  • 0

96b259ac47244701b5097887d9439120.png

I always enjoy meeting people more chemically imbalanced than myself. -Trevor Philips
Roses are gay, violets are gayer, fuck the poem and listen to Slayer.

Roses are red. Violets are blue. When I Listen to Metallica My neighbors do too!

Unix is user friendly. It just happens to be very selective about who it decides to make friends with.

What's the object-oriented way to become wealthy? Inheritance.






Také označeno jedním nebo více klíčovými slovy: Návod, ternární, podmíněný, operátor, tut, tutorial, samp, pawn, vEnd, operand

0 uživatelů si prohlíží toto fórum

0 uživatelů, 0 návštěvníků 0 anonymních uživatelů

© 2015 IPS, Inc.

TOPlist

Zajímat Vás mohou ještě aktuální zprávy. sleviště, slevy dnes Herbalife je skvělou cestou pro dobré zdraví. Je libo dětský web?