{ File: tabula2.pas }

{ Scopo: utilizzo di procedure e funzioni;
         passaggio di parametri per variabile }

program Tabula;
{ Legge
    - un estremo inferiore
    - un estremo superiore
    - un passo
  e, per una funzione F definita al suo interno,
  (a) tabula la funzione F tra l'estremo inferiore e quello superiore con il
      passo specificato
  (b) calcola il minimo e il massimo tra i valori che la funzione assume
      nei punti di tabulazione
  (c) stampa un istogramma della funzione, scalato su 70 colonne dello
      schermo rispetto ai valori minimo e massimo calcolati al punto (b)

  Versione che utilizza PARAMETRI PER VARIABILE.
}

const
  ColIstogramma = 70;

var
  inferiore,        { estremo inferiore dell'intervallo di tabulazione }
  superiore,        { estremo superiore dell'intervallo di tabulazione }
  passo,            { passo }
  min,              { minimo  della funzione nell'intervallo di tabulazione }
  max       : real; { massimo della funzione nell'intervallo di tabulazione }


  function F (x : real) : real;
  begin
    F := 3.0 * x * x - 4.0 * x + 5.0
  end; { F }


  procedure Tabulazione (inf, sup, passo : real;
                         var minimo,          { minimo e ... }
                             massimo : real); { massimo della funzione nei
                                                punti di tabulazione }
  var
    x      : real;      { punto corrente }
    i      : integer;   { indice del ciclo usato per la tabulazione }
    valore : real;      { valore della funzione nel punto corrente }
  begin
    x := inf;
    minimo := F(inf);
    massimo := minimo;
    writeln('x':8, 'F(x)':10);
    for i := 0 to trunc((sup - inf) / passo) do
    begin
      valore := F(x);
      if valore < minimo then
        minimo := valore
      else if valore > massimo then
        massimo := valore;
      writeln(x:8:3, valore:10:3);
      x := x + passo
    end
  end; { Tabulazione }


  procedure Istogramma (inf, sup, passo, minimo, massimo : real);
  var
    x,              { valore corrente }
    val : real;     { valore della funzione corrente }
    j, k : integer;
  begin
    x := inf;
    writeln(minimo:12:3, massimo:67:3);
    for j := 0 to trunc((sup - inf) / passo) do
    begin
      val := F(x);
      write(x:8:3, ' ');
      for k := 1 to round((val-minimo)*ColIstogramma / (massimo-minimo)) do
        write('*');
      x := x + passo;
      writeln
    end
  end; { Istogramma }


begin { Tabula }
  writeln('Estremo inferiore, estremo superiore e passo della funzione ?');
  readln(inferiore, superiore, passo);
  writeln;
  writeln('TABULAZIONE DELLA FUNZIONE:');
  Tabulazione(inferiore, superiore, passo, min, max);
  writeln;
  writeln('Minimo:  ', min:8:4);
  writeln('Massimo: ', max:8:4);
  writeln;
  writeln('ISTOGRAMMA DELLA FUNZIONE:');
  Istogramma(inferiore, superiore, passo, min, max)
end. { Tabula }