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));
0
xpeye napisał(a):

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

xpeye napisał(a):
		else if((int)(b+c)==b+c)
		printf("%.1f + %.1f = %d\n", b, c, (int)(b+c));

Chrzani waść, pokazuje 9 jak wół: http://ideone.com/ER2S3h

0

To widocznie to wina mojego systemu, bo u mnie 1.8 / 0.2 pokazuje 9.0

0

Znowu waść chrzani: http://ideone.com/0jALWf

0

To patrz:

cba179032d63b783med.jpg

dodanie obrazka do treści posta- fp

0

A ten program który załączyłem do poprzedniego postu jak u ciebie się wyświetla?

0

To jest ten sam

0

Odpal u siebie to:

#include <stdio.h>

int main()
  {
   double b=1.8,c=0.2;
   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);
   return 0; 
  }
0

Oto on:

b.jpg

dodanie obrazka do treści posta - fp

0

Jaki kompilator?
Na ideone stosowany jest gcc.
IMO to u xpeye wyświetla się prawidłowo, a na ideone (gcc) jest źle.
Zresztą szybkie googlanie i wychodzi odpowiedź na stackoverflow więc zamień f na g.

printf("%.1g / %.1g = %.1g\n", b, c, b/c);

Tylko dla dużych liczb może się coś pochrzanić i zamienić na zapis z e.

0

Dev-C++

0

A sprawdzaliście, czy warunek (int)(a/b) == (a/b) jest prawdziwy? Bo to różnie z tym bywa (Na VS2012 działa dobrze).

0

Teraz zauważyłem, że jak zamiast %d dam %g to działa, ale dlaczego? Przecież liczba całkowita to %d

0

Sprawdź jeszcze to:

#include <stdio.h>
 
int main()
  {
   double b=1.8,c=0.2;
   if(b/c==(double)(int)(b/c)) printf("%.1f / %.1f = %d\n", b, c, (int)(b/c));
   else printf("%.1f / %.1f = %.1f\n", b, c, b/c);
   return 0; 
  }

i powiedz jaką optymalizacje włączyłeś?

0

9.0
Po zamianie w poprzednym Twoim kodzie %d na %g działa 9 ale zamieniłem %d na %g w moim i jest 9.0

0

Jedyne co można na to powiedzieć że kompilujesz i odpalasz nie ten kod co edytujesz.

0

Dlaczego?

0

Ale pobieram liczbę jako double i rzutuję ją do float

0

Pergole na peronie urwał!
To jeszcze gorzej robisz: http://ideone.com/lQbGdh
Zgrywasz się czy tak na serio?

0

Liczba typu double ma 10 cyfr znaczących. Pobieram ją od użytkownika i rzutuje na typ float, mający 6 cyfr znaczących. Wtedy końcówka, zawierająca cyfry różne od zera, zostanie obcięta. Po drugie, gdy zastosuje gcc release 0.6/0.3=2 a jak inny gcc to 2.0. Dla innych liczb kropka i zero i tu i tu

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