Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola Roadmap • 0. Primi passi con Java • 1. Buone abitudini • 2. Tipi di dati primitivi • 3. Uso di classi • 4. Leggere e scrivere Fondamenti di Programmazione Interazione con l’utente • I programmi visti finora non ricevono nessun input dall’utente e producono output in modo molto semplice e “grezzo” (double con un sacco di decimali) • Ricevere input dall’utente e presentare risultati in formato facilmente leggibile è necessario per qualunque programma non banale che debba essere usato “davvero” Fondamenti di Programmazione Leggere e scrivere 1 Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola Roadmap • 4. Leggere e scrivere ¾ Ricevere dati in ingresso Fondamenti di Programmazione Input da tastiera con Scanner (da Java 5 in poi) • La tastiera è rappresentata da un oggetto standard denominato System.in • Il modo più comodo per effettuare letture da tastiera è utilizzare la classe Scanner disponibile nel package java.util • Bisogna costruire un’istanza di Scanner passando System.in come argomento al costruttore Scanner lettore = new Scanner(System.in); Fondamenti di Programmazione Leggere e scrivere 2 Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola Input da tastiera con Scanner • La classe Scanner mette a disposizione metodi che danno luogo alla lettura da tastiera di valori di un certo tipo • nextInt() nextInt() restituisce un int corrispondente a quanto inserito da tastiera • nextDouble() nextDouble() è analogo • next() next() restituisce un oggetto String contenente la prossima parola singola inserita cioè tutti i caratteri inseriti fino ad un separatore (spazio, tab o Enter) Enter) • nextLine() nextLine() restituisce un oggetto String contenente tutti i caratteri inseriti fino alla pressione del tasto Enter Fondamenti di Programmazione Un maggiordomo personale • Gli ossequi generici non ci bastano più, vogliamo essere salutati personalmente • Dovremo inserire il nostro nome da tastiera, poi passarlo al metodo saluta che dovrà stamparlo in coda al saluto Fondamenti di Programmazione Leggere e scrivere 3 Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola Un maggiordomo personale public class Ossequioso { private String mioSaluto; mioSaluto; public Ossequioso (String (String cosaDevoDire) cosaDevoDire) { mioSaluto = cosaDevoDire; cosaDevoDire; } Aggiunto un argomento Un "purista" definirebbe al metodo saluta due costanti public void saluta (String (String nome) { System.out.println (mioSaluto + " " + nome + "!" ); System.out.println( } } Fondamenti di Programmazione Lo spazio va aggiunto per evitare parole "incollate" Un maggiordomo personale import java.util .*; java.util.*; public class BuongiornoMain { private final static String SALUTO_ITA = "Buongiorno"; public static void main (String args[]) args[]) { Ossequioso maggiordomo; Scanner lettore = new Scanner(System.in); maggiordomo = new Ossequioso(SALUTO_ITA); System.out.print ("Inserire il nome da ossequiare:"); System.out.print("Inserire String nome = lettore.nextLine (); lettore.nextLine(); maggiordomo.saluta(nome); } } Fondamenti di Programmazione Leggere e scrivere 4 Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola Definire le proprie valute import java.util .*; java.util.*; public class ValutaInput { public static void main (String args []) { Scanner lettore = new Scanner(System.in); System.out.print ("Inserire il nome della prima valuta:"); System.out.print("Inserire String nome1 = lettore.next (); lettore.next(); System.out.print ("Inserire valore in euro prima valuta:"); System.out.print("Inserire double valore1 = lettore.nextDouble (); lettore.nextDouble(); System.out.print ("Inserire il nome della seconda valuta:"); System.out.print("Inserire String nome2 = lettore.next (); lettore.next(); System.out.print ("Inserire valore in euro seconda valuta:"); System.out.print("Inserire double valore2 = lettore.nextDouble (); lettore.nextDouble(); Valuta valuta1 = new Valuta(nome1,valore1); Valuta valuta2 = new Valuta(nome2,valore2); System.out.print ("Risultato 1 = "); System.out.print("Risultato System.out.println (valuta1.tassoConversione tassoConversione(valuta2)); (valuta2)); System.out.println(valuta1. System.out.print ("Risultato 2 = "); System.out.print("Risultato System.out.println (valuta2.tassoConversione tassoConversione(valuta1)); (valuta1)); System.out.println(valuta2. } } Fondamenti di Programmazione Input di dati • L’utente deve essere sempre guidato all’inserimento dei dati con messaggi chiari e completi • Se si inserisce una sequenza di caratteri non valida quando l’istanza di Scanner si aspetta un numero si causa la brusca terminazione del programma • Questo non è accettabile in generale, ma impareremo più avanti a gestire questi problemi • L’uso di nextLine può dar luogo a comportamenti inaspettati (si può “ricordare” dell’ultimo Enter inserito in precedenza) Fondamenti di Programmazione Leggere e scrivere 5 Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola Modificare il comportamento di next • Se si vuole accettare in input una riga intera (comprensiva di spazi e tab) senza gli inconvenienti di nextLine si può imporre a next di usare come unico separatore il ritorno a capo Scanner lettore = new Scanner(System.in); String aCapo = System.getProperty ("line.separator separator"); "); System.getProperty("line. lettore.useDelimiter (aCapo); lettore.useDelimiter( aCapo); Fondamenti di Programmazione Input da tastiera con BufferedReader • Prima di Java 5 il modo tipico di ottenere input da tastiera era un po’ più macchinoso • Non esisteva un modo diretto di leggere valori numerici • Si potevano leggere solo oggetti String e poi convertirli in numeri • Questa modalità è ovviamente ancora disponibile nelle versioni da 5 in poi Fondamenti di Programmazione Leggere e scrivere 6 Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola Lettura da tastiera 1) Creazione di un istanza di BufferedReader (package java.io) associata a System.in BufferedReader lettore = new BufferedReader( BufferedReader( new InputStreamReader(System.in)); InputStreamReader(System.in)); 2) Il metodo readLine restituisce un riferimento ad un oggetto String contenente ciò che è stato inserito su una linea da tastiera String stringaLetta = lettore.readLine(); Fondamenti di Programmazione Conversione da String a tipi numerici • Metodi standard per convertire la sequenza di caratteri contenuta in un oggetto String nel valore numerico che essa rappresenta Byte.parseByte (stringaLetta); Byte.parseByte( stringaLetta); Short.parseShort (stringaLetta); Short.parseShort( stringaLetta); Integer. Integer.parseInt( parseInt(stringaLetta); stringaLetta); Long.parseLong (stringaLetta); Long.parseLong( stringaLetta); Double. Double.parseDouble( parseDouble(stringaLetta); stringaLetta); Float. Float.parseFloat( parseFloat(stringaLetta); stringaLetta); Fondamenti di Programmazione Leggere e scrivere 7 Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola Le classi wrapper • Le classi istanziabili ibride Boolean, Byte, Character, Double, Float, Integer, Long, Short si dicono wrapper rispetto ai corrispondenti tipi semplici e sono utili per due scopi: ¾ forniscono metodi di utilità generale per operare sui tipi semplici ¾ permettono di rappresentare i tipi semplici come oggetti (utile in alcuni casi): Integer intero = new Integer(25); Fondamenti di Programmazione Roadmap • 4. Leggere e scrivere ¾ Ricevere dati in ingresso ¾ Formattare i dati in uscita Fondamenti di Programmazione Leggere e scrivere 8 Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola Presentazione dei dati • L’utente non si accontenta di essere guidato e “sopportato” nell’input: vuole anche una visualizzazione comoda dei dati in output • La stampa di un double con interminabili decimali non è certo un aiuto da questo punto di vista • Se si stampano più risultati su più righe li si vorrebbe incolonnati opportunamente Fondamenti di Programmazione L’oggetto System.out • L’oggetto standard System.out rappresenta il video (o equivalenti, come la console in un ambiente integrato di sviluppo) • I metodi print e println invocabili su System.out stampano a video il valore di qualunque variabile in modo piuttosto grezzo (l’unica differenza tra i due è il ritorno a capo) Fondamenti di Programmazione Leggere e scrivere 9 Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola Output formattato (da Java 5 in poi) • Il metodo printf invocabile sull’oggetto standard System.out permette la produzione di output in forma meno grezza • Il metodo printf ha un numero variabile di argomenti (uno o più) • Il primo argomento è di tipo String, viene detto format string e fornisce la specifica di ciò che deve essere stampato usando opportuni specificatori • Gli argomenti successivi al primo corrispondono agli specificatori e devono essere sostituiti ad essi nella stampa prodotta Fondamenti di Programmazione Output formattato format string: contiene sia parti double temperatura; da stampare tali e quali sia format specifiers (uno solo in questo caso) . . . System.out.printf ("Ci sono %1.2f gradi", temperatura) System.out.printf("Ci Essendoci un solo format specifier c’è un solo parametro aggiuntivo int iscritti,promossi; double percentuale=(double )promossi/(double double)iscritti; )iscritti; percentuale=(double)promossi/( . . . System.out.printf ("Ci sono stati %d promossi con tasso System.out.printf("Ci di successo %1.3f", promossi, percentuale) format string: contiene parti da stampare tali e quali e due format specifiers Ci sono quindi due parametri aggiuntivi Fondamenti di Programmazione Leggere e scrivere 10 Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola Format specifiers • Ogni format specifier inizia con il carattere % e finisce con una lettera minuscola detta “conversion” • Tra i due possono esserci (opzionalmente) altri caratteri • La lettera minuscola finale indica il tipo di dato da stampare Fondamenti di Programmazione Format specifiers: conversion • Le possibili conversion sono 14 • Tra le più comuni: s per stringhe generiche d per un un numero intero (in base 10) f per un numero floating point (in base 10) e per un numero floating point (in base 10, notazione scientifica) t per data e ora (usi non banali) n per il ritorno a capo Fondamenti di Programmazione Leggere e scrivere 11 Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola Format specifiers: parti opzionali %[argument _index$][ flags][ ][width width][. ][.precision precision]]conversion %[argument_ index$][flags • L’argument index serve a riferire per indice posizionale gli argomenti successivi: non si usa spesso ed è utile solo se si deve stampare più volte lo stesso argomento (e non si vuole ripeterlo nella lista) • I flags possibili sono 7 tra i quali: output allineato a sinistra (applicabile in ogni caso) + viene stampato il segno (applicabile solo a numeri) 0 aggiunge zeri all’inizio (applicabile solo a numeri) , stampa a gruppi di 3 cifre: p.e. 1.357.488 (applicabile solo a numeri) Fondamenti di Programmazione Format specifiers: parti opzionali %[argument _index$][ flags][ ][width width][. ][.precision precision]]conversion %[argument_ index$][flags • width specifica il numero minimo di caratteri da produrre in output (utile per incolonnamenti, allineamenti) • precision - per conversion di tipo generale (come s) specifica il numero massimo di caratteri da produrre in output (utile per incolonnamenti, allineamenti) - per conversion di tipo floating point (come f) specifica il numero di caratteri dopo la virgola - per conversion di altro tipo non deve esserci Fondamenti di Programmazione Leggere e scrivere 12 Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola Stringhe formattate • E’ possibile produrre oggetti String con contenuto formattato anziché stampare il contenuto formattato a video • Tale compito è svolto da un metodo static della classe String denominato format che riceve argomenti nello stesso modo di printf • Per una trattazione estensiva del tema “formattazione” vedere la documentazione della classe Formatter nel package java.util Fondamenti di Programmazione Leggere e scrivere 13