Sei sulla pagina 1di 2

Canale 2

Compito di Fondamenti di Informatica


28 febbraio 2015

1. [4 punti] Eseguire le seguenti conversioni, indicando sempre i passaggi intermedi.

(a) Convertire in base dieci i seguenti numeri espressi in notazione complemento a due su 8 bit:
1001 1010, 0011 0011.
(b) Convertire in notazione eccesso 27 su 8 bit i seguenti numeri decimali: 137, −117.
(c) Convertire in un numero frazionario in base dieci il numero in virgola mobile 11101011.

2. [3 punti] Con riferimento al linguaggio macchina, descrivere le tre tipologie di istruzioni studiate,
fornendo per ciascuna un esempio. Cosa si intende per ciclo macchina? Come sono definite le fasi
coinvolte in tale ciclo?

3. [3 punti] Con riferimento al linguaggio Java, rispondere alle seguenti domande.

(a) Discutere la differenza di utilizzo tra l’operatore == ed il metodo equals, illustrando con un
esempio.
(b) In quali contesti non è possibile utilizzare il ciclo for generalizzato al posto del ciclo for tradizionale?
Illustrare con un esempio.

4. [6 punti] Implementare un metodo public static boolean disjoint(String s1, String s2)
che restituisce il valore true se le due stringhe passate come argomento non hanno alcun carattere in
comune, e restituisce false in caso contrario. Ad esempio, per le due stringhe "na&tysc" e "xvhz5"
il metodo restituisce true, poichè non vi sono caratteri in comune.

5. [17 punti] Si desidera simulare il processo di attesa degli utenti agli sportelli di un ufficio postale.
Assumere la classe Utente avente le variabili d’istanza numeroAttesa (int) e minutiRichiesti (short),
e la classe Sportello, avente la variabile d’istanza unUtente (riferimento a Utente). Assumere per
tali classi gli usuali metodi di costruzione, accesso e modifica senza sviluppare il codice relativo. La
classe UfficioPostale è cosı̀ definita:

public class UfficioPostale {


private ArrayList<Utente> utenti;
private Sportello[] sportelli;
private int numSportelli; // sentinella
public UfficioPostale(int maxSportelli){...};
public void entraUtente(int unNumeroAttesa, short unMinutiRichiesti){...};
public int prossimoUtente();
public boolean apreSportello(){...};
public void chiudeSportello(int indice){...};
public void minutoTrascorso(){...};
public double statistica(){...};
};

L’array sportelli deve essere gestito come un array parzialmente riempito, usando numSportelli
come sentinella. Il metodo entraUtente inserisce un utente nell’ArrayList utenti, facendo attenzione
a non creare duplicati per il valore del numero d’attesa. Contrariamente alla logica comune, per
questo tema d’esame si assume che i numeri d’attesa siano assegnati in ordine qualsiasi (e non in
ordine crescente). Il metodo prossimoUtente restituisce l’indice dell’utente nell’ArrayList utenti
avente il numero d’attesa più basso.
Il metodo apreSportello apre un nuovo sportello solo se il numero di utenti nell’ArrayList utenti
è superiore al triplo del numero di sportelli aperti, e se c’è ancora posto nell’array sportelli. In
caso di successo, l’utente con il numero d’attesa più basso viene rimosso dall’ArrayList utenti e viene
assegnato allo sportello appena aperto. Il valore booleano restituito dal metodo indica se l’apertura
dello sportello ha avuto successo o meno. Il metodo chiudeSportello rimuove dall’array sportelli
lo sportello avente l’indice specificato (se esiste) eliminando anche l’utente assegnato.
Il metodo minutoTrascorso sottrae un minuto dalla variabile d’istanza minutiRichiesti di tutti gli
utenti assegnati ad uno sportello. Se per un qualche utente il valore raggiunge lo zero, l’utente deve
essere rimosso e sostituito con l’utente avente il numero d’attesa più basso, cancellando quest’ultimo
dall’ArrayList utenti. Infine, il metodo statistica restituisce il valore medio dei minuti richiesti
calcolato su tutti gli utenti nel sistema (associati agli sportelli oppure presenti nell’ArrayList utenti).

Potrebbero piacerti anche