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

C++ Existe algum comando que limite o número digitado pelo usuário?

Recommended Posts

Olá, estou fazendo um código de votação e no começo dele eu peço para que o usuário digite um número de título de eleitor, o programa é baseado no Sistema eleitoral brasileiro, então é necessário que o usuário digite apenas 12 dígitos (nem mais, nem menos). Existe alguma biblioteca ou função que faça um limite de dados digitados do usuário?

adicionado 5 minutos depois

O código está assim:

#include <cctype>
int main(){
    int v=7,depEstAnaR=0, depEstAnaG=0, depEstAdal=0, vn=0, vb=0, titulo=0, depFedAna=0, depFedPau=0, GovMaia=0, GovGen=0, GovSel=0,SenGut=0, SenFer=0,PresMae=0, PresAnt=0, PresLis=0, Mulher=0, Homem=0;
    setlocale(LC_ALL,"");
    printf("Seja bem vindo, inicie a sua votação!\n Digite seu titulo:");
    scanf("%d", &titulo);
    do{
        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!");
                }
    }    while(v!=0 && v!=51 && v!=34 && v!=11 && v!=10 && v!=15);
    do{
        printf("\n\nDeputado Federal:\n56-Ana Vitória\n33-Paulo Guilherme\n20-Voto Nulo\n25-Voto Branco");
        printf("\nDigite o número correspondente ao seu voto e aperte ENTER: ");
        scanf("%d",&v);
        switch(v){
            case 56:
                depFedAna=depFedAna+1;
                Mulher=Mulher+1;
                printf("Ana Vitória. Voto registrado!");
                break;
            case 33:
                depFedPau=depFedPau+1;
                Homem=Homem+1;
                printf("Paulo Guilherme. Voto registrado!");
                break;
            case 20:
                vn=vn+1;
                printf("Voto Nulo registrado!");
                break;
            case 25:
                vb=vb+1;
                printf("Voto Branco registrado!");
            default:
                printf("OPCAO INVALIDA. Digite algo válido!");
                   break;}
        
    }    while(v!=56 && v!=33 && v!=20 && v!=25);
    do{
        printf("\n\nGovernador:\n38-Maia da Ana\n40-Gentil\n18-Selma Silva\n30-Voto Nulo\n35-Voto Branco");
        printf("\nDigite o número correspondente ao seu voto e aperte ENTER: ");
        scanf("%d",&v);
        switch(v){
            case 38:
                GovMaia=GovMaia+1;
                Mulher=Mulher+1;
                printf("Maia da Ana. Voto registrado!");
                break;
            case 40:
                GovGen=GovGen+1;
                Homem=Homem+1;
                printf("Gentil. Voto registrado!");
                break;
            case 18:
                GovSel=GovSel+1;
                Mulher=Mulher+1;
                printf("Selma Silva. Voto registrado!");
                break;
            case 30:
                vn=vn+1;
                printf("Voto Nulo registrado!");
                break;
            case 35:
                vb=vb+1;
                printf("Voto Branco registrado!");
                break;
            default:
                printf("OPCAO INVALIDA. Digite algo válido!");
                break;}
    } while(v!=38 && v!=40 && v!=18 && v!=30 && v!=35);
    do{
        printf("\n\nSenador:\n04-Gutemberg Silva\n67-Fernando Fernandes\n45-Voto Nulo\n50-Voto Branco");
        printf("\nDigite o número correspondente ao seu voto e aperte ENTER: ");
        scanf("%d",&v);
        switch(v){
            case 04:
                SenGut=SenGut+1;
                Homem=Homem+1;
                printf("Gutemberg Silva. Voto registrado!");
                break;
            case 67:
                SenFer=SenFer+1;
                Homem=Homem+1;
                printf("Fernando Fernandes. Voto registrado!");
                break;
            case 45:
                vn=vn+1;
                printf("Voto Nulo registrado!");
                break;
            case 50:
                vb=vb+1;
                printf("Voto Branco registrado!");
                break;
            default:
                printf("OPCAO INVALIDA. Digite algo válido!");
                break;}
    }    while(v!=04 && v!=67 && v!=45 && v!=45 && v!=50);
    do{        
        printf("\n\nPresidente:\n17-Maeli Gente Boa\n22-Antônio do Brasil\n31-Lissandro Progresso\n55-Voto Nulo\n60-Voto Branco");
        printf("\nDigite o número correspondente ao seu voto e aperte ENTER: ");
        scanf("%d",&v);
        switch(v){
            case 17:
                PresMae=PresMae+1;
                Mulher=Mulher+1;
                printf("Maeli Gente Boa. Voto registrado!");
                break;
            case 22:
                PresAnt=PresAnt+1;
                Homem=Homem+1;
                printf("Antônio do Brasil. Voto registrado!");
                break;
            case 31:
                PresLis=PresLis+1;
                Homem=Homem+1;
                printf("Lissandro Progresso. Voto registrado!");
                break;
            case 55:
                vn=vn+1;
                printf("Voto Nulo registrado!");
                break;
            case 60:
                vb=vb+1;
                printf("Voto Branco registrado!");
                break;
            default:
                printf("OPCAO INVALIDA. Digite algo válido!");
                break;}
    } while(v!=17 && v!=22 && v!=31 && v!=55 && v!=60);
    printf("Resultados de Deputado Estadual:\n Ana Rita Pacheco\t% i\n Ana Guilherme\t %i\n Adalberto\t %i\n Votos Nulos\t %i\n Voto Branco\t %i\n",depEstAnaR,depEstAnaG,depEstAdal,vn,vb);
    return 0;
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você pode fazer o limite da entrada usando a função fgets, mas não é o método ideal para isso(não vou deixar um exemplo disso, mas se você quiser, eu posto um exemplo).

 

O método correto para esse seu tipo de aplicação seria, limpar os dígitos que ultrapassa o valor máximo.

 

Para fazer isso, você teria que pegar a quantidade de dígitos inserido pelo usuário, para fazer isso de forma simples, você pode usar a classe to_string e usar o método length. Depois você transforma para uma string e remove os caracteres que ultrapassa o limite e converte novamente para um inteiro(usando a função stoi).

 

O exemplo abaixo faz exatamente o que você quer, no caso usei para 3 o limite máximo de digitos.

 

#include <iostream>              // std::cout, std::cin
#include <string>                // std::to_string, std::stoi

#define MAX_NUM                  3

int main()
{
    int numero = 0;

    std::cout << "Insira um numero(ate 3 digitos): ";
    std::cin >> numero;
    
    // Pega a quantidade de números que o inteiro possui usando a classe to_string e armazena no na variável a quantidade
    int qntDigitos = std::to_string(numero).length();
    
    // Verifica se a quantidade números é maior que o limite permitido(definido na constante MAX_NUM)
    if (qntDigitos > MAX_NUM)
    {
        // Converte o inteiro para string
        std::string novonum_str = std::to_string(numero);
    
        // Troca os caracteres dos números que ultrapassam o limite(definido na constante MAX_NUM) pelo caractere que representa o fim de uma string(caractere nulo)
        for (size_t i = MAX_NUM; i < novonum_str.length(); i++)
            novonum_str[i] = '\0';

        // Converte a string para inteiro
        int novonum_int = std::stoi(novonum_str);

        // Mostra na saída o número corrigido
        std::cout << "Numero corrigido: " << novonum_int << std::endl;
    }
    return 0;
}

 

Saída do primeiro teste:

Citação

Insira um numero(ate 3 digitos): 123456
Numero corrigido: 123

 

Saída do segundo teste:

Citação

Insira um numero(ate 3 digitos): 1234
Numero corrigido: 123

 

Saída do terceiro teste:

Citação

Insira um numero(ate 3 digitos): 41203120
Numero corrigido: 412

 

Duas sugestões:

1 - Para esse tipo de aplicação, use como string para ficar mais simples o seu código, como inteiro, se o usuário digitar um número grande, tipo, 123456789101234, vai ocasionar problemas, e um inteiro não pode receber 16 dígitos.

2 - Se você está programando em C++ use funções e recursos da linguagem C++, evite ao máximo usar funções e recursos da linguagem C.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

Olá. Bem interessante seu raciocínio ao converter o numero para uma string e trabalhar com a classe string, mas um ponto q gostaria de frisar é q usando o método "substr" da classe string o código ficaria reduzido d maneira bastante significativa.

Para resolver a questão do usuário digitar um número realmente muito grande, daria p resolver a questão trabalhando com um numero do tipo double, no caso do exemplo abaixo, long double.

Seria algo assim: 

 

#include <iostream>              // cout, cin
#include <string>                // to_string, stoi, substr
using namespace std;


int main()
{
    long double numero;

    cout << "Digite um numero de 3 digitos: ";
    cin >> numero;

    string numeroStr = to_string(numero).substr(0, 3);

    long long int novoNumero = stoi(numeroStr);

    cout << "Novo numero: " << novoNumero << endl;

    return 0;
}

Só um ponto no código q passou despercebido ao postar, a variável novoNumero pode ser só do tipo int que já resolve.

Ficou assim pois estava fazendo testes aqui e esqueci de mudar nessa parte

adicionado 10 minutos depois

Seria mudar nessa linha do código:

 

int novoNumero = stoi(numeroStr);

 

  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 20/04/2018 às 16:46, cyer disse:

2 - Se você está programando em C++ use funções e recursos da linguagem C++, evite ao máximo usar funções e recursos da linguagem C.

Esse é ponto importante para membros e não membros!

Tava triste a respeito disso então protestei nesse tópico: xadrez matriz c movimenta

  • Curtir 1

Compartilhar este post


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

Esse é ponto importante para membros e não membros!

Tava triste a respeito disso então protestei nesse tópico: xadrez matriz c movimenta

 

A função "substr" é um método da classe string do C++, talvez você quis se referir aos alteradores de tipo como "long double"

Se é isso basta deixar com int e pronto.

Não entendi ao certo sua colocação ?!

Compartilhar este post


Link para o post
Compartilhar em outros sites
14 minutos atrás, giu_d disse:

Não entendi ao certo sua colocação ?!

Concordei com membro @cyer , quando ele alerta @Alexandre Caribé enquanto o seu erro paradigmático, ou seja confundir mesclar C com C++.

adicionado 5 minutos depois

C é conhecida por muitos como linguagem de programação imperativa (característica de todas as linguagens antigas).

C++ é conhecida por muitos como linguagem de programação orientada a objetos (característica de todas as linguagens novas e produtivas). Mesclar as duas é conhecido por muitos como sendo uma prática grosseira.

 

Ficou claro o quanto concordo com ponto citado.

adicionado 8 minutos depois

Existe poucas pessoas que considera esse ponto irrelevante.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

Desculpa. Minha intenção foi d apenas apresentar uma função do C++ q é bem útil para o exercício citado, com o objetivo de simplificar o código, já q o C++ oferece vários métodos para classes com a classe string, vector, set, etc...

Normalmente eu estou olhando p códigos q criei há algum tempo atrás e procuro usar uma lógica q deixe o código mais automatizado, reduzindo assim a qtde de código p fazer a mesma coisa.

Se isso é um erro por aqui me desculpa. Sou novo por aqui e estou aqui justamente para aprender

Inclusive aprendi já alguns recursos da classe string q não conhecia, como o método "to_string"

Mas se fazer o q eu fiz foi um erro desculpa, não quis d modo algum atrapalhar nem entristecer alguém.

Longe de mim algo assim. Estou há pouco tempo estudando C e C++ e já vi q tem muitos aqui com muito mais experiência do q eu quero aproveitar isso para aprender ao máximo por aqui

 

Compartilhar este post


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

Desculpa. Minha intenção foi d apenas apresentar uma função do C++ q é bem útil para o exercício citado, com o objetivo de simplificar o código, já q o C++ oferece vários métodos para classes com a classe string, vector, set, etc...

Normalmente eu estou olhando p códigos q criei há algum tempo atrás e procuro usar uma lógica q deixe o código mais automatizado, reduzindo assim a qtde de código p fazer a mesma coisa.

Se isso é um erro por aqui me desculpa. Sou novo por aqui e estou aqui justamente para aprender

Inclusive aprendi já alguns recursos da classe string q não conhecia, como o método "to_string"

Mas se fazer o q eu fiz foi um erro desculpa, não quis d modo algum atrapalhar nem entristecer alguém.

Longe de mim algo assim. Estou há pouco tempo estudando C e C++ e já vi q tem muitos aqui com muito mais experiência do q eu quero aproveitar isso para aprender ao máximo por aqui

 

Agora quem não entendeu fui eu.

 

Isso não tem nada ver com TU e sim com ELE, o autor do tópico que fez C dentro de um arquivo cpp praticamente.

 

Quando eu digo SEU erro estou falando na terceira pessoa do singular, ou seja, o autor do topico. Se tivesse falando de TU teria escrito TEU erro.

 

MEU: Primeira pessoa do Singular, aquela que fala.

TEU: Segunda pessoa do Singular, aquele com quem se fala. 

SEU : Terceira Pessoa no Singular de quem duas pessoas estão falando em geral acompanhada da partícula. Ex: Maria errou, seu erro foi não saber concordância.

 

Kkkk!!!

 

@giu_d Não é um competição, mas se fosse você teria ganhanho por ter explorado os objetos que deixaram o código mais oculto.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

Desculpa. Pensei q você tinha feito o comentário q fez pela questão d eu ter postado o código.

Apenas me confundi. Desculpa

Como já disse e você pode ver muito bem sou inda muito novo por aqui. Você, por exemplo, já é membro aqui desde 2014.

Por ser inda novo por aqui não estou muito familiarizado em como é o funcionamento desse site

Novamente gostaria d me desculpar. Realmente pensei q você estava se referindo a mim. 

Ao q parece eu tava comendo bolha hehe

adicionado 5 minutos depois

Na verdade foi um final d semana muito corrido por aqui, com meus dois sobrinhos passando o final d semana aqui.

Criança você deve saber como é. Realmente, apesar de eu gostar muito deles, acaba mudando bastante a rotina e acaba gerando um certo desgaste a mais

 

adicionado 24 minutos depois

Vou resumir tudo isso dessa forma: Em virtude do desgaste tanto físico como mental em q me encontrava, nem era a hora adequada para eu postar algo por aqui

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@giu_d realmente o código ficou bem mais limpo, não tinha pensado em usar a função substr para limitar, muito boa sua ideia.

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

×