Ir ao conteúdo
  • Cadastre-se
Filipe Henriques de Paiva

C++ dizima periodica em c++

Recommended Posts

oi sou novo em programaçao e tenho um projeto pessoal e encontrei um obstaculo que estou semanas sem consegui resolver;

nao consigo fazer esse programa funcionar. tipo mesmo si o usuario digitar a resposta correta ele marca como falso, a dificuldade é 

fazer ele corrigir uma questão onde a resposta é uma dizima periodica. eu agradeço muito si alguem soubesse o que eu deveria fazer.

#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
    double c,d;
    double a,b;
    a=4;
    b=3;
    c=a/b;
    cout<<"4/3 = ";
    cin>>d;
    if(c==d)
    {
        cout<<"correto";
    }
    else
    {
        cout<<"errado a resposta e"<<c;
    }
    return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Filipe Henriques de Paiva Olá. Cara, aí você está fazendo uma comparação de valores do tipo double, nesse caso em C e C++, nessa comparação, são verificadas todas as casas decimais de um número informado

Em C uma das formas que encontrei para resolver o problema foi converter os valores para uma string e contabilizar apenas duas casas decimas, em seguida, comparar as strings

Não é o ideal, mas vou passar uma maneira de resolver a questão em C, tanto por eu não ter muita intimidade com o C++

#include <stdio.h>
#include <string.h>

int main(void) {

    double c = 0, resp;
    double a, b;
    char valor1[10], valor2[10];

    a = 4;
    b = 3;
    c = a / b;

    printf("4 / 3: ");
    scanf("%lf", &resp);

    sprintf(valor1, "%.2lf", c);
    sprintf(valor2, "%.2lf", resp);

    if (!strcmp(valor1, valor2))
        printf("Correto!\n");
    else
        printf("Errado!\n");

    return 0;
}

Perceba que foi preciso converter os números do tipo double formatados com apenas 2 casas decimais para strings em C e aí fazer a comparação das strings

OBS: Logo que puder passo uma maneira para resolver a questão em C++, isso se algum colega aqui do fórum não apresentar uma solução mais simples para essa questão em C++

Editado por giu_d
corrigir comentário
  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Comparação de igualdade entre números de ponto flutuante é um tema complicado, pois como pode ver no exemplo do seu programa, o resultado da divisão 4/3 armazenado na forma de ponto flutuante não fica exatamente igual ao valor obtido ao ler 1.333333333333 digitado pelo usuário e lido com cin, há diferenças nas formas finais em modo binário devido a diferenças nas operações efetuadas, então a operação de comparação de igualdade == não conseguirá constatar a igualdade.

 

Uma solução parcial/incompleta que pode ser usada é usar uma margem de erro máxima, e calcular a diferença relativa entre os 2 valores que deseja-se verificar se são iguais.

 

Ou seja, dada uma margem de erro máxima epsilon, e dois números de ponto flutuante a e b,  serão consideradas quase iguais (ou suficientemente iguais) se |(a - b) / b| < epsilon (onde | | indica valor absoluto ou módulo).

 

Mas note que isto não funcionará se a e b forem iguais ou muito próximos de 0, pois teremos 0 / 0 que não é um valor numérico válido, ou a divisão pode ir para infinito para valores a e b muito pequenos logo o resultado não será menor que epsilon mesmo se a e b forem quase iguais.

 

Então, vários métodos foram estudados e propostos para lidar com as exceções, e obter uma solução que funciona em todos os casos, mas isso aumenta a complexidade do problema e não é a proposta do seu exercício, se tiver interesse pesquise na internet e encontrará algumas soluções.

 

Neste caso a solução da diferença relativa já seria suficiente.

 

Então uma solução deste tipo deve funcionar:

#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std;
int main()
{
    double c,d;
    double a,b;
    a=4;
    b=3;
    c=a/b;
    cout<<"4/3 = ";
    cin>>d;
    if(abs( (c - d) / d ) < 0.0000001)
    {
        cout<<"correto";
    }
    else
    {
        cout<<"errado a resposta e"<<c;
    }
    return 0;
}

 

Editado por isrnick
  • Curtir 3

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá... :!!!:

 

5 horas atrás, Filipe Henriques de Paiva disse:

[...] si o usuario digitar a resposta correta ele marca como falso, [...]

Só por curiosidade minha. Qual é a resposta verdadeira para (4 / 3) ?  O que de certo deve ser digitado. É uma pergunta pertinente tanto para mais uma possível alternativa de resolução de minha parte quanto é para matar minha curiosidade.

 

O.k! Tchau

Compartilhar este post


Link para o post
Compartilhar em outros sites
14 horas atrás, Filipe Henriques de Paiva disse:

o resultado é 1.33333....

Para essa resposta, eu recomendo transforma a dizima em fração.

  • Curtir 1

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

×