{ File: progetto.pas }

{ Scopo: driver per esercizio sull'uso di grafi }

program Progetto;
{ Esercizio di esame di Fondamenti di Informatica del 12/2/1998.
  Dichiarazioni di tipo, procedure ausiliarie e programma driver. }

const
  NumAttivita = 5;

type
  TipoAttivita = 1..NumAttivita;
  TipoProgetto = array [TipoAttivita, TipoAttivita] of real;
     { matrice di adiacenza che rappresenta il grafo associato ad un progetto }

  TipoArco        = record
                      sorgente, destinazione : TipoAttivita;
                      costo                  : real
                    end;
     { elemento della lista di archi }

  TipoListaArchi  = ^TipoRecordLista;
  TipoRecordLista = record
                      arco : TipoArco;
                      next : TipoListaArchi
                    end;   


{ Inserire in questo punto la dichiarazione della procedura o funzione che
  risolve il punto 2. }


{ Inserire in questo punto la dichiarazione della procedura o funzione che
  risolve il punto 3. }


{ procedure ausiliarie usate dal programma driver }

  procedure LeggiProgetto (nomefile : string; var progetto: TipoProgetto);
  { Legge dal file di testo nomefile le informazioni riguardo alle attivita di
    un progetto, rappresentato tramite matrice di adiacenza.
    Assume che il file contenga una matrice di reali di 5x5 elementi
    nonnegativi. }
  var
    f    : text;
    i, j : TipoAttivita;

  begin { LeggiProgetto }
    assign(f, nomefile);
    reset(f);
    for i := 1 to NumAttivita do
      for j := 1 to NumAttivita do
        read(f, progetto[i, j]);
    close(f)
  end; { LeggiProgetto }


  procedure StampaProgetto (progetto: TipoProgetto);
  { Stampa su video le informazioni riguardo al progetto. }
  var
    i, j : TipoAttivita;

  begin { StampaProgetto }
    for i := 1 to NumAttivita do
    begin
      for j := 1 to NumAttivita do
        write(progetto[i, j]:6:1);
      writeln
    end
  end; { StampaProgetto }


  procedure StampaListaArchi (lista: TipoListaArchi);
  { Stampa su video le informazioni riguardo agli archi in lista. }
  begin { StampaListaArchi }
    writeln('sorgente':10, 'destinazione':14, 'costo':10);
    while lista <> NIL do
    begin
      with lista^.arco do
        writeln(sorgente:10, destinazione:14, costo:10:1);
      lista := lista^.next
    end
  end; { StampaListaArchi }


{ variabili usate nel programma principale }
var
  prog     : TipoProgetto; { progetto sul quale vengono fatte le elaborazioni }
  archi    : TipoListaArchi;  { lista di archi }
  nomefile : string;  { nome del file contenente le informazioni sul progetto }
  r        : real;    { valore reale di soglia usato nel punto 3 }
  isolate  : boolean; { tiene conto dell'esistenza di attivita` isolate }

begin { Progetto }

  { Lettura delle informazioni sul progetto da file. }
  writeln('Immetti il nome del file dal quale leggere le informazioni sul progetto!');
  writeln('(N.B. Il file deve gia'' esitere)');
  readln(nomefile);
  LeggiProgetto(nomefile, prog);                   { lettura da file }

  writeln;
  writeln('Matrice di adiacenza che rappresenta il progetto:');
  StampaProgetto(prog);                            { stampa di conferma }

  { Verifica dell'esistenza di attivita` isolate }

  { Inserire in questo punto una opportuna attivazione della procedura o
    funzione che risolve il punto 2,
    - prendendo in ingresso la matrice prog che rappresenta le attivita` di un
      progetto
    - e restituendo in isolate il valore booleano calcolato. }

  { la seguente istruzione e` stata usata per testare il driver: }
  {  isolate := TRUE; }

  { stampa del risultato dell'attivazione della procedura o funzione 2 }
  writeln;
  if isolate then
    writeln('Il progetto ha attivita` isolate.')
  else
    writeln('Il progetto non ha attivita` isolate.');

  { Lettura del valore reale di soglia. }
  writeln;
  write('Valore di soglia (reale positivo)? ');
  readln(r);

  { Inserire in questo punto una opportuna attivazione della procedura o
    funzione che risolve il punto 3,
    - prendendo in ingresso
        - la matrice prog che rappresenta le attivita` di un progetto e
        - il valore di soglia r
    - e restituento in archi la lista degli archi che hanno costo maggiore del
      valore di soglia r. }

  { le seguenti istruzioni sono state usate per testare il driver: }

  {
    new(archi);
    with archi^ do
    begin
      arco.sorgente := 3;
      arco.destinazione := 2;
      arco.costo := 9.2;
      new(next)
    end;
    with archi^.next^ do
    begin
      arco.sorgente := 4;
      arco.destinazione := 5;
      arco.costo := 9.5;
      next := NIL
    end;
  }

  { stampa del risultato dell'attivazione della procedura o funzione 3 }
  writeln;
  writeln('Archi con costo maggiore di ', r:4:1, ':');
  StampaListaArchi(archi)

end. { Progetto }