Puffetta (Normal User)
Rookie
Messaggi: 21
Iscritto: 29/11/2009
|
Ciao a tutti!! ho un problema con questo codice
Codice sorgente - presumibilmente C |
/*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.*/ #include<stdio.h> #include<stdlib.h> const int size=100; typedef double vettore[size]; int leggigradopolinomio(); void leggicoefficienti(vettore, int); double leggia(); double pna(vettore, double, int); void stampa(double, double); main() { int n; vettore c; double a, s; n=leggigradopolinomio(); leggicoefficienti(c, n); a=leggia(); s=pna(c, a, n); stampa(a, s); system("PAUSE"); return 0; } int leggigradopolinomio() { int a; do { printf("\n\n Qual'e' il grado pari massimo del polinomio? 2n="); scanf("%d", &a); } while((a>size)||!(a%2==0)); return a; } void leggicoefficienti(vettore x, int a) { for(int i=0; i<a; i++) { printf("\n Il coefficiente a[%d] del polinomio vale: ", i ); scanf("%lf", &x[i]); } return; } double leggia() { double x; printf("\n\n In quale punto dobbiamo calcolare il valore del polinomio? x="); scanf("%lf", &x); return x; } double pna(vettore x, double a, int n) { double s, pot; pot=a*a; s=x[0]+(x[1]*pot); for(int k=2; k<n; k++) { pot=pot*(a*a); s=s+(x[k]*pot); } return s; } void stampa(double d, double b) { printf("\n\n Il valore del polinomio p(x)nel punto x=%lf e' uguale a %lf\n\n", d , b ); return; }
|
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!!!!!!!!!
|
|
HeDo (Founder Member)
Guru^2
Messaggi: 2765
Iscritto: 21/09/2007
|
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 |
|
Puffetta (Normal User)
Rookie
Messaggi: 21
Iscritto: 29/11/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# |
double pna(vettore x, double a, int n) { double s, pot; pot=a*a; s=x[0]+(x[2]*pot); for(int k=4; k<n; k+=2) { pot=pot*(a*a); s=s+(x[k]*pot); } return s; }
|
grazie!!!
|
|
HeDo (Founder Member)
Guru^2
Messaggi: 2765
Iscritto: 21/09/2007
|
perchè fai partire k da 4?
|
|
Puffetta (Normal User)
Rookie
Messaggi: 21
Iscritto: 29/11/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?
|
|
HeDo (Founder Member)
Guru^2
Messaggi: 2765
Iscritto: 21/09/2007
|
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?
|
|
Puffetta (Normal User)
Rookie
Messaggi: 21
Iscritto: 29/11/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...
|
|
HeDo (Founder Member)
Guru^2
Messaggi: 2765
Iscritto: 21/09/2007
|
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 |
|