Ir ao conteúdo

Posts recomendados

Postado

Ola sou novo aqui no fórum, esta e minha primeira pergunta/ postagem então ja desculpa aee qualquer vacilo, estou estudando C++ e uso o programa DEV C++ versão 4.9.9.2 o que acontece eu quero fazer um programinha simples pra encaixar em um programa maior, to fazendo seguimento a seguimento separado, para poder testar mais fácil, o que eu quero é testar a altura de um usuário e a mesma deve esta dentro de um determinado parâmetro de limite, sendo que acima de um determinado tamanho ate um limite, ele pode cumprir uma função, abaixo de um determinado parâmetro ate um limite ele não poderá cumprir a função(cargo de trabalho) e se ele estiver tanto abaixo ou acima dos limites ele digitou errado e então entra no sistema de repetição e volta a fazer a pergunta ate que seja inserida a informação correta, porém isso so funciona com números caso eu insira uma letra o programa apresenta problemas e fica num loop infinito preenchendo e respondendo infinitamente sem parar, alguém pode me ajudar a resolver isso, ja agradeço a atenção segue o código...

 

#include<iostream>
#include<cstdlib>
#include<locale.h>

using namespace std;

int main()
{
    setlocale(LC_ALL, "Portuguese");
    
    double altura;
    
    do{
           cout<<" Digite sua altura dividindo os metros dos centimetros com uso de um ponto . \n";
           cin>>altura;
           
           if(altura>=1.80 && altura<=2.60)
           {
                           cout<<" Sua estatura é adequada para trabalhos com itens altos...\n";
                           }
                           else if(altura<=1.79 && altura>=0.80)
                           {
                                cout<<" Sua estatura não esta adequada a trabalhos com itens altos...\n";
                                }
                                else
                                {
                                    cout<<" Dados incorretos, favor digitar novamente...\n";
                                    }
                                    }while(altura<=0.79 || altura>=2.61);
                                    
                                    system("pause");
                                    
                                    return 0;
                                    
                                    }
    

 

  • Curtir 1
Postado

Oi @nfk2012 !

 

Se eu entendi bem você vai precisar verificar o tipo da variável que esta sendo analisada.

Eu consegui achar uma forma muito simples de fazer isso, usando o sizeof, dessa forma:

 

image.png.f660e4bf5735f86836f03733a8b27e51.png

 

A saída desse programa ficaria assim:

 

image.png.cdef23ee36e767887c87edf074a9a3c1.png

 

O contrario também acontece:

 

image.png.858622bc135c7d8b3d8a38ae08ba4f27.png

 

image.png.67ed5054559ebbdf24ad48de7775cf40.png

 

Tenta fazer assim!

  • Curtir 2
  • Confuso 1
Postado

@thefill Então na verdade eu não preciso testar a variável em si o que eu preciso testar é somente o valor que o usuário inserir, quando ele insere números o programa funciona perfeitamente, mas se por algum motivo ele insere uma letra o programa apresenta problemas ele entra em loop infinito, se você copiar meu código e testar com qualquer numero ele funciona agora insira uma letra aee você vai ver o que estou falando ele fica num lopp infinito de pergunta e resposta automático.

 

@arfneto Então mano... onde estão me ensinando dizem que é C++ mas como sou leigo...rsrsrs mas mesmo sendo c ou c++ o lance é nesse trecho mesmo a parte de inserir ele em outro código eu to tranquilo, mas esse trecho ele esta fechado como um programa separado mesmo só que como disse se o usuário inserir uma letra por acidente ao invés de um numero o código apresenta problemas entra em loop infinito, se você puder copiar o código e testar vai ver o que acontece.

  • Curtir 1
Postado
43 minutos atrás, thefill disse:

Tenta fazer assim!

 

Não, nem tente. Está errado.

 

Poste código e não imagens. Código alguém pode copiar e compilar e testar. Qual o propósito de postar uma imagem de um código? Use o botão code como descrito no  primeiro tópico do forum, @thefill

 

Os testes que está fazendo com o operador sizeof só comparam o tamanho da variável. Não tem o efeito que pretendeu mostrar. float e int tem o mesmo tamanho por exemplo, e seu programa então diria que o int é um float....

 

 

11 minutos atrás, nfk2012 disse:

se você puder copiar o código e testar vai ver o que acontece.

 

poste o programa todo, como eu disse....

  • Curtir 1
Postado

@arfneto o programa inteiro e esse aee que postei, o resto e de outro exercício cada exercício e um teste diferente eu só quero saber sobre esse que esta apresentando problemas quando o usuário entra com uma letra ao invés de um numero.

  • Curtir 1
Postado
3 horas atrás, nfk2012 disse:

porém isso so funciona com números caso eu insira uma letra o programa apresenta problemas e fica num loop infinito preenchendo e respondendo infinitamente sem parar, alguém pode me ajudar a resolver isso, ja agradeço a atenção

Falha na captura! O método deve retorna fail (0 ou -1 consulte o manual) para sinalizar que o formato requerido no parâmetro e os dados na entrada são incompatíveis. Se descartar uma entrada, lendo após a falha uma ‘string’, talvez resolva.

  • Curtir 2
Postado
29 minutos atrás, nfk2012 disse:

esta apresentando problemas quando o usuário entra com uma letra ao invés de um numero

 

Você nada fez para testar. Parte do princípio que leu um número só que pode não ter lido...

 

Como @mauro_b te indicou, precisa TESTAR se leu algo. Deve imaginar que ao digitar umas letras o programa precisa tomar uma decisão e faltou sua instrução...

 

formate com mais cuidado seu código. Está difícil de ler. Em geral ao menos alinhe o do com o while correspondente.

 

Pode achar mais legível escrever como o exemplo abaixo. Compare e entenda as diferenças

 

EXEMPLO

 

#include <locale.h>
#include <iostream>
using namespace std;

int main(void)
{
    string prompt{
        "\nDigite sua altura dividindo os metros dos "
        "centimetros com uso de um ponto . : "};
    double altura{0.};
    setlocale(LC_ALL, "Portuguese");
    cout << prompt;
    cin >> altura;
    while (cin.good() && altura >= 0.79 && altura <= 2.61)
    {
        if (altura >= 1.80)
            cout << "\nSua estatura é adequada"
                    " para trabalhos com itens "
                    "altos...\n";
        else if (altura >= 0.80)
            cout << "\nSua estatura não esta adequada"
                    " a trabalhos com itens altos...\n";
        else
            cout
                << "\nDados incorretos, favor digitar novamente...\n\n";

        cout << prompt;  // le o proximo
        cin >> altura;
    };  // while()
    return 0;
}

 

E considere que ponto flutuante é uma miséria para testar. Imagine se o cara digitar 2.6005 e veja o que acontece com seus testes...

 

Como está aprendendo e enquanto está testando se acostume a mostrar IMEDIATAMENTE o valor lido nesses comandos. Muitas vezes não é o que parece e assim economiza um tempo.

Não use system() para nada. Não vai aprender nada com isso.

 

Não use pause. 

 

Se o seu IDE não para ao final do programa mude de IDE

 

Se precisa parar o programa use uma mensagem e uma leitura, como cout e cin.

 

 

  • Curtir 2
Postado

Obrigado pela ajuda@arfneto @mauro_b , tem alguns comandos no seu exemplo que não conheço então não entendi muito bem mas vou pesquisar aqui e testar no meu codigo para ver como fica e se consigo aprender valeu pela ajuda de novo.

  • Curtir 1
Postado
1 hora atrás, nfk2012 disse:

tem alguns comandos no seu exemplo que não conheço então não entendi muito bem

pergunte. aqui. é um forum. não faz sentido ler aqui e pesquisar em outro lugar eu acho. E como fui eu que escrevi não acha que faria sentido perguntar exatamente pra quem escreveu?

  • Curtir 2
Postado
12 horas atrás, thefill disse:

Foi mal aí gente, desculpa, eu também ainda estou aprendendo

 

Não, não acho que foi mal. Você tinha uma ideia e um código e podia ajudar. Essa é a motivação do forum 

  • Curtir 2
Postado

@arfneto Ola novamente o codigo que voce me passou não roda no meu compilador ele da erro, e como não conheço o comando string prompt não consegui resolver o erro anexei o erro que acontece, para que possa ver, e ja que estou voltando no codigo queria tirar algumas duvidas, 1 como se usa e para que serve esta comando string prompt, 2 para serve e como usar o comando cin.good, 3 porque voce setou a variavel atura entre chaves?

erro de compilação.png

  • Amei 1
Postado

@nfk2012     esse Dev C++ , é muito antigo ,  considere trocar de compilador/IDE , por exemplo para o visual studio  , e inclua  as opções mais recentes ,   e  prompt  é apenas uma variável simples ,   e string é um tipo de variável comum na linguagem  C++ ,   ela substitui por exemplo , a variável char prompt[10]; da linguagem C ,  

// em c++
string prompt = "qq coisa";

// em  c
char prompt[10] = {"qq coisa"};
//  ou ainda
char prompt[] = {"qq coisa"};

 

  • Curtir 1
Postado
Em 28/12/2021 às 20:25, nfk2012 disse:

@mauro_b Hum.. como to começando agora não entendi muito bem como fazer isso, como ficaria no código isso que você me orientou a fazer?

/******************************************************************************

Welcome to GDB Online.
GDB online is an online compiler and debugger tool for C, C++, Python, Java, PHP, Ruby, Perl,
C#, VB, Swift, Pascal, Fortran, Haskell, Objective-C, Assembly, HTML, CSS, JS, SQLite, Prolog.
Code, Compile, Run and Debug online from anywhere in world.

*******************************************************************************/
#include <iostream>
#include <string>
int
main() {
    // O programa abaixo é uma ex. que força a captura e descarte [de todo a linha de] dados incompatíveis.
    
    auto usuario__altura= .0f;
    /// define uma varável do tipo [f], que é o tipo desejado de informação
    
    std::string tmp= {};
    /// define uma instância string, que é a variável para implementação da expressão de descarte
    
    /*
    No caso abaixo, os comandos estão 'presos' num ciclo enquanto falhar a captura do dado determinado pelo parâmetro;
    saltando para o início do bloco a partir do fim do seu bloco 'else',
    que contém alguns comandos que trata e ignora uma falha do fluxo!
    */ Forca_A_Captura: {
        
        if(std::cin >>usuario__altura) {
        /// se [não está sinalizada como nula ou falha]
    
            std::cout <<"Captura BEM Sucedida, fail: " <<std::cin.fail() <<std::endl;
            /// escrever Captura Bem ... sinalização atual: fail
            
        }
        else {
        /// do contrário

            std::cout <<"Captura MAL Sucedida, fail: " <<std::cin.fail() <<std::endl;
            /// escrever Captura MAL ... sinalização atual: fail
            
            
            std::cin.clear();
            /// Limpar a sinalização.
            
            std::getline(std::cin, tmp);
            /// Talvez opti por std::cin.ignore(BUFSIZ, '\n'); que é mais usual
            /// Ambos tenta capturar, duma linha de entrada, compatível com fluxo de caractere
            
            goto Forca_A_Captura; // compatível com parâmetro no método cin()
        }
        
    }
    /// Fim de Forca_A_Captura
    return 0;
}

 

  • Curtir 1
  • Obrigado 1
Postado

@devair1010 Obrigado pela explicação e pelo conselho de mudar de compilador, eu ja vinha percebendo que o dev C++ apresentava muitos bugs e não me deixa copiar alguns , vou mudar para o compilar/IDE que você me recomendou, valeu mesmo👍

@mauro_b 😲 caramba cara valeu mesmo pela explicação e pelo código agora consegui entender pelo menos a estrutura e a logica por trás do que você me falou, e vi que eu tenho que mudar a forma de programar aqui no meu código para evitar esse bug que falei vou ter que refazer... agora fiquei com outra duvida esse código que você fez ele esta em C ou em C++, porque pelo que eu estou vendo acho que estão me ensinando usando as duas linguagens ao mesmo tempo, nem sei se isso e possível dentro de um código, e assim vocês que ja têm mais experiencia por qual linguagem e mais fácil começar a programar e é mais fácil começar com estruturada ou orientada a objetos?

  • Curtir 1
Postado
13 horas atrás, nfk2012 disse:

e como não conheço o comando string prompt

 

Isso não é um comando. Apenas declara uma variável prompt do tipo string

 

14 horas atrás, nfk2012 disse:

1 como se usa e para que serve esta comando string prompt, 2 para serve e como usar o comando cin.good, 3 porque voce setou a variavel atura entre chaves?

 

  • talvez em seu IDE deva usar #include <string>... Isso não é um comando. É só uma declaração
  • cin.good é exatamente a razão de seu tópico: indica se leu algo ou não
  • usar chaves é a maneira recomendada em C++

 

9 horas atrás, devair1010 disse:

e string é um tipo de variável comum na linguagem  C++

 

Na verdade string é uma classe e não um tipo de variável comum

  • Curtir 1
  • Obrigado 1
Postado
2 horas atrás, nfk2012 disse:

agora fiquei com outra duvida esse código que você fez ele esta em C ou em C++, porque pelo que eu estou vendo acho que estão me ensinando usando as duas linguagens ao mesmo tempo, nem sei se isso e possível dentro de um código, e assim vocês que ja têm mais experiencia por qual linguagem e mais fácil começar a programar e é mais fácil começar com estruturada ou orientada a objetos?

Atualmente é os dois, e nessa ordem: estrutura e objeto, mesmos em curso de recurso duma linguagem POO, em específico C++. Quase todos ficamos curiosos de como tal coisa acontece e precisa da estruturação para entender, por exemplo: uma classe USUÁRIO não existe, como existe a STRING, logo é preciso objetar [definir a classe] e depois instanciar [definir uma variável], em outras palavras:

 

Define a classe usuário, no mínimo, com atributo: altura e método: pegar_altura, respectivamente, uma variável e uma função. A função tem decisões e iterações, ou seja:  Prog. Estruturada!

 

  • Curtir 2

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 comunidades 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

×
×
  • Criar novo...