Corso sul linguaggio Java Modulo JAVA A - Array // Prerequisiti Variabili semplici Operazioni su variabili Strutture di controllo //
Introduzione In molte situazioni reali può capitare di elaborare elenchi di dati di vario tipo presenti i memoria. Quali strumenti offre Java per trattare queste situazioni? Come si usano questi strumenti? In questa Unità vediamo uno di questi strumenti, detto array, che è un primo esempio di variabile strutturata; impariamo come si dichiara un array e come si utilizza in vari problemi. // Informazioni generali Attraverso l array è possibile rappresentare molte situazioni reali. L array è una variabile strutturata perché è fatta in modo da contenere nello stesso tempo una molteplicità di valori, a differenza delle variabili semplici (int, float, char, boolean) che ne possono contenere uno alla volta. L array, come tutte le variabili, può essere dichiarato, inizializzato ed utilizzato. //
Struttura di un array Un array, in quanto variabile strutturata, contiene nel suo interno variabili di tipo più semplice dette componenti. L accesso a ciascuna componente avviene mediante una variabile intera associata all array detta indice. Il nome della variabile array è un nome collettivo di tutta la struttura ed è assegnato dal programmatore indici nome collettivo componenti // Vettore Un vettore è un array monodimensionale, ossia tale che per individuare una componente è sufficiente un solo indice. Nell esempio a fianco, abbiamo rappresentato un vettore di componenti intere in cui: V indica il nome collettivo della variabile i è l indice delle componenti Nel linguaggio Java su un array si possono svolgere le seguenti operazioni: dichiarazione allocazione caricamento i V //
Dichiarazione vettore La dichiarazione di un vettore consiste nello specificare il nome collettivo il tipo delle componenti Essa assume la forma: tipo ident[ ]; dove: tipo è il tipo delle componenti (int, float, ecc); ident è il nome collettivo [ ] indicano che NON è una variabile semplice Esempi: int V[ ]; //dichiara un vettore di interi float num[ ]; //dichiara un vettore di float La dichiarazione di un vettore NON specifica il numero di componenti // Allocazione vettore Per specificare il numero di componenti occorre allocare il vettore dopo averlo dichiarato: Esempi: int v[ ]; v=new int[]; float f[ ]; f=new float[]; //dichiara il vettore v //alloca vettore di componenti (v. figura) //dichiara un vettore di float //alloca un vettore di componenti reali Notare che le componenti di un array hanno indici che iniziano da ; quindi nel secondo esempio, le componenti vanno da a, nel quarto esempio vanno da a. i v //
Caricamento vettore il caricamento di un vettore consiste nello specificare i valori da immettere nelle componenti del vettore, dopo averlo dichiarato ed allocato Esempi: int v[ ]; v=new int[]; // dichiara il vettore v // alloca vettore di componenti for (int i=; i < ; i++) // carica il vettore con valori da a.. v[i] = i; Per caricare i valori nel vettore si usa un ciclo for nel programma i v // Dichiarazione ed allocazione Un vettore può essere dichiarato e allocato in una sola istruzione con la sintassi: tipo ident[ ] = new tipo [lunghezza]; dove tipo è il tipo delle componenti; ident è il nome collettivo lunghezza indica il numero di componenti Esempi int v[ ]= new int []; //dichiara e alloca il vettore In generale, la lunghezza di un vettore non può essere modificata durante l esecuzione dell applicazione. i v //
Inizializzazione da programma Un vettore può essere inizializzato da programma mediante la sintassi seguente: tipo ident[ ] = {listavalori ; dove tipo è il tipo delle componenti; ident è il nome collettivo listavalori indica l elenco dei valori da immettere Esempio int V[ ]= {,,,,,,,,, ; i v // Lettura e stampa di vettori ATTIVITA : scrivere un programma che, dopo aver acquisito il numero n di elementi da registrare in un vettore, ne esegue la lettura da input e successivamente li stampa a video. Scrivere l algoritmo relativo. Ovviamente è necessario un ciclo for per il caricamento, ed un altro ciclo for per la stampa. Inizio Costante Intero MAXN; Intero v[maxn], // dichiara il vettore con dimensione opportuna i; // indice per la scansione del vettore Leggi (n); LeggiV (v, n); // funzione di lettura del vettore v[] StampaV (v, n); // funzione di stampa del vettore v[] Fine //
Lettura e stampa di vettori import java.io.*; import javax.swing.*; class VettoriEFunzioni { public static void main(string args[ ]) { int[] v = new int []; int n; try ATTIVITA : scrivere la codifica in Java dell algoritmo realizzato. {n = Integer.parseInt (JOptionPane.showInputDialog("Immetti n")); LeggiV (v, n); StampaV (v, n); /* fine try */ catch (Exception E) { System.out.println ("Attenzione: catturata eccezione "); /* fine catch */ /* fine main */ // Lettura e stampa di vettori ATTIVITA : scrivere la codifica in Java dell algoritmo realizzato. static void LeggiV (int v[], int n) throws Exception { int i; for (i = ;i < n;i++) v[i]=integer.parseint (JOptionPane.showInputDialog("Valore: ")); static void StampaV (int v[], int n) { int i; for (i = ;i < n;i++) JOptionPane.showMessageDialog (null,"v[" + v[i] + "] = " + v[i]); /* fine classe */ //
Vettori come parametri I vettori possono essere passati come parametri alle funzioni, rendendo quindi il codice più leggibile e più compatto. Quando si passa ad una funzione un vettore come parametro: nell istanza della funzione: il parametro attuale è il solo nome del vettore, senza le parentesi nel prototipo: il parametro formale è il tipo del vettore, il nome e le parentesi vuote. viene considerato automaticamente il passaggio per indirizzo (by reference) e pertanto occorre ricordare che la funzione opera sui valori originali del vettore // Proprietà length Negli array è possibile utilizzare la proprietà length che contiene il numero di elementi. Per utilizzare questa proprietà su un vettore di nome ident si usa la sintassi ident.length Per leggere e stampare un vettore vett[] si può scrivere quindi: for (int i = ; i < vett.length; i++) { System.out.print ("Valore: "); v[i] = Integer.parseInt (Tastiera.readLine ()); for (int i = ; i < v.length; i++) System.out.println ("v["+i+"]="+v[i]); //
Stringhe e vettori di caratteri Tra le stringhe e i vettori di caratteri esistono delle differenze: la stringa ha il carattere terminatore ( \ ) al contrario del vettore di caratteri. Il carattere \ consente di stabilire la lunghezza effettivamente occupata dai caratteri nel vettore; un altra differenza tra stringhe ed vettori di caratteri è che la stringa può essere trattata mediante istruzioni semplici. Ad es: String str; str=joptionpane.showinputdialog ("Immetti stringa: ")); System.out.println( La stringa e + str); // Dichiarazione di matrici Si può considerare anche un array pluridimensionale detto matrice, che può essere a due o più dimensioni. Una matrice a dimensioni si dichiara con: tipo ident [righe][colonne]; dove : tipo è il tipo delle componenti; ident è il nome della matrice righe indica il numero delle righe colonne indica il numero delle colonne Trattandosi di una matrice, le componenti sono individuate da due indici. //
Allocazione di matrici Esempi: int voti[ ] [ ]; //dichiara la matrice voti voti = new int[][]; //alloca la matrice voti con // righe e colonne int voti[ ] [ ] = new int[][]; // dichiara e alloca la matrice voti[ ][ ] L inizializzazione da programma di una matrice si effettua con una sintassi simile quella degli array monodimensionali Esempio int v[][]={{,,{,, {,; // Utilizzo di matrici Vediamo un esempio di utilizzo di matrici. ATTIVITA : scrivere un applicazione che legga da input gli elementi di una matrice m[][] di interi e successivamente calcoli e stampi la loro media aritmetica. Utilizzare le funzioni. Si dichiara e si alloca una matrice m[][] di interi e si istanzia la funzione lettura (m, r, c) che, attraverso un doppio ciclo for legge da input, uno ad uno, i valori da caricare in essa. Successivamente, alla variabile media si assegna il risultato della funzione somma (m, r, c) diviso e si stampa media. somma (m, r, c) calcola la somma degli elementi di m[][] sommando in un accumulatore somma (azzerato) i valori di m[][] mediante un doppio ciclo for. //
Utilizzo di matrici import java.io.*; class MediaConFunzioni { static InputStreamReader In = new InputStreamReader (System.in); static BufferedReader Tastiera = new BufferedReader (In); public static void main(string args[ ]) throws Exception { final int nr = ; final int nc = ; int m[][]=new int [nr][nc]; float media; LeggiM (m); media=somma(m)/; System.out.println("Media = "+ media); // Utilizzo di matrici static void LeggiM (int mat[][]) throws Exception { for (int i=; i<mat.length; i++) for (int j=; j<mat[i].length; j++) { System.out.print("Valore: "); mat[i][j] = Integer.parseInt (Tastiera.readLine()); static float somma (int mat[][]) { int s=; for (int i=; i<mat.length; i++) for (int j=; j<mat[i].length; j++) s+=mat[i][j]; return s; /* fine classe */ Anche per le matrici, quando sono utilizzate come parametri di funzioni, vale il passaggio per indirizzo. //
Un gioco con i dadi Applichiamo i concetti visti finora ad un gioco con i dadi, che si svolge come segue. Il giocatore lancia dadi e se ottiene: o al primo lancio, il giocatore vince, o il giocatore perde,,,, o questo sarà il suo punteggio P. In tal caso, lancia nuovamente i dadi fino a quando o esca di nuovo il punteggio P (nel qual caso il giocatore vince) oppure esca il valore (nel qual caso il giocatore perde). ATTIVITA : scrivere l algoritmo che realizza il gioco. // Un gioco con i dadi Algoritmo Dadi Inizio Inizializza il seme con l orologio P = lancio(); // punteggio del primo lancio Nel caso che (P) sia {,: vittoria;,,:sconfitta; Ripeti P = lancio(); Fintantochè P è diverso da P e P!= ; Se (P = =P) allora vittoria altrimenti sconfitta; Fine //
Argomenti Struttura di un array Vettore Dichiarazione vettore Allocazione vettore Caricamento vettore Dichiarazione ed allocazione Inizializzazione da programma Lettura e stampa di vettori Vettori come parametri Proprietà length Stringhe e vettori di caratteri Dichiarazione di matrici Allocazione di matrici Utilizzo di matrici Un gioco con i dadi // Altre fonti di informazione M. Bigatti, Il linguaggio Java - ed. HOEPLI P.Gallo, F. Salerno, JAVA la programmazione ad oggetti ed. Minerva Italica L. Cabibbo - Fondamenti di informatica-oggetti e Java - ed. McGraw Hill A.Lorenzi, A.Rizzi Il linguaggio Java ed. ATLAS //