serie con pigreco

« Older   Newer »
 
  Share  
.
  1.  
    .
    Avatar

    Member

    Group
    Member
    Posts
    206

    Status
    Offline
    ragazzi sono ancora io :P....su questo forum mi siete sembrati molto disponibili e vi ringrazio......ho un problema con un programma,è la traccia d'esame di qualche mese fa ma non ho idea di come si faccia,qualcuno può farmelo vedere e magari spiegare?non so come si fa quando si deve usare una serie.....

    la traccia è:

    trovare un'approssimazione di pigreco sfruttando la serie [ (-1^n)*(4/(2n+1))] ,e stampare una tabella dove all'iterazione n si associa il valore parziale di pigreco trovato


    grazie a chi mi risponde
     
    Top
    .
  2. Guglielmoqwerty
     
    .

    User deleted


    Sempre in C++ giusto?
     
    Top
    .
  3.  
    .
    Avatar

    Member

    Group
    Member
    Posts
    206

    Status
    Offline
    si sempre in c++..purtroppo l esame si fa in c++
     
    Top
    .
  4. Guglielmoqwerty
     
    .

    User deleted


    Non possodarti direttamente tutta a classe ma se mi dai una delucidazione ti posso fare la maggior parte (con annessa spiegazione). Quali valori deve avere n? Per quello che ho capito dovrei prima dargli valore 1, poi 2, poi 3 etc, fino ad un valore limite giusto?
     
    Top
    .
  5.  
    .
    Avatar

    Member

    Group
    Member
    Posts
    206

    Status
    Offline
    CITAZIONE (Guglielmoqwerty @ 2/11/2013, 14:48) 
    Non possodarti direttamente tutta a classe ma se mi dai una delucidazione ti posso fare la maggior parte (con annessa spiegazione). Quali valori deve avere n? Per quello che ho capito dovrei prima dargli valore 1, poi 2, poi 3 etc, fino ad un valore limite giusto?

    il mio prof è un idiota quindi le sue tracce il più delle volte sono incomprensibili...questa traccia è di febbraio 2013 e ogni tanto le "ricicla" le tracce...a esser sinceri a me o 18 o 30elode non cambia niente,tanto è l'ultimo esame...e mi dici che non puoi mettermi il codice intero,ma io in fondo non sono un programmatore a me di programmare non me ne frega,mi basta solo passare l'esame con ogni mezzo lecito o meno...capisci quello che dico,mettiti nei miei panni.....
    per quanto riguarda il valore di n,credo che vada inserito da tastiera,credo..comunque grazie del codice(grazie in anticipo) e grazie,a te e anche a gli altri che rispondono/risponderanno alle mie domande..domande che per voi magari sono stupide,ma per me sono l'esatto opposto......
    grazie ;)
     
    Top
    .
  6. Guglielmoqwerty
     
    .

    User deleted


    Stupide? Poche cose sono veramente stupide, molte altre vengono considerate tali solo perché sí è capaci di farle e non si pensa a chi ha appena cominciato. Pensa solo al parlare, sembra ovvio, ma per i bambini piccoli non è cosi.
    Comunque, ho guardato su internet e non riesco a trovare questa formula (e anche pensandoci per valori dispari di n non avrebbe senso). Ricontrolla bene l'esercizio.
    Oltre a questo, supponendo (probabilmente per assurdo) che la formula sia corretta la funzione sarebbe:
    CODICE
    //sostituendo il nome del metodo con main il programma funziona ma non vorrei che fosse un atteggiamento da C
    void stampaPI(int numeroMassimo) //indico il Massimo valore di PI
    {
         int n=0; //numero
         int pi;
         while(n<=numeroMassimo)
         {
               if(n%2==0){ pi=1; } //se l'esponente è pari il numero è positivo
               else { pie-1; } //altrimenti negativo. NDR: ogni potenza di -1 ha modulo 1
               pi=pi*(4/(2*n+1)); //applico la formula
               printf("Il valore di PI con n pari a %d e' %­lf",n,pi); //Stampo del testo esplicativo
               n++;
         }
    }


    OK, scritto. Per sicurezza prova a compilarlo perché scrivo con il tablet e non è il Massimo. A casa ricontrollo. (Robot, dagli un occhiata anche tu :) )
     
    Top
    .
  7.  
    .
    Avatar

    Member

    Group
    Member
    Posts
    206

    Status
    Offline
    purtroppo la serie è quella,l ho scritta giusta...sta scritta così sulla traccia.....per cortesia,appena puoi,me lo scrivi il programma intero non solo una parte..ora sto sul telefonino e sto andando a giocare a pallone...poi quando torno mi preparo e stasera scendo quindi prima di domani non credo di poter controllare se funziona o meno..spero di essermi spiegato..lo dici anche tu che la serie è strana,ma il mio prof è un idiota,in dipartimento lo sanno tutti ma nn possono cacciarlo perchè ha agganci buoni...per curiosità mia,ma tu cosa sei?programmatore,studente universitario,liceo?cosa?è una curiosità?
    grazie :)
     
    Top
    .
  8. Guglielmoqwerty
     
    .

    User deleted


    Studente di liceo sciebtifico tradizionale che si diletta con l'informatica. (mi hanno sempre quei cosi con tante lucine :P )

    Per far funzionare il programma basta aggiungere sotto a ciò che ti ho scritto (dopo la parentesi chiusa)
    CODE
    int main() { stampaPI(numeroMassimo); }
    Il mio dubbio era un altro, ma ho controllato, non c'é niente di particolare da fare =)
     
    Top
    .
  9.  
    .
    Avatar

    Senior Member

    Group
    Staff
    Posts
    10,796

    Status
    Anonymous
    Quel codice non è proprio corretto comunque.
    Il numero N non credo debba essere letto da tastiera, piuttosto è da trovare iterativamente in quanto devi trovare tu l'approssimazione.

    Ora non sono a casa, ma domani sera magari riesco a scrivere qualcosa. ^^
     
    Top
    .
  10.  
    .
    Avatar

    Member

    Group
    Member
    Posts
    206

    Status
    Offline
    CITAZIONE (RootkitNeo @ 2/11/2013, 20:26) 
    Quel codice non è proprio corretto comunque.
    Il numero N non credo debba essere letto da tastiera, piuttosto è da trovare iterativamente in quanto devi trovare tu l'approssimazione.

    Ora non sono a casa, ma domani sera magari riesco a scrivere qualcosa. ^^

    infatti il programma scritto dall'amico non va,or ora ho controllato..il ragazzo è volenteroso ma è alle prime armi ;)..comunque RootkitNeo ti ringrazio e appena puoi posta il programma,ti ringrazio in anticipo...buona domenica ;)
     
    Top
    .
  11. Guglielmoqwerty
     
    .

    User deleted


    Alle prime armi? Diciamo che per aiutarti mi sono improvvisato programmatore di C :P

    Il programma completo comunque sarebbe (ho aggiunto un po' di cose che davo per scontate):
    CODICE
    #include <stdio.h>

    void stampaPI(int numeroMassimo) //indico il Massimo valore di PI
    {
           int n=0; //numero
           double pi;
           while(n<=numeroMassimo)
           {
                   if(n%2==0){ pi=1; } //se l'esponente è pari il numero è positivo
                   else { pi=-1; } //altrimenti negativo. NDR: ogni potenza di -1 ha modulo 1
                   
                   pi= pi*(4/ ( (double)(2*n+1)) ); //applico la formula
                   
                   printf("Il valore di PI con n pari a %d",n); //Stampo del testo esplicativo
                   printf(" e' %­lf \n",pi);
                   
                   n++;
           }
    }

    int main()
    {
           int numeroMassimo = 100;
           stampaPI(numeroMassimo);
    }

    Il programma adesso compila e funziona ma la formula continua a non avere senso. Comincio a pensare di essermi perso qualcosa...

    Comunque adesso è arrivato Root, ti lascio nelle sue mani (quindi in buone mani :) )
     
    Top
    .
  12.  
    .
    Avatar

    Senior Member

    Group
    Staff
    Posts
    10,796

    Status
    Anonymous
    @Guglielmoqwerty: la formula postata è corretta, anche se non mi è ben chiaro se sia una variante della Leibniz o se è la stessa (non sono un gran matematico...).
    Il numero che è necessario inserire, N, è in pratica il numero di iterazioni che si vogliono ottenere (avevo interpretato male il testo quando ho letto la volta precedente, in quanto pensavo ci si dovesse fermare quando si trovava un approssimazione). In questo caso quindi è semplice.

    Ad ogni modo, con il codice che ho scritto riesci ad ottenere questa approssimazione:
    CODICE
    10000000 : 3.14159275358984


    Se superi i 10 milioni armati di pazienza e fallo se hai tempo...

    CODICE
    #include<iostream>
    #include<cstdio>
    #include<cmath>

    using namespace std;

    void findPi(int n) {
     double pi = 0.0;
     
     for(int i=0; i<=n; i++) {
      pi += (double) ((pow(-1.,i))*(4./(2.*i+1)));
      printf("%d : %.15g \n",i,pi);
     }
    }

    int main() {
     int n;
     cout << "Inserire N: ";
     cin >> n;
     
     findPi(n);
     return 0;
    }


    Il punto decimale indica appunto che il numero è decimale; allo stesso modo il .15g indica che accetta 15 cifre dopo la virgola.
    Non so che valutino al tuo esame, ma credo faccia una buona impressione utilizzare le librerie di C++ e non del C (anche se con alcuni compilatori a quanto so non cambia moltissimo). In pratica le librerie del C sono in questo formato math.h, stdio.h, stdlib.h, in C++ quando sono a disposizione cstdio, cstdlib, cmath etc (e non dimenticarti mai using namespace std;, altrimenti non trova cout/cin).
    Se puoi gestire l'input e l'output senza una particolare formattazione ti conviene utilizzare iostream e cin/cout; in caso contrario importi cstdio ed utilizzi printf come ho fatto io.

    Per vedere l'output di quel programma al completo al momento dell'esecuzione ho dirottato l'output in un file di testo (verrà dirottato tutto l'output, quindi è compresa la stringa che richiede l'input), digitando:
    CODICE
    nomefile > out.txt


    non aprirlo con Notepad.exe, ma aprilo con Notepad++ (o un altro editor di questo livello, altrimenti crasha il programma).

    Un altra cosa Guglielmo, guarda quanto può essere più bello il tuo if:
    CODICE
    pi = (pi & 1) ? -1 : 1;
     
    Top
    .
  13.  
    .
    Avatar

    Member

    Group
    Member
    Posts
    206

    Status
    Offline
    CITAZIONE (RootkitNeo @ 4/11/2013, 01:43) 
    @Guglielmoqwerty: la formula postata è corretta, anche se non mi è ben chiaro se sia una variante della Leibniz o se è la stessa (non sono un gran matematico...).
    Il numero che è necessario inserire, N, è in pratica il numero di iterazioni che si vogliono ottenere (avevo interpretato male il testo quando ho letto la volta precedente, in quanto pensavo ci si dovesse fermare quando si trovava un approssimazione). In questo caso quindi è semplice.

    Ad ogni modo, con il codice che ho scritto riesci ad ottenere questa approssimazione:
    CODICE
    10000000 : 3.14159275358984


    Se superi i 10 milioni armati di pazienza e fallo se hai tempo...

    CODICE
    #include<iostream>
    #include<cstdio>
    #include<cmath>

    using namespace std;

    void findPi(int n) {
     double pi = 0.0;
     
     for(int i=0; i<=n; i++) {
      pi += (double) ((pow(-1.,i))*(4./(2.*i+1)));
      printf("%d : %.15g \n",i,pi);
     }
    }

    int main() {
     int n;
     cout << "Inserire N: ";
     cin >> n;
     
     findPi(n);
     return 0;
    }


    Il punto decimale indica appunto che il numero è decimale; allo stesso modo il .15g indica che accetta 15 cifre dopo la virgola.
    Non so che valutino al tuo esame, ma credo faccia una buona impressione utilizzare le librerie di C++ e non del C (anche se con alcuni compilatori a quanto so non cambia moltissimo). In pratica le librerie del C sono in questo formato math.h, stdio.h, stdlib.h, in C++ quando sono a disposizione cstdio, cstdlib, cmath etc (e non dimenticarti mai using namespace std;, altrimenti non trova cout/cin).
    Se puoi gestire l'input e l'output senza una particolare formattazione ti conviene utilizzare iostream e cin/cout; in caso contrario importi cstdio ed utilizzi printf come ho fatto io.

    Per vedere l'output di quel programma al completo al momento dell'esecuzione ho dirottato l'output in un file di testo (verrà dirottato tutto l'output, quindi è compresa la stringa che richiede l'input), digitando:
    CODICE
    nomefile > out.txt


    non aprirlo con Notepad.exe, ma aprilo con Notepad++ (o un altro editor di questo livello, altrimenti crasha il programma).

    Un altra cosa Guglielmo, guarda quanto può essere più bello il tuo if:
    CODICE
    pi = (pi & 1) ? -1 : 1;

    grazie root,gentilissimo come sempre....
    cosa valutano al mio esame?l'unica cosa che valutano,non essendo degli informatici,è se il programma compila o meno,può essere fatto anche benissimo ma non compila,anche per una virgola sbagliata,il prof senza se e senza ma ti manda...per le librerie,lui ci fa usare SOLO quelle del c++,e per quanto riguarda prinf io uso cout(e cin)..la parte dove sta prinf,col cout come la scrivo?perchè leggo n i e pi dentro al printf,e sinceramente non so come si usi questa funzione

    grazie
     
    Top
    .
  14.  
    .
    Avatar

    Senior Member

    Group
    Staff
    Posts
    10,796

    Status
    Anonymous
    CITAZIONE (aaa123 @ 4/11/2013, 10:01) 
    grazie root,gentilissimo come sempre....
    cosa valutano al mio esame?l'unica cosa che valutano,non essendo degli informatici,è se il programma compila o meno,può essere fatto anche benissimo ma non compila,anche per una virgola sbagliata,il prof senza se e senza ma ti manda...per le librerie,lui ci fa usare SOLO quelle del c++,e per quanto riguarda prinf io uso cout(e cin)..la parte dove sta prinf,col cout come la scrivo?perchè leggo n i e pi dentro al printf,e sinceramente non so come si usi questa funzione

    grazie

    Bene, allora se non devi utilizzare printf (che è comunque molto semplice) devi importare iomanip. Il codice è il seguente:
    CODICE
    #include<iostream>
    #include<cmath>
    #include<iomanip>

    using namespace std;

    void findPi(int n) {
    double pi = 0.0;

    for(int i=0; i<=n; i++) {
     pi += (double) ((pow(-1.,i))*(4./(2.*i+1)));
     cout << n << " : " << setprecision(16) << pi << endl;
    }
    }

    int main() {
    int n;
    cout << "Inserire N: ";
    cin >> n;

    findPi(n);
    return 0;
    }


    E' anche più semplice rispetto a prima. Il nome della funzione chiamata è piuttosto esplicativo, ad ogni modo: www.cplusplus.com/reference/iomanip/setprecision/

    Quell'endl è il ritorno a capo.
    Un ultima cosa: io casto esplicitamente a double per assegnare il valore a pi, ma il cast è inutile (puoi anche toglierlo, il risultato non cambia in quanto è già un double).
    Se non vuoi usare nemmeno cmath, devi scrivere tu una tua funzione pow (ma non so quanto ti convenga...).

    Prego. ;)
     
    Top
    .
  15.  
    .
    Avatar

    Member

    Group
    Member
    Posts
    206

    Status
    Offline
    grazie root..
    cmat lo so usare,anche se il prof ci ha detto di usare math.h mah...
    comunque quando scrivi pi += (double) ((pow(-1.,i))*(4./(2.*i+1)));
    quel += (double) che significa?
    += che vuol dire?
    e double devo metterlo x forza?nno ho già dichiarato che pi è una funzione di tipo double?
     
    Top
    .
16 replies since 2/11/2013, 10:40   184 views
  Share  
.