Szerző Téma: Else if ág pontosan, hogyan is müködik?  (Megtekintve 973 alkalommal)

Else if ág pontosan, hogyan is müködik?
« Dátum: 2013. július 11. - 20:21:29 »
0 Show voters
Kezdõ pawn tanuló vagyok.
Az alábbi kód logikai mûködését nem látom át teljesen:
 
CMD:pm( playerid, params[  ] ) {
    //Tároló létrehozása az azonosítónak, és az üzenetnek
    new iPid;
    new szMsg[ 100 ];
    if( sscanf( params, \"is[100]\", iPid, szMsg ) ) {
        SendClientMessage( playerid, COLOR_RED, \"Használat: /pm < JátékosID > < Üzenet >\" );
    } else if( !IsPlayerConnected( iPid ) || IsPlayerNPC( iPid ) ) {
        SendClientMessage( playerid, COLOR_RED, \"Érvénytelen azonosító!\" );
    } else {
        new szStr[ 128 ];
        format( szStr, sizeof szStr, \"[ PM ]: %s( %i ): %s\", GetPlayerNameEx( playerid ), playerid, szMsg );
        SendClientMessage( iPid, COLOR_YELLOW, szStr );
    }
    return 1;
}
GetPlayerNameEx( playerid ) {
    new z[ MAX_PLAYER_NAME ];
    GetPlayerName( playerid, z, sizeof z );
    return z;
}

 
Azt értem, hogy  sscanf feldarabolja a karakterláncokat és változókba menti.
Az nem világos számomra, hogy az if ágakban, hogyan zajlanak pontosan a dolgok.
Az világos, hogy a \'sima\' if így müködik:
 
if (feltétel)
{
// utasításokat hajt végre itt, ha a feltétel igaz
}
else
{
// utasításokat hajt végre itt, ha a feltétel hamis
}

 
Az elsõ feltétel utasítás:
 
    if( sscanf( params, \"is[100]\", iPid, szMsg ) ) 
{
        SendClientMessage( playerid, COLOR_RED, \"Használat: /pm < JátékosID > < Üzenet >\" );
    }

 
Mikor írja ki, hogy \"Használat: /pm < JátékosID > < Üzenet >\"?
Akkor írja ki, amikor a játékos nem ír be paramétert, és akkor a \"feltétel\" igaz lesz?
Amikor ír be paramétert akkor hamis lesz az ág?
 
else if( !IsPlayerConnected( iPid ) || IsPlayerNPC( iPid ) ) 
{
        SendClientMessage( playerid, COLOR_RED, \"Érvénytelen azonosító!\" );
}

 
else if utasítást nem értem, több feltétel vizsgálatakor használjuk amikor az elsõ if feltétele nem igaz?
Azt értem, hogy || vagy operátornál, a feltétel feljesül, akkor kiírja, hogy \"Érvénytelen azonosító!\", de azt nem értem, miért pont \"else if\" van ott.
 
else 
{
        new szStr[ 128 ];
        format( szStr, sizeof szStr, \"[ PM ]: %s( %i ): %s\", GetPlayerNameEx( playerid ), playerid, szMsg );
        SendClientMessage( iPid, COLOR_YELLOW, szStr );
}

Nem elérhető Flash

  • 5726
  • (っ◕‿◕)っ
    • Profil megtekintése
Else if ág pontosan, hogyan is müködik?
« Válasz #1 Dátum: 2013. július 11. - 20:41:14 »
0 Show voters
Így sokkal egyszerûbb és spórolsz a sorokkal is.
 
CMD:pm(playerid, params[] ) {
    //Tároló létrehozása az azonosítónak, és az üzenetnek
    new iPid, szMsg[128];
    if(sscanf(params, \"is[128]\", iPid, szMsg ) ) return SendClientMessage( playerid, COLOR_RED, \"Használat: /pm < JátékosID > < Üzenet >\" );
    if(!IsPlayerConnected(iPid) || IsPlayerNPC(iPid)) return SendClientMessage( playerid, COLOR_RED, \"Érvénytelen azonosító!\" );
    new szStr[ 128 ];
    format( szStr, sizeof szStr, \"[ PM ]: %s( %i ): %s\", GetPlayerNameEx( playerid ), playerid, szMsg );
    SendClientMessage( iPid, COLOR_YELLOW, szStr );
    SendClientMessage(playerid, -1, \"Privát üzenet elküldve.\");
    return 1;
}

Else if ág pontosan, hogyan is müködik?
« Válasz #2 Dátum: 2013. július 11. - 22:17:39 »
0 Show voters
Gyakorlatilag arról van szó hogy egyetlen egy utasítás fog megtörténni egyszeri lefutás alkalmával:
Próbáld ki mit csinál a következõ kód:
 
   new
rand = 5;
//
if(0 < rand)       printf(\"1 rand értéke : %d\", rand);
else if(1 < rand)   printf(\"2 rand értéke : %d\", rand);
else if(2 < rand)   printf(\"3 rand értéke : %d\", rand);
else if(3 < rand)   printf(\"4 rand értéke : %d\", rand);
else if(4 < rand)   printf(\"5 rand értéke : %d\", rand);
else          printf(\"6 rand értéke : %d\", rand);
//
if(0 < rand)   printf(\"_1 rand értéke : %d\", rand);
if(1 < rand)   printf(\"_2 rand értéke : %d\", rand);
if(2 < rand)   printf(\"_3 rand értéke : %d\", rand);
if(3 < rand)   printf(\"_4 rand értéke : %d\", rand);
if(4 < rand)   printf(\"_5 rand értéke : %d\", rand);
else      printf(\"_6 rand értéke : %d\", rand);
//

 
Akik nem értik az else if használatát azok általában return utasításokkal szakítják meg a kód tovább futását lásd a fenti posztot, az else if szerkezetnél nincs szükség közbensõ return utasításra.
Mûködése megegyezik a switch case utasításokkal:
 
   new
rand = random(10);
switch(rand)
{
case 0: printf(\"0 rand értéke : %d\", rand);
case 1: printf(\"1 rand értéke : %d\", rand);
case 2: printf(\"2 rand értéke : %d\", rand);
case 3: printf(\"3 rand értéke : %d\", rand);
case 4: printf(\"4 rand értéke : %d\", rand);
default: printf(\"Egyik else if illetve ez esetben case résznek se felelt meg a véletlenszerû érték: %d\", rand); // A default egyezik meg az else if szerkezetben a legutolsó sima else részhez, mikor semmilyen feltétel nem felelt meg akkor fut le az utána írt rész.
}
// Ugyanez else if szerkezetben:
if(rand == 0)      printf(\"0 rand értéke : %d\", rand);
else if(rand == 1)   printf(\"1 rand értéke : %d\", rand);
else if(rand == 2)   printf(\"2 rand értéke : %d\", rand);
else if(rand == 3)   printf(\"3 rand értéke : %d\", rand);
else if(rand == 4)   printf(\"4 rand értéke : %d\", rand);
else          printf(\"Egyik else if illetve ez esetben case résznek se felelt meg a véletlenszerû érték: %d\", rand); // A default egyezik meg az else if szerkezetben a legutolsó sima else részhez, mikor semmilyen feltétel nem felelt meg akkor fut le az utána írt rész.

Else if ág pontosan, hogyan is müködik?
« Válasz #3 Dátum: 2013. július 14. - 14:08:28 »
0 Show voters
Így már értem, hogyan mûködik a else if.
De még mindig nem értem:
 
    if( sscanf( params, \"is[100]\", iPid, szMsg ) )
        {
        SendClientMessage( playerid, COLOR_RED, \"Használat: /pm < JátékosID > < Üzenet >\" );
    }

 
Ebben a feltételben if( sscanf( params, \"is[100]\", iPid, szMsg ) ) mikor lesz a feltétel igaz?
Vagyis emberi nyelven, hogyan lehetne írni, milyen állítást tartalmaz?
És ezt se értem, elég sok helyen használják a felkiáltó jel operátort, pl. így:
 
else if( !IsPlayerConnected( iPid ) || IsPlayerNPC( iPid ) )
{
        SendClientMessage( playerid, COLOR_RED, \"Érvénytelen azonosító!\" );
}

 
http://sampforum.hu/index.php?topic=9710.0 Itt van az if-rõl egy írás, de csak annyit ír a felkiáltó jel operátorról, hogy tagadás fejezünk ki vele.
Ezt eddig én is tudtam, hogy tagadást fejezünk ki vele, mégsem értem.
Nem is írt rá példát.
IsPlayerConnected függvény visszatérési értéke igaz vagy hamis.
if(!true) vagy if(!false) lehet az állításban, mert a IsPlayerConnected függvény ezt az értéke adja vissza.
if(!true) értéke hamis, if(!false) értéke igaz?
Ember nyelven leírná valaki hogy, mi pontosan mi is zajlik a zárójelben.
Mondjuk itt még kitalálható a végeredmény.
De mondjuk itt:
 
public OnDialogResponse(playerid,dialogid,response,listitem,inputext[])
{
if(dialogid == 1)
{
if( !responese)
{
   SendClientMessage(playerid,-1,\"Te kiléptél a dialógusból.\" );
}
if (listitem == 0 )
{
   SendClientMessage(playerid,-1,\"Te az elsõ lehetõséget választottad!.\");
}
if (listitem == 1 )
{
   SendClientMessage(playerid,-1,\"Te a második lehetõséget választottad!\");
}
return 1;
}
return 0;
}

 
respone -A választott gomb (0 -Elsõ gomb értéke, 1 - Második gomb értéke)
Most, ha a második gombot választjuk akkor, ebben a feltételben if( !responese) egyet kap értékként, azaz igaz lesz, és kiír egy üzenetett.
A feltétel értelmezése szerintem 1 !==1 egy nem egyenlõ eggyel? hamis, mert egy egyenlõ eggyel.
De itt a feltétel még is igaz lesz, és kiírja az üzenetett.
Én ezt nem értem felkiáltó jeles operátort. :facepalm: :facepalm:
« Utoljára szerkesztve: 2013. július 14. - 14:10:49 írta bbTamas »

Else if ág pontosan, hogyan is müködik?
« Válasz #4 Dátum: 2013. július 14. - 15:23:02 »
0 Show voters
Itt jön az amikor bezavarodnak az emberek azzal a dologgal hogy hamis igaz, vagy igaz vagy mégsem? :D
Gondolkodj visszatérési értéken, amit vissza adnak a különbözõ funkciók, igen mert mindegyik más értékkel tér vissza annak megfelelõen hogyan tudta ellátni feladatát.
Például a sscanf 1-es értéket ad vissza ha valamit nem talált rendben.
Az strcmp meg 0 értékkel tér vissza ha a kettõ karakterlánc megegyezik.
Az IsPlayerConnected is 1-es értéket adott vissza, mikor csatlakozott állapotot küld vissza a játékosról.
Az strfind meg (-1)-es értéket ad vissza akkor ha semmilyen egyezést nem talált.
Na most ha visszatérési értéken gondolkodsz ami akár lehetne egy karakter is vagy 600 is tök mindegy akkor az if-ben azt vizsgálod, hogy azt kaptad-e vissza vagy sem és akkor már eltudod dönteni a két különbözõ dolognál mi történjen.
Az if minden esetben két lehetséges út vonalat biztosít, vagy igaz vagy hamis amit vizsgálsz benne, ennek megfelelõen közvetlen utána vagy az else utasítás után lévõ dolgok futnak le.
Itt jön képbe hogy szinte minden más függvénynek más a visszatérési értéke és egy azon dolgot le lehet írni többféleképpen.
A következõ pár példa szinte mind ugyanaz csak a kód kinézetük más, és máshol helyezkedik el hogy mikor mi történjen:
 
if(IsPlayerConnected(playerid) == 1) print(\"Csatlakozva\"); else print(\"Nincs csatlakozva.\");
if(IsPlayerConnected(playerid)) print(\"Csatlakozva\"); else print(\"Nincs csatlakozva.\");
if(!IsPlayerConnected(playerid)) print(\"Nincs csatlakozva\"); else print(\"Csatlakozva.\");
if(IsPlayerConnected(playerid) == 0) print(\"Nincs csatlakozva\"); else print(\"Csatlakozva.\");
if(IsPlayerConnected(playerid) != 1) print(\"Nincs csatlakozva\"); else print(\"Csatlakozva.\");
if(IsPlayerConnected(playerid) != 0) print(\"Csatlakozva\"); else print(\"Nincs csatlakozva.\");

 
Akkor még pár példa:
 
new
    rand = random(6) - random(6);
if(rand) print(\"A rand értéke nagyobb mint 0\");
if(rand > 0) print(\"A rand értéke nagyobb mint 0\");
if(rand == 4) print(\"A rand értéke pontosan 4\");
if(rand != -3) print(\"A rand értéke bármi csak nem -3\");
if(rand > 2 && rand != 4) print(\"A rand értéke nagyobb 2-nél de nem 4!\");
if(!rand) print(\"A rand értéke kisebb mint 1\");
if(rand < 1) print(\"A rand értéke kisebb mint 1\");
if(rand >= -3) print(\"A rand értéke -3 vagy annál nagyobb érték.\");
if(rand == 4 || rand == 2) print(\"A rand értéke vagy 4 vagy 2\"); else print(\"A rand értéke se nem 4 se nem 2\");

 
Tehát röviden fogalmazva visszatérési értékek összehasonlítása történik a zárójelben, ha ezen értékek a köztük lévõ operátor jeleknek megfelelnek akkor közvetlen az if után írt kód fut le, ellenkezõ esetben az (else) ág illetve az (else if) ág következik, ha egyáltalán szükség van rá.
Ui.: Remélem nem rontottam el a példákat mivel nem teszteltem. De bízok benne csak nem tévesztek már ennyi idõ után, de tévedni emberi dolog. :D
Tehát mindig azt figyeld milyen értéket is ad vissza az if zárójelei közt lévõ eljárás/eljárások, az miként felel meg az esetleg köztük lévõ operátor jeleknek, így már remélhetõleg érteni fogod hogy a benne lévõ kritériumoknak van igaz, illetve hamis végeredménye és ez dönti el hogy most közvetlen utána, vagy else utasítás után fut tovább a program.
« Utoljára szerkesztve: 2013. július 15. - 08:49:55 írta ɐʞzssǝlosz »

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal