Ir ao conteúdo
  • Cadastre-se
Alexandre Caribé

C++ Há alguma forma de fazer o default repetir o switch?

Recommended Posts

Galera eu estou com um problema, eu preciso fazer uma votação e fiz tudo em switch case, ela está correta porém quando voto em um número que não seja dos candidatos ele para o switch e continua o código que está abaixo dele. Preciso fazer o default repetir o switch, pois ao votar um número que não é de nenhum candidato ele continua o código que está fora do switch. Olhem como está o código:

 while(v!=0)
    {
        printf("\n\nDeputado Estadual:\n 51-Ana Rita Pacheco\n 34-Ana Guilherme\n 11-Adalberto Campos\n 10-Voto Nulo\n 15-Voto Branco");
        printf("\nDigite o número correspondente ao seu voto e aperte ENTER: ");
        scanf("%d",&v);
        switch(v){
            case 0:
                printf("Votação encerrada!");
                break;
            case 51:
                depEstAnaR=depEstAnaR+1;
                Mulher=Mulher+1;
                printf("Ana Rita Pacheco. Voto registrado!");
                break;
            case 34:
                depEstAnaG=depEstAnaG+1;
                Mulher=Mulher+1;
                printf("Ana Guilherme. Voto registrado!");
                break;
            case 11:
                depEstAdal=depEstAdal+1;
                Homem=Homem+1;
                printf("Adalberto Campos. Voto registrado!");
                break;
            case 10:
                vn=vn+1;
                printf("Voto Nulo registrado!");
                break;
            case 15:
                vb=vb+1;
                printf("Voto Branco registrado!");
            default:
                printf("OPCAO INVALIDA. Digite algo válido!");}

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Alexandre Caribé     não, o default não faz  isso ,  então você pode usar o comando do / while  assim :

do{
    printf("Digite o número correspondente ao seu voto e aperte ENTER: ");
    scanf("%d",&v);
    switch(v)
      .
      .
    códigos
      .
      .
}while(v!=0 && v!=51 && v!=34 && v!=11 ?&& v!=10 && v!=15);

 

  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Realmente continue não funciona. Porém goto funciona.

#include <stdio.h>
int main( void ){
	int i = 0;
	L0: switch( i ){
		case 10:
			return 0;
		default:
			printf(" %d", ++i); 
        		goto L0;}
	return 0;}

 

  • Curtir 2
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi, o código parece estar correto como está, se digitar uma opção inválida ele entra no default e exibe a mensagem e depois repete o o ciclo while.

 

A única coisa que vi que estava faltando era um "break" no fim do case 15 (voto em branco), e eu adicionei isso. (Se quiser também pode por um break no default mas não é necessário.)

 

    while(v!=0){
        printf("\n\nDeputado Estadual:\n 51-Ana Rita Pacheco\n 34-Ana Guilherme\n 11-Adalberto Campos\n 10-Voto Nulo\n 15-Voto Branco");
        printf("\nDigite o número correspondente ao seu voto e aperte ENTER: ");
        scanf("%d",&v);
        switch(v){
            case 0:
                printf("Votação encerrada!");
                break;
            case 51:
                depEstAnaR=depEstAnaR+1;
                Mulher=Mulher+1;
                printf("Ana Rita Pacheco. Voto registrado!");
                break;
            case 34:
                depEstAnaG=depEstAnaG+1;
                Mulher=Mulher+1;
                printf("Ana Guilherme. Voto registrado!");
                break;
            case 11:
                depEstAdal=depEstAdal+1;
                Homem=Homem+1;
                printf("Adalberto Campos. Voto registrado!");
                break;
            case 10:
                vn=vn+1;
                printf("Voto Nulo registrado!");
                break;
            case 15:
                vb=vb+1;
                printf("Voto Branco registrado!");
                break;
            default:
                printf("OPCAO INVALIDA. Digite algo válido!");
        }
    }
  • Curtir 1
  • Obrigado 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@devair1010, @vangodp, @AnsiC@isrnick Obrigado, a forma que o Devair disse funcionou, eu sabia do goto porém alguns veteranos do meu curso de Eng. de Computação disseram para não utilizar isso por que os professores (dizem que quebram a lógica do código ou algo assim), descontam ponto em quem usa. Por acaso vocês saberiam me dizer o nome da biblioteca que não permite que o usuário digite letras? E se existe algo que limite o número mínimo que o usuário pode digitar (ex: um cartão de banco da visa que tem 16 números e que caso o usuário queira inserir mais números não seja possível)?

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Feche essa poster.

E cria um novo com essa nova questão. É por uma questão de melhor organização, pois esse novo problema

  • Obrigado 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Alexandre Caribé não é só porque quebra a lógica do código, goto em vários casos gera alguns problemas na hora da compilação. Existe a função isalpha, você pode simplesmente fazer um for e verificar caractere por caractere com a função isalpha.

#include <iostream>       // std::cout, std::cin
#include <iomanip>        // std::boolapha
#include <string>         // std::string
#include <cctype>         // isalpha

bool PossuiLetra(std::string Entrada)
{
    for (size_t i = 0; i < Entrada.size(); i++)
    {
        if (isalpha(Entrada[i]))
            return true;
    }
    return false;
}

int main()
{
    std::string Teste1 = "123456789A";
    std::string Teste2 = "123456789";
    std::string Teste3 = "----...";

    std::cout << "Possui letra? " << std::boolalpha << PossuiLetra(Teste1) << std::endl;
    std::cout << "Possui letra? " << std::boolalpha << PossuiLetra(Teste2) << std::endl;
    std::cout << "Possui letra? " << std::boolalpha << PossuiLetra(Teste3) << std::endl;

    std::cin.clear();
    std::cin.get();

    return 0;
}

 

Saída:

Citação

Possui letra? true
Possui letra? false
Possui letra? false

 

Para limitar os dígitos você pode verificar a quantidade de digitos, se for maior que 16 você limpa os outros.

 

Exemplo:

#include <iostream>
#include <string>
  
int main()
{
    std::string entrada;

    std::cin >> entrada;

    if (entrada.size() > 16)
    {
        std::cout << "Entrada maior que 16.\n";
        
        for (size_t i = 16; i < entrada.size(); i++)
            entrada[i] = '\0';
    }

    std::cout << entrada << std::endl;
    
    return 0;
}

Entrada:

Citação

34932190312390902312945012059120120439129401234909011249014901091412029490123901239

 

Saída:

Citação

Entrada maior que 16.
3493219031239090

 

  • Obrigado 1
  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 minuto atrás, cyer disse:

goto em vários casos gera alguns problemas na hora da compilação

Não sabia, dá um exemplo?

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
10 minutos atrás, AnsiC disse:

Não sabia, dá um exemplo?

 

Escrevi um exemplo simples, testei no Visual Studio e gerou esse erro por conta do "goto" e da inicialização da variável depois do goto.

 

Esse é um exemplo que me lembro, no momento só lembro desse, mas tem vários outros problemas que são gerados pelo goto.

 

13A4gXK.png

 

#include <iostream>				// std::cout
#include <Windows.h>				// OpenProcess
 
int main()
{
    HANDLE Processo = OpenProcess(PROCESS_ALL_ACCESS, false, 0x10);

    if (Processo == NULL)
    {
        std::cout << "Falha ao abrir o processo.\n";
        goto final;
    }

    int erro = 0; // Essa declaração apos o goto vai ser onde vai gerar o erro na compilação, por conta de inicializar a variável apos um goto
  
    final:
    if (Processo)
        CloseHandle(Processo);

    std::cout << "Saindo.\n";

    return EXIT_SUCCESS;
}

 

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

É, de fato para pessoas iniciante / inexperientes na arte do goto, o bicho pega.

 

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
agora, AnsiC disse:

É, de fato para pessoas iniciante / inexperientes na arte do goto, o bicho pega.

 

 

O maior problema em usar goto, nem sempre é os erros, mas sim porque quebra completamente a lógica do código

  • Curtir 1
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 minuto atrás, cyer disse:

O maior problema em usar goto, nem sempre é os erros, mas sim porque quebra completamente a lógica do código

É, também! Ainda bem que essas questões não foram o bastante para remover essa palavra chave, e espero que nunca seja porque gosto muito do poder por traz de simples palavra que desbanca todo resto das declarações de loop.

  • Curtir 1
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
50 minutos atrás, AnsiC disse:

É, também! Ainda bem que essas questões não foram o bastante para remover essa palavra chave, e espero que nunca seja porque gosto muito do poder por traz de simples palavra que desbanca todo resto das declarações de loop.

@AnsiC fique tranquilo, nunca irão retirar o goto da linguagem. Que aconteceria com as centenas de códigos antigos que contêm goto? Não poderiam ser compiladas. Incluindo o linux? :tw_grimace:

  • Curtir 1
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
54 minutos atrás, vangodp disse:

@AnsiC fique tranquilo, nunca irão retirar o goto da linguagem. Que aconteceria com as centenas de códigos antigos que contêm goto? Não poderiam ser compiladas. Incluindo o linux? :tw_grimace:

 

Da linguagem C não podem retirar, mas da linguagem C++ podem retirar o goto, inclusive já fizeram algo parecido na nova versão do C++ Moderno chamada de "C++ 11", na versão mais recente do C++(C++ 17), retiraram a keyword register, é provável que nas próximas versões do C++ moderno retire algumas "keywords" que são inúteis nos dias de hoje da mesma forma que o register é.

 

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4340

https://stackoverflow.com/questions/20618008/replacement-for-deprecated-register-keyword-c-11

  • Curtir 1
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

6 horas atrás, cyer disse:

Da linguagem C não podem retirar, mas da linguagem C++ podem retirar o goto

Sempre achei que C++ fosse extensão da linguagem C, até mais que isso, que todo código C++ é reduzido a C antes de assemblear. Então poderias usar o goto em C++ da mesma formo que consigo em C'11?

Deixa pra lá, com goto e sem goto não tenho intenção de aprender c++

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em um principio sim c++ era uma extensão C, mas agora não, foi totalmente reescrito e é independente.

  • Curtir 1
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
9 horas atrás, AnsiC disse:

 

Sempre achei que C++ fosse extensão da linguagem C, até mais que isso, que todo código C++ é reduzido a C antes de assemblear. Então poderias usar o goto em C++ da mesma formo que consigo em C'11?

Deixa pra lá, com goto e sem goto não tenho intenção de aprender c++

 

Antigamente era sim isso, hoje em dia esse pode se dizer que esse conceito mudou, C++ está praticamente superior(ou quase) que o C(no quesito de recursos, funções e projetos), ainda perde um pouco no desempenho em comparação a linguagem C, mas não é grande coisa, tanto que aplicativos que precisam do máximo desempenho possível, como jogos, a maioria hoje em dia é feita em C++.


Um bom programador tem sempre que se manter atualizado para o mercado de trabalho.

 

Se você aprende a programar em C++ você aprende a programar em qualquer linguagem Orientada a objetos(Java, C# e varias outras).

  • Curtir 1
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
2 horas atrás, cyer disse:

Um bom programador tem sempre que se manter atualizado para o mercado de trabalho

C é a linguagem dos efeitos especias do Cinema desdo do Filme ET até Avatar.

C está em todos sistema operacionais famosos.

C language é a célula de todo programa que você já usou e vai usar **.

C não é produtiva verdade. "O que me irrita nas linguagens super produtivas como Python (em termos de produtividade C++ perde feio para Python) é que só seleto grupo de pessoas sabem o que realmente está acontecendo;"

C faz parte de 'todos compiladores / interpretadores' exemplo no mundo Python que  é baseado em java que é baseado C++ que é baseado em C; 

C language é a linguagem da chamada heurística que faz a verdadeira programação, programação essa feita por grandes programadores de compiladores.

C só perde para Java; Até sua filha C++  fica em 'terceiro todos os anos' ... :D 

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

Top Language 2018

 

** voce gosta de fazer pipoca e ligar sua tv e assistir um filminho? Isso só foi possível porque C fez a ponte entre o humano e o controlador digital da Tv e do Microondas e de quase todo aparelho domestico até a porta da garagem.

 

C é o mais perto que podermos chegar da máquina :P

 

"Nenhuma técnica de programação resolve todos os problemas.
 Nenhuma linguagem de programação produz apenas resultados corretos.
 Nenhum programador deve iniciar cada projeto do zero"

 

C é para quem tem calma de aprender, e não ficará por isso fora da diversão.

  • Curtir 1
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@AnsiC onde você mora encontra muito mercado para linguagem C? Pois onde eu moro não.

 

Citação

C é o mais perto que podermos chegar da máquina

Não, podemos programar em algo muito mais baixo, como por exemplo em Assembly, utilizando até IDEs para C/C++, como por exemplo o Visual Studio ou CodeBlocks, ambos possuem suporte para inline assembly.

 

Tudo que se pode fazer em C pode fazer em C++ e em 99% dos casos de uma forma até melhor.

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
2 horas atrás, cyer disse:

onde você mora encontra muito mercado para linguagem C? Pois onde eu moro não.

Em nenhum momento estou pedindo para você abandonar uma coisa pela outra; Pelo contrario faça como quiser e siga a tendencia de sua região.

 

2 horas atrás, cyer disse:

Tudo que se pode fazer em C pode fazer em C++ e em 99% dos casos de uma forma até melhor.

Será! Sei não ein!

  • Obrigado 1
  • Haha 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
3 horas atrás, AnsiC disse:

Em nenhum momento estou pedindo para você abandonar uma coisa pela outra; Pelo contrario faça como quiser e siga a tendencia de sua região.

Eu não falei que ia abandonar ou trocar, só perguntei porque na minha região você dificilmente vai encontrar trabalhos para programadores em C, a maioria prefere o C++(embora ainda prefiro a linguagem C), apenas para você ter uma ideia de como o C++ está ficando cada vez mais forte no mercado

  • Curtir 1
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
7 horas atrás, cyer disse:

Eu não falei que ia abandonar ou trocar, só perguntei porque na minha região você dificilmente vai encontrar trabalhos para programadores em C, a maioria prefere o C++(embora ainda prefiro a linguagem C), apenas para você ter uma ideia de como o C++ está ficando cada vez mais forte no mercado

Valeu

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×