[C++, Algoritmi] Metodo delle secanti

lucia88
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?
#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
vict85
Il compilatore e/o il sistema operativo che dicono?

lucia88
Si in effetti il compilatore dice:
secanti.cpp:undefined reference to leggi(int&,double&)
Error ld returned exit status

quindi come posso risolverlo?

hyoukarou
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.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.