Fondamenti di Informatica
Aeronautica, Meccanica, Elettrica, Materiali, Nucleare, Chimica,
Ambiente e Territorio (vecchio programma)
Appello del 17-6-1998
 

 

Esercizio 1 (18 punti)

 

Una fabbrica di componenti produce 12 componenti diversi che vengono prodotti utilizzando macchine dedicate, cioé ogni macchina produce un solo componente ed è quindi univocamente individuata dal codice di questo.

Ogni lunedì mattina la fabbrica riceve il file Ordini.dat contenente tutti gli ordinativi arrivati nella settimana precedente e prepara un piano di lavoro per le singole macchine. Al termine di ogni giornata lavorativa il piano di lavoro viene aggiornato eliminando tutti i pezzi già prodotti.

Il file Ordini.dat è un file di record e ogni record contiene le seguenti informazioni:

codice componente (4 caratteri), codice cliente (6 caratteri), numero di pezzi ordinati (intero positivo).

Il piano di lavorazione viene memorizzato in un array Lavoro di 12 componenti, ciascuna delle quali è un record contenente il codice componente, che individua anche la macchina che lo produce, e un puntatore alla lista degli ordini per quel componente.

 

    Il candidato:

     

  1. fornisca le opportune dichiarazioni dei tipi di dati Pascal per rappresentare il file Ordini.dat e e l’array Lavoro;
  2.  

  3. scriva una procedura Pascal che, leggendo il file Ordini.dat, produca e restituisca come parametro di output l’array Lavoro;
  4.  

  5. scriva una procedura Pascal che, ricevendo come parametri di input l’array Lavoro (prodotto in accordo al punto precedente) e la quantità Q di pezzi prodotti dalla macchina di codice K, aggiorni l’array Lavoro eliminando gli ordini eseguiti. Se un ordine è stato eseguito eliminare il record relativo e se non è stato completamente eseguito decrementare il numero di pezzi nel record stesso.
 

NB: il numero di pezzi eseguiti può anche soddisfare più di un ordine o esaurire la lista degli ordini per quel componente.

 

Nell'esempio riportato sotto, a sinistra (a) c'è la situazione iniziale dell'array Lavoro (si mostra solo la lista della macchina M04) e a destra (b) lo stato dell'array dopo l'esecuzione della procedura con K=M04 e Q=14. In (b), il primo ordinativo in lista è stato eliminato perché totalmente soddisfatto (14>9); il secondo è stato solo modificato perché dopo aver soddisfatto il primo ordine ci sono ancora solo 5 (14-9) componenti disponibili, che bastano per soddisfare solo parzialmente l'ordine. Quindi il secondo ordine rimane in lista con numero di pezzi richiesti diminuito di 5. Il terzo ordine non è stato soddisfatto, né parzialmente né totalmente e rimane invariato in lista.

 
 
(a)
(b)
 

 

Fondamenti di Informatica
Aeronautica, Meccanica, Elettrica, Materiali, Nucleare, Chimica,
Ambiente e Territorio (vecchio programma)
Appello del 17-6-1998
 
 

 

Esercizio 2 (4 punti)

Descrivere la rappresentazione binaria in complemento a 2 dei numeri interi. In particolare, supponendo che gli interi siano rappresentati con 8 bit, rappresentare in tale forma il proprio giorno e mese di nascita e calcolarne la differenza.
 

Esercizio 3 (4 punti)

Scrivere un sottoprogramma Fortran che, ricevendo come parametro di ingresso una matrice quadrata di ordine N, con N pari, sostituisca gli elementi delle colonne pari con le righe corrispondenti. Fornire inoltre le dichiarazioni da inserire nel programma principale.
 

Esercizio 4 (4 punti)

Che cosa stampa questo programma quando gli vengono forniti in ingresso il vostro giorno e mese di nascita?

Mostrare anche l’evoluzione della pila dei record di attivazione della procedura P.

 
program data;
    var
        m, n: integer;
 
function P (m, n: integer): integer;
    begin
        if (n <= m) and (m mod n = 0) then
            P := n
        else if n > m then
                P := P(n, m)
            else
                P := P(n, m mod n);
end;
 
begin
    readln(m, n);
    if (n > 0) and (m > 0) then
        writeln(P(m, n))
    else
        writeln(‘Input errato’)
end.