Fondamenti di Informatica
Aeronautica, Meccanica, Elettrica, Materiali, Nucleare, Chimica, Ambiente e Territorio
Appello del 12-2-1998 (prima parte)

Esercizio 1 (18 punti)

Le varie attivita' di un progetto corrispondono ai nodi di un grafo, i cui archi, etichettati con valori reali, esprimono il costo necessario per passare da una attivita' all'altra. Il grafo e' rappresentato tramite matrice di adiacenza A(n x n), in cui A(i,j) = 0 denota l'assenza di arco tra i nodi i e j, mentre A(i,j)<>0 indica la presenza di un arco tra i e j di costo A(i,j).

  1. Scrivere le dichiarazioni di tipo necessarie per i sottoprogrammi 2 e 3 seguenti.
  2. Scrivere una procedura o funzione Pascal che, ricevendo in ingresso la matrice A, restituisca "vero" se nel grafo non esiste un' attivita' isolata (un'attivita' e' isolata quando da essa non partono archi verso altre attivita' e non puo' essere raggiunta a partire da altre attivita'), "falso" altrimenti.
  3. Scrivere una procedura o funzione Pascal che, ricevendo in ingresso la matrice A ed un valore reale r, restituisca in uscita una lista L formata da tutti gli archi di costo maggiore di r. Ogni record della lista deve corrispondere ad un arco, e contenere le seguenti informazioni: nodo di partenza, nodo di arrivo, costo dell'arco.
Esempio:
Fondamenti di Informatica
Aeronautica, Meccanica, Elettrica, Materiali, Nucleare, Chimica, Ambiente e Territorio
Appello del 12-2-1998 (seconda parte)

Esercizio 2 (4 punti)

Illustrare e comparare i metodi di "segmentazione" e "paginazione" della memoria di un calcolatore.

Esercizio 3 (4 punti)

Scrivere un sottoprogramma Fortran che ricevendo in ingresso due vettori A(n) e B(n) ad elementi interi, verifichi se contengono gli stessi valori in ordine inverso (per esempio, se A[1] = B[n], e così via).

Esercizio 4 (4 punti)

Dato il seguente programma Pascal, dire cosa stampa motivando la risposta.

program Prova;
type
  punt = ^rec;
  rec = record
          info: integer;
          next: punt
        end;
var
  p, app: punt; i: integer;

procedure Costruisci (var q: punt; k: integer);
begin
  if k <> 0 then
  begin
    new(q);
    q^.info := k; q^.next := nil; Costruisci(q^.next, k - 1)
  end
end;

procedure Pippo (l: punt);
var
  q: punt;
begin
  q := l;
  while q <> nil do
  begin
    q^.info := q^.info - i; i := i + 1; q := q^.next
  end;
  l^.next^.next := q; l := nil
end;

begin
  Costruisci(p, 10);
  i := 2;
  Pippo(p);
  app := p;
  while app <> nil do
  begin
    write(app^.info); app := app^.next
  end;
end.