Programma in c++ sul pi greco

di il
8 risposte

Programma in c++ sul pi greco

Salve a tutti,
ho fatto un programma che consente di calcolare pi greco con la precisione e numero iterazioni secondo 4 metodi:
leibniz ();
archimede ( l2n(misura del lato del poligono inscritto in una circonferenza avente n*2 lati ) = sqrt(2*raggio^2 - raggio * sqrt (4*r^2 - ln^2)) dove ln è il valore di un lato del poligono inscritto avente n lati;
sharp ;
eulero http://misterpalomar.blogspot.it/2012/03/i-ponti-di-eulero.html (la formula è quella : pigreco^2/6=1+1/2^2...
Non funziona (anche se è, una volta compilato, non dà errori sintattici) purtroppo.
Eccolo:

#include <iostream>
#include <cmath>
using namespace std;
float pg_leib(float n);
float pg_archimede(float k,float raggio); 
float precisione,p1,p2,s,a,raggio, pgreco, incertezza, ln, lati, x,i,k, j, scelta,b,ripetere,h;
float pg_sharp(float n);
float pg_eulero(float n);

int main ()
{
	
    cout<<"Programma per calcolare pi greco secondo questi algoritmi"<<endl;
	cout<<"Premere:"<<endl;
	cout<<"1- Algoritmo leibniz"<<endl;
	cout<<"2- Algoritmo archimede"<<endl;
	cout<<"3- Algoritmo sharp"<<endl;
	cout<<"4- Algoritmo eulero"<<endl;
	cout<<"Cosa scegli?"<<endl;
	cin>>scelta;
	if (scelta==1)
	{ cout<<"Dammi la precisione"<<endl;
	cin>>precisione;
	float n=50;
	do
	 {p1=pg_leib(n);
	 p2=pg_leib(n*2);
	 n=n*2;
	 } while (fabs (p1-p2)>precisione);
	 cout<<"Pigreco vale.........."<<endl;
	 cout<<(p1+p2)/2<<endl;;
	 cout<<"le iterazioni fatte sono........"<<endl;
	 cout<<n/2;
	
}
else if (scelta ==2)
{cout<<"Inserire numero di iterazioni"<<endl; 
   cin>>k; 
   cout<<"Inserire il raggio della circonferenza"<<endl; 
   cin>>raggio; 
	do
	 {p1=pg_archimede(k,raggio);
	 
	 p2=pg_archimede(k*2,raggio*2);
	k=k*2;
	 } while (fabs (p1-p2)>precisione);
	 
   pgreco= pg_archimede(k,raggio); 
   cout<<"Pi greco e' circa "<<pgreco<<endl;
}
else if (scelta==3)
{cout<<"Dammi la precisione:"<<endl;
	cin>>precisione;
	cout<<"Dammi x:"<<endl;
	cin>>x;
	do
	 {p1=pg_sharp(x);
	 
	 p2=pg_sharp(x*2);
	 x=x*2;
	 } while (fabs (p1-p2)>precisione);
	 cout<<"Pigreco vale:"<<endl;
	 cout<<(p1+p2)/2<<endl;;
	 cout<<"Le iterazioni fatte sono:"<<endl;
	 cout<<x/2<<endl;
     
}
else if (scelta==4)
{cout<<"Dammi la precisione"<<endl;
	cin>>precisione;
	cout<<"Dammi x"<<endl;
	cin>>x;
	do
	 {p1=pg_eulero(x);
	 
	 p2=pg_eulero(x*2);
	 k=k*2;
	 } while (fabs (p1-p2)>precisione);
	 cout<<"Pigreco vale:"<<endl;
	 cout<<(p1+p2)/2<<endl;;
	 cout<<"Le iterazioni fatte sono:"<<endl;
	 cout<<x/2<<endl;}

system("PAUSE");
    return EXIT_SUCCESS;


}


float pg_leib(float n)
{float p=1;
   short int s=-1;
     for (int i=3; i<=n; i+=2)
         {p=p+(s/i);
         s=-s;}
return p*4;}

float pg_archimede(float k, float raggio) 
{ ln=raggio; 
  lati=3; 
for(x=1;x<k;x++) 
{ln=sqrt(2*raggio*raggio-raggio*sqrt(4*raggio*raggio-ln*ln)); 
lati=ln*2; } 

k=(lati*ln)/raggio; 
return k; 
}

float pg_sharp(float n)
{j=2*(sqrt(3));
 h=1;
 b=1;
 s=-1;
for (i=3;i<=x;i+=2)
{h=h*3;
  b=b+(s/(i*h));
  s=-s;}
return j=j*b;
}

float pg_eulero(float n)
{j=1;
for (i=2;i<=x;i++)
{k=1/(i*i);
j=j+k;
}j=sqrt(j*6);
}



Non capisco bene perché non funziona.
Qualcuno può aiutarmi?
Grazie per le risposte.

8 Risposte

  • Re: Programma in c++ sul pi greco

    Perche non provi a rifare l'esercizio senza le variabili globali. Vedrai che molto probabilmente il problema sta lì.
  • Re: Programma in c++ sul pi greco

    Io ti consiglierei anche di aggiungere un pò di spazi, qualche a capo e magari anche dei tab.
  • Re: Programma in c++ sul pi greco

    Singolarmente funzionavano quasi alla perfezione. Li ho uniti e niente...Vorrei farne uno con le 4 opzioni...
  • Re: Programma in c++ sul pi greco

    mro ha scritto:


    Singolarmente funzionavano quasi alla perfezione. Li ho uniti e niente...Vorrei farne uno con le 4 opzioni...
    Segui il consiglio di skynet, il problema è li. Poi se vuoi che qualcuno guardi il tuo codice scrivilo in maniera ordinata e leggibile. L' uso delle variabili globali è una pessima pratica di programmazione, genera errori difficili da trovare, diventa sempre più problematica al crescere delle dimensioni del programma, come nel tuo caso, con una funzione andava con tre ha smesso di funzionare.

    Anche se sistemi l' errore e mantieni le variabili in questo modo rischi che alla prossima aggiunta smetta di funzionare di nuovo.
  • Re: Programma in c++ sul pi greco

    Il programma su leibniz è:
    #include <iostream>
    #include <cmath>
    using namespace std;
    float pg_leib(float n);
    float precisione,p1,p2,ripetere,s;
    int main (int argc, char *argv[])
    {
    	do{cout<<"Dammi la precisione"<<endl;
    	cin>>precisione;
    	int k=50;
    	do
    	 {p1=pg_leib(k);
    	 
    	 p2=pg_leib(k*2);
    	 k=k*2;
    	 } while (fabs (p1-p2)>precisione);
    	 cout<<"Pigreco vale........."<<endl;
    	 cout<<(p1+p2)/2<<endl;;
    	 cout<<"le iterazioni fatte sono........"<<endl;
    	 cout<<k/2<<endl;
         cout<<"Ripetere (1-si')"<<endl;
    	 cin>>ripetere;
      }while (ripetere==1);
    	
    }
    
    float pg_leib(float n)
    {float p=1;
      short int s=-1;
         for (float i=3; i<=n; i+=2)
             {p=p+(s/i);
             s=-s;}
    return p*4;}
    
  • Re: Programma in c++ sul pi greco

    Prova a prendere un libro di programmazione e guarda come è scritto il codice, è bello e leggibile, ti suggerirei di scrivere allo stesso modo. Scusa se insisto su questo punto ma il tuo non è un problema che riguarda concetti di programmazione, ma è solo questione di disordine. Riscrivi il codice per bene e vedrai che si mette a funzionare.

    Inoltre gli ambienti di sviluppo forniscono strumenti per indentare automticamente, il tuo codice potrebbe diventare:
    
    #include <iostream>
    #include <cmath>
    
    using namespace std;
    float pg_leib(float n);
    
    int main (int argc, char *argv[])
    {
    	float ripetere;
    	do
    	{
    		float precisione, p1, p2;
    		cout << "Dammi la precisione" << endl;
    		cin >> precisione;
    		int k = 50;
    		do
    		{
    			p1 = pg_leib(k);
    			p2 = pg_leib(k * 2);
    			k = k * 2;
    		} 
    		while (fabs(p1 - p2) > precisione);
    		
    		cout << "Pigreco vale........." << endl;
    		cout << (p1 + p2) / 2 << endl;
    		cout << "le iterazioni fatte sono........" << endl;
    		cout << k / 2 << endl;
    		cout << "Ripetere (1 - si')" << endl;
    		cin >> ripetere;
    	}
    	while (ripetere == 1);
    }
    
    float pg_leib(float n)
    {
    	float p = 1;
    	short int s = -1;
    	for (float i = 3; i <= n; i += 2)
    	{
    		p = p + (s / i);
    		s = -s;
    	}
    
    	return p * 4;
    }
    Oltre a riscriverlo ho tolto le variabili globali, ti consiglio di fare lo stesso lavoro con le altre funzioni.
  • Re: Programma in c++ sul pi greco

    Grazie per il consiglio!!
  • Re: Programma in c++ sul pi greco

    Un altro consiglio sarebbe quello di non mettere mai a confronto nelle espressioni di valutazione (vedi while, if ecc) delle varibili float o double. Ci sono numeri in virgola mobile non rappresentabili in sistema binario e quindi può capitare che l'espressione non sia validata.
    vedi anche :
Devi accedere o registrarti per scrivere nel forum
8 risposte