{ File: esperim2.pas }

{ Scopo: uso di file di record }

program EsperimentiDaFile;
{ Legge da un file di record i risultati di 10 esperimenti.
  Per ogni esperimento il file contiene un record con la data in cui
  l'esperimetno e` stato eseguito ed il risultato dell'esperimento (valore
  reale).

  Stampa su un file di testo la data ed il risultato di quegli esperimenti per
  i quali il risultato e` minore del 50% della media dei 20 risultati.
}

const
  NumeroEsperimenti = 10;

type
  TipoData = record
               giorno : 1..31;
               mese   : 1..12;
               anno   : integer
             end;     

  TipoEsperimento = record
                      data      : TipoData;
                      risultato : real
                    end;

  TipoEsperimenti = array [1..NumeroEsperimenti] of TipoEsperimento;

  TipoFileEsperimenti = file of TipoEsperimento;


  procedure LeggiEsperimenti (var esperimenti: TipoEsperimenti);
  { Legge da un file di record PASCAL i risultati con data di esperimenti.
    Assume che il numero di esperimenti memorizzati sul file sia esattamente
    pari e NumeroEsperimenti.
  }
  var
    i    : integer;           { indice del ciclo per scandire gli esperimenti }
    f    : TipoFileEsperimenti;
    nome : string;

  begin { LeggiEsperimenti }
    write('Immetti il nome del file di record che contiene i risultati!');
    readln(nome);

    Assign(f, nome);
    Reset(f);

    i := 0;
    while not eof(f) do
    begin
      i := i + 1;
      read(f, esperimenti[i])
    end;

    Close(f)
  end; { LeggiEsperimenti }


  function MediaEsperimenti (esperimenti: TipoEsperimenti): real;
  { Restituisce la media dei risultati degli esperimenti. }
  var
    somma : real;
    i     : integer;

  begin { MediaEsperimenti }
    somma := 0;
    for i := 1 to NumeroEsperimenti do
      somma := somma + esperimenti[i].risultato;
    MediaEsperimenti := somma / NumeroEsperimenti
  end; { MediaEsperimenti }


  procedure StampaEsperimentiSottoSoglia(esperimenti : TipoEsperimenti;
                                         soglia      : real);
  var
    i    : integer;       { indice del ciclo per scandire gli esperimenti }
    f    : text;
    nome : string;

  begin { StampaEsperimentiSottoSoglia }
    write('Immetti il nome del file di testo su cui stampare!');
    readln(nome);

    Assign(f, nome);
    Rewrite(f);

    for i := 1 to NumeroEsperimenti do
      with esperimenti[i] do
        if risultato < soglia then
          writeln(f, data.giorno:2, '/', data.mese:2, '/', data.anno:4,
                     risultato:10:2);

    Close(f)
  end; { StampaEsperimentiSottoSoglia }


  procedure ScriviEsperimenti;
  { Legge da tastiera la data e i risultati di NumeroEsperimenti esperimenti
    e produce un file di record PASCAL contenente un record per ogni
    esperimento.
  }
  var
    i           : integer;    { indice del ciclo per scandire gli esperimenti }
    esperimento : TipoEsperimento;
    f           : TipoFileEsperimenti;
    nome        : string;

  begin { ScriviEsperimenti }
    write('Immetti il nome del file di record su ci scrivere i risultati!');
    readln(nome);

    Assign(f, nome);
    Rewrite(f);

    for i := 1 to NumeroEsperimenti do
    begin
      write('Esperimento ', i:2, ': data (g,m,a)? ');
      with esperimento.data do readln(giorno, mese, anno);
      write('              : risultato? ');
      readln(esperimento.risultato);
      write(f, esperimento)
    end;

    Close(f)
  end; { ScriviEsperimenti }


var
  esp : TipoEsperimenti;

begin { EsperimentiDaFile }
{ ScriviEsperimenti; }
  LeggiEsperimenti(esp);
  StampaEsperimentiSottoSoglia(esp, 0.5*MediaEsperimenti(esp))
end. { EsperimentiDaFile }