Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Algoritmo di horner e polinomio di grado 2n
Forum - C/C++ - Algoritmo di horner e polinomio di grado 2n

Avatar
Puffetta (Normal User)
Rookie


Messaggi: 21
Iscritto: 29/11/2009

Segnala al moderatore
Postato alle 11:36
Martedì, 29/12/2009
Ciao a tutti!! ho un problema con questo codice

Codice sorgente - presumibilmente C

  1. /*Scrivere un programma C++ che legge un intero positivo n, un numero reale a e i coefficienti di un polinomio p(x) di grado 2n; successivamente calcola il valore p(a) - sfruttando l'esistenza di sole potenze pari - e lo stampa sul video.*/
  2.  
  3. #include<stdio.h>
  4. #include<stdlib.h>
  5.  
  6. const int size=100;
  7. typedef double vettore[size];
  8.  
  9. int leggigradopolinomio();
  10. void leggicoefficienti(vettore, int);
  11. double leggia();
  12. double pna(vettore, double, int);
  13. void stampa(double, double);
  14.  
  15. main()
  16. {
  17.       int n; vettore c; double a, s;
  18.      
  19.       n=leggigradopolinomio();
  20.      
  21.       leggicoefficienti(c, n);
  22.      
  23.       a=leggia();
  24.      
  25.       s=pna(c, a, n);
  26.      
  27.       stampa(a, s);    
  28.            
  29.       system("PAUSE");
  30.       return 0;
  31. }
  32.  
  33.  
  34. int leggigradopolinomio()
  35. {
  36.     int a;
  37.    
  38.     do
  39.         {
  40.              printf("\n\n Qual'e' il grado pari massimo del polinomio?   2n=");
  41.              scanf("%d", &a);
  42.         }
  43.       while((a>size)||!(a%2==0));
  44.      
  45.       return a;
  46. }
  47.  
  48.  
  49. void leggicoefficienti(vettore x, int a)
  50. {
  51.      for(int i=0; i<a; i++)
  52.                    {
  53.                          printf("\n Il coefficiente a[%d] del polinomio vale: ", i);
  54.                          scanf("%lf", &x[i]);                        
  55.                    }
  56.      return;
  57. }
  58.  
  59.  
  60. double leggia()
  61. {
  62.        double x;
  63.        
  64.        printf("\n\n In quale punto dobbiamo calcolare il valore del polinomio? x=");
  65.        scanf("%lf", &x);
  66.        
  67.        return x;
  68. }
  69.  
  70.  
  71. double pna(vettore x, double a, int n)
  72. {
  73.        double s, pot;
  74.        
  75.        pot=a*a;
  76.      
  77.        s=x[0]+(x[1]*pot);
  78.      
  79.        for(int k=2; k<n; k++)
  80.                     {    
  81.                           pot=pot*(a*a);
  82.                          
  83.                           s=s+(x[k]*pot);
  84.                     }
  85.                    
  86.        return s;      
  87. }
  88.  
  89.  
  90. void stampa(double d, double b)
  91. {        
  92.       printf("\n\n Il valore del polinomio p(x)nel punto x=%lf e' uguale a %lf\n\n", d, b);    
  93.      
  94.       return;
  95. }



Il mio problema è che non riesco quando leggo i coefficienti del polinimio a farmi dare solo ed escusivamente quelli di grado pari. ad esempio x^0; x^2;x^4;...; x^2n eliminando quelli di grado dispari intermedi... c'è un modo per farlo?

grazie in anticipo per l'aiuto!!!!!!!!!

PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 12:31
Martedì, 29/12/2009
si che c'è un modo, considera questo pezzo di codice come "core" della tua implementazione




for (int n = 0; n < N; n += 2) {
   cout << A[n] << endl;
}



dove N è il grado del polinomio, e il vettore A contiene i suoi coefficienti.
Nel ciclo for i campi inizializzazione, controllo e iterazione possono contenere qualsiasi cosa :)

Ultima modifica effettuata da HeDo il 29/12/2009 alle 13:11
PM Quote
Avatar
Puffetta (Normal User)
Rookie


Messaggi: 21
Iscritto: 29/11/2009

Segnala al moderatore
Postato alle 13:11
Martedì, 29/12/2009
ah, giusto. non ci avevo proprio pensato. scusa ma sono alle prime armi. a questo punto però devo modificare anche il ciclo che regola l'algoritmo di horner così giusto?
Codice sorgente - presumibilmente C#

  1. double pna(vettore x, double a, int n)
  2. {
  3.        double s, pot;
  4.        
  5.        pot=a*a;
  6.      
  7.        s=x[0]+(x[2]*pot);
  8.      
  9.        for(int k=4; k<n; k+=2)
  10.                     {    
  11.                           pot=pot*(a*a);
  12.                      
  13.                           s=s+(x[k]*pot);
  14.                     }
  15.        return s;      
  16. }



grazie!!!

PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 13:12
Martedì, 29/12/2009

perchè fai partire k da 4?

PM Quote
Avatar
Puffetta (Normal User)
Rookie


Messaggi: 21
Iscritto: 29/11/2009

Segnala al moderatore
Postato alle 13:18
Martedì, 29/12/2009
perchè x[k=0] e x[k=2] hanno già i loro valori definiti prima del ciclo. L'algoritmo di Horner in gerere ha un for che parte dal terzo termine, cioè per i=0,1,2, 3..n il ciclo deve partire da 2. in questo caso considerando che i=0,2, 4,6,.., 2n il terzo termine è 4. mi sono spiegata?

PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 13:48
Martedì, 29/12/2009

ok capito, cmq non devi modificare l'agoritmo di horner, quello è così :)

semplicemente in fase di presentazione dei dati, mostri solo quelli con indice pari.

era questa la consegna, giusto?

PM Quote
Avatar
Puffetta (Normal User)
Rookie


Messaggi: 21
Iscritto: 29/11/2009

Segnala al moderatore
Postato alle 13:57
Martedì, 29/12/2009
si... ma l'algoritmo devo modificarlo per forza perchè mentre in generale si raccoglie solo la x, visto che è pari posso raccogliere ogni volta x^2...  

PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 14:30
Martedì, 29/12/2009
Testo quotato

Postato originariamente da Puffetta:

si... ma l'algoritmo devo modificarlo per forza perchè mentre in generale si raccoglie solo la x, visto che è pari posso raccogliere ogni volta x^2...  



implementalo e poi ragioniamo sul codice :)

PM Quote