Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
spik2nick Forumaš(ica)
Pridružen/a: 28. 09. 2011. (12:41:01) Postovi: (D)16
|
Postano: 23:03 čet, 17. 11. 2011 Naslov: |
|
|
Zadatak 17:
Napisati program koji ce ucitati 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 ce ispisati broj 125.75.
Napomena: Mozete pretpostaviti da ulazni broj nije veci od 9999 i da nema vise od 4 decimale.
Imam samo jedno pitanje vezano uz ispis. Znači na kraju mi program ispisuje nepotrebne nule. Kako bi to mogao kvalitetno riješiti?
[code:1]#include<stdio.h>
int main(void)
{
double x,broj=0,baza=1,ostatak=0;
int intx,i,dec=4;
scanf("%lg",&x);
intx=(int)(x*10000);
while(intx%10==0)
{
intx/=10;
dec--;
}
for(i=0;i<dec;i++)
{
broj+=(intx%10)*baza;
intx/=10;
baza*=10;
}
while(intx!=0)
{
ostatak+=intx%10;
ostatak*=0.1;
intx/=10;
}
broj+=ostatak;
printf("Naopako: %f",broj);
return 0;
}
[/code:1]
Zadatak 17:
Napisati program koji ce ucitati 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 ce ispisati broj 125.75.
Napomena: Mozete pretpostaviti da ulazni broj nije veci od 9999 i da nema vise od 4 decimale.
Imam samo jedno pitanje vezano uz ispis. Znači na kraju mi program ispisuje nepotrebne nule. Kako bi to mogao kvalitetno riješiti?
Kod: | #include<stdio.h>
int main(void)
{
double x,broj=0,baza=1,ostatak=0;
int intx,i,dec=4;
scanf("%lg",&x);
intx=(int)(x*10000);
while(intx%10==0)
{
intx/=10;
dec--;
}
for(i=0;i<dec;i++)
{
broj+=(intx%10)*baza;
intx/=10;
baza*=10;
}
while(intx!=0)
{
ostatak+=intx%10;
ostatak*=0.1;
intx/=10;
}
broj+=ostatak;
printf("Naopako: %f",broj);
return 0;
}
|
_________________ Pokušaj je prvi korak prema neuspjehu!!
|
|
[Vrh] |
|
anamarie Forumaš(ica)
Pridružen/a: 07. 09. 2011. (10:59:19) Postovi: (87)16
Spol:
|
Postano: 23:09 čet, 17. 11. 2011 Naslov: |
|
|
[quote="spik2nick"]Zadatak 17:
Napisati program koji ce ucitati 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 ce ispisati broj 125.75.
Napomena: Mozete pretpostaviti da ulazni broj nije veci od 9999 i da nema vise od 4 decimale.
Imam samo jedno pitanje vezano uz ispis. Znači na kraju mi program ispisuje nepotrebne nule. Kako bi to mogao kvalitetno riješiti?
[code:1]#include<stdio.h>
int main(void)
{
double x,broj=0,baza=1,ostatak=0;
int intx,i,dec=4;
scanf("%lg",&x);
intx=(int)(x*10000);
while(intx%10==0)
{
intx/=10;
dec--;
}
for(i=0;i<dec;i++)
{
broj+=(intx%10)*baza;
intx/=10;
baza*=10;
}
while(intx!=0)
{
ostatak+=intx%10;
ostatak*=0.1;
intx/=10;
}
broj+=ostatak;
printf("Naopako: %f",broj);
return 0;
}
[/code:1][/quote]
hm..može imati maksimalno 4 decimale,znači [b]%.4f[/b]
a to bi ispisalo 125.7500
spik2nick (napisa): | Zadatak 17:
Napisati program koji ce ucitati 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 ce ispisati broj 125.75.
Napomena: Mozete pretpostaviti da ulazni broj nije veci od 9999 i da nema vise od 4 decimale.
Imam samo jedno pitanje vezano uz ispis. Znači na kraju mi program ispisuje nepotrebne nule. Kako bi to mogao kvalitetno riješiti?
Kod: | #include<stdio.h>
int main(void)
{
double x,broj=0,baza=1,ostatak=0;
int intx,i,dec=4;
scanf("%lg",&x);
intx=(int)(x*10000);
while(intx%10==0)
{
intx/=10;
dec--;
}
for(i=0;i<dec;i++)
{
broj+=(intx%10)*baza;
intx/=10;
baza*=10;
}
while(intx!=0)
{
ostatak+=intx%10;
ostatak*=0.1;
intx/=10;
}
broj+=ostatak;
printf("Naopako: %f",broj);
return 0;
}
|
|
hm..može imati maksimalno 4 decimale,znači %.4f
a to bi ispisalo 125.7500
|
|
[Vrh] |
|
boksi Forumaš(ica)
Pridružen/a: 02. 09. 2011. (16:37:55) Postovi: (44)16
Spol:
|
|
[Vrh] |
|
spik2nick Forumaš(ica)
Pridružen/a: 28. 09. 2011. (12:41:01) Postovi: (D)16
|
|
[Vrh] |
|
anamarie Forumaš(ica)
Pridružen/a: 07. 09. 2011. (10:59:19) Postovi: (87)16
Spol:
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
|
[Vrh] |
|
lost_soul Forumaš(ica)
Pridružen/a: 18. 10. 2009. (17:38:41) Postovi: (133)16
|
|
[Vrh] |
|
mdoko Forumaš(ica)
Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol:
Lokacija: Heriot-Watt University, Edinburgh
|
|
[Vrh] |
|
gflegar Forumaš(ica)
Pridružen/a: 12. 10. 2011. (15:03:41) Postovi: (10D)16
Spol:
|
Postano: 23:24 čet, 17. 11. 2011 Naslov: |
|
|
[quote="boksi"]nisam sigurna je li moje ok, ispisuje dobro, ali meni djeluje malo prevarantski ;)[/quote]
Meni ne dijeluje, stovise je bi ovo ovako rijesio, jer mi je logicno zakljuciti da za ulaz dobijemo broj [b]formatiran[/b] kao double, a mene su ucili (tu mislim na bivseg olimpijca koji danas radi u google-u) da je najbolje realan broj ucitati tako da ne gubimo na preciznosti.
[code:1]
#include <stdio.h>
int main(void){
int c, f;
scanf("%d.%d", &c, &f);
while(f % 10 == 0 && f != 0) f/= 10;
printf("%d.%d", f, c);
return 0;
}
[/code:1]
(Nisam ovo kompajlirao ali valjda radi :D )
boksi (napisa): | nisam sigurna je li moje ok, ispisuje dobro, ali meni djeluje malo prevarantski |
Meni ne dijeluje, stovise je bi ovo ovako rijesio, jer mi je logicno zakljuciti da za ulaz dobijemo broj formatiran kao double, a mene su ucili (tu mislim na bivseg olimpijca koji danas radi u google-u) da je najbolje realan broj ucitati tako da ne gubimo na preciznosti.
Kod: |
#include <stdio.h>
int main(void){
int c, f;
scanf("%d.%d", &c, &f);
while(f % 10 == 0 && f != 0) f/= 10;
printf("%d.%d", f, c);
return 0;
}
|
(Nisam ovo kompajlirao ali valjda radi )
Zadnja promjena: gflegar; 23:50 čet, 17. 11. 2011; ukupno mijenjano 1 put.
|
|
[Vrh] |
|
boksi Forumaš(ica)
Pridružen/a: 02. 09. 2011. (16:37:55) Postovi: (44)16
Spol:
|
|
[Vrh] |
|
BlameGame Forumaš(ica)
Pridružen/a: 14. 09. 2011. (19:17:53) Postovi: (6C)16
|
|
[Vrh] |
|
PermutiranoPrase Forumaš(ica)
Pridružen/a: 10. 09. 2011. (16:08:19) Postovi: (F4)16
Spol:
|
Postano: 0:01 pet, 18. 11. 2011 Naslov: |
|
|
Zadatak 12, fibonaccijevski niz. Stalno mi se ruši nakon unosa trećeg člana. Mislim da je ovaj dio kritičan:
[code:1]if ((a2-a1)%a0==0) alfa = (a2-a1)/a0;
else Fibonacci=0;[/code:1]
jer kad njega maknem, program se ne ruši nego nastavi normalno i mislim da bi čak trebao raditi.
Trenutno ne vidim uzrok...
Zadatak 12, fibonaccijevski niz. Stalno mi se ruši nakon unosa trećeg člana. Mislim da je ovaj dio kritičan:
Kod: | if ((a2-a1)%a0==0) alfa = (a2-a1)/a0;
else Fibonacci=0; |
jer kad njega maknem, program se ne ruši nego nastavi normalno i mislim da bi čak trebao raditi.
Trenutno ne vidim uzrok...
Description: |
|
Download |
Filename: |
12.c |
Filesize: |
1.72 KB |
Downloaded: |
104 Time(s) |
|
|
[Vrh] |
|
spik2nick Forumaš(ica)
Pridružen/a: 28. 09. 2011. (12:41:01) Postovi: (D)16
|
|
[Vrh] |
|
mdoko Forumaš(ica)
Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol:
Lokacija: Heriot-Watt University, Edinburgh
|
|
[Vrh] |
|
PermutiranoPrase Forumaš(ica)
Pridružen/a: 10. 09. 2011. (16:08:19) Postovi: (F4)16
Spol:
|
Postano: 0:13 pet, 18. 11. 2011 Naslov: |
|
|
Da, to sam i ja mislila, ali problem je - ne dijelim s nulom. Unesem 1, 2, 4, dijeli se (4-2)/1 i sruši se. :?
Da, to sam i ja mislila, ali problem je - ne dijelim s nulom. Unesem 1, 2, 4, dijeli se (4-2)/1 i sruši se.
|
|
[Vrh] |
|
mdoko Forumaš(ica)
Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol:
Lokacija: Heriot-Watt University, Edinburgh
|
Postano: 0:17 pet, 18. 11. 2011 Naslov: |
|
|
[quote="PermutiranoPrase"]Da, to sam i ja mislila, ali problem je - ne dijelim s nulom. Unesem 1, 2, 4, dijeli se (4-2)/1 i sruši se. :?[/quote]
Daj postaj kompletan kod, jer ovako je nemoguće pronaći problem.
PermutiranoPrase (napisa): | Da, to sam i ja mislila, ali problem je - ne dijelim s nulom. Unesem 1, 2, 4, dijeli se (4-2)/1 i sruši se. |
Daj postaj kompletan kod, jer ovako je nemoguće pronaći problem.
_________________ Extraordinary claims require extraordinary evidence. – Carl Sagan
|
|
[Vrh] |
|
PermutiranoPrase Forumaš(ica)
Pridružen/a: 10. 09. 2011. (16:08:19) Postovi: (F4)16
Spol:
|
|
[Vrh] |
|
Phoenix Forumaš(ica)
Pridružen/a: 15. 05. 2010. (18:46:07) Postovi: (164)16
Sarma: -
|
Postano: 0:26 pet, 18. 11. 2011 Naslov: |
|
|
Prase, što ti točno radi sljedeća linija? :?
[code:1]if ((a-a2)/a1 || (a-a2)/a1!=alfa) Fibonacci=0;[/code:1]
Moje zamjerke:
1) Ispravi ovu liniju gore. Prije nego uđeš u petlju izračunaj [tt]alfa[/tt] preko [tt]a0[/tt], [tt]a1[/tt] i [tt]a2[/tt] pa će ova provjera imati smisla (premda ti prvi uvjet ne treba, dakle samo [tt](a-a2)/a1!=alfa[/tt]).
2) Uvjet tvoje do-while petlje bi trebao biti [tt]a0==0[/tt].
I da, možda još jedna sitnica: kada provjeravaš je li [tt](a-a2)/a1!=alfa[/tt], stavi da je [tt]alfa2=(a-a2)/a1[/tt] i dodatno provjeri je li [tt]a1*alfa2+a2==a[/tt] (jer zbog cjelobrojnog dijeljenja možeš dobiti drugačije rješenje od željenog).
Prase, što ti točno radi sljedeća linija?
Kod: | if ((a-a2)/a1 || (a-a2)/a1!=alfa) Fibonacci=0; |
Moje zamjerke:
1) Ispravi ovu liniju gore. Prije nego uđeš u petlju izračunaj alfa preko a0, a1 i a2 pa će ova provjera imati smisla (premda ti prvi uvjet ne treba, dakle samo (a-a2)/a1!=alfa).
2) Uvjet tvoje do-while petlje bi trebao biti a0==0.
I da, možda još jedna sitnica: kada provjeravaš je li (a-a2)/a1!=alfa, stavi da je alfa2=(a-a2)/a1 i dodatno provjeri je li a1*alfa2+a2==a (jer zbog cjelobrojnog dijeljenja možeš dobiti drugačije rješenje od željenog).
|
|
[Vrh] |
|
mdoko Forumaš(ica)
Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol:
Lokacija: Heriot-Watt University, Edinburgh
|
Postano: 0:38 pet, 18. 11. 2011 Naslov: |
|
|
[quote="PermutiranoPrase"]Zar nije u privitku čitav kod, tj. .c datoteka?[/quote]
Sorry, nisam vidio :oops:
Uglavnom, našao sam problem:
[code:1]do {
printf("Unesite prvi clan niza, a0, razlicit od 0: ");
scanf("%d", &a0);
} while (a0=0);
[/code:1]
Uvjet za prekid izvršavanja petlje nije testiranje jednakosti ([tt]==[/tt]), nego pridruživanje ([tt]=[/tt]), pa, bez obzira što se unese, varijabli [tt]a0[/tt] se pridruži [tt]0[/tt], a vrijednost izraza [tt]a0=0[/tt] je [tt]0[/tt], što uzrokuje prekid izvršavanja petlje i u daljnjem toku programa varijabla [tt]a0[/tt] ima vrijednost [tt]0[/tt], što onda uzrokuje rušenje programa prilikom dijeljenja.
[b]Preporuka:[/b] uključite opcije [tt]-Wall[/tt] i [tt]-Wextra[/tt] prilikom kompajliranja i onda vam se ovakvo nešto neće događati (tj. kompajler će vas upozoriti na potencijalni problem).
PermutiranoPrase (napisa): | Zar nije u privitku čitav kod, tj. .c datoteka? |
Sorry, nisam vidio
Uglavnom, našao sam problem:
Kod: | do {
printf("Unesite prvi clan niza, a0, razlicit od 0: ");
scanf("%d", &a0);
} while (a0=0);
|
Uvjet za prekid izvršavanja petlje nije testiranje jednakosti (==), nego pridruživanje (=), pa, bez obzira što se unese, varijabli a0 se pridruži 0, a vrijednost izraza a0=0 je 0, što uzrokuje prekid izvršavanja petlje i u daljnjem toku programa varijabla a0 ima vrijednost 0, što onda uzrokuje rušenje programa prilikom dijeljenja.
Preporuka: uključite opcije -Wall i -Wextra prilikom kompajliranja i onda vam se ovakvo nešto neće događati (tj. kompajler će vas upozoriti na potencijalni problem).
_________________ Extraordinary claims require extraordinary evidence. – Carl Sagan
Zadnja promjena: mdoko; 0:41 pet, 18. 11. 2011; ukupno mijenjano 1 put.
|
|
[Vrh] |
|
spik2nick Forumaš(ica)
Pridružen/a: 28. 09. 2011. (12:41:01) Postovi: (D)16
|
Postano: 0:41 pet, 18. 11. 2011 Naslov: |
|
|
E evo i moje rješenje fibonaccijevskog niza... Ali pošto nemamo test primjera nisam siguran jel radi točno ono što bi i trebao... Pogledajte...
[code:1]#include<stdio.h>
int main(void)
{
int n, x=0, y=0, z=0, i, alfa=0,nije=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
z=y;
y=x;
scanf("%d",&x);
if(i==2)
if((x-y)%z==0)
alfa=(x-y)/z;
else
nije=1;
if(i>2 && (x-y)%z==0)
{
if (alfa!=(x-y)/z)
nije=1;
}
}
if(nije)
printf("Ucitani niz nije fibonaccijevski.");
else
printf("Ucitani niz brojeva je fibonaccijevski sa alfa = %d",alfa);
return 0;
}
[/code:1]
E evo i moje rješenje fibonaccijevskog niza... Ali pošto nemamo test primjera nisam siguran jel radi točno ono što bi i trebao... Pogledajte...
Kod: | #include<stdio.h>
int main(void)
{
int n, x=0, y=0, z=0, i, alfa=0,nije=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
z=y;
y=x;
scanf("%d",&x);
if(i==2)
if((x-y)%z==0)
alfa=(x-y)/z;
else
nije=1;
if(i>2 && (x-y)%z==0)
{
if (alfa!=(x-y)/z)
nije=1;
}
}
if(nije)
printf("Ucitani niz nije fibonaccijevski.");
else
printf("Ucitani niz brojeva je fibonaccijevski sa alfa = %d",alfa);
return 0;
}
|
_________________ Pokušaj je prvi korak prema neuspjehu!!
|
|
[Vrh] |
|
|