[Tutorial] Estruturas de Controlo
#1

Declaraзхes e Estruturas de Controlo



________::Introduзгo


Neste tutorial vou explicar a maior parte e as mais importantes Estruturas de Controlo da linguagem Pawn,
para servidores que tenham como include principal a <a_samp>


________::Estruturas de Controlo



__::Condicionais


::if

Verifica se algo й verdadeiro ou falso

pawn Код:
new lol =2;

if(lol == 2)
    {
    print("Como lol tem valor 2, vai ser impresso isto na caixa preta (CmdBox)");
    }
Pode tambйm ser utilizado para verificar o valor de uma funзгo:

pawn Код:
if(AlgumaFuncao(...) == 2)
    {
    print("O Valor de AlgumaFuncao(...) й 2");
    }
Pode ser utilizado em mistura com alguns operadores lуgicos:

pawn Код:
if(AlgumaFuncao(...) == 2 && OutraFuncao(...) == 52)
    {
    print("O Valor de AlgumaFuncao(...) й 2 e de OutraFuncao(...) й 52");
    }


::else

Chamado quando "if" falha

pawn Код:
new lol = 2;

if(lol == 5)
    {
    print("Isto nao vai ser impresso, porque lol nao й igual a 2");
    }
else
    {
    print("Isto vai ser impresso, porque o if falhou");
    }
Pode ser utilizado em conjunto com "if":

pawn Код:
new lol = 2;
   
if(lol == 5)
    {
    print("Isto nao vai ser impresso, porque lol nao й igual a 2");
    }
else if(lol == 3)
    {
    print("Tambйm nao vai ser impresso, porque lol nгo й 3");
    }
else if( lol == 2)
    {
    print("Vai ser impreso, porque lol й igual a 2");
    }

::?

Basicamente serve para efetuar uma alteraзгo, dentro de um "if" ou "else"

pawn Код:
new
    primeira = 3,
    segunda;
   
if(primeira == 3)
    {
    segunda = 2;
    }
else if(primeira == 5)
    {
    segunda = 1;
    }
else
    {
    segunda = 0;
    }
Й exactamente a mesma coisa que isto:

pawn Код:
segunda = (primeira == 3) ? (2) : ((primeira == 5) ? (1) : (0));





__::Loops




::while

"while" serve para fazer determinada aзгo, quando a demonstraзгo for verdadeira:

pawn Код:
//Um looping usando while
new
    i = 0;
   
while(i < MAX_PLAYERS)
    {
    DeterminadaFuncao(...);
    i++;
    }

::for

"for" significa "para":

pawn Код:
for(new i = 0; i < MAX_PLAYERS; i++)
//pode-se ler:
//para( nova variavel "i", de valor 0, para "i" menor que MAX_PLAYERS; faz i++ (aumenta "i" em um valor inteiro)
    {
    DeterminadaFuncao(...);
    }

Este loop pode ser tambйm escrito da seguinte forma:

pawn Код:
new
    i = 0;
   
for( ; i < MAX_PLAYERS ;)
    {
    DeterminadaFuncao(...);
    i++;
    }

NOTA
este tipo de loop й mais utilizado por ser menos extenso, porйm faz mais verificaзхes...
Um GM com grandes quantidades de loops deste tipo acaba por lagar mais do que um GM
com iguais quantidade de loops tipo "while"



::do-while

"do-while" faz determinada aзгo, enquando a demonstraзгo se verificar verdadeira

pawn Код:
new
    i = 0;

do
    {
    DeterminadaFuncao(...);
    i++;
    }
while(i < MAX_PLAYERS);
Um tipo de loop muito pouco conhecido, pois ocupa muito espaзo no GM




::if-goto

Este loop й bastante facil de entender... Porйm й bastante longo, o que nao permite ser muito usado

pawn Код:
new
    i = 0;
   

    loop:
    if(i < MAX_PLAYERS)
        {
        DeterminadaFuncao(...);
        i++;
        goto loop;
        }



__::Switch(s)



::switch

Basicamente й o mesmo que o "if/else if", porйm de uma forma mais simples, mais curta e mais rapida de escrever/entender

pawn Код:
new
        skin = 150;
       
    switch(skin)
                {
        case 149:
            {
            print("isto nгo vai ser impresso");
            }
        case 150:
            {
            print("isto vai ser impresso");
            }
        case 151:
            {
            print("isto nгo vai ser impresso");
            }
        default:
            {
            print("isto nгo vai ser impresso");
            }
                }
Isso й exactamente o mesmo que isso, sу que de um jeito mais simples:


pawn Код:
new
        skin = 150;
       
    if(skin == 149)
        {
        print("isto nгo vai ser impresso");
        }
    else if(skin == 150)
        {
        print("isto vai ser impresso");
        }
    else if(skin == 151)
        {
        print("isto nгo vai ser impresso");
        }
    else
        {
        print("isto nгo vai ser impresso");
        }



::case

"case" й a base de qualquer Switch... Significa "caso ... seja verdadeiro"

pawn Код:
new skin;
    switch(skin)
    {
    case 1, 2, 4, 8, 16, 32:
        {
        DeterminadaFuncao(...);
        }
    }
Significa o mesmo que isso:

pawn Код:
new skin;
   
    if(skin == 1 || skin == 2 || skin == 4 || skin == 8 || skin == 16 || skin == 32)
    {
        DeterminadaFuncao(...);
    }

a estrutura "case" tem vбrios modos de escrever, atribuindo determinado significados:

pawn Код:
new
    a;
       
    switch(a)
        {
        case 1:
            {
            print("Caso a == 1");
            }
        case 2,3,4:
            {
            print("Caso a == 2, ou a== 3, ou a== 4");
            }
        case 6 .. 11:
            {
            print("Para todos os valor entre 6 e 11, inclusive");
            print("a == 6 || a== 7 || a== 8 || a == 9 || a == 10 || a == 11");
            }
        }

::default

Estб para "case", como "else" estб para "if"


pawn Код:
new a;
   
    switch(a)
        {
        case 2:
            {
            print("se a == 2, imprime isto");
            }
        default:
            {
            print("se a != 2 (a estrutura if(a == 2) falhou), imprime isto");
            }
       
        }



Й o mesmo que isso:

pawn Код:
new a;
   
    if(a == 2)
        {
        print("se a == 2, imprime isto");
        }
    else
        {
        print("se a != 2 (a estrutura if(a == 2) falhou), imprime isto");
        }




__::Declaraзхes Rбpidas(s)




::break


"break" pбra um loop quando aplicado:

pawn Код:
for(new i = 0; i < 400; i++)
        {
        if(i == 99) break;
                //para o loop quando "i" for igual a 99
        }



::continue


salta/reinicia o loop


pawn Код:
for(new i = 0; i < 4; i++)
        {
        if(i != 3) continue;
        printf("i = %d", i);
        //no log, vai imprimir apenas o 3, pois para todos os restantes valores, o
        //loop foi reiniciado antes da parte de imprimir o valor de "i"
        }

::return

Esta declaraзгo tem vбrios usos

Um deles й para interromper uma funзгo/loop

pawn Код:
main()
    {
        print("1");
        ImprimirLol("1");
        print("2");
    }
       
       
    ImprimirLol(num)
    {
        //se num for igual a um nao vai imprimir nada
        if(num == 1)
            {
            return;
            }
        //caso "if(num == 1) falhe, executa este "else"
        else
            {
            print("2");
            //imprime "2"
            }
    }

Por outro lado, esta declaraзгo pode tambйm ser utilizada para retornar um valor:

pawn Код:
main()
    {
    print("1");
    if(RetornarValor(1) == 27)//Quando o argumento da funcao
                              //RetornarValor, se esse valor
                              // retornado foir 27...
        {
        print("2"); // imprime na CmdBox: "2"
        }
    print("3");
    }
   
   
    RetornarValor(num)
    {
    if(num == 1)
        {
        return 27;//caso o argumento (num) for igual a 1, a funcao
                  //retorna o valor 27
        }
    return false;//caso num != 1, retorna/diz que a verificaзгo й falsa
    }



________::Conclusгo

й isso galera.... Espero que tenham gostado

Qualquer coisa comente/pergunte...
Caso tenha gostado do tutorial, ou tenha sido util para vc, comente






________::Links


Postei no pastebin todos os exemplos que criei ai em cima:

http://pastebin.com/1Ybvak01






________::Crйditos


Crйditos a:

andmeida10, por ter criado o tutorial
Wiki-SAMP - Onde aprendi e desenvolvi os meus conhecimentos
SAMP Team, por suportar este forum
Reply
#2

Wow, bom tutorial cara

Muito bem explicado, +3rep ;P

@off

Bom ver que estб de volta
Reply
#3

ou para resumir e para quem gosta de poucas linhas podemos fazer assim
PHP код:
new lol 2;
    
if( 
lol == )
    print( 
"Isto nao vai ser impresso, porque lol nao й igual a 2" );
else if( 
lol == )
    print( 
"Tambйm nao vai ser impresso, porque lol nгo й 3" );
else if( 
lol == )
    print( 
"Vai ser impreso, porque lol й igual a 2" ); 
mais um уtimo tutorial feito pelo andmeida10.
Reply
#4

Quote:
Originally Posted by Magnus'
Посмотреть сообщение
Wow, bom tutorial cara

Muito bem explicado, +3rep ;P

@off

Bom ver que estб de volta
valeu...
Acho que ficou atй bastante bom


@off:
Estou de volta, mas nao mt... pelo q tive vendo, n tem nem
metade da humildade que havia antes

й pena ver isso acontecer




-----------------------------------------------------------------------------------------------------------



Quote:
Originally Posted by Miqueias Barros
Посмотреть сообщение
ou para resumir e para quem gosta de poucas linhas podemos fazer assim
PHP код:
new lol 2;
    
if( 
lol == )
    print( 
"Isto nao vai ser impresso, porque lol nao й igual a 2" );
else if( 
lol == )
    print( 
"Tambйm nao vai ser impresso, porque lol nгo й 3" );
else if( 
lol == )
    print( 
"Vai ser impreso, porque lol й igual a 2" ); 
mais um уtimo tutorial feito pelo andmeida10.
valeu

Pode ser resumido assim, sim... mas eu prefiro usar sempre { e }, assim nao me perco
Reply
#5

apaga aqui, sff
Reply
#6

Muito bom! Parabйns tigrгo
Reply
#7

Bom tutorial, sу deixa tabulado certinho os trechos de cуdigos, e sу para lembrar, todos loops sгo executados atй que a condiзгo seja falsa. rs
Reply
#8

Parabйns! ++REP...
Reply
#9

Quote:
Originally Posted by [FeK]DraKiNs
Посмотреть сообщение
Bom tutorial, sу deixa tabulado certinho os trechos de cуdigos, e sу para lembrar, todos loops sгo executados atй que a condiзгo seja falsa. rs
como assim

o loop so para quando a contiзгo for false se vc colocar um return...

Assim ele para:




pawn Код:
if(strcmp(cmdtext, "/admins", true) == 0)
        {
         for(new i = 0; i < MAX_PLAYERS; i++)
            {
           
            SendClientMessage(playerid, LARANJA, " ");
            SendClientMessage(playerid, LARANJA, "___|ADMINS ONLINE|___");
            if(IsPlayerConnected(i) && PlayerInfo[i][pAdmin] > 0)
                {
                new admrank[24];
                if(PlayerInfo[i][pAdmin] == 1)          { admrank = "Moderador";    }
                else if(PlayerInfo[i][pAdmin] == 2)     { admrank = "Admin";        }
                else if(PlayerInfo[i][pAdmin] == 3)     { admrank = "Admin Chefe";  }
                else if(PlayerInfo[i][pAdmin] == 1100)  { admrank = "Admin Master"; }
                else if(PlayerInfo[i][pAdmin] == 1200)  { admrank = "Dono";         }
                else if(PlayerInfo[i][pAdmin] == 6211)  { admrank = "Scripter";     }
               
                new iname[MAX_PLAYER_NAME];
                GetPlayerName(i, iname, sizeof(iname));
                format(string, sizeof(string), "%s [ID: %d]: %s", iname, i, admrank);
                SendClientMessage(playerid, VERDECLARO, string);
                return 1;//esse return faz o loop parar :D
                }
               
            }
        }

Assim ele nao para:


pawn Код:
if(strcmp(cmdtext, "/admins", true) == 0)
        {
         for(new i = 0; i < MAX_PLAYERS; i++)
            {
           
            SendClientMessage(playerid, LARANJA, " ");
            SendClientMessage(playerid, LARANJA, "___|ADMINS ONLINE|___");
            if(IsPlayerConnected(i) && PlayerInfo[i][pAdmin] > 0)
                {
                new admrank[24];
                if(PlayerInfo[i][pAdmin] == 1)          { admrank = "Moderador";    }
                else if(PlayerInfo[i][pAdmin] == 2)     { admrank = "Admin";        }
                else if(PlayerInfo[i][pAdmin] == 3)     { admrank = "Admin Chefe";  }
                else if(PlayerInfo[i][pAdmin] == 1100)  { admrank = "Admin Master"; }
                else if(PlayerInfo[i][pAdmin] == 1200)  { admrank = "Dono";         }
                else if(PlayerInfo[i][pAdmin] == 6211)  { admrank = "Scripter";     }
               
                new iname[MAX_PLAYER_NAME];
                GetPlayerName(i, iname, sizeof(iname));
                format(string, sizeof(string), "%s [ID: %d]: %s", iname, i, admrank);
                SendClientMessage(playerid, VERDECLARO, string);
                }
               
            }
        }
Reply
#10

Quote:
Originally Posted by paulor
Посмотреть сообщение
Parabйns! ++REP...
Valeu
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)