Roadmap Interazione con l`utente

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