Sei sulla pagina 1di 4

Esercitazione E4

10/25/11 4:19 PM

Esercitazione E4
Argomento: Progettazione con il JDK Premessa) Console Comandi di Windows Vedere slide e testo E0. Fase 1) Operativit del JDK Rendersi operativi col JDK, seguento i seguenti passi: Aprire una console comandi Arrivati al prompt, verificare che "java" e "javac" funzionino (java -version, e poi javac -version)! Spostarsi sulla cartella C:\Documents and Settings\nome.cognome (comando cd C:\Documents and Settings\nome.cognome) Creare una cartella di lavoro chiamata "finfa" (comando mkdir finfa) Spostarsi in tale cartella (comando cd finfa) Verificare che non ci siano file in questa cartella (comando dir) Scompattare il contenuto dell'archivio codice.zip nella cartella di lavoro "finfa" Nella cartella di lavoro "finfa" troverete ora una cartella "codice" contenente i seguenti file Java, rappresentanti altrettante classi: Prova.java, E.java, E1.java Aprire l'editor di testo jEdit Aprire il sorgente Prova.java e comprendere il comportamento e il ruolo delle varie parti del codice Spostarsi (nel prompt) nella catella "codice" Compilare la classe Prova (comando javac Prova.java) In quale posizione del file system viene salvato il codice binario generato? Testare la classe Prova che, prendendo un valore dalla linea di comando (es.: java Prova 5) stampa in output il fattoriale del valore passato come argomento (es.: il fattoriale di 5 120). Fase 2) Primo caso di analisi di un algoritmo La struttura delle classi che considereremo quella spiegata a lezione e riportata nell'esempio del file E.java (contenuto in codice.zip), che contiene la funzione da costruire o analizzare (in questo esempio la funzione init), la funzione di test fornita, un main che testa la funzione e stampa a video il suo risultato (true o false), e le funzioni ausiliarie richieste (ad esempio arrayToString ed arrayEquals). Ognuna di queste funzioni realizzata come metodo statico e pubblico. Data la funzione init public static int[] init(int size, int elem){ int[] a=new int[size]; for (int i=0;i<a.length;i++){ a[i]=elem; } return a; } Il test per questa funzione :
file:///Users/saramontagna/Documents/FondLA%202011:2012/Esercitazioni/e4/e4.html Page 1 of 4

Esercitazione E4

10/25/11 4:19 PM

public static boolean test(){ // Test fornito return arrayEquals(init(5,1),new int[]{1,1,1,1,1}) && arrayEquals(init(3,1),new int[]{1,1,1}) && arrayEquals(init(1,6),new int[]{6}) && arrayEquals(init(0,10),new int[]{}); } Compilare il file E.java ed eseguire la classe cos generata, verificando che il risultato dell'esecuzione sia true. Analizzare la funzione init e capirne il funzionamento. Fase 3) Secondo caso di analisi di un algoritmo Data la funzione: int[] f(int[] a){ int[] b=new int[a.length]; for (int i=0;i<a.length;i++){ b[a.length-1-i]=a[i]; } return b; } capire il suo funzionamento. Chiedersi cosa succede con l'invocazione f(new int[] {10,20,30,40}). Una volta capito l'algoritmo realizzato, considerate la classe nel file E2.java (contenuto in codice.zip), che contiene la funzione f sopra riportata ed un main che stampa a video il risultato della invocazione f(new int[]{10,20,30,40}). Compilarla ed eseguirla, verificando che l'esito ottenuto sia quello che ci si aspettava. Aggiungere al main altre invocazioni. Nel proseguo della esercitazione, ogni volta che si chiede di costruire una certa funzione e di testarla, costruire una nuova classe Java simile ad E o E2 (a seconda che vogliate costruire anche la funzionalit di test o meno). Fase 4) Progetto per modifica Data la funzione f dell'esercizio precedente, costruire una funzione f2, simile ad f, che dato l'array a costruisce un nuovo array ottenuto da a invertendone la sua seconda met. Data la signature ed il test: // signature da usare int[] f2(int[] a)... boolean test(){ return arrayEquals(f2(new int[]{10,20,30,40,50,60}),new int[]{10,20,30,60,50,40}) && arrayEquals(f2(new int[]{10,20,30,40,50,60,70}),new int[]{10,20,30,70,60,50,40}) && arrayEquals(f2(new int[]{}),new int[]{}) && arrayEquals(f2(new int[]{10}),new int[]{10}) && arrayEquals(f2(new int[]{10,20}),new int[]{10,20}) && arrayEquals(f2(new int[]{10,20,30}),new int[]{10,30,20}); } la funzione dovr essere costruita attraverso i seguenti passi:
file:///Users/saramontagna/Documents/FondLA%202011:2012/Esercitazioni/e4/e4.html Page 2 of 4

Esercitazione E4

10/25/11 4:19 PM

come prima istruzione creare un nuovo array lungo quanto quello in input a, e assegnarlo ad una variabile b fare un ciclo <for> attraverso tutti gli elementi di a, dall'inizio alla fine; dentro al <for> eseguire il seguente <if> se i pi piccolo della lunghezza di a diviso 2, allora assegnare a b[i] esattamente a[i] altrimenti, assegnare a b[i] il valore di a nella posizione a.length-1-i+a.length/2 dopo il <for>, ritornare b Provare quanto costruito in una classe E3. Modificare la funzione f2 in una funzione f3 che inverte invece la prima met dell'array. Provarla in una classe E4 senza una funzionalit di test, ma con un insieme di stampe successive nel main (come nel caso di E2). Fase 5) Progetto Costruire una funzione azzeraNegativi con la seguente signature: int[] azzeraNegativi(int[] a) che prende in ingresso un array e lo modifica mettendo a zero tutti i suoi elementi negativi. Tale funzione deve passare il test: boolean testNegativi(){ return arrayEquals(azzeraNegativi(new int[]{10,20,30}),new int[]{10,20,30}) && arrayEquals(azzeraNegativi(new int[]{10,20,-5,30}),new int[]{10,20,0,30}) && arrayEquals(azzeraNegativi(new int[]{10,20,-5,-1,30}),new int[]{10,20,0,0,30}) && arrayEquals(azzeraNegativi(new int[]{-1,-2,-3}),new int[]{0,0,0}) && arrayEquals(azzeraNegativi(new int[]{}),new int[]{}); } Finito questo esercizio, come modifichereste questa funzione per creare un nuovo array invece di modificare quello in input? Costruire una funzione uni con la seguente signature: int[] uni(int[] a) che prende in ingresso un array e ne crea uno nuovo simile ad a, ma con un 1 in pi sia all'inizio che alla fine. Tale funzione deve passare il test: boolean testUni(){ return arrayEquals(uni(new int[]{10,20,30}),new int[]{1,10,20,30,1}) && arrayEquals(uni(new int[]{10}),new int[]{1,10,1}) && arrayEquals(uni(new int[]{}),new int[]{1,1}); } Fare la versione ricorsiva di azzeraNegativi e uni, in modo che passi i medesimi test. Fase 6) Il controllo di flusso: errori tipici
file:///Users/saramontagna/Documents/FondLA%202011:2012/Esercitazioni/e4/e4.html Page 3 of 4

Esercitazione E4

10/25/11 4:19 PM

Creare un sorgente che implementi e testi la seguente funzione: int f(int j){ int k; if (j>0){ k=0; } return k; } Che significato ha l'errore prodotto dal tentativo di compilazione? variable k may non have been initialized: qualsiasi variabile locale deve essere sempre inizializzata prima di essere utilizzata, qualsiasi sia lo scenario (il percorso seguito dal flusso di controllo) del programma. Creare un sorgente che implementi e testi la seguente funzione: int f(int j){ if (j>0){ return j; }else{ return -j; } j++; return j; } Che significato ha l'errore prodotto dal tentativo di compilazione? unreachable statement: per qualsiasi istruzione (statement) deve esistere uno scenario che prevede la sua esecuzione. Creare un sorgente che implementi e testi la seguente funzione: int f(int j){ if (j>0){ j=-j; }else{ return j; } } Che significato ha l'errore prodotto dal tentativo di compilazione? missing return statement: data una funzione che restituisce un valore (non void) allora qualsiasi scenario deve concludersi con una istruzione che specifica il valore che deve essere restituito.

file:///Users/saramontagna/Documents/FondLA%202011:2012/Esercitazioni/e4/e4.html

Page 4 of 4