Fondamenti di Informatica
Corso di Laurea in Ingegneria Automatica e Informatica
Università degli Studi di Roma "La Sapienza"
AA. 2006-2007

Proff. Camil Demetrescu e Luigi Laura

Esempi di domande di esame (con soluzioni commentate)

Regole per la prova di esame


Domanda 1

Considerare il seguente frammento di programma Java:

int x = -5;
if (x>0) if (x>10) System.out.println("uno");
   else if (x>-6) System.out.println("due");
   else System.out.println("tre");

Cosa stampa il programma?

(A) uno [NO, vedi caso (D)]

(B) due [NO, vedi caso (D)]

(C) tre [NO, vedi caso (D)]

(D) il programma non stampa nulla [RISPOSTA CORRETTA: infatti, il secondo else si riferisce al terzo if, il primo else si riferisce al secondo if, e quindi il primo if non ha un ramo else. Poiché x è negativo, il test del primo if fallisce e quindi, non essendoci un ramo else, non viene eseguita nessuna istruzione]


Domanda 2

Considerare il seguenti due cicli:

for (int i=0; i<10; i++)       // CICLO 1
    System.out.println(10-i);

int i=10;
while(i>1) {                   // CICLO 2
    System.out.println(i);
    i--;
}

Una sola delle seguenti affermazioni è vera. Quale?

(A) i due cicli stampano gli stessi numeri nello stesso ordine [NO, vedi caso (B)]

(B) i due cicli stampano gli stessi numeri nello stesso ordine, ma il secondo stampa un numero in meno [RISPOSTA CORRETTA: il primo ciclo stampa 10, 9, 8, ..., 3, 2, 1, il secondo stampa 10, 9, 8, ..., 3, 2]

(C) i due cicli stampano gli stessi numeri, ma in ordine diverso [NO, vedi caso (B)]

(D) il secondo ciclo non termina mai [NO, infatti la variabile locale i parte da 10 e viene decrementata finchè non diventa uguale a 1, nel qual caso il ciclo termina]


Domanda 3

Il seguente programma formato da due classi contiene un errore:

 1  class Intero {
 2     private int x;
 3     public Intero(int x) { this.x = x; }
 4  }
 5  class ProvaIntero {
 6      public static void main(String[] x) {
 7          Intero q = new Intero(19);
 8          incrementa(q);
 9      }
10      private static void incrementa(Intero q){
11          q.x++;
12      }
13  }

Su quale linea viene segnalato l'errore dal compilatore?

(A) linea 8, poichè il metodo incrementa invocato è dichiarato dopo il metodo main [NO, l'ordine di dichiarazione dei metodi in una classe è del tutto irrilevante]

(B) linea 2, poichè non è possibile definire la variabile x in questo punto [NO, le variabili di istanza possono essere dichiarate ovunque nel corpo di una classe, purchè fuori da ogni metodo, come in questo caso]

(C) linea 11, poichè non è possibile accedere alla variabile di istanza x [RISPOSTA CORRETTA: infatti x è una variabile di istanza privata della classe Intero, e quindi non può essere acceduta direttamente dalla classe ProvaIntero]

(D) linea 7, poichè non è possibile invocare il costruttore in quel modo [NO, l'invocazione è corretta, visto che la classe Intero prevede un costruttore con un unico parametro formale int]


Domanda 4

Quale delle seguenti affermazioni relative al tipo boolean del linguaggio di programmazione JAVA è vera

(A) le espressioni di tipo boolean si possono usare per specificare una condizione [RISPOSTA CORRETTA: si pensi alle istruzioni if, while e for, il cui comportamento dipende da una condizione data sotto forma di espressione booleana]

(B) le espressioni di tipo boolean si possono usare nel ciclo while ma non nel ciclo for [NO, vedi risposta (A)]

(C) le espressioni di tipo boolean sono utili solo quando si devono scrivere istruzioni if annidate [NO, le due cose non hanno nessun nesso fra loro]

(D) le espressioni di tipo boolean sono sempre vere o sempre false [NO, ovviamente, sennò non servirebbero a nulla]


Domanda 5

Considerare la seguente classe:

1  public class Mistero {
2      private int x;
3      public Mistero() { this.x = 10; }
4      public static void aggiungi(int k) {
5          this.x += k;
6      }
7  }

Una sola delle seguenti affermazioni è vera. Quale?

(A) il compilatore segnala un errore alla linea 3 poichè il costruttore è definito male [NO, il costruttore è OK]

(B) il programma stampa 10 [NO, il programma contiene un errore: vedi caso (C)]

(C) il compilatore segnala un errore alla linea 5 poichè si accede in modo errato alla variabile x [RISPOSTA CORRETTA: infatti il riferimento this è indefinito in un metodo static, dato che i metodi statici non hanno oggetto di invocazione]

(D) il metodo 'aggiungi' somma k alla variabile di istanza x dell'oggetto su cui il metodo è invocato [NO, il programma contiene un errore: vedi caso (C)]


Domanda 6

Se un metodo A invoca un metodo B, come può B modificare il contenuto una variabile creata da A?

(A) la variabile può essere contenuta in un oggetto creato da A il cui riferimento è passato come parametro al metodo B [RISPOSTA CORRETTA]

(B) non è possibile [NO, sennò in Java si potrebbe fare ben poco...]

(C) basta passare come parametro attuale al metodo B la variabile di A che si intende modificare [NO, si veda la Domanda 9]

(D) basta dichiarare la variabile static in A [NO, non si posso dichiarare variabili static all'interno di un metodo]


Domanda 7

Quale delle seguenti affermazioni relative alle istruzioni di ciclo while e di ciclo for è vera?

(A) ciclo while e ciclo for consentono di esprimere cicli indefiniti [RISPOSTA CORRETTA: infatti, tutto quello che si può fare con un for può essere fatto con un while, e viceversa. Un ciclo è indefinito se il numero di iterazioni che esso effettuerà non è noto all'inizio del ciclo: questo ragionamento può essere applicato sia al for che al while. ]

(B) non c'? nessuna differenza tra le due istruzioni di ciclo while e di ciclo for  [NO, chiaramente hanno una sintassi differente]

(C) il ciclo while consente di esprimere cicli indefiniti mentre il ciclo for consente di esprimere solo cicli definiti [NO, tutto quello che si può fare con un for può essere fatto con un while, e viceversa.]

(D) esistono elaborazioni che possono essere realizzate con un ciclo for, ma non con un ciclo while [NO, tutto quello che si può fare con un for può essere fatto con un while, e viceversa.]


Domanda 8

Quale delle seguenti affermazioni relative agli array del linguaggio di programmazione JAVA è vera?

(A) gli array consentono di memorizzare collezioni di dati omogenei (dello stesso tipo) [RISPOSTA CORRETTA, le celle di un array sono tutte dello stesso tipo. ]

(B) gli array sono un tipo di dato primitivo [NO, gli array sono tipi non-primitivi: i tipi primitivi sono solo quelli che permettono di esprimere valori semplici, come numeri o valori booleani]

(C) gli array consentono di memorizzare collezioni di dati eterogenei (di tipo diverso) [NO, le celle di un array sono tutte dello stesso tipo]

(D) gli array possono essere sempre ridimensionati ove serva più spazio per memorizzare i dati [NO, un array una volta creato non è ridimensionabile]


Domanda 9

Considerare il seguente programma:

 1  public class Programma {
 2      public static void main(String[] args) {
 3          int x = 10;
 4          decrementa(x);
 5          System.out.println(x);
 6      }
 7      private static void decrementa(int x) {
 8          x = x - 1;
 9      }
10  }

Una sola delle seguenti affermazioni è vera. Quale?

(A) il programma stampa 10 [RISPOSTA CORRETTA: infatti il metodo decrementa non ha nessun effetto sulle variabili del main. Il decremento avviene sul parametro formale x del metodo decrementa, parametro che viene distrutto non appena il metodo stesso termina]

(B) il programma stampa 9 [NO, vedi caso (A)]

(C) il compilatore segnala un errore alla linea 4 poiché l'invocazione del metodo decrementa è errata [NO, l'invocazione data è equivalente a quella per esteso Programma.decrementa(x): poiché sia il main che decrementa sono nella stessa classe, Programma. può essere omesso]

(D) il programma si blocca a tempo di esecuzione con un errore alla linea 4 poiché non è possibile invocare il metodo decrementa [NO, eventuali errori relativi alle invocazioni di metodi sono sempre errori dati a tempo di compilazione, non errori di esecuzione]


Domanda 10

Quando viene creata una variabile di istanza?

(A) al momento della creazione dell'oggetto nel quale è definita [RISPOSTA CORRETTA]

(B) al momento della dichiarazione di classe in cui è contenuta [NO, le variabili di istanza sono contenute negli oggetti, e dichiarare una classe non provoca la costruzione di alcun oggetto, cosa che invece si fa con l'operatore new]

(C) durante l'esecuzione del blocco in cui è dichiarata  [NO, le variabili di istanza sono definite nel corpo di una classe, non in un blocco di istruzioni all'interno di un metodo come invece accade per le variabili locali]

(D) quando le viene assegnato un valore [NO, questo sarebbe fanta-Java]


Domanda 11

Si consideri il seguente numero in base 10: 25. Quale numero in base 2 rappresenta?

(A) 1001100 [NO, infatti 64 + 8 + 4 = 76]

(B) 11001 [SI, infatti 16 + 8 + 1 = 25]

(C) 10010 [NO, infatti 16 + 2 = 18]

(D) 1001101 [NO, infatti 64 + 8 + 4 + 1 = 77]


Domanda 12

Si consideri il seguente numero in base 2: 10110. Quale numero in base 10 rappresenta?

(A) 10110 [ovviamente NO]

(B) 47 [NO]

(C) 22 [SI, infatti 16 + 4 + 2 = 22]

(D) 13 [NO]