Ir ao conteúdo

Posts recomendados

Postado

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;
}

Postado

@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++

Postado

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;
}

 

  • Curtir 2
Postado

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

Postado
14 horas atrás, Filipe Henriques de Paiva disse:

o resultado é 1.33333....

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

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...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!