Ir para conteúdo
Fórum Script Brasil
  • 0

Lucas Bulhões

Pergunta

Boa noite pessoal, sou iniciante em C, e estou tendo um erro no meu programa que é uma espécie de calculadora, o erro está ocorrendo somente na divisão, eu serei eternamente grato se alguém puder dedicar um pouco do tempo para analisar esse problema, as 3 operações estão funcionando ok.

Desde já agradeço a todos.

 

#include <stdio.h>

int main (void){

int n1,n2,k;
float res;

printf (" |-------------|Operaçoes Matematicas|---------------|\n\n");
printf ("Entre com o primeiro operando:");
scanf("%d",&n1);
printf("Entre com o segundo operando:");
scanf("%d",&n2);
printf("Escolha:\n\n");
printf("1-Soma\n2-Subtraçao\n3-Multiplicaçao\n4-Divisao\n\n");
printf("Digite aqui:");
scanf("%d",&k);
if(k==1){
    (res=(n1+n2));
    printf("%f",res);    
    }
else if(k==2){
    (res=(n1-n2));
    printf("%f",res);
    }
else if(k==3){
    (res=(n1*n2));
    printf("%f",res);
    }
else if((k=4) && (n2!=0)){
    (res=(n1/n2));
    printf("%f",res);
}
else if((k==4) && (n2==0)){
    printf("não e possivel dividir por zero.");
}
return 0;}

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

Imagine o seguinte caso:

    int a = 7, b = 2;
    float f = a/b;

    printf("%f", f);

Claramente deveria dar 3.5 porem se compilar você vai ver que esta saindo 3.0. Que aconteceu? Uma conversão implícita de tipos.
você está dividindo um inteiro por outro, e guardando o resultado em um float(real), São 2 instruções, isso implica que você divide um int por outro int, e como inteiros não possuem parte fracionaria, se descarta tudo o que for depois do ponto, logo é atribuído a um float implicando um cast, uma conversão de int a float neste caso, mesmo ocorrendo a conversão o que estava depois do ponto já não existe, Como o programa não sabia o que havia na conversão de tipo, o programa preenche essa parte com um zero depois do ponto.
Para que o resultado seja o correto você precisa fazer a conversão de forma explicita, indicando que se trata da divisão de um float por outro float assim:
 

    int a = 7, b = 2;
    float f = (float)a/b;

    printf("%f", f);

Neste caso indicamos que desejamos conservar a parte fracionaria ao fazer um cast de int a float com a variável a, logo acontece novamente uma conversão implícita com b, pois o programa toma como se a é um float ele faz a conversão implícita de b a float também. A efeitos é a mesma coisa que fazer

    int a = 7, b = 2;
    float f = (float)a/(float)b;

    printf("%f", f);


Nesse caso como você quer atribuir o resultado a um float, o normal seria que 'a' e 'b' fossem também flotantes, porem como nesse caso não são, se da o caso em que é preciso fazer de forma explicita, indicando que se deseja conservar as partes fracionarias. Fazer casts de forma explicita mesmo que aparentemente não faça falta quer dizer que você tem o programa baixo controle, e que você sabe em todo momento qual tipo de resultado vai ser gerado, pode se considerar uma boa pratica.

Considere usar doubles neste tipo de casos. Ao se tratar de poucas variáveis o consumo de memória não é muito grande preucupe-se pela memoria quando se tratar de muitos doubles, talvez nesse caso seja melhor optar por um tipo mais pequeno como float, como por exemplo um array de 1000 doubles, talvez neste caso seja melhor 1000 floats que ocupam a metade.

Link para o comentário
Compartilhar em outros sites

  • 0
3 horas atrás, vangodp disse:

Imagine o seguinte caso:


    int a = 7, b = 2;
    float f = a/b;

    printf("%f", f);

Claramente deveria dar 3.5 porem se compilar você vai ver que esta saindo 3.0. Que aconteceu? Uma conversão implícita de tipos.
você está dividindo um inteiro por outro, e guardando o resultado em um float(real), São 2 instruções, isso implica que você divide um int por outro int, e como inteiros não possuem parte fracionaria, se descarta tudo o que for depois do ponto, logo é atribuído a um float implicando um cast, uma conversão de int a float neste caso, mesmo ocorrendo a conversão o que estava depois do ponto já não existe, Como o programa não sabia o que havia na conversão de tipo, o programa preenche essa parte com um zero depois do ponto.
Para que o resultado seja o correto você precisa fazer a conversão de forma explicita, indicando que se trata da divisão de um float por outro float assim:
 


    int a = 7, b = 2;
    float f = (float)a/b;

    printf("%f", f);

Neste caso indicamos que desejamos conservar a parte fracionaria ao fazer um cast de int a float com a variável a, logo acontece novamente uma conversão implícita com b, pois o programa toma como se a é um float ele faz a conversão implícita de b a float também. A efeitos é a mesma coisa que fazer


    int a = 7, b = 2;
    float f = (float)a/(float)b;

    printf("%f", f);


Nesse caso como você quer atribuir o resultado a um float, o normal seria que 'a' e 'b' fossem também flotantes, porem como nesse caso não são, se da o caso em que é preciso fazer de forma explicita, indicando que se deseja conservar as partes fracionarias. Fazer casts de forma explicita mesmo que aparentemente não faça falta quer dizer que você tem o programa baixo controle, e que você sabe em todo momento qual tipo de resultado vai ser gerado, pode se considerar uma boa pratica.

Considere usar doubles neste tipo de casos. Ao se tratar de poucas variáveis o consumo de memória não é muito grande preucupe-se pela memoria quando se tratar de muitos doubles, talvez nesse caso seja melhor optar por um tipo mais pequeno como float, como por exemplo um array de 1000 doubles, talvez neste caso seja melhor 1000 floats que ocupam a metade.

Muito Obrigado, essa questão já estava me prendendo a algum tempo.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...