Jump to content
Fórum Script Brasil
  • 0

Lucas Bulhões

Question

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 to comment
Share on other sites

2 answers to this question

Recommended Posts

  • 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 to comment
Share on other 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      651.9k
×
×
  • Create New...