Duvida sobre Else-if e Switch

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

Duvida sobre Else-if e Switch

Mensagem por DonutScore em Seg 17 Mar 2014, 19:32

Pessoal, aprendi como usar o switch e fui criar meu menu, no codigo abaixo, sempre que eu selecionava a primeira opção, todas as outras abaixo dele eram executadas uma apos a outra.
Código:
if (keyboard_check_pressed(vk_enter))
    {
    var option;
    option = scr_menu_current(items,ind);
    switch (option)
        {
        case 0:
            room_goto(roo_start);
        case 1:
            show_message("teste");
        case 2:
            show_message("teste");
        case 3:
            show_message("teste");
        case 4:
            show_message("teste");
        case 5:
            show_message("teste");
        case 6:
            show_message("teste");
        case 7:
            show_message(ds_list_find_value(items,option));
        case 8:
            if (show_question("Tem certeza de que deseja sair?"))
                {
                game_end();
                }
        break;
        }
    }

Não entendo muito bem como funciona o switch alguém poderia me explicar? Resolvi mudando o codigo para else-if e eagora está normal, mas acredito que o switch era para funcionar no exemplo acima, enfim com o codigo abaixo não tem mais erro.
Código:
if (keyboard_check_pressed(vk_enter))
    {
    var option;
    option = scr_menu_current(items,ind);
   if option = 0
      {
      room_goto(roo_start);
      }
   else if option = 1
      {
      show_message("teste");
      }
   else if option = 2
      {
      show_message("teste");
      }
   else if option = 3
      {
      show_message("teste");
      }
   else if option = 4
      {
      show_message("teste");
      }
   else if option = 5
      {
      show_message("teste");
      }
   else if option = 6
      {
      show_message("teste");
      }
   else if option = 7
      {
      show_message(ds_list_find_value(items,option));
      }
   else if option = 8
      {
      if (show_question("Tem certeza de que deseja sair?"))
            {
            game_end();
            }
   }
    }

Obrigado  pig

DonutScore

Número de Mensagens : 176
Idade : 23
Data de inscrição : 18/12/2013
Reputação : 6
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://donutscore.com

Voltar ao Topo Ir em baixo

Re: Duvida sobre Else-if e Switch

Mensagem por Mr. Kaleb em Seg 17 Mar 2014, 19:38

Ahn... No fim de cada case, você tem que por um break.

Mr. Kaleb

Ranking : Nota C
Número de Mensagens : 1400
Idade : 19
Data de inscrição : 07/09/2010
Notas recebidas : C
Reputação : 21
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Duvida sobre Else-if e Switch

Mensagem por PedroX em Seg 17 Mar 2014, 20:25

O case é como o if e o break faz o papel do else. Só que switch é mais eficiente que if-else.

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: Duvida sobre Else-if e Switch

Mensagem por Mr. Kaleb em Seg 17 Mar 2014, 20:35

PedroX escreveu:O case é como o if e o break faz o papel do else. Só que switch é mais eficiente que if-else.

Só complementando, é mais eficiente para a execução, porque quando o switch checa a ação correta, ele para de checar o resto, já o if-else checa todo o programa. É isso mesmo? Só queria dar um adendo, se estiver errado, me corrijam

Mr. Kaleb

Ranking : Nota C
Número de Mensagens : 1400
Idade : 19
Data de inscrição : 07/09/2010
Notas recebidas : C
Reputação : 21
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Duvida sobre Else-if e Switch

Mensagem por Gabreel em Seg 17 Mar 2014, 20:38

Mr. Kaleb escreveu:
PedroX escreveu:O case é como o if e o break faz o papel do else. Só que switch é mais eficiente que if-else.

Só complementando, é mais eficiente para a execução, porque quando o switch checa a ação correta, ele para de checar o resto, já o if-else checa todo o programa. É isso mesmo? Só queria dar um adendo, se estiver errado, me corrijam
Exato.

Gabreel

Número de Mensagens : 2227
Idade : 20
Data de inscrição : 02/10/2009
Reputação : 52
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Duvida sobre Else-if e Switch

Mensagem por DonutScore em Seg 17 Mar 2014, 22:44

Obrigado a todos, agora sim entendi porque o código era executando até o final. (Coisas de iniciantes Smile

DonutScore

Número de Mensagens : 176
Idade : 23
Data de inscrição : 18/12/2013
Reputação : 6
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://donutscore.com

Voltar ao Topo Ir em baixo

Re: Duvida sobre Else-if e Switch

Mensagem por Willy em Seg 17 Mar 2014, 23:44

Gabreel escreveu:
Mr. Kaleb escreveu:
PedroX escreveu:O case é como o if e o break faz o papel do else. Só que switch é mais eficiente que if-else.

Só complementando, é mais eficiente para a execução, porque quando o switch checa a ação correta, ele para de checar o resto, já o if-else checa todo o programa. É isso mesmo? Só queria dar um adendo, se estiver errado, me corrijam
Exato.
Errado!
O if else não checa todas as condições. Por isso é importante fazer uma estruturação de checagem, desde a mais completa até a mais básica, por exemplo:


Código:
if (Var1=10 && Var2=20 && Var3=30){
//Ação
}else if (Var1=10 && Var2=20){
//Ação
}else if (Var1=10){
//Ação
}

Se as 3 condições forem atendidas, o primeiro "//Ação" é executado, se apenas 2 forem atendidas, o segundo é executado, se for apenas 1, o terceiro.
Entretanto, se eu fizer a mesma checagem de forma oposta:
Código:
if (Var1=10){
//Ação
}else if (Var1=10 && Var2=20){
//Ação
}else if (Var1=10 && Var2=20 && Var3=30){
Ação
}
Neste caso, mesmo que a terceira condição for verdadeira, apenas a primeira será executada.

Agora, em questão de desempenho, não que seja muito significativo, switch é mais rápido.

___________


Engines, tutoriais e projetos? Clique no banner!



Atenção:
Comporte-se, senão você vai levar a cintada do Willy no meio da bunda! bravo


Willy

Ranking : Nota A
Número de Mensagens : 1812
Idade : 23
Data de inscrição : 08/06/2009
Notas recebidas : C + B + A + A
Reputação : 245
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 2
   : 1
   : 1

http://willy-gmbr.blogspot.com/

Voltar ao Topo Ir em baixo

Re: Duvida sobre Else-if e Switch

Mensagem por PedroX em Ter 18 Mar 2014, 15:00

Só para complementar um pouco, já que todo mundo está fazendo isso:

Código:
if (a==1 && b==0)
{
// BOOM!
}

No GM:8 e em versões antigas do GM:S, acontecia o seguinte:

http://www.yoyogames.com/tech_blog/52 escreveu:Now, previously when using GameMaker: Studio, that “if” would evaluate both parts, checking the value of val1 (a) and val2 (b), even if val1 (a) had evaluated as false. This is obviously not optimal, since sometimes you may want to evaluate several values, and those values could be derived from expensive functions etc... which will make them more costly to run.
Resumindo, o GM verificava a expressão inteira, para depois decidir se executava ou não o código. Com funções lentas, isso poderia deixar o jogo lento. Veja:

Código:
if (0>1 && draw_get_pixel(10, 10) == c_red)
{
// isso não vai ser executado
}

Como 0 não é maior que 1, o código não será executado. Mas a função draw_get_pixel (que é bem lenta) seria executada mesmo assim.

Por isso, é bom usar ifs sequencialmente.

Código:
if (0>1)
if (draw_get_pixel(10, 10) == c_red) //essa condição não será testada
{
// isso também não será executado
}

A diferença é que o GM vai ver que 0 não é maior que 1 e já vai parar por aí.

Agora o Short-circuit evaluation foi implementado. Ou seja, se você usar o GM:S, pode usar o && sem medo, porque a expressão deixa de ser interpretada logo no primeiro false retornado.

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: Duvida sobre Else-if e Switch

Mensagem por Conteúdo patrocinado Hoje à(s) 20:23


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum