Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Problema com switch.


Fabrizio Barrow

Pergunta

O meu problema é que a função break não funciona no meu switch, ou seja, ela não termina de executa-lo.

Segue aqui uma parte do meu codigo:

switch (Palavra){
Palavra = getchar();    
case 'I'
printf("5 ");
    switch (Palavra){
    Palavra = getchar();       
    case '.':
    printf("V");
    break;
    default:
    printf("NS");
    break;
    }
break;  // break do case'I'.      
case 'C':
printf("6 ");
........

O programa roda perfeitamente até chegar no case '.', depois disso ele roda o default e todos os outros switchs e case depois do case'C' ignorando a função break.

Ex de saida: I V NS 6.

O esperado: I V

Como posso resolver isso?

Obrigado pela atenção.

Editado por Fabrizio Barrow
Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0

Você não verifica a condição do switch assim..

Faça:

Palavra = getchar();
switch (Palavra) {
case 'I':
    printf("5 ");
    Palavra = getchar();
    switch (Palavra) {   
    case '.':
        printf("V");
        break;
    default:
        printf("NS");
        break;
    }
    break;  // break do case'I'.      
case 'C':
    printf("6 ");
    ........

Abraços.

Link para o comentário
Compartilhar em outros sites

  • 0

Obrigado a todos por tentar me ajudar. :D

O erro anterior eu resolvi trocando o "int main (void)" por "int main()", porém, continuando o meu exercicio da faculdade, deparei-me com outro impencilio.

Segue o codigo inteiro do meu programa:

#include <stdio.h>
#include <stdlib.h>

int main () {
    char Palavra;    
    Palavra = getchar(); 
                switch (Palavra){    
        case 'A':
        printf("1 ");
            Palavra = getchar(); 
            switch (Palavra){           
            case 'L':
            printf("2 ");        
                Palavra = getchar(); 
                switch (Palavra){       
                case 'I':
                printf("5 ");                
                    Palavra = getchar(); 
                    switch (Palavra){       
                    case '.':
                    printf("V");
                    break;
                    default:
                    printf("NS");
                    break;
                    }
                break;        
                case 'C':
                printf("6 ");        
                    Palavra = getchar(); 
                    switch (Palavra){       
                    case 'E':
                    printf("10 ");                
                        Palavra = getchar(); 
                        switch (Palavra){       
                        case '.':
                        printf("V");
                        break;
                        default:
                        printf("NS");
                        break;
                        }
                    break;    
                    case 'A':
                    printf("11 ");                     
                        Palavra = getchar(); 
                        switch (Palavra){
                        case '.':
                        printf("V");
                        break;
                        default:
                        printf("NS");
                        break;
                        }                        
                    break;
                    case '.':
                    printf("NF");
                    break;                     
                    default:
                    printf("NE");
                    break; 
                    }    
                break;
                case '.':
                printf("NF");
                break;                   
                default:
                printf("NE");
                break; 
                }
            break;    
            case 'I':
            printf ("3 ");        
                Palavra = getchar(); 
                switch (Palavra){     
                case 'O':
                printf("7 ");                
                    Palavra = getchar(); 
                    switch (Palavra){    
                    case '.':
                    printf("V");
                    break;
                    default:
                    printf("NS");
                    break;
                    }            
                break;
                case '.':
                printf("NF");
                break;                    
                default:
                printf("NE");
                break; 
                }
            break;    
            case 'R':
            printf("4 ");            
                Palavra = getchar(); 
                switch (Palavra){       
                case 'O':
                printf("8 ");                
                    Palavra = getchar(); 
                    switch (Palavra){       
                    case '.':
                    printf("V");
                    break;
                    default:
                    printf("NS");
                    break;
                    }
                break;       
                case 'T':
                printf("9 ");                      
                    Palavra = getchar();             
                    switch (Palavra){      
                    case 'E':
                    printf("12 ");                    
                        Palavra = getchar(); 
                        switch (Palavra){      
                        case '.':
                        printf("V");
                        break;
                        default:
                        printf("NS");
                        break;
                        }        
                    break;
                    case '.':
                    printf("NF");
                    break; 
                    default:
                    printf("NE");
                    break; 
                    }
                break;
                case '.':
                printf("NF");
                break;                    
                default:
                printf("NE");
                break; 
                }           
            break;
            case '.':
            printf("NF");
            break;                           
            default:
            printf("NE");
            break; 
            }

        break;    
        case '.':
        printf("NF");
        break;
        default:
        printf("NE");
        break;
        }
    printf("\n");    
    system("PAUSE");
    return 0;
}

O novo problema é que agora ele ignora os cases I e C e passa direto para o default, por exemplo:

Entra: ALCA.

Saida esperada: 1 2 6 11 V

Saida real: 1 2 NE

Obs: Eu sei que posso encurtar meu codigo usando outras funçoes, mas nesse exercicio so posso usar switch ou if.

Editado por Fabrizio Barrow
Link para o comentário
Compartilhar em outros sites

  • 0

Explique para o seu professor (ele não deve saber) que o comando de quebra break após um default só faz sentido quando após esse default existir algum outro case.

Uma situação dessas parece esquisita. E é mesmo, além de ser uma grosseria. Ninguém em sã consciência faz isso. Mas mesmo sendo esquisita, é um arranjo perfeitamente válido, que não dá erro. Mas só nessa situação um break faria sentido. Veja um exemplo simples:

char vlr = 1;
switch(vlr) {
    case 0  : vlr = 10; break;
    default : vlr = 12; break;
    case 2  : vlr = 11; break;
}

No final vlr conterá 12. Mas aí o último case não será considerado? Será sim. O compilador sabe que há mais um teste a ser feito após o default. Se você trocar o último teste para case 1, no final vlr conterá 11. E o default não será utilizado. Não se preocupe. O compilador não vai se perder.

Finalizando: default, observando-se as regras da boa programação, deve ser sempre o último comando no switch, até por uma questão de legibilidade. Portanto, um break seguinte ao default, nessas condições, não interrompe piçiroca nenhuma. É peso morto. :)

Link para o comentário
Compartilhar em outros sites

  • 0

O mais estranho de tudo é que eu mandei o arquivo com os breaks pro meu pai para ele analizar o codigo. Ele falou a mesma coisa que voce Maligno e compilou com Dev C++ o programa.c e rodou-o, porem deu um outro problema diferente do meu. Depois disso ele tirou os breaks e o programa funcionou perfeitamente e passou-o devolta pra mim e aqui tambem rodou corretamente. Depois de algumas horas meu pai, achando a situação estranha, compilou denovo o programa com os breaks e rodou-o, milagrosamente o programa funcionou como o previsto.

Acho que tudo isso foi por causa de um bug do Dev C++.

Link para o comentário
Compartilhar em outros sites

  • 0

Atenha-se sempre às normas da linguagem. A norma de C diz que você pode ter break no seu default. Isso é regra e ponto final. Agora, se no final der pau nisso, é bug do compilador. Você até pode mudar o código para sanar o problema, mas não se esqueça de algo MUITO importante: quem está contrariando a regra é o compilador e não você.

Mas isso é fichinha. Você não tem idéia dos bugs esquisitos que já peguei no GCC. Aliás, o GCC eu nunca uso pra produção. Apenas pra teste. E olha lá. Sempre de olhos bem abertos.

Vou contar um caso escabroso. Resumidamente: eu tinha a função A() que chamaba B(). Em A() havia uma malha com um iterador i. O escopo dessa variável, claro, era local à A(). Na função B(), nada demais. Era código comum. Mas, por alguma estranha razão, ela ferrava com aquela variável iteradora i de A(); completamente fora do escopo de B(). Após o retorno de B() a função A() dava pau porque i passava a ter um valor absurdo.

Solução: modifiquei o código de B(), fazendo um monte de lingüiça de rosca, só pra mudar a forma do código. Operacionalmente ficou a mesma coisa. E parou de dar o erro.

Passados alguns meses, com o programa já modificado várias vezes (ele mudou de forma, digamos assim), voltei a função B() ao que era quando dava esse erro. Sem mudar a versão do GCC, recompilei e parou de dar erro. Tudo funciona até hoje.

Moral da história: não dá pra confiar muito em alguns compiladores. É bom ficar de olhos bem abertos, até porque o pior erro é aquele que você não vê. Por isso a etapa de testes é muito importante. Tem de ser a mais abrangente possível.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...