{ File: doping.pas }

{ Scopo: esercizio di esame del 11/9/1998 }

program Doping;

{ Dichiarazioni di costanti e tipi }

const
  NumAtleti = 22;
  LungSigla = 12;

type
  TipoSigla = packed array [1..LungSigla] of char;      { sigla di un farmaco }

  TipoData  = record
                giorno : 1..31;
                mese   : 1..12;
                anno   : 0..99
              end;

  TipoListaFarmaci  = ^TipoRecordFarmaco;
  TipoRecordFarmaco = record
                        sigla : TipoSigla;
                        data  : TipoData;
                        next  : TipoListaFarmaci
                      end;

  TipoAtleta = record
                 matricola    : integer;
                 prescrizioni : TipoListaFarmaci   { lista farmaci prescritti }
               end;           

  TipoArchivio = array [1..NumAtleti] of TipoAtleta;

  TipoDoping     = record                        { record memorizzato su file }
                     sigla   : TipoSigla;
                     data    : TipoData;         { data di divieto/ammissione }
                     vietato : 0..1              { 0 = vietato,  1 = ammesso }
                   end;      
  TipoFileDoping = file of TipoDoping;

  TipoNomeFile = string;


{ Procedura che risolve il punto 3 }

procedure FarmaciAmmessi (var lista_farmaci : TipoListaFarmaci;
                          nome_file         : TipoNomeFile);
{ Restituisce in lf la lista dei farmaci ammessi contenuti nel file nome_file. }
var
  f      : TipoFileDoping;
  doping : TipoDoping;
  paux   : TipoListaFarmaci;

begin { FarmaciAmmessi }
  lista_farmaci := NIL;
  assign(f, nome_file);
  reset(f);
  while not eof(f) do
  begin
    read(f, doping);
    if doping.vietato = 1 then  { il farmaco e` ammesso }
    begin
      new(paux);
      paux^.sigla := doping.sigla;
      paux^.data := doping.data;
      lista_farmaci := paux
    end
  end;
  close(f)
end; { FarmaciAmmessi }


{ Procedure che risolvono il punto 2 }

function DataNonAnteriore (data1, data2: TipoData): boolean;
{ Restituisce TRUE se data1 e` una data non anteriore a data 2, e FALSE
  altrimenti. }
begin
  DataNonAnteriore :=
    (data1.anno > data2.anno) or
    ((data1.anno = data2.anno) and
     ((data1.mese > data2.mese) or ((data1.mese = data2.mese) and
                                    (data1.giorno > data2.giorno))))
end; { NonAnterioreData }


procedure EliminaPrescrizioniVietate (var archivio : TipoArchivio;
                                      nome_file    : TipoNomeFile);
{ Elimina dall'archivio tutte le prescrizioni dei farmaci che sono stati
  prescritti in data non anteriore a quella del divieto specificato nel file
  nome_file. }
var
  f      : TipoFileDoping;
  doping : TipoDoping;
  i      : 1..NumAtleti;


  procedure EliminaPrescrizione (var lista_farmaci : TipoListaFarmaci;
                                 dop               : TipoDoping);
  { Elimina da lista_farmaci le prescrizioni del farmaco specificato da dop,
    se la prescrizione e` avvenuta in data non anteriore a quella della data
    specificata in dop. }
  var
    paux : TipoListaFarmaci;

  begin { EliminaPrescrizione }
    if lista_farmaci <> NIL then
    begin
      EliminaPrescrizione(lista_farmaci^.next, dop);
      if (lista_farmaci^.sigla = dop.sigla) and
         DataNonAnteriore(lista_farmaci^.data, dop.data) then
      begin
        paux := lista_farmaci;
        lista_farmaci := lista_farmaci^.next;
        dispose(paux)
      end
    end
  end; { EliminaPrescrizione }


begin { EliminaPrescrizioniVietate }
  assign(f, nome_file);
  reset(f);
  while not eof(f) do
  begin
    read(f, doping);
    if doping.vietato = 0 then  { il farmaco e` vietato }
      for i := 1 to NumAtleti do
        EliminaPrescrizione(archivio[i].prescrizioni, doping)
  end;
  close(f)
end; { EliminaPrescrizioniVietate }


{ Programma principale }

begin { Doping }
end. { Doping }