8 - Stringhe (e altre classi dalla Libreria Standard di Java)

Похожие документы
18 - Classi parzialmente definite: Classi Astratte e Interfacce

18 - Vettori. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

6 - Blocchi e cicli. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

5 - Istruzioni condizionali

Esercizi per la prova in itinere (con soluzioni)

14 - Metodi e Costruttori

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

Uso di metodi statici. Walter Didimo

15 - Packages. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

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

14 - Packages. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Algebra di Boole: Concetti di base. E un algebra basata su tre operazioni logiche

22 - Strutture Dati (Java Collections Framework)

23 - Graphical User Interface GUI (Cenni)

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

10 - Programmare con gli Array

IL LINGUAGGIO JAVA Input, Tipi Elementari e Istruzione Condizionale

Programmazione in Java (I modulo)

21 - Alberi e Ricorsione

Funzioni, Stack e Visibilità delle Variabili in C

Programmazione Orientata agli Oggetti. Emilio Di Giacomo e Walter Didimo

Un esempio per iniziare. Il controllo del programma in C. Altri cenni su printf() Esercizi (printf) printf( 8!=%d, fatt);

Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro

Programmazione web lato client con JavaScript. Marco Camurri 1

Le basi del linguaggio Java

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

20 - Input/Output su File

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

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Programmazione I - Laboratorio

Indice. Prefazione. 3 Oggetti e Java 53

esercizi Esercizi / problemi

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

Prima lezione di laboratorio. I mattoni di base di un programma Java. Riassunto. Comandi Unix. Oggi. Blog & Group.

La velocità di una carovana

VBA è un linguaggio di scripting derivato da Visual Basic, da cui prende il nome. Come ogni linguaggio ha le sue regole.

Programma del corso. Elementi di Programmazione. Introduzione agli algoritmi. Rappresentazione delle Informazioni. Architettura del calcolatore

Modulo 2: Strutture fondamentali della programmazione Java

Caratteri e stringhe

Definizione di metodi in Java

Elementi di C++ di base

Programmazione modulare

Laboratorio di Programmazione: Linguaggio C Lezione 9 del 27 novembre 2013

Lezione 21 e 22. Valentina Ciriani ( ) Laboratorio di programmazione. Laboratorio di programmazione. Lezione 21 e 22

Algoritmi di Ricerca. Esempi di programmi Java

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

Array in Fortran 90. Ing. Luca De Santis. Anno accademico 2006/2007. DIS - Dipartimento di informatica e sistemistica

Programmazione I. 11 gennaio Considerate la seguente gerarchia di classi (rappresentata mediante un diagramma UML): +f(double x):

La gestione dell input/output da tastiera La gestione dell input/output da file La gestione delle eccezioni

TIPI PRIMITIVI: LIMITI

Realizzare un programma che legga da input tre numeri interi e stampi a video la loro somma e la media.

Excel & VBA. Excel e Visual Basic for Application

Input/output da file I/O ANSI e I/O UNIX FLUSSI E FILE FLUSSI FLUSSI di TESTO FLUSSI BINARI FILE

Esercizi di Algoritmi e Strutture Dati

Programmazione in Python. Moreno Marzolla

Stringhe e allocazione dinamica della memoria

Java Native Interface Appunti

La sintassi del C APPENDICE H

Corso di Fondamenti di Informatica Il sistema dei tipi in C++

Транскрипт:

8 - Stringhe (e altre classi dalla Libreria Standard di Java) Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ milazzo milazzo di.unipi.it Corso di Laurea Magistrale in Informatica Umanistica A.A. 2013/2014 Paolo Milazzo (Università di Pisa) Programmazione - Stringhe A.A. 2013/2014 1 / 26

Introduzione Abbiamo visto come creare classi che includono metodi diversi In particolare, metodi ausiliari che risolvono sottoproblemi Vedremo più avanti (nella seconda parte del corso) come realizzare programmi che consistono di più classi che si dividono il lavoro I metodi di una classe potranno invocare i metodi di un altra Per il momento vediamo come utilizare classi già fatte La Libreria Standard di Java (Application Programming Interface API) Una enorme collezione di classi già implementate! Un metodo di un altra classe si invoca così: <nomeclasse>.<nomemetodo>(<parametri>) Paolo Milazzo (Università di Pisa) Programmazione - Stringhe A.A. 2013/2014 2 / 26

Le classi degli altri pacchetti devono essere importate all inzio del programma: Paolo Milazzo (Università di Pisa) Programmazione - Stringhe A.A. 2013/2014 3 / 26 La Libreria Standard di Java (1) Le classi della Libreria Standard sono organizzate in pacchetti tematici Alcuni pacchetti: java.lang contiene le classi più comunemente utilizzate (considerate di base per il linguaggio) java.util contiene classi di utilità (strutture dati, insiemi, date, ore,...) java.io contiene classi per l input/output (tramite console, files,...) java.awt e java.swing contengono classi per costruire interfacce grafiche java.security contiene classi per crittografia e altri aspetti di sicurezza... Le classi del pacchetto java.util sono immediatamente disponibili al programmatore

La Libreria Standard di Java (2) La documentazione ufficiale della Libreria Standard di Java è disponibile qui: http://docs.oracle.com/javase/7/docs/api/ Trovate un link nella pagina web del corso USATE QUESTA DOCUMENTAZIONE!!! Contiene TUTTE le informazioni necessarie di TUTTE le classi E navigabile per singolo pacchetto, per singola classe e singolo metodo... Paolo Milazzo (Università di Pisa) Programmazione - Stringhe A.A. 2013/2014 4 / 26

La classe Math Esempio: la classe Math contiene numerosi metodi che eseguono calcoli matematici Alcuni tra i metodi più comuni della classe Math Math.abs(a) restituisce il valore assoluto del numero a Math.pow(a,b) restituisce l elevamento a potenza a b Math.sqrt(a) restituisce la radice quadrata di a Math.round(a) restituisce l arrotondamento di a all intero più vicino Math.floor(a) restituisce l arrotondamento di a per difetto Math.ceil(a) restituisce l arrotondamento di a per eccesso Math.sin(a) restituisce il seno di a Math.random() restituisce un numero frazionario casuale compreso tra 0.0 (compreso) e 1.0 (escluso). Esiste anche la classe Random che fa cose più sofisticate...)... Paolo Milazzo (Università di Pisa) Programmazione - Stringhe A.A. 2013/2014 5 / 26

Esempio di uso // genera un numero casuale tra 0.0 e 1.0 double numerocasuale = Math. random (); // lo trasforma in un numero tra 0.0 e 10.0 numerocasuale *= 10; // lo trasforma in un numero tra 1.0 e 10.0 senza decimali double interocasuale = Math. ceil ( numerocasuale ); // ne calcola il quadrato int quadrato = ( int ) Math. pow ( interocasuale,2); Paolo Milazzo (Università di Pisa) Programmazione - Stringhe A.A. 2013/2014 6 / 26

Oggetti Moltissime delle classi della Libreria Standard si usano per creare oggetti Questa è la caratteristica principale di Java (e di tutti gli altri linguaggi di programmazione orientati agli oggetti) Un oggetto è una istanza di una classe: un oggetto può possedere un proprio stato interno la classe specifica i metodi che possono essere invocati sull oggetto (metodi d istanza, specificano il comportamento dell oggetto) La relazione tra classi e oggetti è la seguente: Una classe definisce un tipo (non primitivo) i cui valori sono oggetti Paolo Milazzo (Università di Pisa) Programmazione - Stringhe A.A. 2013/2014 7 / 26

La classe String (1) Esempio: la classe String contiene metodi per l elaborazione di stringhe Creare oggetti di tipo String String nome = new String (" Mario "); String cognome = new String (" Rossi "); Le variabili nome e cognome sono due oggetti di tipo String sono due istanze della classe String hanno stati interni diversi ("Mario" e "Rossi"); Per creare un oggetto si usa la parola chiave new new è seguito dalla chiamata a un costruttore della classe: uno speciale metodo che ha lo stesso nome della classe e inizializza il nuovo oggetto Paolo Milazzo (Università di Pisa) Programmazione - Stringhe A.A. 2013/2014 8 / 26

La classe String (2) La classe String in realtà è speciale. I suoi oggetti possono essere creati anche così: String nome = " Mario "; // equivalente a new String (" Mario "); String cognome = " Rossi "; // equivalente a new String (" Rossi "); Attenzione: per inserire alcuni caratteri bisogna usare apposite sequenze di escape // le virgolette si inseriscono come \" String s1 = " Marco ha detto : \" Buongiorno!\" " // corrisponde a: Marco ha detto : " Buongiorno!" // il carattere backslash si inserisce come \\ String s2 = " Il file in C :\\ Programmi \\ Java "; // corrisponde a: Il file in C:\ Programmi \ Java Le variabili di tipo String possono essere usate come tutte le altre variabili. Ad esempio: String primonome = nome ; // in assegamenti System. out. println ( cognome ); // stampate metodoausiliario ( nome, cognome ); // nelle chiamate a metodi ausiliari Paolo Milazzo (Università di Pisa) Programmazione - Stringhe A.A. 2013/2014 9 / 26

La classe String (3) La classe String mette a disposizione numerosi metodi per elaborare i propri oggetti La chiamata di un metodo su un oggetto ha la seguente sintassi: <nomeoggetto>.<nomemetodo>(<parametri>) Paolo Milazzo (Università di Pisa) Programmazione - Stringhe A.A. 2013/2014 10 / 26

La classe String (4) Supponendo che str sia un oggetto di tipo String, ecco alcuni tra i metodi più comuni che si possono chiamare su esso: str.length() resitiuisce la lunghezza della stringa (numero di caratteri) str.isempty() restituisce true se la stringa è vuota (0 caratteri) o false altrimenti str.substring(i,j) restituisce la porzione di str che va dal carattere in posizione i al carattere in posizione j (escluso). str.substring(i) restituisce la porzione di str che va dal carattere in posizione i alla fine della stringa. ATTENZIONE A substring si inizia a contare da 0, quindi: String saluto = " Hello, World!"; System. out. println ( saluto. substring (7,12)); // stampa World i e j devono essere minori di String.length() Paolo Milazzo (Università di Pisa) Programmazione - Stringhe A.A. 2013/2014 11 / 26

La classe String (5) Un esempio: stampa un parola tre caratteri per volta public class ParolaSpezzettata { public static void main ( String [] args ) { // parola da spezzettare String parola = " Supercalifragilistichespiralidoso!!"; // scandisce la stringa 3 caratteri per volta for ( int i =0; i< parola. length (); i +=3) { /* assicura che la porzione considerata ( da i a i +3) non superi la fine della stringa */ if (i+3 < parola. length ()) System. out. println ( parola. substring (i,i +3)); else System. out. println ( parola. substring (i, parola. length ())); Paolo Milazzo (Università di Pisa) Programmazione - Stringhe A.A. 2013/2014 12 / 26

Il tipo primitivo char Quando si elaborano stringhe spesso si deve lavorare con i singoli caratteri. Tra i tipi primitivi di Java, il tipo char descrive valori che sono singoli caratteri Codifica Unicode: rivedere la lezione sui tipi primitivi... I letterali di tipo carattere si descrivono tra singoli apici a, b, c, 1, 2, [, ], _,,... caratteri speciali: \n (a capo) e altri poco usati... Un esempio di assegnamento: char carattere = a ; I valori di tipo char sono in realtà codificati come interi (Unicode), quindi si possono applicare operatori aritmetici: carattere ++; // " incrementa " di 1 il carattere System. out. println ( carattere ); // stampa b Paolo Milazzo (Università di Pisa) Programmazione - Stringhe A.A. 2013/2014 13 / 26

Switch su char Il tipo char può essere usato anche nell ambito di uno switch char scelta = d ; switch ( scelta ) { case a : System. out. println (" Hai scelto a"); break ; case b : System. out. println (" Hai scelto b"); break ; case c : System. out. println (" Hai scelto c"); break ; case d : System. out. println (" Hai scelto d"); break ; case e : System. out. println (" Hai scelto e"); break ; default : System. out. println (" Lettera sbagliata "); Paolo Milazzo (Università di Pisa) Programmazione - Stringhe A.A. 2013/2014 14 / 26

Altri metodi di String (1) Altri metodi utili per gli oggetti di tipo String str.charat(i) restituisce il carattere della stringa in posizione i. Analogo a str.substring(i,i+1), ma il risultato è di tipo char anziché String str.indexof(c) restituisce la posizione della prima occorrenza del carattere c nella stringa str oppure -1 se non presente str.indexof(c,i) restituisce la posizione della prima occorrenza successiva a i del carattere c nella stringa str oppure -1 se non presente Paolo Milazzo (Università di Pisa) Programmazione - Stringhe A.A. 2013/2014 15 / 26

Altri metodi di String (2) Esempio: stampa un carattere ogni tre public class UnoOgniTre { public static void main ( String [] args ) { // parola da stampare String parola = " Supercalifragilistichespiralidoso!!"; // scandisce la stringa 3 caratteri per volta for ( int i =0; i< parola. length (); i +=3) { System. out. println ( parola. charat (i )); Esempio: in che posizione è la h? String parola = " Supercalifragilistichespiralidoso!!"; System. out. println ( parola. indexof ( h )); // stampa 20 Paolo Milazzo (Università di Pisa) Programmazione - Stringhe A.A. 2013/2014 16 / 26

Esempio d uso Conta i caratteri di spazio in un testo import java. util. Scanner ; public class ContaSpazi { public static void main ( String [] args ) { Scanner input = new Scanner ( System. in ); System. out. println (" Inserisci una riga di testo "); String s = input. nextline (); int cont =0; // contatore degli spazi int i =0; // indice usato per scandire il testo while (i!= -1) { // cerca il prossimo spazio a partire dalla posizione i+1 i = s. indexof (,i +1); if (i!= -1) cont ++; System. out. println ( cont ); Paolo Milazzo (Università di Pisa) Programmazione - Stringhe A.A. 2013/2014 17 / 26

Concatenazione di stringhe (1) La concatenazione di due stringhe "Mario" e "Rossi" è semplicemente la stringa "MarioRossi" L operatore di concatenzaione in Java si scrive semplicemente + String nome = " Paolo "; String cognome = " Milazzo "; System. out. println ( nome + cognome ); // stampa PaoloMilazzo System. out. println ( nome +" " + cognome ); // stampa Paolo Milazzo L operatore + in Java è sovraccaricato di significati (overloaded): può essere applicato sia a numeri che a stringhe Che cosa succede se mischiamo numeri e stringhe in una espressione? System. out. println (" Rai " + 3); // stampa Rai3 System. out. println (3 + 4 + 5); // stampa 12 System. out. println ("" + 3 + 4 + 5); // stampa 345 System. out. println (4 + 5 + " pippo "); // stampa 9 pippo Paolo Milazzo (Università di Pisa) Programmazione - Stringhe A.A. 2013/2014 18 / 26

Concatenazione di stringhe (2) La concatenazione è molto utile per ridurre il numero degli enunciati System.out.print(...) Per esempio possiamo combinare : // stampa Il risultato e : System. out. print ("Il risultato e : "); // stampa il valore di ris sulla stessa riga e va a capo System. out. println ( ris ); nella singola invocazione: System. out. println ("Il risultato e : " + ris ); Paolo Milazzo (Università di Pisa) Programmazione - Stringhe A.A. 2013/2014 19 / 26

Convertire numeri in stringhe e viceversa Per convertire un numero intero i (o double d) in una stringa: Integer.toString(i) (oppure Double.toString(d)) i+"" (oppure d+"") (concatenazione con stringa vuota) Per convertire una stringa s che rappresenta un numero in un int (o double) Esempi: Integer.parseInt(s) (oppure Double.parseDouble()) int anno = 2013; String annotesto = anno ; // ERRORE : tipi incompatibili String annotesto = "" + anno ; // OK double pi = " 3.1415926 "; // ERRORE : tipi incompatibili double pi = Double. parsedouble (" 3.1415926 "); // OK int miliardo = Integer. parseint (" 1000000000 "); // OK Nota: anche Integer e Double sono classi della Libreria Standard di Java Paolo Milazzo (Università di Pisa) Programmazione - Stringhe A.A. 2013/2014 20 / 26

Input di stringhe (1) Per chiedere all utente di inserire una stringa si possono usare due metodi di Scanner (oggetto input) input.next() legge una singola parola input.nextline() legge un intera riga (tutti i caratteri fino al ritorno a capo) String s1, s2, s3; System. out. println (" Inserisci due righe di testo "); s1 = input. nextline (); s1 = input. next (); s2 = input. nextline (); System. out. println ("s1 --" + s1 ); System. out. println ("s2 --" + s2 ); System. out. println ("s3 --" + s3 ); Esecuzione: Inserisci due righe di testo ecco la prima riga ecco la seconda riga s1 -- ecco la prima riga s2 -- ecco s3 -- la seconda riga Paolo Milazzo (Università di Pisa) Programmazione - Stringhe A.A. 2013/2014 21 / 26

Input di stringhe (2) Il metodo next() viene solitamente usato anche per leggere singoli caratteri, come segue: System. out. println (" Vuoi continuare? [S/N]"); // legge il primo carattere della prossima parola char scelta = input. next (). charat (0); switch ( scelta ) { case S : System. out. println (" continua "); break ; case N : System. out. println (" basta "); break ; default : System. out. println (" ERRORE "); Esempio di esecuzione Vuoi continuare? [ S/ N] N basta ma in realtà succede anche quanto segue Vuoi continuare? [ S/ N] NOOOO!!!! basta Paolo Milazzo (Università di Pisa) Programmazione - Stringhe A.A. 2013/2014 22 / 26

Input di stringhe (3) Il metodo nextline() ha un problema noto Consideriamo la seguente porzione di programma: int n = input. nextint (); String s1 = input. nextline (); String s2 = input. nextline (); CASO 1. Supponiamo che l utente voglia inserire il seguente input: 44 gatti in fila per 3 Abbiamo n diventa 44 s1 diventa " gatti in" s2 diventa "fila per 3" Paolo Milazzo (Università di Pisa) Programmazione - Stringhe A.A. 2013/2014 23 / 26

Input di stringhe (4) Consideriamo sempre la stessa porzione di programma: int n = input. nextint (); String s1 = input. nextline (); String s2 = input. nextline (); CASO 2. Supponiamo che l utente voglia inserire il seguente input: 44 gatti in fila per 3 Abbiamo n diventa 44 s1 diventa "" s2 diventa "gatti in" Il metodo nextline() ha letto la stringa vuota tra 44 e il ritorno a capo della prima riga Non c e una soluzione generale a questo problema... bisogna tenerne conto quando si usano questi metodi... Paolo Milazzo (Università di Pisa) Programmazione - Stringhe A.A. 2013/2014 24 / 26

Confronto tra stringhe (1) Per dire se due stringhe sono uguali non si può usare == questo vale in generale per tutti gli oggetti == confronterebbe l indirizzo di memoria dei due oggetti... La classe String fornisce metodi per confrontare stringhe s1.equals(s2) restituisce true se s1 e s2 sono uguali (stessa sequenza di caratteri), e false altrimenti s1.compareto(s2) restituisce un valore minore di 0 se s1 precede s2 lessicograficamente un valore maggiore di 0 se s2 precede s1 lessicograficamente il valore 0 se s1 e s2 sono uguali L ordine lessicografico è simile all ordine alfabetico, con la differenza che nessun simbolo è ignorato (spazi, accenti, apostrofi, ecc...) Paolo Milazzo (Università di Pisa) Programmazione - Stringhe A.A. 2013/2014 25 / 26

Confronto tra stringhe (2) Esempio (NOTA: Questo è un ottimo esempio su come si fanno i cicli!!!): import java. util. Scanner ; public class IndovinaParola { public static void main ( String [] args ) { Scanner input = new Scanner ( System. in ); String parolamisteriosa = " ciao "; int tentativi =0; // contatore dei tentativi boolean indovinato = false ; // " flag " che dice quando terminare do { String s = input. next (); if ( s. equals ( parolamisteriosa )) { System. out. println (" INDOVINATO!!! "); indovinato = true ; // interrompe il ciclo else { System. out. println (" Sbagliato... "); tentativi ++; if ( parolamisteriosa. compareto ( s) <0) System. out. println (" La parola misteriosa precede " + s); else System. out. println (" La parola misteriosa segue " + s); while (! indovinato && tentativi <10); // due condizioni di uscita // verifica il motivo dell uscita dal ciclo if (! indovinato ) System. out. println (" Tentativi esauriti ");