[Tutorial] Usando switch
#1

Rodney Francalim

Tutoriais
••••••••••••••••••••••••••••••••••••••••••••••••••

1: Sobre o 'switch'?
- Switch й um substituto do if e else if, mas trabalha de uma maneira mais simples e ordenada e com vбrias possibilidades. Todavia, ele nгo й melhor do que o if e else if (depende do seu ponto de vista e com o que e como quer trabalhar seu cуdigo), atй porque com o switch nгo й possнvel fazer uma comparaзгo, ou seja, nгo й aceito operadores lуgicos, jб que vamos trabalhar, tambйm, com os cases e isso restringe um pouco o uso do switch.

2: Criando seu prуprio switch
- Primeiro deve-se comeзar com o prуprio switch (уbvio ) seguido da variбvel que vocк queira trabalhar entre parкnteses.

- Mas vamos comeзar exemplificando, caso usбssemos if e else if:
pawn Код:
new var = random(6);
if(var == 0) printf("O valor da variбvel й %d", var);
else if(var == 1) printf("O valor da variбvel й %d", var);
else if(var == 2) printf("O valor da variбvel й %d", var);
else if(var == 3) printf("O valor da variбvel й %d", var);
else print("O valor da variбvel й desconhecido");
- Agora vejamos como ficarб usando switch:
pawn Код:
new var = random(6);
switch(var)
{
    case 0: printf("O valor da variбvel й %d", var); // Caso o valor da variбvel seja 0, enviarб essa mensagem com o valor da variбvel no console.
    case 1: printf("O valor da variбvel й %d", var); // Caso o valor da variбvel seja 1, enviarб essa mensagem com o valor da variбvel no console.
    case 2: printf("O valor da variбvel й %d", var); // Caso o valor da variбvel seja 2, enviarб essa mensagem com o valor da variбvel no console.
    case 3: printf("O valor da variбvel й %d", var); // Caso o valor da variбvel seja 3, enviarб essa mensagem com o valor da variбvel no console.
    default: print("O valor da variбvel й desconhecido"); // Caso o valor da variбvel seja diferente das que estгo logo acima, enviarб essa mensagem informando que o valor й desconhecido
}
- E dб pra deixar mais simples do que isso:
pawn Код:
new var = random(6);
switch(var)
{
    case 0 .. 3: printf("O valor da variбvel й %d", var); // Caso o valor da variбvel esteja de 0 а 3, enviarб essa mensagem com o valor da variбvel no console.
    default: print("O valor da variбvel й desconhecido"); // Caso o valor da variбvel seja diferente das que estгo logo acima, enviarб essa mensagem informando que o valor й desconhecido
}
- Agora vou colocar um exemplo para informar se o nъmero escolhido serб нmpar ou par:
pawn Код:
new var = random(6);
switch(var)
{
    case 0, 2, 4, 6: printf("O valor da variбvel й par (%d)", var); // Caso o valor da variбvel seja 0, 2, 4 ou 6, enviarб essa mensagem informando que й um nъmero par, seguido do prуprio valor da variбvel no console.
    case 1, 3, 5:    printf("O valor da variбvel й нmpar (%d)", var); // Caso o valor da variбvel seja 1, 3 ou 5, enviarб essa mensagem informando que й um nъmero нmpar, seguido do prуprio valor da variбvel no console.
}
3: Exemplos
- Nessa seзгo eu vou apenas citar exemplos em if e else if e como ficaria em switch.
pawn Код:
if(!strcmp(cmdtext, "/admins", true))
{
    SendClientMessage(playerid, -1, "Admins Online:");
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
        if(PlayerInfo[i][pAdmin] == 1)
        {
            GetPlayerName(i, sendername, sizeof(sendername));
            format(string, 128, "Admin: %s [Admin level 1]", sendername);
            SendClientMessage(playerid, COLOR_GRAD2, string);
        }
        else if(PlayerInfo[i][pAdmin] == 2)
        {
            GetPlayerName(i, sendername, sizeof(sendername));
            format(string, 128, "Admin: %s [Admin level 2]", sendername);
            SendClientMessage(playerid, COLOR_GRAD2, string);
        }
        else if(PlayerInfo[i][pAdmin] == 3)
        {
            GetPlayerName(i, sendername, sizeof(sendername));
            format(string, 128, "Admin: %s [Admin level 3]", sendername);
            SendClientMessage(playerid, COLOR_GRAD2, string);
        }
        else if(PlayerInfo[i][pAdmin] == 4)
        {
            GetPlayerName(i, sendername, sizeof(sendername));
            format(string, 128, "Admin: %s [Admin level 4]", sendername);
            SendClientMessage(playerid, COLOR_GRAD2, string);
        }
        else if(PlayerInfo[i][pAdmin] == 5)
        {
            GetPlayerName(i, sendername, sizeof(sendername));
            format(string, 128, "Admin: %s [Admin level 5]", sendername);
            SendClientMessage(playerid, COLOR_GRAD2, string);
        }
    }
    return 1;
}
- Switch...
pawn Код:
if(!strcmp(cmdtext, "/admins", true))
{
    SendClientMessage(playerid, 0xFFFFFFAA, "Admins Online:");
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
        switch(PlayerInfo[i][pAdmin])
        {
            case 1 .. 5:
            {
                GetPlayerName(i, sendername, sizeof(sendername));
                format(string, 128, "Admin: %s [Admin level %d]", sendername, PlayerInfo[i][pAdmin]);
                SendClientMessage(playerid, 0xFFFF00AA, string);
            }
        }
    }
    return 1;
}
- Outro exemplo tambйm й com o uso do dialogid e listitem.
pawn Код:
if(dialogid == 0)
{
    if(response)
    {
        if(listitem == 0)
        {
            // ...
        }
        if(listitem == 1)
        {
            // ...
        }
    }
}

if(dialogid == 1)
{
    if(response)
    {
        if(listitem == 0)
        {
            // ...
        }
        if(listitem == 1)
        {
            // ...
        }
    }
}
- Mais uma vez com switch:
pawn Код:
switch(dialogid)
{
    case 0:
    {
        if(response)
        {
            switch(listitem)
            {
                case 0: // ...
                case 1: // ...
            }
        }
    }
    case 1:
    {
        if(response)
        {
            switch(listitem)
            {
                case 0: // ...
                case 1: // ...
            }
        }
    }
}
4: Explicaзхes
- Como vocк deve ter visto, o caso pode mudar. Й tanto para:
pawn Код:
case 1: // var = 1
case 2: // var = 2
case 3: // var = 3
quanto para:
pawn Код:
case 1, 2, 3: // var = %d
e:
pawn Код:
case 1 .. 3: // var = %d
- E tambйm temos o default, por exemplo:
pawn Код:
case 1: // executa o cуdigo caso o valor seja 1
case 2: // executa o cуdigo caso o valor seja 2
case 3: // executa o cуdigo caso o valor seja 3
case 4: // executa o cуdigo caso o valor seja 4
default: // executa o cуdigo caso o valor nгo esteja anexado em nenhum dos casos (OPCIONAL)
5: Consideraзхes finais
- Meu segundo tutorial, eu sу encontrei 1 tutorial sobre switch entгo resolvi fazer mais 1, sу pra enriquecer mais o fуrum.
- Caso vocк queira mais alguma informaзгo sobre a diferenзa entre switch e if e else if, clique aqui.

6: Agradecimentos e crйditos
- Agradecer ao Josma_cmd pelo tutorial dele, me ajudou bastante.
- E ao wiki.sa-mp.com.
- E tambйm ao Don_Speed por ter me corrigido.

••••••••••••••••••••••••••••••••••••••••••••••••••
Reply
#2

Faltou falar do default.
Reply
#3

Putz, foi uma das primeiras coisas que separei no bloco de notas pra falar, pqp. Valeu por lembrar.

@EDIT:
Valeu por ajudar, teu nome estб nos agradecimentos tambйm, valeu.
Reply
#4

o Tutorial do Josma ta quase igual esse. a unica coisa que lamento й que coisas assim nгo foram feitas quando comecei
Reply
#5

Me ajudo bastante
Reply
#6

Quote:
Originally Posted by Sky_.
Посмотреть сообщение
o Tutorial do Josma ta quase igual esse. a unica coisa que lamento й que coisas assim nгo foram feitas quando comecei
Bom, a introduзгo em partes estб sim bem semelhante, atй porque se trata de um mesmo assunto, mas a minha й um pouco mais precisa.

E o exemplo do /admins tambйm, mas fora isso, temos algumas diferenзas, cara.

Quote:
Originally Posted by lucas_mdr1235
Посмотреть сообщение
Me ajudo bastante
Essa foi a intenзгo.
Reply
#7

O Tutorial estб bom mais vocк errou em dizer que ele й um substituto do IF, nгo й nгo й um substituto e sim mais uma opзгo de Condicional como o Ternaria tbm й.

Nesse exemplo que vocк deu:


pawn Код:
if(PlayerInfo[i][pAdmin] == 1)
else if ...
Nгo й necessбrio esse complicaзгo, eu entendi que vocк complicou nessa parte para mostrar que o Switch й mais simples, basta fazer:

pawn Код:
if(PlayerInfo[i][pAdmin] > 0 && PlayerInfo[i][pAdmin] < 6)
Fora isso ta bem Explicado..
Reply
#8

Nice
Reply
#9

Quote:
Originally Posted by Rodney_Francalim
Посмотреть сообщение
jб que vamos trabalhar, tambйm, com os cases e isso restringe um pouco o uso do switch, atй porque com ele nгo podemos trabalhar com Float, por exemplo.
Como assim nгo se pode trabalhar com Float tag?
pawn Код:
UsandoSwitch(Float:x) {
    switch(Float:x) {
        case 0.0000: print("O valor de 'x' й 0.0000");
        case 0.1000: print("O valor de 'x' й 0.1000");
        case 0.2000: print("O valor de 'x' й 0.2000");
    }
    return 1;
}
//Uso(exemplo)
UsandoSwitch(0.1000);
Ele aceita nгo sу Float, como a maioria das tags nativas .
Reply
#10

Tutorial bonito, mas bastante bбsico mesmo.


Em switch podemos colocar comparaзхes sim!

pawn Код:
new variavel = 0;
   
    switch( false != bool:  variavel ) { // veja a comparaзгo
        case 0: print("false");
        case 1: print("true");
    }

ou outro exemplo:
pawn Код:
new variavel1 = 2;
    new variavel2 = 1;
   
    // 1 + 2  = 3
   
    switch(2) {
        case 0: print("resultado nгo й 3");
        case 1: print("resultado й 3");
    }

Apesar de ser inviбvel, й possнvel!
___

O problema real de usar switch й que ele nгo aceita valores constantes, logo nгo podemos colocar variбveis nele

Errado:
pawn Код:
switch( variavel1 + variavel2  == 3 ) {
        case variavel1: print("resultado nгo й 3");
        case variavel2: print("resultado й 3");
    }
pois nгo pode fazer case Variavel apenas case VALOR_CONSTANTE seja via tipo de variбvel "const" ou seja via algum nъmero mesmo!

pawn Код:
const variavel1 = 2;
    const variavel2 = 1;
   
    // 1 + 2  = 3
   
    switch(2) {
        case variavel1: print("blabla");
        case variavel2: print("blabla");
    }

ou

pawn Код:
switch(2) {
        case 1: print("blabla");
        case 2: print("blabla");
    }

Alйm de ter os statements adicionais ..


____

E em switch pode usar qualquer tipo de tag, inclusive Float como AFerreira disse acima
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)