Fondamenti di Informatica

Ambiente e Territorio

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 strutture e ogni struttura 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 è una struttura 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 C per risolvere i punti successivi;
  2. scriva una funzione (o più) C che, leggendo il file Ordini.dat, produca e restituisca come parametro di output l’array Lavoro;
  3. scriva una funzione (o più) C 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 la struttura relativa e se non è stato completamente eseguito decrementare il numero di pezzi nella struttura stessa.

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 funzione di cui al punto 3. 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

Ambiente e Territorio

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)

Definire le seguenti relazioni:

Il candidato:

  1. indichi le chiavi delle relazioni;
  2. scriva una interrogazione SQL per determinare i nomi di tutti gli impiegati che lavorano a Roma il cui stipendio annuo lordo è superiore a Lit. 70000000.

 

Esercizio 4 (4 punti)

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

#include <stdio.h>

int m, n;

int F (int m, int n)

{

if ((n <= m)&&(m % n == 0))

return n;

else if (n > m)

return F(n, m);

else

return F(n, m % n);

}

main() {

scanf("%d%d", &m, &n);

if ((n > 0)&&(m > 0))

printf("%d\n", F(m, n));

else

printf("Input errato\n");

return 0;

}