Lezione 7 Stringhe e array: un primo approccio agli oggetti



Documenti analoghi
Stringhe e Array. Prof. Francesco Accarino IIS Altiero Spinelli Via Leopardi 132 Sesto San Giovanni

4 GLI ARRAY E LE STRINGHE

Programmazione a Oggetti e JAVA. Prof. B.Buttarazzi A.A. 2012/2013

Impariamo a programmare in. Lezione 7

Capitolo 5. Array e collezioni. c 2005 Pearson Education Italia Capitolo 5-1 / 61

Stringhe. Walter Didimo

STRINGHE IN JAVA In Java, le stringhe non sono pezzi di memo-ria con dentro dei caratteri, come in C: sono oggetti appartenenti alla classe

Programmazione ad oggetti

Corso di Laurea Ingegneria Civile Fondamenti di Informatica. Dispensa 16 Tipi riferimento e stringhe. Carla Limongelli.

I tipi strutturati e i record in C++

Fondamenti di Informatica T-1

Tipi di dato strutturati: Array

Tipi derivati. Strutture Matrici typedef enum

Fondamenti di Informatica T-1

Programmazione I - corso B a.a prof. Viviana Bono

Strutture dati e loro organizzazione. Gabriella Trucco

Lezione 12: Allocazione Dinamica della Memoria

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014

A. Ferrari. informatica. Java basi del linguaggio. Alberto Ferrari Informatica

Fondamenti di Informatica

Programmazione in Java (I modulo) Lezione 4

Array. In Java un array è un oggetto senza metodi, con attributo pubblico length che memorizza la dimensione dell array

Il linguaggio C funzioni e puntatori

STRINGHE IN JAVA. se occorre un contenitore esiste StringBuffer

Introduzione alla programmazione. Alice Pavarani

Elementi di Informatica A. A. 2016/2017

Programmazione Orientata agli Oggetti in Linguaggio Java

STRINGHE IN JAVA In Java, le stringhe non sono pezzi di memo-ria con dentro dei caratteri, come in C: sono oggetti appartenenti alla classe

Programmazione Orientata agli Oggetti in Linguaggio Java

Fondamenti di Informatica T-1

Informatica 7. appunti dalle lezioni del 20 e 22/10/2010

Gli Array. Dichiarazione di un array

Linguaggio C: Array Valeria Cardellini

Puntatori. Fondamenti di Programmazione

Programmazione Orientata agli Oggetti. Emilio Di Giacomo e Walter Didimo

1 Tipi numerici Tipi interi Virgola mobile Conversioni e promozioni Tipi ed espressioni... 5

Tipi primitivi ed array

Il linguaggio C. Puntatori e dintorni

Array. Walter Didimo

Fondamenti Teorici e Programmazione

Fondamenti di Informatica T-1

Costanti e Variabili

Array di array. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 03. A. Miola Febbraio 2008

Fondamenti di Informatica T-1

Java Le stringhe. Stringhe

Programmazione C: Esercizi su vettori e funzioni. Titolo presentazione. sottotitolo. Milano, XX mese 20XX

Gli oggetti. Ogni oggetto ha un interfaccia e ogni oggetto ha un tipo. Incapsulamento. Oggetti. Contatore. Invio di Messaggi

Corso di Fondamenti di Informatica

Array. Definizione e utilizzo di vettori

Le stringhe. Un vettore di caratteri non è necessariamente una stringa perché non sempre termina con \0.

Java Le stringhe. Stringhe

Corso di PHP. Prerequisiti. 4.1 Array sequenziali. Variabili semplici Operazioni su variabili Strutture di controllo

OCA JAVA 7 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO

Lezione 4 Casting, stringhe e caratteri, operatori relazionali, espressioni e variabili booleane

Programmazione. Cognome... Nome... Matricola... Compitino del 24 novembre 2011

ALGORITMI E STRUTTURE DATI

Le classi in java. Un semplice programma java, formato da una sola classe, assume la seguente struttura:

Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre Negli esercizi proposti si utilizzano le seguenti classi:

definisce un vettore di 4 puntatori a carattere (allocata memoria per 4 puntatori)!

Corso sul linguaggio Java

Parte 3. Puntatori. [S. Dalí The temptation of St. Anthony, 1946] - AA. 2015/16 3.1

Esonero di Informatica I. Ingegneria Medica

Le basi del linguaggio Java

Puntatori e array. Tipo puntatore Vettori

C: panoramica. Violetta Lonati

Capitolo 16 Iterazione

Introduzione al linguaggio C

I Fondamenti del Linguaggio

Concetti base programmazione. Antonio Gallo

Tipi di dati strutturati e Linguaggio C. Record o strutture Il costruttore struct in C

Questi lucidi provengono dal capitolo 2 di:

Autore: Prof. Agostino Sorbara ITIS "M. M. Milano" Polistena (RC)

4 - Tipi di dato primitivi

Esercitazione Fondamenti di informatica 2

Corso di Fondamenti di Informatica

Java: introduzione. /** * CiaoMondoApp.java * La solita classe banale. import java.lang.*; // predefinita. class CiaoMondoApp

Implementazione delle classi

Fondamenti di Informatica T-1

Java: introduzione. «Struttura fondamentale

Laboratorio di Matematica e Informatica 1

Array di array. Walter Didimo

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - Programma

Programmazione Java Struttura di una classe, Costruttore, Riferimento this

Fondamenti di Informatica T-1. Selezione Stringhe

C: primi elementi. Lezione 4

Allocazione dinamica della memoria

Laboratorio di Algoritmi e Strutture Dati. Esercizi

Linguaggio Java. Robusto. Orientato agli oggetti. Protegge e gestisce dagli errori. Non permette costrutti pericolosi

Programmazione Orientata agli Oggetti in Linguaggio Java

Creazione di oggetti e Stringhe

Transcript:

Lezione 7 Stringhe e array: un primo approccio agli oggetti Java distingue due grandi categorie di dati: i tipi predefiniti, oramai completamente descritti, e gli oggetti, che da questo punto in avanti sono il principale argomento di studio del corso. I primi, inglobati direttamente nel cuore del linguaggio, coprono le esigenze di calcolo più elementari e costituiscono le fondamenta di ogni programma. Senza di essi, non sarebbe possibile progettare ed utilizzare delle strutture più complesse. Gli oggetti, al contrario, possono essere intesi come dei tipi personalizzati, che estendono le possibilità già integrate nel linguaggio. Ogni sviluppatore può e deve definire gli schemi di funzionamento di nuovi oggetti. Questi schemi sono le classi. Ad ogni modo, non è necessario reinventare ogni volta la ruota. Si supponga che per lo sviluppo di un certo programma sia stato necessario definire un nuovo tipo di dati. Lo stesso, all'occorrenza, può essere impiegato in altri progetti, semplicemente riutilizzando la classe Java o il bytecode (il file.class già compilato) che lo definiscono. La piattaforma Java 2 arriva allo sviluppatore con una nutrita schiera di oggetti pronti all'uso, ordinatamente riposti in spazi gerarchici chiamati pacchetti. In questo modo, il programmatore non deve sviluppare in proprio una classe dedicata, ad esempio, alla rappresentazione di date ed orari, giacché all'interno della piattaforma ne trova una già pronta e sperimentata. Le stringhe e gli array sono due particolari modelli di dati. Non sono tipi predefiniti, sono degli oggetti, eppure possono avvantaggiarsi di caratteristiche di cui tutti gli altri oggetti non possono disporre. Per certi versi, le stringhe e gli array sono oggetti profondamente integrati nel linguaggio stesso. 7.1 - Stringhe Un basilare approccio alle stringhe è già stato svolto nel corso delle lezioni precedenti. Creare un oggetto di tipo String (questo modo di dire, d'ora in avanti, sarà sempre più ricorrente) è semplice: String miastringa = "Ciao"; Anche gli operatori di concatenazione sono stati completamente descritti (cfr. Lezione 5). Ciò che delle stringhe ancora non è noto, riguarda le caratteristiche che più le avvicinano alla programmazione orientata agli oggetti. Ogni oggetto, in Java, dispone di proprietà e metodi. Le proprietà forniscono informazioni sullo stato corrente dell'oggetto, mentre i metodi sono funzioni che permettono all'oggetto di svolgere un'azione. A livello teorico, questa breve ed inefficiente definizione sarà dettagliatamente esaminata ed approfondita nel corso della prossima lezione. Per il momento, è più interessante capire come, nella pratica, i metodi e le proprietà di un oggetto possano essere sfruttate a vantaggio dei propri software. Ogni oggetto di tipo String dispone di una nutrita schiera di metodi. Qualche linea di codice, in casi come questo, vale più di mille altre precisazioni: // Creo un oggetto di tipo String String miastringa = "Ciao"; // Richiamo il metodo charat() per sapere // quale carattere apra la stringa. In Java, // il primo carattere di una stringa ha indice 0, Carlo Pelliccia // Lezioni di Java // Lezione 7 // Pagina 1 di 6

// il secondo ha indice 1, il terzo ha indice 2 // e così via. char primo = miastringa.charat(0); System.out.println(primo); // Stampa "C" // Voglio recuperare una sottostringa formata // dai primi tre caratteri della stringa contenuta // nell'oggetto miastringa String sottostringa = miastringa.substring(0, 3); System.out.println(sottoStringa); // Stampa "Cia" // Voglio sapere l'indice associato al carattere 'i' // presente in miastringa int indice = miastringa.indexof('i'); System.out.println(indice); // Stampa "1" Questo esempio ha dimostrato l'uso di tre metodi di cui ogni oggetto di tipo String è dotato: charat(), indexof() e substring(). Quando si effettua una chiamata del tipo miastringa.indexof('i') si osserva il generico modello, basato sulla notazione puntata, mostrato di seguito: riferimento.nomemetodo(argomenti) Il riferimento, come si vedrà bene in seguito, è la variabile che lavora da ancora verso l'oggetto. La terminologia ufficiale chiama oggetto di invocazione l'oggetto sul quale è stato attivato un metodo. Non è detto che un metodo debba necessariamente richiedere degli argomenti. In casi come questo, è necessario includere ugualmente la coppia di parentesi tonde che seguono il nome del metodo, alla seguente maniera: riferimento.nomemetodosenzaargomenti() Alcuni metodi svolgono esclusivamente delle operazioni all'interno dell'oggetto di invocazione, altri restituiscono un risultato al codice chiamante. Il risultato restituito dai metodi dotati di tale possibilità è detto valore di ritorno. Come è lecito attendersi, ciascun valore di ritorno è di uno specifico tipo che è interessante conoscere. In tal modo, i valori di ritorno possono essere letti, memorizzati ed utilizzati come più conviene. Ad esempio, come si è visto nel codice presentato poco sopra, il metodo indexof() restituisce un valore di tipo int, charat() restituisce un char e substring() un nuovo oggetto String. L'elenco dei metodi di cui sono dotate le stringhe è davvero folto e ben nutrito. La seguente tabella fornisce una panoramica dei metodi di uso più comune: Tipo restituito Metodo e parametri Descrizione int charat(int i) Restituisce il carattere alla posizione i. boolean endswith(string s) Restituisce true se l'oggetto di invocazione termina con la sottostringa s. boolean equals(string s) Restituisce true quando l'oggetto di invocazione e s rappresentano la medesima sequenza di caratteri. Carlo Pelliccia // Lezioni di Java // Lezione 7 // Pagina 2 di 6

Tipo restituito Metodo e parametri Descrizione int indexof(char c) Restituisce la prima posizione del carattere c, oppure -1 nel caso tale carattere non faccia parte della stringa. int indexof(char c, int i) Come il precedente, con la differenza che la ricerca del carattere c prende piede dalla posizione i. int indexof(string s) Restituisce la prima posizione della sottostringa s, oppure -1 nel caso tale sottostringa non compaia nell'oggetto di invocazione. int indexof(string s, int i) Come il precedente, con la differenza che la ricerca della sottostringa s prende piede dalla posizione i. int length() Restituisce la lunghezza della stringa. String replace(char c1, char c2) Restituisce una nuova stringa, ottenuta dall'oggetto di invocazione sostituendo il carattere c2 ad ogni occorrenza del carattere c1. boolean startswith(string s) Restituisce true se l'oggetto di invocazione inizia con la sottostringa s. String tolowercase() Restituisce una nuova stringa, ottenuta traslando verso il minuscolo ogni carattere dell'oggetto di invocazione. String touppercase() Restituisce una nuova stringa, ottenuta traslando verso il maiuscolo ogni carattere dell'oggetto di invocazione. String trim() Restituisce una nuova stringa, ottenuta dall'oggetto di invocazione eliminando gli spazi che precedono il primo carattere significativo e quelli che seguono l'ultimo. In pratica, " ciao ".trim() restituisce "ciao". Tabella 7.1 I più importanti metodi di cui sono dotati gli oggetti di tipo String. Come è possibile osservare dalla tabella, gli oggetti di Java ammettono più metodi con il medesimo nome, purché differiscano per quel che riguarda gli argomenti processati. 7.2 - Array Un array è un gruppo di variabili del medesimo tipo, cui ci si riferisce con un nome comune ed un indice numerico. A differenza di C e C++, dove gli array sono spazi di memoria allocati in aree adiacenti, gli array di Java sono in tutto e per tutto degli oggetti. Un array monodimensionale può essere creato osservando il seguente modello: nometipo[] nomearray = new nometipo[dimensione]; Carlo Pelliccia // Lezioni di Java // Lezione 7 // Pagina 3 di 6

"tipo[] nomearray" o "tipo nomearray[]"? Java supporta due differenti sintassi per la dichiarazione di un array. La prima, esaminata nel Paragrafo 7.2, è quella logicamente più corretta, così strutturata: tipo[] nomearray Ad esempio: int[] mioarray La seconda forma, del tutto equivalente alla prima nel risultato prodotto, pone la coppia di parentesi quadre a fianco del nome dell'array, anziché del suo tipo: tipo nomearray[] Ad esempio: int mioarray[] La forma logicamente più corretta, come si è anticipato, è la prima, giacché in Java gli array sono oggetti, e dunque la loro natura è più strettamente legata al tipo che non al nome. Diversamente avviene in C, dove la seconda forma è quella corretta, giacché gli array di C sono aree di memoria affiancate, e non oggetti. Java supporta ambo le notazioni per facilitare la stesura del codice a chi già è abituato alle forme di C/C++. Ad esempio: String[] giornidellasettimana = new String[7]; Questo codice genera un array monodimensionale, costituito da sette elementi di tipo String. La dimensione di un array può essere determinata staticamente, mediante una costante di qualsiasi tipo, oppure dinamicamente, servendosi di un valore intero noto solo al momento dell'esecuzione: // Dimensionamento statico int[] arr1 = new int[2]; // Dimensionamento dinamico // Si supponga che n sia una variabile di tipo numerico intero int[] arr2 = new int[n]; Una volta dichiarato ed inizializzato un array, è possibile accedere ai diversi elementi che ne fanno parte servendosi del particolare operatore [ ]: String[] giornidellasettimana = new String[7]; giornidellasettimana[0] = "Lunedì"; giornidellasettimana[1] = "Martedì"; giornidellasettimana[2] = "Mercoledì"; giornidellasettimana[3] = "Giovedì"; giornidellasettimana[4] = "Venerdì"; giornidellasettimana[5] = "Sabato"; giornidellasettimana[6] = "Domenica"; for (int i = 0; i < 7; i++) System.out.println(giorniDellaSettimana[i]); Il primo elemento di un array di dimensione n ha indice 0, mentre l'ultimo ha indice n - 1. Gli array possono avvantaggiarsi di una forma breve, per l'inizializzazione in linea degli elementi che lo costituiscono: String[] giornidellasettimana = { "Lunedì", "Martedì", "Mercoledì", "Giovedì", "Venerdì", "Sabato", "Domenica" }; Questa forma è spesso usata quando si è alle prese con un array di ridotte dimensioni. Gli array di Java dispongono di una particolare proprietà, ossia l'intero length, che riporta la dimensione dell'array: String[] giornidellasettimana = new String[7]; System.out.println(giorniDellaSettimana.length); // Stampa "7" Carlo Pelliccia // Lezioni di Java // Lezione 7 // Pagina 4 di 6

Un ciclo for ideato allo scopo di scorrere gli elementi di un array, pertanto, può essere facilmente scritto al seguente modo: for (int i = 0; i < nomearray.length; i++) { // Operazioni su nomearray[i] } In lingua italiana, gli array monodimensionali vengono chiamati vettori. Java, ad ogni modo, supporta anche il concetto di array multidimensionale o matrice: int[][] matrice = new int[2][3]; matrice[0][0] = 2; matrice[0][1] = 4; matrice[0][2] = 7; matrice[1][0] = 0; matrice[1][1] = 5; matrice[1][2] = 3; Questo codice genera una matrice di dimensione 2 3, costituita da sei elementi. La Figura 7.1 fornisce una rappresentazione grafica della struttura. Figura 7.1 Rappresentazione grafica di una matrice di 2 righe e 3 colonne. Una matrice è rempre resa mediante un array di array. Nel codice sopra mostrato, ad esempio, la matrice è in realtà un vettore di dimensione 2, i cui elementi sono vettori di dimensione 3. Questo comporta che la proprietà matrice.length indica di quante righe è composta la matrice, mentre matrice[0].length riporta il numero di colonne presenti lungo la prima riga. Il seguente codice riproduce sulla linea dei comandi l'ultima figura mostrata: for (int i = 0; i < matrice.length; i++) { for (int j = 0; j < matrice[i].length; j++) { System.out.print(matrice[i][j] + " "); } System.out.println(); } Carlo Pelliccia // Lezioni di Java // Lezione 7 // Pagina 5 di 6

Creare matrici a tre o più dimensioni è altrettanto semplice: char[][][] tredimensioni = new char[4][2][4]; String[][][][] quattrodimensioni = new String[2][3][2][4]; Ogni ragionamento svolto in merito alle matrici bidimensionali può essere facilmente esteso e adattato ai nuovi casi introdotti. Inizializzazione automatica degli elementi di un array Quando si inizializza un array, si inizializzano automaticamente anche tutti i suoi elementi. Ad esempio, scrivendo int[] arr = new int[5]; si ottengono cinque interi impostati sul valore 0. Semplificando, è come se fosse stato scritto: int[] arr = {0, 0, 0, 0, 0}; Lo stesso avviene con i tipi numerici byte, char, short, long, float e double. I tipi boolean vengono automaticamente posizionati su false. I riferimenti agli oggetti, invece, vengono inizializzati con lo speciale valore null. E' possibile verificare l'osservazione eseguendo il codice: String[] s = new String[5]; for (int i = 0; i < s.length; i++) System.out.println(s[i]); Il significato, gli scopi e le conseguenze dei valori null saranno esaminati nella prossima lezione. ArrayIndexOutOfBoundsException Il seguente codice, benché contenga un errore, viene normalmente compilato: int[] i = new int[5]; System.out.println(i[5]); Gli indici degli array, lo si ricorda, possono spaziare da 0 a n - 1, dove con n si intende la dimensione del vettore. Dunque, i[5] non è un elemento valido, giacché l'ultimo elemento del vettore dichiarato è i[4]. Il codice, comunque sia, è sintatticamente corretto, e per questo può essere compilato senza proteste. Il problema verrà a galla a tempo di esecuzione, quando si riceverà il messaggio di errore: java.lang.arrayindexoutofboundsexception Carlo Pelliccia // Lezioni di Java // Lezione 7 // Pagina 6 di 6