Search
 
 
  Engleski
 
 
 
Open in this window (click to change)
Forum@DeGiorgi: Početna
Forum za podršku nastavi na PMF-MO
Login Registracija FAQ Smajlići Članstvo Pretražnik Forum@DeGiorgi: Početna

Problem s double aritmetikom (zadatak)
WWW:

Moja sarma
 
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji 1. godine, preddiplomski studij Matematika -> Programiranje 1 i 2
Prethodna tema :: Sljedeća tema  
Autor/ica Poruka
krilo
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 01. 11. 2016. (14:45:48)
Postovi: (4D)16
Spol: žensko
Sarma = la pohva - posuda
= 5 - 0

PostPostano: 22:36 sri, 30. 11. 2016    Naslov: Problem s double aritmetikom Citirajte i odgovorite

Pozdrav forumaši.
Imam 2 pitanja
1) Postoji li u c-u neki %nešto za ispis u binarnom obliku (kao što su %x i %o za ispis u heksadecimalnom i oktalnom obliku)?
2) Kolokvij 2011. Zadatak 5 (10 bodova) Napišite program koji učitava realni broj dvostruke točnosti t, znak d te cijele brojeve k, c i a.
Program treba na ekran ispisati tri linije. U prvoj liniji treba 4 puta ispisati znak d, u drugoj liniji treba u **aritmetici dvostruke
točnosti izračunati i ispisati vrijednost izraza [tex]t^5 + (k^3+a)/c^3[/tex] **, a u trećoj liniji treba ispisati ostatak koji se dobije pri cjelobrojnom
dijeljenju izraza k-a s brojem c.
Program treba biti napisan u skladu s ANSI C standardom. Nije dozvoljeno korištenje biblioteke math.

Program mi nije problem napisati, osim dijela označenog s **. Ne mogu dobiti dobre rezultate jer se izraz [tex](k^3+a)/c^3[/tex] računa pomoću integera i onda kad se zbroji s [tex]t^5[/tex] opet dobijem int (npr. za t=1, k=c=a=2), a trebam dobiti decimalni broj. Kako zaobići taj problem?

Hvala unaprijed.
Pozdrav forumaši.
Imam 2 pitanja:
1) Postoji li u c-u neki %nešto za ispis u binarnom obliku (kao što su %x i %o za ispis u heksadecimalnom i oktalnom obliku)?
2) Kolokvij 2011.: Zadatak 5 (10 bodova) Napišite program koji učitava realni broj dvostruke točnosti t, znak d te cijele brojeve k, c i a.
Program treba na ekran ispisati tri linije. U prvoj liniji treba 4 puta ispisati znak d, u drugoj liniji treba u **aritmetici dvostruke
točnosti izračunati i ispisati vrijednost izraza [tex]t^5 + (k^3+a)/c^3[/tex] **, a u trećoj liniji treba ispisati ostatak koji se dobije pri cjelobrojnom
dijeljenju izraza k-a s brojem c.
Program treba biti napisan u skladu s ANSI C standardom. Nije dozvoljeno korištenje biblioteke math.

Program mi nije problem napisati, osim dijela označenog s **. Ne mogu dobiti dobre rezultate jer se izraz [tex](k^3+a)/c^3[/tex] računa pomoću integera i onda kad se zbroji s [tex]t^5[/tex] opet dobijem int (npr. za t=1, k=c=a=2), a trebam dobiti decimalni broj. Kako zaobići taj problem?

Hvala unaprijed.


[Vrh]
Korisnički profil Pošaljite privatnu poruku
mdoko
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 30. 11. 2002. (22:17:12)
Postovi: (718)16
Spol: muško
Sarma = la pohva - posuda
199 = 237 - 38
Lokacija: MPI-SWS, Kaiserslautern

PostPostano: 3:16 čet, 1. 12. 2016    Naslov: Re: Problem s double aritmetikom Citirajte i odgovorite

[quote="krilo"]
1) Postoji li u c-u neki %nešto za ispis u binarnom obliku (kao što su %x i %o za ispis u heksadecimalnom i oktalnom obliku)?
[/quote]

Ne postoji, ali takav ispis nije pretjerano često koristan. Ako ti treba, nije problem napisati funkciju koja će ispisivati binarni zapis broja. Probaj sam, a ako ne ide, baci pogled ovamo: [spoiler]==========================================[code:1]
void print_binary(int n) {
int d;
if(n == 0) {
printf("0");
} else {
if(n < 0) {
printf("-");
n = -n;
}
d = 1;
while(2 * d <= n) {
d = d * 2;
}
while(d != 0) {
int digit = n / d;
printf("%d", digit);
n = n % d;
d = d / 2;
}
}
}
[/code:1][/spoiler]

[quote]2) Napišite program koji učitava realni broj dvostruke točnosti t, [...] te cijele brojeve k, c i a.
Program treba [...] u **aritmetici dvostruke točnosti izračunati i ispisati vrijednost izraza [tex]t^5 + (k^3+a)/c^3[/tex] ** [...]

Program mi nije problem napisati, osim dijela označenog s **. Ne mogu dobiti dobre rezultate jer se izraz [tex](k^3+a)/c^3[/tex] računa pomoću integera i onda kad se zbroji s [tex]t^5[/tex] opet dobijem int (npr. za t=1, k=c=a=2), a trebam dobiti decimalni broj. Kako zaobići taj problem?
[/quote]

Treba reći programu da izračun obavi s doubleovima umjesto s intovima. To je moguće na više načina, a ja ću ovdje prezentirati samo najčitljiviji.

Ideja je "prekopirati" vrijednosti iz cjelobrojnih varijabli u floating point varijable:
[code:1]
int main(void) {
double t;
int k, c, a;
double k_dbl, c_dbl, a_dbl; /* ove varijable će nam biti korisne za izbjegavanje integer aritmetike */
double rezultat;

scanf("%g%d%d%d", &t, &k, &c, &a);

k_dbl = k;
c_dbl = c;
a_dbl = a;

rezultat = t * t * t * t * t + (k_dbl * k_dbl * k_dbl + a_dbl) / (c_dbl * c_dbl * c_dbl);

printf("%g", rezultat);

return 0;
}
[/code:1]
krilo (napisa):

1) Postoji li u c-u neki %nešto za ispis u binarnom obliku (kao što su %x i %o za ispis u heksadecimalnom i oktalnom obliku)?


Ne postoji, ali takav ispis nije pretjerano često koristan. Ako ti treba, nije problem napisati funkciju koja će ispisivati binarni zapis broja. Probaj sam, a ako ne ide, baci pogled ovamo:
Spoiler [hidden; click to show]:


Citat:
2) Napišite program koji učitava realni broj dvostruke točnosti t, [...] te cijele brojeve k, c i a.
Program treba [...] u **aritmetici dvostruke točnosti izračunati i ispisati vrijednost izraza [tex]t^5 + (k^3+a)/c^3[/tex] ** [...]

Program mi nije problem napisati, osim dijela označenog s **. Ne mogu dobiti dobre rezultate jer se izraz [tex](k^3+a)/c^3[/tex] računa pomoću integera i onda kad se zbroji s [tex]t^5[/tex] opet dobijem int (npr. za t=1, k=c=a=2), a trebam dobiti decimalni broj. Kako zaobići taj problem?


Treba reći programu da izračun obavi s doubleovima umjesto s intovima. To je moguće na više načina, a ja ću ovdje prezentirati samo najčitljiviji.

Ideja je "prekopirati" vrijednosti iz cjelobrojnih varijabli u floating point varijable:
Kod:

int main(void) {
  double t;
  int k, c, a;
  double k_dbl, c_dbl, a_dbl; /* ove varijable će nam biti korisne za izbjegavanje integer aritmetike */
  double rezultat;

  scanf("%g%d%d%d", &t, &k, &c, &a);

  k_dbl = k;
  c_dbl = c;
  a_dbl = a;

  rezultat = t * t * t * t * t + (k_dbl * k_dbl * k_dbl + a_dbl) / (c_dbl * c_dbl * c_dbl);

  printf("%g", rezultat);

  return 0;
}



_________________
Extraordinary claims require extraordinary evidence. – Carl Sagan
[Vrh]
Korisnički profil Pošaljite privatnu poruku Posjetite Web stranice
krilo
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 01. 11. 2016. (14:45:48)
Postovi: (4D)16
Spol: žensko
Sarma = la pohva - posuda
= 5 - 0

PostPostano: 11:41 čet, 1. 12. 2016    Naslov: Citirajte i odgovorite

Hvala na odgovoru, sad sve radi kako treba ) Još jedno pitanje, vezano za zadaće... Treba riješiti zadatke tipa
Napišite program koji učitava tri realna broja x, y i z, te ispisuje vrijednost izraza [tex] f = m^2 + M^3 [/tex], pri čemu je m= min{x,y,z} i M = max{x,y,z}.

Program super radi s "normalnim" (manjim) brojevima, i ja pošaljem .c file na stranicu (tako svih 5 zadataka tog tipa), a on meni na mail vrati poruku da niti jedan program ne valja s argumentom tipa "netočno za input 3342.7814, 9564.9266, 5550.5548". I tako za sve zadatke. Kako da ga "natjeram" da prihvaća takve monstrozitete od brojeva i je li to uopće moguće?
Hvala na odgovoru, sad sve radi kako treba Smile Još jedno pitanje, vezano za zadaće... Treba riješiti zadatke tipa:
Napišite program koji učitava tri realna broja x, y i z, te ispisuje vrijednost izraza [tex] f = m^2 + M^3 [/tex], pri čemu je m= min{x,y,z} i M = max{x,y,z}.

Program super radi s "normalnim" (manjim) brojevima, i ja pošaljem .c file na stranicu (tako svih 5 zadataka tog tipa), a on meni na mail vrati poruku da niti jedan program ne valja s argumentom tipa "netočno za input: 3342.7814, 9564.9266, 5550.5548". I tako za sve zadatke. Kako da ga "natjeram" da prihvaća takve monstrozitete od brojeva i je li to uopće moguće?


[Vrh]
Korisnički profil Pošaljite privatnu poruku
mdoko
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 30. 11. 2002. (22:17:12)
Postovi: (718)16
Spol: muško
Sarma = la pohva - posuda
199 = 237 - 38
Lokacija: MPI-SWS, Kaiserslautern

PostPostano: 11:49 čet, 1. 12. 2016    Naslov: Citirajte i odgovorite

[quote="krilo"]
Program super radi s "normalnim" (manjim) brojevima, i ja pošaljem .c file na stranicu (tako svih 5 zadataka tog tipa), a on meni na mail vrati poruku da niti jedan program ne valja s argumentom tipa "netočno za input: 3342.7814, 9564.9266, 5550.5548". I tako za sve zadatke. Kako da ga "natjeram" da prihvaća takve monstrozitete od brojeva i je li to uopće moguće?[/quote]

Nisu to baš nešto jako veliki brojevi. Možeš li zalijepiti kod ovdje za neki od tih primjera, pa da vidimo što se događa?
krilo (napisa):

Program super radi s "normalnim" (manjim) brojevima, i ja pošaljem .c file na stranicu (tako svih 5 zadataka tog tipa), a on meni na mail vrati poruku da niti jedan program ne valja s argumentom tipa "netočno za input: 3342.7814, 9564.9266, 5550.5548". I tako za sve zadatke. Kako da ga "natjeram" da prihvaća takve monstrozitete od brojeva i je li to uopće moguće?


Nisu to baš nešto jako veliki brojevi. Možeš li zalijepiti kod ovdje za neki od tih primjera, pa da vidimo što se događa?



_________________
Extraordinary claims require extraordinary evidence. – Carl Sagan
[Vrh]
Korisnički profil Pošaljite privatnu poruku Posjetite Web stranice
krilo
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 01. 11. 2016. (14:45:48)
Postovi: (4D)16
Spol: žensko
Sarma = la pohva - posuda
= 5 - 0

PostPostano: 12:27 čet, 1. 12. 2016    Naslov: Citirajte i odgovorite

[code:1]#include <stdio.h>
#include <stdlib.h>

int main(void)
{
double x, y, z;
printf ("Upisi tri realna broja: ");
scanf ("%lf %lf %lf", &x, &y, &z);

double m, M;
m=x;
if (y<m) m=y;
if (z<m) m=z;
M=x;
if (y>M) M=y;
if (z>M) M=z;

double a= m*m + M*M*M;
printf ("f = m^2+M^3 = %g", a);

return 0;
}[/code:1]

Kad uvrstim problematične brojeve, izbaci rezultat 8.75085e+011 (što mi se čini da u kalkulatoru izbaci dobro).
Kod:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    double x, y, z;
    printf ("Upisi tri realna broja: ");
    scanf ("%lf %lf %lf", &x, &y, &z);

    double m, M;
    m=x;
    if (y<m) m=y;
    if (z<m) m=z;
    M=x;
    if (y>M) M=y;
    if (z>M) M=z;

    double a= m*m + M*M*M;
    printf ("f = m^2+M^3 = %g", a);

return 0;
}


Kad uvrstim problematične brojeve, izbaci rezultat 8.75085e+011 (što mi se čini da u kalkulatoru izbaci dobro).


[Vrh]
Korisnički profil Pošaljite privatnu poruku
hendrix
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 03. 09. 2012. (15:59:06)
Postovi: (92)16
Sarma = la pohva - posuda
29 = 31 - 2

PostPostano: 12:51 čet, 1. 12. 2016    Naslov: Citirajte i odgovorite

Davno sam rjesavao zadace iz Proga, ali sam 99% siguran da u ispisu ne smijes imati nista osim trazenog izlaza (tj. brojeva), cak mislim da to negdje i podebljano pise.

(Naknadno dodano: Vidi [url=http://degiorgi.math.hr/prog1/ku/help.php#sect04]ovdje[/url], točka 3. :D )

Dakle, makni sve ove dodatke iz prvog [tt]printf()[/tt] argumenta, ostavi samo [tt]%g[/tt] pa probaj onda.

Opcenito, ako ti na takvim algoritamski jednostavnim zadacima sve na izlazu izgleda tocno, problem ce gotovo uvijek biti u necem popratnom na sto ne obracas paznju. :)
Davno sam rjesavao zadace iz Proga, ali sam 99% siguran da u ispisu ne smijes imati nista osim trazenog izlaza (tj. brojeva), cak mislim da to negdje i podebljano pise.

(Naknadno dodano: Vidi ovdje, točka 3. Very Happy )

Dakle, makni sve ove dodatke iz prvog printf() argumenta, ostavi samo %g pa probaj onda.

Opcenito, ako ti na takvim algoritamski jednostavnim zadacima sve na izlazu izgleda tocno, problem ce gotovo uvijek biti u necem popratnom na sto ne obracas paznju. Smile


[Vrh]
Korisnički profil Pošaljite privatnu poruku
krilo
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 01. 11. 2016. (14:45:48)
Postovi: (4D)16
Spol: žensko
Sarma = la pohva - posuda
= 5 - 0

PostPostano: 13:15 čet, 1. 12. 2016    Naslov: Citirajte i odgovorite

Eeeeee puno ti hvala... Ne sjećam se da je itko ta pravila spomenuo. Poslala sam ponovno sve pa će valjda bar nešto biti dobro. )
Eeeeee puno ti hvala... Ne sjećam se da je itko ta pravila spomenuo. Poslala sam ponovno sve pa će valjda bar nešto biti dobro. Smile


[Vrh]
Korisnički profil Pošaljite privatnu poruku
Prethodni postovi:   
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji 1. godine, preddiplomski studij Matematika -> Programiranje 1 i 2 Vremenska zona: GMT + 01:00.
Stranica 1 / 1.

 
Forum(o)Bir:  
Ne možete otvarati nove teme.
Ne možete odgovarati na postove.
Ne možete uređivati Vaše postove.
Ne možete izbrisati Vaše postove.
Ne možete glasovati u anketama.
You cannot attach files in this forum
You can download files in this forum


Powered by phpBB © 2001, 2002 phpBB Group
Theme created by Vjacheslav Trushkin
HR (Cro) by Ančica Sečan