{ File: radice.pas }

{ Scopo: esercizio sull'uso di cicli e di funzioni }

program Radice;

var
  numero,                { il numero di cui trovare la radice }
  appr_disp, appr_succ,  { variabili che contengono l'approssimazione
                           disponibile e quella calcolata a partire da essa }
  start,                 { l'approssimazione iniziale fornita dall'utente}
  eps: real;             { la precisione con cui si vuole il risultato
                           (es. 0.0001) }

  function ApprossimazioneSuccessiva (appr: real): real;
  begin
    ApprossimazioneSuccessiva := (appr + numero / appr) / 2;
  end; { ApprossimazioneSuccessiva }

begin { Radice }
  writeln('Dammi  il numero del quale vuoi la radice quadrata');
  readln(numero);
  writeln('e che precisione vorresti?');
  readln(eps);
  writeln('dammi un''approssimazione di partenza (ad es. 1)');
  readln(start);
  appr_disp := start;

  repeat
    appr_succ := ApprossimazioneSuccessiva(appr_disp);

    writeln('   approssimazione ottenuta = ', appr_succ :15:12);

    { ora in appr_succ c'e' l'approssimazione che sara'
      disponibile per il calcolo della successiva approssimazione }
    appr_disp := appr_succ;

  until abs(sqr(appr_succ) - numero) < eps;

  writeln('ecco la radice quadrata');
  writeln(appr_succ :15:12);
  writeln('comunque se usavi la funzione sqrt ti veniva ', sqrt(numero):15:12);
  readln;
end. { Radice }