[C++, Algoritmi] Metodo delle secanti
Ciao,
ho un problema con questo programma che calcola gli zeri di una funzione mediante il metodo di bisezione.
Apparentemente mi sembra non ci siano errori,però non mi parte.cosa sbaglio?
ho un problema con questo programma che calcola gli zeri di una funzione mediante il metodo di bisezione.
Apparentemente mi sembra non ci siano errori,però non mi parte.cosa sbaglio?
#include<stdio.h> #include<stdlib.h> #include<math.h> #include<iostream> using namespace std; //prototipi delle funzioni double f(double); void leggi(int&,double&); void estremi(double*); double secanti(double*,int&,int,double); //definisco le funzioni per allocazione dinamica array void controlla_puntatore(double* p ){ if(p!=NULL) return; else{ cout<<endl<<"Memoria non allocata correttamente."; cout<<endl<<"Il programma verra' terminato..."; cout<<endl; exit(1); } } double* alloca_vet(int dim){ double* v=new double[dim]; controlla_puntatore(v); return v; } //funzione principale main(){ int nmax,cont=0; double eps,*x; leggi(nmax,eps); x=alloca_vet(nmax); estremi(x); *(x+nmax)=secanti(x,cont,nmax,eps); cout<<endl<<"la soluzione ottenuta con "<<cont<<"iterazioni e': "<<*(x+nmax); return 0; } void leggi(double& err,int& n){ do{ cout<<endl<<"Inserire il numero massimo d'iterazioni: "; cin>>n; }while(n<=0); do{ cout<<endl; cout<<"Inserire la precisione voluta:"; cin>>err; }while(err<=0); return; } void estremi(double* x){ cout<<endl<<"Inserire un intervallo [a,b] all'interno del quale si trova lo zero,"<<endl; cout<<"e nel quale l'algoritmo delle secanti sia convergente"<<endl; do{ cout<<endl<<"a="; cin>>x[0]; cout<<endl<<"b="; cin>>x[1]; if(f(x[0])*f(*(x+1))>0) cout<<endl<<"Attenzione:f(a) ha lo stesso segno di f(b)...Riprova."; }while(f(x[0])*f(*(x+1))>0); return; } double secanti(double* x,int& c,int n,double eps){ do{ x[c+2]=x[c+1]-f(x[c+1])*(x[c+1]-x[c])/(f(x[c+1])-f(x[c])); c++; }while(fabs(f(x[n+1]))>eps && c<n); return x[n+1]; } double f(double x){ return 2*x+1; }
Risposte
Il compilatore e/o il sistema operativo che dicono?
Si in effetti il compilatore dice:
secanti.cpp:undefined reference to leggi(int&,double&)
Error ld returned exit status
quindi come posso risolverlo?
secanti.cpp:undefined reference to leggi(int&,double&)
Error ld returned exit status
quindi come posso risolverlo?
Apparentemente mi sembra non ci siano errori,però non mi parte.cosa sbaglio?
Compilatore:
warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type] error: undefined reference to `leggi(int&, double&)'
Apparentemente hai invertito i tipi dei parametri della funzione leggi quando sei andato a definirla (r. 38 ca.). Per il warning basta che dai alla funzione main il tipo int. Fatto ciò compila e termina senza problemi, anche se non ho controllato la correttezza dell'algoritmo.
Minuzie: le prime due righe sono praticamente inutili, il codice è assai C-like(sai, tutte quelle macro, controlla_puntatore, il vettore di doubles che avresti potuto costruire semplicemente usando vector delle STL) e il fatto che il codice è organizzato un po' male(non lasci nessun spazio, sarà una questione personale ma per me è stato difficile leggerlo).
Se serve altro chiedi.