//ClasseRadiceQuadrata - Donato Modugno 09/11/2016
//Copiato in parte dal codice del professore
#include <iostream>
#include <cstdlib>
using namespace std;

const int MAX_ITER = 1000;

class radiceQuadrata {
	public:
		double max_errore;
		unsigned int max_iterazioni;
		int totaleIterazioni;
		
		radiceQuadrata();
		radiceQuadrata(double max_err,unsigned int max_iter);
		
		double calcoloRadiceQuadrata(double arg, double max_user_err);
		double calcoloRadiceQuadrata(double arg, unsigned int max_user_iter);
};

main() {
	radiceQuadrata sqrt = radiceQuadrata();
	
	double argomento = 0;
	double errore = 0.01;
	double radice = 0;
	
	cout << "Inserisci l\'argomento e l\'errore" << endl;
 	cin >> argomento;
 	cin >> errore;
 	radice = sqrt.calcoloRadiceQuadrata(argomento,errore);
 	cout<< "\nsqrt(" << argomento << ") = " << radice << endl;
}

radiceQuadrata::radiceQuadrata(){
			max_errore = 0.01;
			max_iterazioni = 1000;
		};
		
double radiceQuadrata::calcoloRadiceQuadrata(double arg, double max_user_err){
	  double Radice, RadicePrec, err = arg;
	  int n, cont=0;
	  RadicePrec=arg/2;
	  while(err > max_user_err && cont <= MAX_ITER)
	  { 
	   Radice=(RadicePrec + arg/RadicePrec)/2;   
	   
	   err=((Radice-RadicePrec)/Radice);       
	   if (err<0) err = -1*err;
	   
	   RadicePrec=Radice;
	   totaleIterazioni = cont;
	   cont++;
	  }
	  if (cont >= MAX_ITER) return -1;
	  else return Radice;
}