PDA

Visualizza la versione completa : [C++] Calcolo della radice come limite di una successione:Errore!


f4t4l1ty
11-02-2008, 13:22
Questo programma l'avevo già postato una quindicina di giorni fa se non vado errato..
il programma funzione perfettamente, eccetto per il calcolo della radice come limite di funzione...ho tentato in più modi di scrivere il programmino..per ora vi posto questa versione...
Vi sarei molto grato se qualcuno potesse modificare il programma in modo che funzioni completamente..
P.S=Non è considerato valido l'uso di puntatori
Uso della sola procedura void

Per il limite di una successione basarsi su questo codice:


...
Y=1;
do
{Y=(Y + X /Y)/2;
cout<<Y<<"\n";
}while(fabs((Y*Y-X)/X)>E);


Programma da modificare:


/*

Si scriva un programma che, assegnato in ingresso, ad un vettore V, un insieme
di n valori interi, calcoli la somma som ed il prodotto prod degli elementi del
vettore V e visualizzi quindi i valori di som e prod. Di ogni elemento del vettore,
si calcoli inoltre la radice quadrata in due modi distinti: utilizzando la funzione
di libreria sqrt e scrivendo esplicitamente le istruzioni per il calcolo della
radice quadrata come limite di una successione, con precisione assegnata in ingresso.
Si produca quindi, sul supporto di uscita, una tabella che per ogni valore V[i]
riporti i valori di sqrt(V[i]) e della radice di V[i] calcolata nel secondo modo.
Si strutturi il programma in sottoprogrammi (ad esempio: input, somma, prodotto,
radice, output).

ESEMPIO
INPUT
n = 4
V= 2 4 6 8
errore tollerato per il calcolo della radice quadrata = 0.1

OUTPUT
la somma degli elementi del vettore e' = 20
il prodotto degli elementi del vettore e' = 384

V[i] RQ1[i] RQ2[i]
2 1.41421 1.41667
4 2 2.00061
6 2.44949 2.44949
8 2.82843 2.82847
*/

#include<iostream>
using namespace std;
#include<stdlib.h>
#include<math.h>

//Prototipi delle funzioni
void input(int &n, int v1[], double&E);
void somma(int n,int v1[],int &som);
void prodotto(int n, int v1[], int &prod);
void radice_sqrt(int n, int v1[], double rq1[]);
void radice_newton(int &n,int v1[],double E,double rq2[]);
void output(int som, int prod,int n, int v1[], double rq1[],double rq2[]);


int main()
{
//Dichiarazioni
int v1[100];
int n;
int som;
int prod;
double rq1[100];
double E;
double rq2[100];

//Chiamate delle funzioni
input(n,v1,E);
somma(n,v1,som);
prodotto(n,v1,prod);
radice_sqrt(n,v1,rq1);
radice_newton(n,v1,E,rq2);
output(som,prod,n,v1,rq1,rq2);


cout<<"\n\n";
system("PAUSE");
return 0;
}

void input(int &n, int v1[], double&E)
{
int i;
cout<<"N = ";
cin>>n;

cout<<"V= ";
for(i=0;i<n;i++)
{
cin>>v1[i];
}
cout<<"\nerrore tollerato per il calcolo della radice quadrata = ";
cin>>E;
}

void somma(int n,int v1[],int &som)
{
int i;
som = 0;
for(i=0;i<n;i++)
{
som = som + v1[i];
}
}

void prodotto(int n, int v1[], int &prod)
{
int i;
prod=1;
for(i=0;i<n;i++)
{
prod = prod * v1[i];
}
}

void radice_sqrt(int n, int v1[], double rq1[])
{
int i;
for(i=0;i<n;i++)
{
rq1[i] = sqrt(double(v1[i]));
}
}

void radice_newton(int &n,int v1[],double E,double rq2[])
{
int i;
double Y;
int k;
Y=1;
if(i<n && fabs((Y*Y-v1[i])/v1[i])>E)
{ Y=(Y+v1[i]/Y)/2;
i++;
}
else
{
rq2[n]=Y;
n++;
}
}

void output(int som, int prod,int n, int v1[], double rq1[],double rq2[])
{
int i;//indice di scorrimento del vettore

cout<<"la somma degli elementi del vettore e' = " << som<<"\n";
cout<<"il prodotto degli elementi del vettore e' = "<<prod<<"\n";

cout<<"V[i]\t\t RQ1[i]\t\t RQ2[i]\n";
for(i=0;i<n;i++)
{
cout<<v1[i]<<"\t\t"<<rq1[i]<<"\t\t"<<rq2[i]<<"\n";
}
}


Grazie a tutti come al solito... :)

f4t4l1ty
11-02-2008, 15:21
Ho dimenticato di indicare il codice...
Prego gli admin di modificarlo

Ovviamente il codice è c++....

f4t4l1ty
11-02-2008, 16:43
Nessuna idea...?!? :confused:

oregon
11-02-2008, 17:28
Manca l'inizializzazione della variabile i



void radice_newton(int &n,int v1[],double E,double rq2[])
{
int i = 0;

f4t4l1ty
11-02-2008, 17:32
Si oregon me ne ero già accorto.. non potendo modificare il messaggio ho dovuto lasciarlo così..
Ma il programma non funziona, anche modificato con i =0;... non è che potresti modificarlo.. in modo che funzioni?anche cambiando totalmente approccio..ricordando sempre quel P.S. le ho provate tutte... non saprei davvero come fare..

oregon
11-02-2008, 17:34
Inserendo quella modifica il programma da' il risultato corretto ... tu cosa inserisci? Quali risultati hai?

f4t4l1ty
11-02-2008, 17:39
/*

Si scriva un programma che, assegnato in ingresso, ad un vettore V, un insieme
di n valori interi, calcoli la somma som ed il prodotto prod degli elementi del
vettore V e visualizzi quindi i valori di som e prod. Di ogni elemento del vettore,
si calcoli inoltre la radice quadrata in due modi distinti: utilizzando la funzione
di libreria sqrt e scrivendo esplicitamente le istruzioni per il calcolo della
radice quadrata come limite di una successione, con precisione assegnata in ingresso.
Si produca quindi, sul supporto di uscita, una tabella che per ogni valore V[i]
riporti i valori di sqrt(V[i]) e della radice di V[i] calcolata nel secondo modo.
Si strutturi il programma in sottoprogrammi (ad esempio: input, somma, prodotto,
radice, output).

ESEMPIO
INPUT
n = 4
V= 2 4 6 8
errore tollerato per il calcolo della radice quadrata = 0.1

OUTPUT
la somma degli elementi del vettore e' = 20
il prodotto degli elementi del vettore e' = 384

V[i] RQ1[i] RQ2[i]
2 1.41421 1.41667
4 2 2.00061
6 2.44949 2.44949
8 2.82843 2.82847
*/

#include<iostream>
using namespace std;
#include<stdlib.h>
#include<math.h>

//Prototipi delle funzioni
void input(int &n, int v1[], double&E);
void somma(int n,int v1[],int &som);
void prodotto(int n, int v1[], int &prod);
void radice_sqrt(int n, int v1[], double rq1[]);
void radice_newton(int &n,int v1[],double E,double rq2[]);
void output(int som, int prod,int n, int v1[], double rq1[],double rq2[]);


int main()
{
//Dichiarazioni
int v1[100];
int n;
int som;
int prod;
double rq1[100];
double E;
double rq2[100];

//Chiamate delle funzioni
input(n,v1,E);
somma(n,v1,som);
prodotto(n,v1,prod);
radice_sqrt(n,v1,rq1);
radice_newton(n,v1,E,rq2);
output(som,prod,n,v1,rq1,rq2);


cout<<"\n\n";
system("PAUSE");
return 0;
}

void input(int &n, int v1[], double&E)
{
int i;
cout<<"N = ";
cin>>n;

cout<<"V= ";
for(i=0;i<n;i++)
{
cin>>v1[i];
}
cout<<"\nerrore tollerato per il calcolo della radice quadrata = ";
cin>>E;
}

void somma(int n,int v1[],int &som)
{
int i;
som = 0;
for(i=0;i<n;i++)
{
som = som + v1[i];
}
}

void prodotto(int n, int v1[], int &prod)
{
int i;
prod=1;
for(i=0;i<n;i++)
{
prod = prod * v1[i];
}
}

void radice_sqrt(int n, int v1[], double rq1[])
{
int i;
for(i=0;i<n;i++)
{
rq1[i] = sqrt(double(v1[i]));
}
}

void radice_newton(int &n,int v1[],double E,double rq2[])
{
int i;
double Y;
int k;
Y=1;
i=0;
if(i<n && fabs((Y*Y-v1[i])/v1[i])>E)
{ Y=(Y+v1[i]/Y)/2;
i++;
}
else
{
rq2[n]=Y;
n++;
}
}

void output(int som, int prod,int n, int v1[], double rq1[],double rq2[])
{
int i;//indice di scorrimento del vettore

cout<<"la somma degli elementi del vettore e' = " << som<<"\n";
cout<<"il prodotto degli elementi del vettore e' = "<<prod<<"\n";

cout<<"V[i]\t\t RQ1[i]\t\t RQ2[i]\n";
for(i=0;i<n;i++)
{
cout<<v1[i]<<"\t\t"<<rq1[i]<<"\t\t"<<rq2[i]<<"\n";
}
}

Risultato:
N = 4
V= 2 4 6 8

errore tollerato per il calcolo della radice quadrata = 0.1
la somma degli elementi del vettore e' = 20
il prodotto degli elementi del vettore e' = 384

V[i] RQ1[i] RQ2[i]
2 1.41421 -5.65934e-021
4 2 -1.45943e+173
6 2.44949 1.2958e-309
8 2.82843 1.17417e+292


Premere un tasto per continuare . . .
Come vedi.. i valori di RQ2 sono totalmente sbagliati...

oregon
11-02-2008, 19:01
Sì ... guardavo solamente la prima colonna ...

Secondo me, il codice dovrebbe essere



void radice_newton(int &n,int v1[],double E,double rq2[])
{
int i;

for(i=0;i<n;i++)
{
rq2[i]=1;
do
{
rq2[i]=(rq2[i] + v1[i] / rq2[i])/2;
} while(fabs((rq2[i] * rq2[i] - v1[i]) / v1[i]) >E);
}
}

BlindSystem
11-02-2008, 19:30
Molto probabilmente frequentiamo lo stesso corso di laurea poikè qst programma l'ho fatto anke io identico. (ingegneria elettronica fed 2 prof Cordella?).................
cmq io l'ho fatto così e gira..vedi un pò..


#include<iostream>
using namespace std;
#include<stdlib.h>
#include<math.h>

void input_vettore(float vett[], int& riemp,float& E);
void somma(float vett[], int riemp, float& somma);
void output_somma(float somma);
void prodotto(float vett[], int riemp, float& prodotto);
void output_prodotto(float prodotto);
void radquad1(float vett[], int riemp, float RQ1[]);
void output_radquad(int riemp, float RQ1[]);
void radquad2(float vett[],int riemp, float RQ2[], float E);
void output_radquad2(int riemp, float RQ2[]);


int main()
{
float V[100],E;
int n;
float som,prod,RQ1[100],RQ2[100],y;

input_vettore(V,n,E);//Chiamata funzione input
somma(V,n,som);//Chiamata funzione somma
output_somma(som);//Chiamata funzione output somma
prodotto(V,n,prod);//Chiamata funzione prodotto
output_prodotto(prod);//Chiamata funzione output prodotto
radquad1(V,n,RQ1);//Chiamata funzione radquad1
output_radquad(n,RQ1);//Chiamata funzione output radquad1
radquad2(V,n,RQ2,E);//Chiamata funzione radquad2
output_radquad2(n,RQ2);//Chaimata funzione output radquad2

system("PAUSE");
return 0;
}


//Funzione input vettore
void input_vettore(float vett[], int& riemp,float& E)
{
int i;
cout<<"Assegna valore intero al numero n di elementi del vettore:\t";
cin>>riemp;
cout<<"\n\nAssegna "<<riemp<<" valori reali agli elementi del vettore:\n\n";
for(i=0;i<riemp;i++)
{
cin>>vett[i];
}
cout<<"Assegna valore alla precisione richiesta:\t";
cin>>E;
}
//Funzione somma elementi del vettore
void somma(float vett[], int riemp, float& somma)
{
int i;
somma=0;
for(i=0;i<riemp;i++)
{
somma=somma+vett[i];
}
}

//Funzione output somma vettore
void output_somma(float somma)
{
cout<<"\nSomma = "<<somma;
cout<<"\n\n";
}

//Funzione prodotto elementi del vettore
void prodotto(float vett[], int riemp, float& prodotto)
{
int i;
prodotto=1;
for(i=0;i<riemp;i++)
{
prodotto=prodotto*vett[i];
}
}

//Funzione output prodotto
void output_prodotto(float prodotto)
{
cout<<"Prodotto = "<<prodotto;
cout<<"\n\n";
}

//Funzione Radice quadrata tramite "sqrt"
void radquad1(float vett[], int riemp, float RQ1[])
{
int i;
for(i=0;i<riemp;i++)
{
RQ1[i]=sqrt(vett[i]);

}
}

//Funzione output radquad
void output_radquad(int riemp, float RQ1[])
{
int i;
cout<<"RQ1:\t";
for(i=0;i<riemp;i++)
{
cout<<RQ1[i]<<"\t\t";
}
cout<<"\n\n";
}

//Funzione Radice quadrata tramite formula di Newton
void radquad2(float vett[],int riemp, float RQ2[], float E)
{
int i;
float y;
for(i=0;i<riemp;i++)
{
y=1;
do
{
y=(y+vett[i]/y)/2;
}while(fabs((y*y-vett[i])/vett[i])>E);
RQ2[i]=y;

}
}

//Funzione output radquad2
void output_radquad2(int riemp, float RQ2[])
{
int i;
cout<<"RQ2:\t";
for(i=0;i<riemp;i++)
{
cout<<RQ2[i]<<"\t\t";
}
cout<<"\n\n";
}


Molte cose sono superflue..(tipo tutti quegli output)..cmq gira..ciao e fammi sapere ki sei così casomai ci vediamo in facoltà..

f4t4l1ty
11-02-2008, 20:24
Originariamente inviato da oregon


void radice_newton(int &n,int v1[],double E,double rq2[])
{
int i;

for(i=0;i<n;i++)
{
rq2[i]=1;
do
{
rq2[i]=(rq2[i] + v1[i] / rq2[i])/2;
} while(fabs((rq2[i] * rq2[i] - v1[i]) / v1[i]) >E);
}
}


Si avevo provato anch'io questo codice.. sbagliavo nell'inserire rq2[0]=1; invece che rq2[i]=1;
effettivamente funziona.. anche se noto dei valori diversi nelle cifre decimali...
Sto ripetendo un po' i programmi vecchi.. e questo era uno dei pochi che non mi riusciva...
Grazie!

Loading