Interagire con il computer
Da tastiera
Da riga di comando
Funzioni di conversione
13/08/02
Input
1
Input da tastiera
Lo standard input di un computer è visto attraverso l’oggetto predefinito System.in
Questo oggetto mette a disposizione un numero limitato di operazioni
Esistono delle classi predefinite che a partire da questo oggetto creano nuovi oggetti con maggiori
funzionalità
La classe InputStreamReader
Un InputStreamReader converte una sequenza di byte in una sequenza di caratteri.in
accordo con uno specifico sistema di codifica.
La classe BufferedReader
Un BufferedReader legge una sequenza di caratteri, la memorizza in un buffer in modo da fornire
funzioni per la lettura di intere linee.
1. InputStreamReader reader = new InputStreamReader(System.in);
2. BufferedReader console = new BufferedReader(reader);
Dopo queste operazioni posso utilizzare l’oggetto console e il metodo readLine() in grado di
restituirmi una linea da tastiera (tutti i caratteri immessi fino alla pressione di un fine linea) sotto forma
di stringa.
String line = console.readLine();
13/08/02
Input
2
Il paradigma ad oggetti
I programmi in generale non gestiscono solo numeri e caratteri, ma devono gestire dati più
complessi che rappresentano più da vicino la realtà. Ad esempio informazioni relative agli
studenti, i conti bancari, ecc.
I linguaggi di programmazione orientati agli oggetti sono adatti a trattare questi tipi di dati o
oggetti.
13/08/02
Input
3
Un programma (o applicazione) è usato da un utente per far eseguire un
insieme di operazioni a un calcolatore ciascuna operazione costituisce uno
strumento per l’utente del programma l’esecuzione di ciascuna operazione
corrisponde allo svolgimento di una sequenza di azioni da parte del
calcolatore.
Un programma mostra a un utente la rappresentazione, nel calcolatore, di
una porzione di mondo reale o virtuale
la porzione di mondo rappresentata da un programma è la realtà di
interesse del programma un programma rappresenta nel calcolatore i dati e
le operazioni di una certa realtà di interesse.
La nozione di programma percepita da chi realizza programmi è
complementare a quella percepita dall’utente
13/08/02
Input
4
Programma Monete5.java
1. import java.io.BufferedReader;
2. import java.io.InputStreamReader;
3. import java.io.IOException;
4.
5. public class Monete5 {
6.
7.
public static void main(String[] args) throws IOException {
8.
final double VAL1CENT = 0.01;
9.
final double VAL10CENT = 0.10;
10.
final double VAL20CENT = 0.20;
11.
12.
InputStreamReader reader
13.
= new InputStreamReader(System.in);
14.
BufferedReader console
15.
= new BufferedReader(reader);
16.
Ho definito 3 costanti di
console è un oggetto
tipo double
per gestire l’input da
terminale
13/08/02
Input
5
Programma Monete5.java
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.}
System.out.print("Quante monete da 1 centesimo hai? ");
int unCent = Integer.parseInt(console.readLine());
System.out.print("Quante monete da 10 centesimi hai? ");
int dieciCent = Integer.parseInt(console.readLine());
System.out.print(" Quante monete da 20 centesimi hai? ");
int ventiCent = Integer.parseInt(console.readLine());
double totale =
console.readLine()
unCent * VAL1CENT +
legge una riga da tastiera e
dieciCent * VAL10CENT +
la restituisce come stringa
ventiCent * VAL20CENT;
System.out.println("Valore totale = " + totale);
}
è buona norma stampare
una frase di richiesta
prima di ogni operazione
di lettura da tastiera
13/08/02
total è una variabile
floating-point
Input
Integer.parseInt()
analizza una stringa e
restituisce il corrispondente
valore intero
6
Esecuzione Monete5.java
E:\Java\esempi\Monete> java Monete5
Quante monete da 1 centesimo hai? 2
Quante monete da 10 centesimi hai? 3
Quante monete da 20 centesimi hai? 5
Valore totale = 1.32
E:\Java\esempi\Monete>
13/08/02
Input
7
Funzioni di conversione
Le classi Integer, Double, Boolean … mettono a disposizione una serie di
metodi di conversione che restituiscono un valore numerico a partire da una stringa.
In particolare sono utili:
Integer.parseInt(stringa)
Double.parseDouble(stringa)
Integer.parseInt( “12”) restituisce il valore intero 12
Double.parseDouble( “12.5”) restituisce il valore double 12.5
Versioni non recenti di Java non hanno parseDouble in alternativa si può usare
(new Double(stringa)).doubleValue()
13/08/02
Input
8
Riutilizzo del software
Come evitare di riscrivere tutte le volte il codice che mi serve per gestire l’input?
Posso definire una classe che mi mette a disposizione dei metodi opportuni e poi
utilizzare questi (allo stesso modo della classe Math)
13/08/02
Input
9
MyUtility.java
1. import java.io.*;
readLine legge una riga da
2.
tastiera, presentando un messaggio
3. public class MyUtility {
di richiesta
4.
5.
private static BufferedReader console =
6.
new BufferedReader(new InputStreamReader(System.in));
7.
8.
public static String readLine(String prompt) {
9.
try {
10.
System.out.print(prompt);
try/catch servono per gestire
11.
return console.readLine();
condizioni di errore
12.
}
13.
catch(IOException e) {
14.
System.err.println(e);
15.
System.exit(1);
16.
}
err corrisponde allo standard error
17.
return null;
di Unix, System.exit forza la
18.
}
terminazione del programma
19.
L’istruzione return forza l’uscita dal
metodo in esecuzione specificando il
valore che deve essere restituito
13/08/02
Input
10
MyUtility.java
20.
21.
22.
23.
24.
/**
readInt – legge un intero da tastiera,
presentando un messaggio di richiesta,
sfrutta readLine
*/
25.
26.
27.
28.
29.
30.
31.
32.
33.
public static int readInt(String prompt) {
return Integer.parseInt(readLine(prompt));
}
Integer.parseInt restituisce il
valore intero corrispondente alla stringa
/**
readDouble – legge un double da tastiera,
presentando un messaggio di richiesta,
sfrutta readLine
*/
34.
35.
36.
37.}
13/08/02
public static double readDouble(String prompt) {
return Double.parseDouble(readLine(prompt));
}
Double.parseDouble si comporta in
maniera simile a Integer.parseInt
solo le versioni recenti di Java lo
implementano
Input
11
Somma.java
Una volta compilata MyUtility.java posso utilizzare i metodi pubblici definiti
(purché il file MyUtility.class sia in una directory compresa in CLASSPATH)
allo stesso modo dell’uso delle funzioni matematiche della classe Math, non posso
invece utilizzare la variabile console perché definita private (non accessibile,
serve solo ai diversi metodi per uso interno)
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13/08/02
// Somma.java legge due numeri da tastiera
// e stampa la loro somma
public class Somma {
public static void main(String[] args) {
int a = MyUtility.readInt("a=");
int b = MyUtility.readInt("b=");
System.out.println("a+b="+(a+b));
}
}
Input
12
Somma.java
E:\Java\esempi\Somma> java Somma
a=3
b=5
a+b=8
E:\Java\esempi\Somma>
13/08/02
Input
13
Usare parametri ai comandi
Come i comandi UNIX così anche I programmi java possono usare parametri:
I parametri posti sulla riga di comando sono utilizzabili attraverso la variabile args (un
vettore di stringhe) del metodo main
Attraverso il campo length posso sapere quanti dati ho a disposizione, i vari
parametri sono accessibili come
args[0]
il primo parametro
args[1]
il secondo
args[2]
il terzo
…
13/08/02
Input
14
Uso di parametri da riga di comando
1.
2.
// Somma2.java somma due valori dati come parametri del programma
// e stampa il risultao
3.
public class Somma2 {
4.
5.
6.
7.
8.
9.
public static void main(String[] args) {
int a = Integer.parseInt(arg[0]);
int b = Integer.parseInt(arg[1]);
System.out.println("a+b="+(a+b));
}
}
E:\Java\esempi\Somma> java Somma2 3 5
a+b=8
E:\Java\esempi\Somma>
13/08/02
Input
15