Programmazione IILezione 10
Daniele Sgandurra
19/11/2010
1/37 Programmazione II Lezione 10 19/11/2010
Sommario
1 Esercitazione: i File JAR
2 JavaPrincipali ComandiBlocchiArray
2/37 Programmazione II Lezione 10 19/11/2010
Esercitazione: i File JAR
Parte I
Esercitazione: i File JAR
3/37 Programmazione II Lezione 10 19/11/2010
Esercitazione: i File JAR
Packaging Di Applicazioni Java
Spesso e utile raccogliere i file delle classi e altre risorse richieste dalprogramma (immagini, etc) in un file JAR (Java ARchive).
Dopo che il programma e stato impacchettato, si puo eseguiredirettamente l’archivio.
Un file JAR e un file zippato che puo contenere programmi, componenti(bean) e librerie di codice (es., rt.jar).
Oltre alle classi, immagini, etc, il file JAR deve contenere anche un file
manifesto che descrive le funzionalita specifiche dell’archivio:
solitamente, e chiamato MANIFEST.MF e si trova in unasottodirectory META-INF. Esempio:
Manifest-Version: 1.0
//righe che descrivono questo archivio
Name: Foo.Class
//righe che descrivono questo file
Name: com/mycompany/mypkg
//righe che descrivono questo pacchetto.
4/37 Programmazione II Lezione 10 19/11/2010
Esercitazione: i File JAR
Creare un JAR da Shell
Spostarsi nella directory bin del progetto Hello:
~$ cd workspace/Hello/bin
Creare il manifesto:
~/workspace/Hello/bin$ emacs Manifest.mf
Aggiungere nel manifesto la classe principale (bisogna anche inserire un ’acapo’ finale):
Main-Class: Hello
Creare il JAR:
~/workspace/Hello/bin$ jar cvfm Hello.jar Manifest.mf Hello.class
Eseguire il JAR:
~/workspace/Hello/bin$ java -jar Hello.jar
Hello World!
5/37 Programmazione II Lezione 10 19/11/2010
Esercitazione: i File JAR
Creare un JAR da Eclipse
6/37 Programmazione II Lezione 10 19/11/2010
Esercitazione: i File JAR
Creare un JAR da Eclipse
7/37 Programmazione II Lezione 10 19/11/2010
Esercitazione: i File JAR
Creare un JAR da Eclipse
8/37 Programmazione II Lezione 10 19/11/2010
Esercitazione: i File JAR
Creare JAR da Eclipse
9/37 Programmazione II Lezione 10 19/11/2010
Esercitazione: i File JAR
Creare JAR da Eclipse
10/37 Programmazione II Lezione 10 19/11/2010
Esercitazione: i File JAR
Creare JAR da Eclipse
11/37 Programmazione II Lezione 10 19/11/2010
Esercitazione: i File JAR
Creare JAR da Eclipse
12/37 Programmazione II Lezione 10 19/11/2010
Esercitazione: i File JAR
Creare JAR da Eclipse
13/37 Programmazione II Lezione 10 19/11/2010
Esercitazione: i File JAR
Creare JAR da Eclipse
Per vedere il contenuto:
jar -tvf Hello.jar
25 Thu Nov 11 09:19:40 CET 2010 META-INF/MANIFEST.MF
519 Wed Nov 03 14:31:14 CET 2010 Hello.class
295 Wed Oct 27 15:40:42 CEST 2010 .classpath
364 Wed Oct 27 15:40:42 CEST 2010 .project
Per estrarre il contenuto:
jar xvf Hello.jar
inflated: META-INF/MANIFEST.MF
inflated: Hello.class
inflated: .classpath
inflated: .project
14/37 Programmazione II Lezione 10 19/11/2010
Esercitazione: i File JAR
Creare JAR da Eclipse
In alternativa, possiamo creare un file manifest e usare quello.
15/37 Programmazione II Lezione 10 19/11/2010
Esercitazione: i File JAR
Creare JAR da Eclipse
16/37 Programmazione II Lezione 10 19/11/2010
Esercitazione: i File JAR
Creare JAR da Eclipse
17/37 Programmazione II Lezione 10 19/11/2010
Java
Parte II
Java
18/37 Programmazione II Lezione 10 19/11/2010
JavaPrincipali ComandiBlocchiArray
Esercizio
Scrivere un programma che verifica se una stringa, inserita dall’utente tramite laconsole, e palindroma. Una stringa e palindroma se e composta da una sequenza dicaratteri (anche non alfabetici) che possa essere letta allo stesso identico modo ancheal contrario, senza considerare gli spazi (ad es.“radar”, “anna”, “i topi non avevanonipoti”, “o mordo tua nuora o aro un autodromo”, etc). Il programma deve eseguire ilminimo numero di confronti necessari per determinare se la stringa e palindroma.Verificare il corretto funzionamento del programma con:
una stringa palindroma di lunghezza pari;
una stringa palindroma di lunghezza dispari;
una stringa non palindroma di lunghezza pari;
una stringa non palindroma di lunghezza dispari;
una stringa di lunghezza unitaria (che quindi e palindroma);
una stringa di lunghezza zero (che definiamo come palindroma).
Suggerimento: usare il metodo substring() (o, meglio, il metodo charAt()) della
classe String all’interno di un ciclo while.
19/37 Programmazione II Lezione 10 19/11/2010
JavaPrincipali ComandiBlocchiArray
Comando for
f o r (<inizializzazione>; <condizione>; <incremento>) {<corpo>
}
<init>: comando di inizializzazione del ciclo;
<cond>: guardia del ciclo;
<incr>: comando di incremento.
i n t totale = 0 ;f o r ( i n t i = 0 ; i < 1 0 ; i++) {
totale = totale + i ;}
A differenza del C, in Java e possibile (e consigliato) dichiarare la variabile i
direttamente dentro il comando for: la i e visibile solo all’interno del ciclo.
20/37 Programmazione II Lezione 10 19/11/2010
JavaPrincipali ComandiBlocchiArray
Esercizio
Scrivere un programma che calcola le probabilita di vincere alla lotteria. Ad esempio,se si devono indovinare 5 numeri compresi tra 0 e 100, si devono prevedere100×99×98×97×96
1×2×3×4×5combinazioni di uscita. In generale, la formula da usare per
indovinare k numeri su n e:
n × (n − 1) × (n − 2) × · · · × (n − k + 1)
1 × 2 × 3 × · · · × k
Il programma chiede da input i due valori n e k e tramite un ciclo for calcola (estampa alla fine) le probabilita di vincere.
Suggerimento: usare nel comando di inizializzazione del for un variabile i inizializzata
a 1 e come guardia controllare che i sia minore o uguale a k e incrementarla ogni volta
di 1. Prima del ciclo, dichiarare una variabile lotteryOdds inizializzata a 1 che nel
ciclo, iterativamente, viene aggiornata opportunamente usando la formula precedente:
ad esempio, al primo ciclo verra moltiplicata e divisa, rispettivamente, per n e 1; al
secondo, per (n − 1) e 2 e cosı via, usando le variabili lotteryOdds, i e n.
21/37 Programmazione II Lezione 10 19/11/2010
JavaPrincipali ComandiBlocchiArray
Comando switch
s w i t c h ( expression ) {c a s e cond1 : code_block_1 ;c a s e cond2 : code_block_2 ;. . .c a s e condn : code_block_n ;d e f a u l t : code_block_default ;}
L’esecuzione inizia all’etichetta case e confronta il proprio valore conquello che effettua la selezione.
Prosegue fino al successivo break oppure fino alla fine dell’istruzioneswitch.
Se nessuna etichetta case coincide con il valore della selezione, allora siesegue la clausola default (se presente).
Dopo l’etichetta case si possono specificare valori interi o costantienumerate, ma non stringhe.
22/37 Programmazione II Lezione 10 19/11/2010
JavaPrincipali ComandiBlocchiArray
Comando switch: Esempio
1 c l a s s SwitchDemo {2 p u b l i c s t a t i c v o i d main ( String [ ] args ) {3 i n t month = Integer . parseInt ( args [ 0 ] ) ;4 s w i t c h ( month ) {5 c a s e 1 : System . out . println ( ” January ” ) ; b r e a k ;6 c a s e 2 : System . out . println ( ” F e b r u a r y ” ) ; b r e a k ;7 c a s e 3 : System . out . println ( ”March” ) ; b r e a k ;8 c a s e 4 : System . out . println ( ” A p r i l ” ) ; b r e a k ;9 c a s e 5 : System . out . println ( ”May” ) ; b r e a k ;
10 c a s e 6 : System . out . println ( ” June ” ) ; b r e a k ;11 c a s e 7 : System . out . println ( ” J u l y ” ) ; b r e a k ;12 c a s e 8 : System . out . println ( ” August ” ) ; b r e a k ;13 c a s e 9 : System . out . println ( ” September ” ) ; b r e a k ;14 c a s e 1 0 : System . out . println ( ” October ” ) ; b r e a k ;15 c a s e 1 1 : System . out . println ( ”November” ) ; b r e a k ;16 c a s e 1 2 : System . out . println ( ” December ” ) ; b r e a k ;17 d e f a u l t : System . out . println ( ” I n v a l i d . ” ) ; b r e a k ;18 }19 }20 }
23/37 Programmazione II Lezione 10 19/11/2010
JavaPrincipali ComandiBlocchiArray
Esercizio
Scrivere un programma che simula una semplice calcolatrice. Il programma deve
stampare iterativamente un menu con quattro opzioni per effettuare le quattro
operazioni matematiche (+, -, *, /) e una quinta per uscire dal programma. Per fare
questo, il programma all’interno di un ciclo chiede di selezionare un’opzione
(leggendola da console) e, se non e quella di uscita, chiede di inserire due numeri e li
legge; poi, tramite l’istruzione switch, il programma esegue l’operazione associata
all’opzione desiderata e ritorna il risultato dell’operazione. Nel caso in cui l’opzione sia
quella di uscita, il programma termina.
24/37 Programmazione II Lezione 10 19/11/2010
JavaPrincipali ComandiBlocchiArray
Istruzioni che Interrompono il Flusso di Controllo
Non esiste l’istruzione goto in Java.Istruzione break senza etichetta:
w h i l e ( years <= 100){
balance += payment ;d o u b l e interest = balance ∗ interestRate / 1 0 0 ;balance += interest ;i f ( balance >= goal ) b r e a k ;years++;
}
Il ciclo viene interrotto se si verifica years > 100 all’inizio del ciclo oppurebalance >= goal. Codice analogo a:
w h i l e ( years <= 100 && balance < goal ){
balance += payment ;d o u b l e interest = balance ∗ interestRate / 1 0 0 ;balance += interest ;i f ( balance < goal )
years++;}
dove pero la stessa condizione e controllata due volte.25/37 Programmazione II Lezione 10 19/11/2010
JavaPrincipali ComandiBlocchiArray
Istruzioni che Interrompono il Flusso di Controllo
Istruzione break con etichetta: per interrompere cicli multipli nidificati. Esempio:
Scanner scanner = new Scanner ( System . in ) ;i n t n ;read_data :w h i l e ( . . . ) // q u e s t a i s t r u z i o n e e ’ e t i c h e t t a t a{
. . .f o r ( . . . ) // i s t r u z i o n e non e t i c h e t t a t a{
System . out . println ( ‘ ‘ Scrivi un numero >= 0 ’ ’ ) ;n = scanner . nextInt ( ) ;i f ( n < 0) // non s u c c e d e n u l l a , s i p r o s e g u e
b r e a k read_data ; // f a u s c i r e d a l c i c l o r e a d d a t a. . .
}}// dopo i l b r e a ki f ( n < 0){
// g e s t i o n e s i t u a z i o n e non c o r r e t t a}e l s e{
// e s e g u e l ’ e l a b o r a z i o n e normale}
26/37 Programmazione II Lezione 10 19/11/2010
JavaPrincipali ComandiBlocchiArray
Istruzioni che Interrompono il Flusso di Controllo
Istruzione continue: trasferisce il controllo all’intestazione del ciclo piu interno.Esempio:
Scanner scanner = new Scanner ( System . in ) ;w h i l e ( sum < goal ){
System . out . println ( ‘ ‘ Scrivi un numero >= 0 ’ ’ ) ;n = scanner . nextInt ( ) ;i f ( n < 0) c o n t i n u e ;sum += n ; // non s i e s e g u e s e n < 0
}
In un ciclo for:
f o r ( count = 1 ; count <= 1 0 0 ; count++){
System . out . println ( ‘ ‘ Scrivi un numero , −1 per uscire ’ ’ ) ;n = scanner . nextInt ( ) ;i f ( n < 0) c o n t i n u e ;sum += n ; // non s i e s e g u e s e n < 0
}
Se n < 0, l’istruzione continue salta all’istruzione count++.
27/37 Programmazione II Lezione 10 19/11/2010
JavaPrincipali ComandiBlocchiArray
Blocchi e Visibilita dei Nomi
Un blocco e una porzione di codice racchiusa tra graffe:
{ // b l o c c o. . .}
La visibilita del nome di una variabile indica le parti di un programma in cui ilnome puo essere utilizzato per riferirsi alla variabile.
Una variabile dichiarata all’interno di un blocco:
e visibile solo all’interno del blocco stesso e dei sottoblocchi;e visibile solo dal punto della dichiarazione in poi.
Vincoli (controllati staticamente dal compilatore):
ogni variabile deve essere inizializzata prima del suo utilizzo;
non e possibile ridefinire una variabile gia definita:
neanche se le variabili sono presenti in due blocchi nidificati.
28/37 Programmazione II Lezione 10 19/11/2010
JavaPrincipali ComandiBlocchiArray
Blocchi: Esempio 1
1 p u b l i c s t a t i c i n t foo ( i n t x , i n t y )2 {3 i n t ret = −1;4 i f ( x > 0) {5 z = 3 ; // non c o r r e t t o : z non a n c o r a d i c h i a r a t a6 i n t z = x + y ;7 ret = ret + z ; // ok8 }9 r e t u r n ret − z ; // non c o r r e t t o : z non v i s i b i l e
10 }
29/37 Programmazione II Lezione 10 19/11/2010
JavaPrincipali ComandiBlocchiArray
Blocchi: Esempio 2
1 p u b l i c s t a t i c i n t foo ( i n t x , i n t y )2 {3 i n t q ;4 q = q + 1 ; // non c o r r e t t o : q non i n i z i a l i z z a t a5 i n t p ;6 i f ( x > 0) {7 p = 5 + x ;8 }9 r e t u r n p ; // non c o r r e t t o : p non sempre i n i z i a l i z z a t a
10 }
30/37 Programmazione II Lezione 10 19/11/2010
JavaPrincipali ComandiBlocchiArray
Blocchi: Esempio 3
1 p u b l i c s t a t i c v o i d main ( String [ ] args )2 {3 i n t n ;4 . . .5 {6 i n t k ;7 i n t n ; // e r r o r e : non p o s s i b i l e r i d e f i n i r e n i n un b l o c c o n i d i f i c a t o8 }9 }
31/37 Programmazione II Lezione 10 19/11/2010
JavaPrincipali ComandiBlocchiArray
Array
Struttura dati che memorizza un insieme di valori dello stesso tipo.
Si accede a ciascun valore mediante un indice intero:
es., se a e un array di interi, allora a[i] definisce l’intero nella i-esimaposizione.
Dichiarazione:
i n t [ ] a ; // d i c h i a r a z i o n e s e n z a i n i z i a l i z z a z i o n ea = new i n t [ 1 0 0 ] ; // c r e a un a r r a y d i 100 i n t e r i
Le voci dell’array sono numerate da 0 al valore (max - 1). Esempio:
i n t [ ] a = new i n t [ 1 0 0 ] ;f o r ( i n t i = 0 ; i < 1 0 0 ; i++)
a [ i ] = i ; // r i e m p i e l ’ a r r a y con v a l o r i da 0 a 99
32/37 Programmazione II Lezione 10 19/11/2010
JavaPrincipali ComandiBlocchiArray
Inizializzare gli Array
Java definisce una scorciatoia per creare e inizializzare gli array:
i n t [ ] smallPrimes = { 2 , 3 , 5 , 7 , 11 , 13} ;
E possibile anche inizializzare un array anonimo:
new i n t [ ] { 17 , 19 , 23 , 29 , 31 , 37} ;
Utile se si vuole assegnare nuovi valori ad un array gia esistente senza creare unanuova variabile:
smallPrimes = new i n t [ ] { 17 , 19 , 23 , 29 , 31 , 37} ;
Codice analogo a:
i n t [ ] anonymous = new i n t [ ] { 17 , 19 , 23 , 29 , 31 , 37} ;smallPrimes = anonymous ;
33/37 Programmazione II Lezione 10 19/11/2010
JavaPrincipali ComandiBlocchiArray
Copiare gli Array
E possibile anche copiare una variabile array in un’altra: a questo punto, entrambe le variabili fannoriferimento allo stesso array:
i n t [ ] luckyNumbers = smallPrimes ;luckyNumbers [ 5 ] = 1 2 ; // a d e s s o anche s m a l l P r i m e s [ 5 ] c o n t i e n e 12
Per copiare tutti gli elementi di un array in un altro si puo usare il metodo arraycopy() della classe System:System.arraycopy(from, fromIntex, to, toIndex, count). Ad esempio, il programma seguente:
i n t [ ] smallPrimes = { 2 , 3 , 5 , 7 , 11 , 13} ;i n t [ ] luckyNumbers = {1001 , 1002 , 1003 , 1004 , 1005 , 1006 , 1007} ;System . arraycopy ( smallPrimes , 2 , luckyNumbers , 3 , 4) ;f o r ( i n t i = 0 ; i < luckyNumbers . length ; i++)
System . out . println ( i + ” : ” + luckyNumbers [ i ] ) ;
stampa:
0: 1001
1: 1002
2: 1003
3: 5
4: 7
5: 11
6: 13
34/37 Programmazione II Lezione 10 19/11/2010
JavaPrincipali ComandiBlocchiArray
Il Ciclo for each
Introdotto con JDK 5.0.
Non si usano indici per scorrere gli array.
Sintassi:
f o r ( variabile : collezione ) istruzione
Esempio:
f o r ( i n t element : a )System . out . println ( element ) ;
analogo a:
f o r ( i n t i = 0 ; i < a . length ; i++)System . out . println ( a [ i ] ) ;
35/37 Programmazione II Lezione 10 19/11/2010
JavaPrincipali ComandiBlocchiArray
Esercizio
Scrivere un programma che crea un array di interi con valori compresi tra 2 e n (valorepassato da riga di comando o console). Il programma implementa il metodo delcrivello di Eratostene per generare i numeri primi: per ogni elemento i-esimo dell’array,settare a -1 tutti gli elementi di posizione j (j > i) il cui valore e multiplodell’elemento considerato. Alla fine stampare tutti e solo i numeri dell’array il cuivalore e diverso da -1 (che saranno numeri primi) preceduti da un numero progressivo(che parte da 1). Es:
1) 2
2) 3
3) 5
4) 7
5) 11
6) 13
7) 17
8) 19
9) 23
10) 29
.
.
.
36/37 Programmazione II Lezione 10 19/11/2010
JavaPrincipali ComandiBlocchiArray
Riferimenti
[1] Core Java 2. Vol. 1: Fondamenti (Cap. 3).
Horstmann Cay S., Cornell Gary.
37/37 Programmazione II Lezione 10 19/11/2010