Korisnički Kontrolni Panel
Pogledajte svoj profil
Pogledajte svoje postove
ČPP
Prijavite se

Matematički forum na kojem možete da diskutujete o raznim matematičkim oblastima, pomognete drugima oko rešavanja zadataka, a i da dobijete pomoć kada vam zatreba


















Index stranica OSTALE MATEMATIČKE OBLASTI MATEMATIKA U INFORMATICI MATEMATIKA U PROGRAMIRANJU

[Pascal] Izračunavanje sume

[Pascal] Izračunavanje sume

Postod Miladin Jovic » Ponedeljak, 17. Novembar 2014, 17:06

Napisati program koji za zadatu tačnost [inlmath]eps[/inlmath] izračunava broj:
[dispmath]S=\frac{4}{1\cdot 2\cdot 3\cdot 2^2}+\frac{8}{2\cdot 3\cdot 4\cdot 2^3}+\frac{12}{3\cdot 4\cdot 5\cdot 2^4}+\frac{16}{4\cdot 5\cdot 6\cdot 2^5}+\cdots[/dispmath]
Da li je dobar ovaj moj kod:

Kôd: Obeleži sve
program suma;
var br,im,a,b,c,d,i,j:integer; s,eps:real;
begin
  write('Unesi zeljenu tacnost:');
  readln(eps);
  a:=1;
  b:=2;
  c:=3;
  j:=2;
  s:=1/6;
  br:=4;
  repeat
    d:=2;
    for i:=1 to j do
      d:=d*2;
    a:=a+1;
    b:=b+1;
    c:=c*1;
    im:=a*b*c*d;
    br:=br+4;
    s:=s+br/im;
    j:=j+1;
  until(br/im<eps);
  write(s:2:6);
end.
Zaslužni forumaš
 
Postovi: 370
Zahvalio se: 243 puta
Pohvaljen: 123 puta

Sharuj ovu temu na:

Share on Facebook Facebook Share on Twitter Twitter Share on MySpace MySpace Share on Google+ Google+

Re:[Pascal] Izračunavanje sume

Postod Daniel » Ponedeljak, 17. Novembar 2014, 19:55

Umesto [inlmath]c:=c{\color{red}*}1;[/inlmath] treba [inlmath]c:=c{\color{red}+}1;[/inlmath]

U ovako napisanom kodu suma uvek sadrži najmanje prva dva sabirka, iako to nije uvek potrebno. Kada je uneta tačnost takva da je dovoljno računati samo prvi sabirak a sve ostale (počev od drugog pa nadalje) odbaciti, ovaj kôd će ipak nepotrebno računati (i dodati) i drugi sabirak.
Da se to ne bi desilo, inicijalna vrednost sume treba da bude nula, a prvi sabirak da se računa unutar petlje, kao i svi ostali.

Brojilac svakog od razlomaka si računao tako što si na brojilac prethodnog dodavao [inlmath]4[/inlmath], i to je sasvim OK. Zar ti nije bilo jednostavnije da tako radiš i s imeniocem, umesto da imenilac svaki put posebno računaš od samog starta? Imenilac prvog razlomka je [inlmath]24[/inlmath], a svaki sledeći imenilac je [inlmath]\frac{2\left(j+2\right)}{j-1}[/inlmath] puta veći od prethodnog, pa to možeš iskoristiti. Na taj način imao bi manje promenljvih u programu, a i program bi bio jednostavniji, a i brži, jer ne bi u svakom koraku spoljašnje petlje bilo nepotrebne unutrašnje petlje za računanje stepena dvojke.
I do not fear death. I had been dead for billions and billions of years before I was born, and had not suffered the slightest inconvenience from it. – Mark Twain
Korisnikov avatar
Daniel  OFFLINE
Administrator
 
Postovi: 7680
Lokacija: Beograd
Zahvalio se: 4039 puta
Pohvaljen: 4110 puta

Re: [Pascal] Izračunavanje sume

Postod Miladin Jovic » Ponedeljak, 17. Novembar 2014, 21:15

Kôd: Obeleži sve
program suma;
var br,i:integer; s,eps,im:real;
begin
  write('Unesi zeljenu tacnost:');
  readln(eps);
  i:=1;
  s:=0;
  br:=0;
  im:=24;
  repeat
    im:=im*((2*(i+2)/i-1)){Kako iz ovog izraza dobiti imenilac za prvi sabirak tj. 24, a i ovde nije definisano deljenje,jer 1-1=0}
    br:=br+4;
    s:=s+br/im;
    i:=i+1;
  until(br/im<eps);
  write(s:2:6);
end.

Kako bi se ovaj kod korigovao?
Zaslužni forumaš
 
Postovi: 370
Zahvalio se: 243 puta
Pohvaljen: 123 puta

Re: [Pascal] Izračunavanje sume

Postod Daniel » Utorak, 18. Novembar 2014, 02:59

U prvi prolazak kroz petlju ulaziš s početnom vrednošću za [inlmath]\mathtt{im}[/inlmath] koja iznosi [inlmath]24[/inlmath]. Zatim na kraju svakog prolaza kroz petlju, neposredno pre [inlmath]\mathtt{until}[/inlmath], dodeliš promenljivoj [inlmath]\mathtt{im}[/inlmath] onu vrednost koju treba da ima u narednom prolazu kroz petlju. To treba da učiniš odmah posle [inlmath]\mathtt{i:=i+1;}[/inlmath] – znači, između linija [inlmath]\mathtt{i:=i+1;}[/inlmath] i [inlmath]\mathtt{until}[/inlmath]. Na ovaj način, [inlmath]\mathtt{i}[/inlmath] već ima onu vrednost koju će imati u narednom prolasku kroz petlju, pa i [inlmath]\mathtt{im}[/inlmath] možeš za naredni prolazak kroz petlju računati po formuli koju si napisao. Treba samo tu formulu da ispraviš: ne treba
Kôd: Obeleži sve
im:=im*((2*(i+2)/i-1));

već treba
Kôd: Obeleži sve
im:=im*(2*(i+2)/(i-1));

Osim toga, pošto se u sklopu [inlmath]\mathtt{until}[/inlmath] nalazi uslov u kome figuriše promenljiva [inlmath]\mathtt{im}[/inlmath], a koja je ovime izmenjena, treba i taj deo korigovati: uvesti varijablu [inlmath]\mathtt{razlomak}[/inlmath] (real type) i u svakoj petlji je, neposredno posle [inlmath]\mathtt{br:=br+4;}[/inlmath] računati kao [inlmath]\mathtt{razlomak:=br/im;}[/inlmath]
Linije [inlmath]\mathtt{s:=s+br/im;}[/inlmath] i [inlmath]\mathtt{until(br/im<eps);}[/inlmath] prepraviti u linije [inlmath]\mathtt{s:=s+razlomak;}[/inlmath] i [inlmath]\mathtt{until(razlomak<eps);}[/inlmath] – ovo ima i opravdanje sa aspekta efikasnosti, jer se količnik [inlmath]\mathtt{br/im}[/inlmath] pojavljuje dvaput u toku jedne petlje (jednom u samoj petlji pri dodavanju sumi i jednom na kraju, unutar uslova za [inlmath]\mathtt{until}[/inlmath]), pa je bolje tu vrednost jednom izračunati i smestiti u jednu varijablu kako se taj količnik ne bi računao dvaput u toku jedne petlje. A time se rešava i ovaj dodatni problem koji bi nastao ažuriranjem vrednosti [inlmath]\mathtt{im}[/inlmath] za naredni prolazak kroz petlju.
I do not fear death. I had been dead for billions and billions of years before I was born, and had not suffered the slightest inconvenience from it. – Mark Twain
Korisnikov avatar
Daniel  OFFLINE
Administrator
 
Postovi: 7680
Lokacija: Beograd
Zahvalio se: 4039 puta
Pohvaljen: 4110 puta


Povratak na MATEMATIKA U PROGRAMIRANJU

Ko je OnLine

Korisnici koji su trenutno na forumu: Nema registrovanih korisnika i 1 gost


Index stranicaTimObriši sve kolačiće boarda
Danas je Utorak, 20. Avgust 2019, 00:25 • Sva vremena su u UTC + 1 sat [ DST ]
Pokreće ga phpBB® Forum Software © phpBB Group
Prevod – www.CyberCom.rs