[C++] Há alguma forma de fazer o default repetir o switch? - C/C#/C++ - Clube do Hardware
Há alguma forma de fazer o default repetir o switch?
Por Alexandre Caribé, 20 de abril em C/C#/C++
Alexandre Caribé 3
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:
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: ");
printf("Votação encerrada!");
depEstAnaR=depEstAnaR+1;
Mulher=Mulher+1;
printf("Ana Rita Pacheco. Voto registrado!");
depEstAnaG=depEstAnaG+1;
printf("Ana Guilherme. Voto registrado!");
depEstAdal=depEstAdal+1;
Homem=Homem+1;
printf("Adalberto Campos. Voto registrado!");
printf("Voto Nulo registrado!");
vb=vb+1;
printf("Voto Branco registrado!");
printf("OPCAO INVALIDA. Digite algo válido!");}
@Alexandre Caribé não, o default não faz isso , então você pode usar o comando do / while assim :
printf("Digite o número correspondente ao seu voto e aperte ENTER: ");
}while(v!=0 && v!=51 && v!=34 && v!=11 ?&& v!=10 && v!=15);
@devair1010 A menos que..... coloque um continue talvez? Não provei, mas acho que daria certo >_<
Realmente continue não funciona. Porém goto funciona.
L0: switch( i ){
printf(" %d", ++i);
goto L0;}
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("OPCAO INVALIDA. Digite algo válido!");
@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)?
Feche essa poster.
E cria um novo com essa nova questão. É por uma questão de melhor organização, pois esse novo problema
@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]))
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;
Possui letra? true
Possui letra? false
Para limitar os dígitos você pode verificar a quantidade de digitos, se for maior que 16 você limpa os outros.
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++)
std::cout << entrada << std::endl;
34932190312390902312945012059120120439129401234909011249014901091412029490123901239
Entrada maior que 16.
3493219031239090
goto em vários casos gera alguns problemas na hora da compilação
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.
#include <iostream>				// std::cout
#include <Windows.h>				// OpenProcess
HANDLE Processo = OpenProcess(PROCESS_ALL_ACCESS, false, 0x10);
std::cout << "Falha ao abrir o processo.\n";
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
if (Processo)
std::cout << "Saindo.\n";
É, de fato para pessoas iniciante / inexperientes na arte do goto, o bicho pega.
agora, AnsiC 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.
@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?
54 minutos atrás, vangodp disse:
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
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++
Em um principio sim c++ era uma extensão C, mas agora não, foi totalmente reescrito e é independente.
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).
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' ...
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
"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.
@AnsiC onde você mora encontra muito mercado para linguagem C? Pois onde eu moro não.
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.
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.
Será! Sei não ein!
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