Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
ceps Forumaš(ica)

Pridružen/a: 08. 10. 2010. (13:03:07) Postovi: (13A)16
|
Postano: 23:32 pon, 22. 11. 2010 Naslov: 17. zadatak iz praktičnog kolokvija |
|
|
Napisati program koji će učitati ulazni double broj, a zatim ispisati onaj broj koji bi nastao zamjenom cijelog i decimalnog dijela. Primjerice, ukoliko je ulazni broj bio 75.125, program će ispisati broj 125.75.
Napomena: Možete pretpostaviti da ulazni broj nije veći od 9999 i da nema više od 4 decimale.
[code:1]#include <stdio.h>
#include <math.h>
int main ()
{
int c1, d1;
double x, d, c;
scanf("%lf", &x);
d = modf(x, &c);
c1 = c;
d1 = d * 10000;
while (d1 % 10 == 0) d1 = d1 / 10;
printf("%d.%d", d1, c1);
return 0;
}[/code:1]
Kao što vidite, ''varao'' sam sa %d.%d zapisom, no mislim da bi mi se problem koji me smeta pojavljivao i da sam išao ''pošteno''.
Sve je u redu za brojeve poput ovog 75.125 u primjeru, no za brojeve kao:
- 125.3333 se ispisuje 3332.125
- 111.0003 se ispisuje 2.111
Vidim da je problem u zapisu brojeva u računalu, tj. floating point standardu, no ne znam kako bih to neutralizirao.
Može kakav hint? Hvala unaprijed!
Napisati program koji će učitati ulazni double broj, a zatim ispisati onaj broj koji bi nastao zamjenom cijelog i decimalnog dijela. Primjerice, ukoliko je ulazni broj bio 75.125, program će ispisati broj 125.75.
Napomena: Možete pretpostaviti da ulazni broj nije veći od 9999 i da nema više od 4 decimale.
Kod: | #include <stdio.h>
#include <math.h>
int main ()
{
int c1, d1;
double x, d, c;
scanf("%lf", &x);
d = modf(x, &c);
c1 = c;
d1 = d * 10000;
while (d1 % 10 == 0) d1 = d1 / 10;
printf("%d.%d", d1, c1);
return 0;
} |
Kao što vidite, ''varao'' sam sa %d.%d zapisom, no mislim da bi mi se problem koji me smeta pojavljivao i da sam išao ''pošteno''.
Sve je u redu za brojeve poput ovog 75.125 u primjeru, no za brojeve kao:
- 125.3333 se ispisuje 3332.125
- 111.0003 se ispisuje 2.111
Vidim da je problem u zapisu brojeva u računalu, tj. floating point standardu, no ne znam kako bih to neutralizirao.
Može kakav hint? Hvala unaprijed!
|
|
[Vrh] |
|
A-tom Forumaš(ica)

Pridružen/a: 18. 05. 2010. (22:18:01) Postovi: (AB)16
Spol: 
|
|
[Vrh] |
|
ceps Forumaš(ica)

Pridružen/a: 08. 10. 2010. (13:03:07) Postovi: (13A)16
|
Postano: 0:13 uto, 23. 11. 2010 Naslov: |
|
|
Varam samo pri ispisu! xD
Kao što vidiš, upis je normalan, %lf, x...
Gle, zadatak je da se ispiše ''decimalni dio''.''cijeli dio'' i to je to. Nigdje nema nekih posebnih napomena kako to napraviti, ali okej, siguran sam da postoji način sa dijeljenjem cijelog dijela broja, odnosno množenjem decimalnog dijela... no opet bih naletio na isti problem sa zapisom brojeva u računalu.
Varam samo pri ispisu! xD
Kao što vidiš, upis je normalan, %lf, x...
Gle, zadatak je da se ispiše ''decimalni dio''.''cijeli dio'' i to je to. Nigdje nema nekih posebnih napomena kako to napraviti, ali okej, siguran sam da postoji način sa dijeljenjem cijelog dijela broja, odnosno množenjem decimalnog dijela... no opet bih naletio na isti problem sa zapisom brojeva u računalu.
|
|
[Vrh] |
|
Flame Forumaš(ica)

Pridružen/a: 12. 08. 2009. (02:14:39) Postovi: (53)16
Spol: 
|
Postano: 23:34 uto, 23. 11. 2010 Naslov: |
|
|
Ne, ne smije se tako varati pri upisu jer su ulazni podaci definirani, unos je tipa double.
No problem je na sreću lako riješiti:
[code:1]d1 = (int) (10000*x + 0.5);[/code:1]
Naime, 10000*x nikad neće napraviti apsolutnu grešku od 0.5, tj. za 10000*x očekuješ dobiti cijeli broj (zbog uvjeta u zadatku), ali on može u računalu zbog aritmetike doubleova primiti vrijednost <10000x - 0.5, 10000x + 0.5> pri čemu je 10000x njegova prava, cijelobrojna vrijednost. Sad kad tome dodaš 0.5 dobivaš nešto unutar intervala <10000x, 10000x + 1>. Sad dolazi (int) što je naredba da se 10000*x + 0.5 prebaci u nešto tipa integer, a to će napraviti na način da jednotavno uzme cijeli dio realnog broja,a to je 10000x.
Opaska: 10000*x je u racunalu, 10000x je prava vrijednost mnozenja 10000 s realnim brojem x.
Ne, ne smije se tako varati pri upisu jer su ulazni podaci definirani, unos je tipa double.
No problem je na sreću lako riješiti:
Kod: | d1 = (int) (10000*x + 0.5); |
Naime, 10000*x nikad neće napraviti apsolutnu grešku od 0.5, tj. za 10000*x očekuješ dobiti cijeli broj (zbog uvjeta u zadatku), ali on može u računalu zbog aritmetike doubleova primiti vrijednost <10000x - 0.5, 10000x + 0.5> pri čemu je 10000x njegova prava, cijelobrojna vrijednost. Sad kad tome dodaš 0.5 dobivaš nešto unutar intervala <10000x, 10000x + 1>. Sad dolazi (int) što je naredba da se 10000*x + 0.5 prebaci u nešto tipa integer, a to će napraviti na način da jednotavno uzme cijeli dio realnog broja,a to je 10000x.
Opaska: 10000*x je u racunalu, 10000x je prava vrijednost mnozenja 10000 s realnim brojem x.
|
|
[Vrh] |
|
sailor m Forumaš(ica)

Pridružen/a: 23. 10. 2010. (10:46:13) Postovi: (4E)16
|
|
[Vrh] |
|
vsego Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3562)16
Spol: 
Lokacija: /sbin/init
|
|
[Vrh] |
|
|