Konwersje typów z float do int - ciągłe wyświetlanie jako float

0

Dlaczego, gdy druga z podanych liczb jest większa od -1 i mniejsza od 1, czyli np: 0.5, 0.8 itp. to wynik, nawe gdy jest całkowity, wyświetla się jako float np. 18.4/0.2=92.0 a nie 92

#include <stdio.h>
#include <ctype.h>
void oblicz(char a);
int menu(void);
int pobierz_pierwszy(void);
float liczba(void);
int main(void)
{
    char dzialanie;
    int znak;
    printf("Cwiczenie 8.8 w jezyku C - autor: xpeye\n\n");
    while ((znak=menu())!='k')
    {
        switch(znak)
        {
            case 'a' : dzialanie='+'; oblicz(dzialanie); break;
            case 'b' : dzialanie='-'; oblicz(dzialanie); break;
            case 'c' : dzialanie='*'; oblicz(dzialanie); break;
            case 'd' : dzialanie='/'; oblicz(dzialanie); break;
        }
    }
    printf("Koniec.\n");
    getchar();
    getchar();
    return 0;
}

void oblicz(char a)
{
    float b, c;
    printf("Podaj pierwsza liczbe: ");
    b=liczba();
    printf("Podaj druga liczbe: ");
    c=liczba();
    while (a=='/' && c==0)
    {
        printf("Podaj liczbe inna niz 0: ");
        c=liczba();
    }
    if (a=='+')
    {
        if(b==(int)b && c==(int)c && b+c==(int)(b+c))
        printf("%d + %d = %d\n", (int)b, (int)c, (int)(b+c));
        else if(b==(int)b)
        printf("%d + %.1f = %.1f\n", (int)b, c, b+c);
        else if(c==(int)c)
        printf("%.1f + %d = %.1f\n", b, (int)c, b+c);
        else if((int)(b+c)==b+c)
        printf("%.1f + %.1f = %d\n", b, c, (int)(b+c));
        else
        printf("%.1f + %.1f = %.1f\n", b, c, b+c);
    }
    else if(a=='-')
    {
        if(b==(int)b && c==(int)c && b-c==(int)(b-c))
        printf("%d - %d = %d\n", (int)b, (int)c, (int)(b-c));
        else if(b==(int)b)
        printf("%d - %.1f = %.1f\n", (int)b, c, b-c);
        else if(c==(int)c)
        printf("%.1f - %d = %.1f\n", b, (int)c, b-c);
        else if((int)(b-c)==b-c)
        printf("%.1f - %.1f = %d\n", b, c, (int)(b-c));
        else
        printf("%.1f - %.1f = %.1f\n", b, c, b-c);
    }
    else if(a=='*')
    {
        if(b==(int)b && c==(int)c && b*c==(int)(b*c))
        printf("%d * %d = %d\n", (int)b, (int)c, (int)(b*c));
        else if(b==(int)b && b*c==(int)(b*c))
        printf("%d * %.1f = %d\n", (int)b, c, (int)(b*c));
        else if(b==(int)b)
        printf("%d * %.1f = %.1f\n", (int)b, c, b*c);
        else if(c==(int)c && b*c==(int)(b*c))
        printf("%.1f * %d = %d\n", b, (int)c, (int)(b*c));
        else if(c==(int)c)
        printf("%.1f * %d = %.1f\n", b, (int)c, b*c);
        else if((int)(b*c)==b*c)
        printf("%.1f * %.1f = %d\n", b, c, (int)(b*c));
        else
        printf("%.1f * %.1f = %.1f\n", b, c, b*c);
    }
    else if(a=='/')
    {
        if(b==(int)b && c==(int)c && b/c==(int)(b/c))
        printf("%d / %d = %d\n", (int)b, (int)c, (int)(b/c));
        else if(b==(int)b && b/c==(int)(b/c))
        printf("%d / %.1f = %d\n", (int)b, c, (int)(b/c));
        else if(b==(int)b)
        printf("%d / %.1f = %.1f\n", (int)b, c, b/c);
        else if(c==(int)c && b/c==(int)(b/c))
        printf("%.1f / %d = %d\n", b, (int)c, (int)(b/c));
        else if(c==(int)c)
        printf("%.1f / %d = %.1f\n", b, (int)c, b/c);
        else if((int)(b/c)==b/c)
        printf("%.1f / %.1f = %d\n", b, c, (int)(b/c));
        else
        printf("%.1f / %.1f = %.1f\n", b, c, b/c);
    }
}

int menu(void)
{
    int ch;
    printf("Wybierz jedno z dzialan:\n");
    printf("a. dodawanie       b. odejmowanie\n");
    printf("c. mnozenie        d. dzielenie\n");
    printf("k. koniec\n");
    ch=pobierz_pierwszy();
    ch=tolower(ch);
    while ((ch<'a' && ch>'d') && ch!='k')
    {
        printf("Wpisz a, b, c, d lub k");
        ch=pobierz_pierwszy();
        ch=tolower(ch);
    }
    return ch;
}

int pobierz_pierwszy(void)
{
    int ch;
    do
    {
        ch=getchar();
    }
    while (ch<=' ');
    while (getchar()!='\n')
    continue;
    return ch;
}

float liczba(void)
{
    float a;
    char ch;
    while (scanf("%f", &a)!=1)
    {
        while ((ch=getchar())!='\n')
        putchar(ch);
        printf(" nie jest liczba.\nPodaj liczbe np. 2.5, -178E8 czy 3: ");
    }
    return a;
}

?

1

Jeżeli w operacji dzielenia przynajmniej jeden operand nie jest liczbą całkowitą to wynik jest liczbą zmiennoprzecinkową.
Powinieneś doczytać na temat wyświetlenia: printf("%.1f %f\n",12.0,12.0);

0

Wiem o tym, dlatego jest rzutowanie - poza tym przy dodawaniu też jest ten problem

1
xpeye napisał(a):

Wiem o tym, dlatego jest rzutowanie - poza tym przy dodawaniu też jest ten problem
Nic nie wiesz! Właśnie dla tego tu pytasz.

#include <cstdio>
using namespace std;

int main()
  {
   char op;
   double a,b,c;
   printf("Degeneraci powinni zastanawiać się po przeczytaniu odpowiedzi\n");
   for(;;)
     {
      printf("Podaj wyrazenie (np 12.2+3): ");
      if(scanf("%lf %c %lf",&a,&op,&b)!=3) break;
      switch(op)
        {
         case '+': c=a+b; break;
         case '-': c=a-b; break;
         case '*': c=a*b; break;
         case '/':
           {
            if(!b)
              {
               printf("Cholero, nie dziel przez zero!\n");
               continue;
              }
            c=a/b; 
           }
         break;
         default:
           {
            printf("Niepoprawna operacja\n");
            continue;
           }
        }
      printf("%lg %c %lg = %lg\n",a,op,b,c);
     }
   return 0;
  }

http://ideone.com/iMJmHL

0

Kod napisałeś w C++ a ja potrzebuje w c

0
xpeye napisał(a):

Kod napisałeś w C++ a ja potrzebuje w C. W języku C printf nie ma specyfikatora %lg

Co ty nie powiesz?
Może zgłoś do ideone że cię okłamują!

http://ideone.com/uY6Sk5

#include <stdio.h>

int main()
  {
   char op;
   double a,b,c;
   printf("Degeneraci powinni zastanawiać się po przeczytaniu odpowiedzi\n");
   for(;;)
     {
      printf("Podaj wyrazenie (np 12.2+3): ");
      if(scanf("%lf %c %lf",&a,&op,&b)!=3) break;
printf("\n"); // tylko dla ideone
      switch(op)
        {
         case '+': c=a+b; break;
         case '-': c=a-b; break;
         case '*': c=a*b; break;
         case '/':
           {
               if(!b)
                 {
                  printf("Cholero, nie dziel przez zero!\n");
               continue;
                 }
            c=a/b; 
           }
         break;
         default:
           {
               printf("Niepoprawna operacja\n");
               continue;
           }
        }
      printf("%lg %c %lg = %lg\n",a,op,b,c);
     }
   printf("A kompletni degeneraci nie powinni kwestionować odpowiedzi\n");
   return 0;
  }
0

Dzięki, ale dlaczego mój kod dla 4.5+5 pokazuje 5 a dla 1.8+0.2 daje 2.0?

1
xpeye napisał(a):

... dlaczego mój kod dla 4.5+5 pokazuje 5 ...
Dla tego że musisz się zgłosić do okulisty lub psychiatry. Pokaż ten kod.

0

To ten na początku tematu

0
        else if((int)(b+c)==b+c)
        printf("%.1f + %.1f = %d\n", b, c, (int)(b+c));

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0