[ reloaded_ @ 13.11.2005. 08:27 ] @
Zadatak ovako glasi:

1. Napisati program koji izračunava približnu vrijednost broja Pi=3.14159... koristeći slijedeću formulu:
Pi = 4*(1 – 1 / 3 + 1 / 5 - 1 / 7 + 1 / 9-1 / 11 +....)
Program se treba prekinuti u trenutku kada apsolutna vrijednost clana sume koji se treba sabrati bude manja od nekog broja eps koji se unosi na početku programa i koji zapravo definira preciznost izračunavanja. Taj uneseni broj eps treba biti u rasponu 0.0001 do 0.1. Ako broj eps nije u tom rasponu, program daje poruku «Broj nije u trazenom rasponu» i završava.
Na primjer, ako je unesen broj eps=0.0000023 program će dati poruku «Broj nije u zadanom rasponu» i završit će se njegovo izvođenje. Ako je sa tastature unesen, na primjer, broj eps=0.01 program će izračunati sumu prema datoj formuli sve dok vrijedi da je član koji se dodaje na sumu veći od 0.01, a to znači da će apsolutna vrijednost zadnjeg dodanog člana biti 1/99.
Zadatak treba riješiti koristeći while petlju

Ja sam sada napravio code:



#include <stdio.h>
#include <math.h>

main()

{
float n, k, eps, Pi, S, SumaP, SumaN, nP, nN;

/* Suma S=[ 1-(1/3)+(15)-(1/7)+(1/9)-(1/11)+(1/13)+... ]
moze se razloziti na dvije sume, i to sumu negativnih
clanova SumaN, te sumu pozitivnih clanova SumaP, u kom
slucaju bi se te dvije sume pisale kao:

SumaN=(1/3)+(1/7)+(1/11)+... ( opsti clan ove cume ce biti Sn=(1/(4n-1)) )
SumaP=(1/1)+(1/5)+(1/9)+... ( opsti clan ove cume ce biti Sn=(1/(4n+1)) )
S=SumaP-SumaN
Pi=4*S
*/

printf("\n Unesi vrijednost eps (u rasponu od 0.0001 do 0.1)");
scanf("%f",&eps);
if ((eps>0.0001) && (eps<0.1))
{
SumaP=1;
n=1;
nP=(1/(1+4*n));
while ( nP>eps )
{
SumaP=SumaP+nP;
n=n+1;
nP=(1/(1+4*n));
}
SumaN=0;
k=1;
nN=(1./(-1.+4.*k));
while (nN>eps )
{
SumaN=SumaN+nN;
n=n+1;
nN=(1./(-1.+4.*k));
}

S=SumaP-SumaN;
Pi=4*S;
printf("Vrijednost Pi za zadato eps, je %.10f", &Pi);
}
else
{
printf ("\n Eps nije u zadanom rasponu!");
}

getch();
return 0;
}



Kada kompajliram, sve je uredu...Prilikom egzekucije, u slucaju da unesem broj koji nije iz datog raspona (npr 0.00001) on mi regularno ispise "Eps nije u zadanom rasponu!"...Medjutim kada mu unesem eps iz datog raspona, jednostavno zaledi...Mislim da nije u redu nesto s while petljom, al mi nije jasno sta...Pa ako neko ima da zna, bio bih mu/joj mnogo zahvalan...Hvala unaprijed...
[ vlaiv @ 13.11.2005. 11:26 ] @
u izrazu:

Code:
nP=(1/(1+4*n));


Probaj da stavis po tackicu ... (mozda kompajler konta da je u pitanju integer ...) pa se izbudali ...


Ali nije to ... :)


Code:

while (nN>eps )
{
SumaN=SumaN+nN;
n=n+1;
nN=(1./(-1.+4.*k));
}


A da uvecas k za jedan u svakom prolazu (umesto n)... :)
[ reloaded_ @ 15.11.2005. 08:41 ] @
OK, popravio sam to sto ste naveli...Sada program vise ne ledi...Medjutim kao rezultat mi daje sve 0.000000 ... pokusavao sam stavljati tackice kao sto si rekao medjutim ni to ne funkcionise:

prepravljeni kod izgleda:

Code:
#include <stdio.h>
#include <math.h>

main()

{
 float eps, Pi, S, SumaP, SumaN, nP, nN;
 int n, k;
 /* Suma S=[ 1-(1/3)+(15)-(1/7)+(1/9)-(1/11)+(1/13)+... ]
    moze se razloziti na dvije sume, i to sumu negativnih
    clanova SumaN, te sumu pozitivnih clanova SumaP, u kom
    slucaju bi se te dvije sume pisale kao:

    SumaN=(1/3)+(1/7)+(1/11)+... ( opsti clan ove cume ce biti Sn=(1/(4n-1)) )
    SumaP=(1/1)+(1/5)+(1/9)+... ( opsti clan ove cume ce biti Sn=(1/(4n+1)) )
    S=SumaP-SumaN
    Pi=4*S
 */

  printf("\n Unesi vrijednost eps (u rasponu od 0.0001 do 0.1)");
  scanf("%f",&eps);
  if ((eps>0.0001) && (eps<0.1))
  {
   SumaP=1;
   n=1;
   nP=(1/(1+4*n));
   while ( nP>eps )
   {
    SumaP=SumaP+nP;
    n=n+1;
    nP=(1/(1+4*n));
   }
   SumaN=0;
   k=1;
   nN=(1/(-1+4*k));
   while (nN>eps )
   {
    SumaN=SumaN+nN;
    k=k+1;
    nN=(1./(-1.+4.*k));
   }

  S=SumaP-SumaN;
  Pi=4*S;
  printf("Vrijednost Pi za zadato eps, je %f", &Pi);
  }
  else
  {
  printf ("\n Eps nije u zadanom rasponu!");
  }

getch();
return 0;
}
[ Srđan Krstić @ 15.11.2005. 09:18 ] @
dve stvari:
prvo, kad stampas, ti stampas adresu umesto broj. Dakle ne treba ti &Pi, nego samo Pi.
Drugo, problem ti je sto su n i k integeri, pa kad racunas nP i nN kompajler se skroz pokochi, kao sto je vec primeceno ;-). Dzaba ti tackice... Mozes da racunas "postupno", ili sto je najjednostavnije, samo promeni i i k da budu i oni tipa float, i radi savrseno (provereno :))