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]
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]
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]
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]
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)]
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]
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.]
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]
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]
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]
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]
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]