esercitazione di laboratorio - Dipartimento di Informatica e Sistemistica

SETTIMA ESERCITAZIONE DI LABORATORIO
Informatica Grafica – Ingegneria Edile Architettura
11/3/2004 – a.a. 2003/2004
Input da console1
La console è un’ interfaccia a linea di comando che permettere ad un utente di fornire l’input ad un programma. In particolare,
attraverso la console possono essere possono essere lette stringhe. Per poter leggere una stringa da console bisognerà instanziare un
oggetto di tipo BufferedReader, ovvero un oggetto lettore di stringhe, e su di esso richiamare il relativo metodo per la lettura di
una stringa da console, readLine, come mostrato nell’esempio di sotto.
BufferedReader console=new BufferedReader(new InputStreamReader(System.in));
System.out.println(“Fornire l’input richiesto”)
String input=console.readLine();
La chiamata del metodo readLine sull’oggetto console nella terza istruzione pone il programma in attesa (cursore
lampeggiante) di ricevere dall’utente una stringa di input tramite tastiera. L’inserimento della stringa seguita dal tasto INVIO
determina l’acquisizione della stringa digitata che viene assegnata alla variabile input. Si osserva che nel progettare l’input da
console all’interno di un programma è buona norma far precedere l’istruzione di acquisizione dell’input da un’istruzione di stampa
in cui si chiede di inserire l’input specificato per facilitare l’interazione dell’utente con il programma 2.
E’ possibile elaborare una stringa da console e trasformarla in un intero, o reale, ove rappresenti un numero, tramite i metodi statici
parseInt, parseFloat e parseDouble delle classi Integer, Float e Double rispettivamente3. Per una descrizione di
tali metodi consultare la documentazione API Java 2.
Redirezione dell’I/O da/su console
L’input da console può sostituire l’inizializzazione di variabili istanza tramite costanti in modo da rendere il programma più
facilmente utilizzabile. Inoltre può essere comodo per elaborare grandi moli di dati redirezionando l’input o l’output da o su file, ad
esempio nell’elaborazioni di matrici. L’esempio di seguito mostra come mandare in esecuzione un programma
(ProvaRedirezione.class) da console acquisendo l’input da un file (fileIN.txt) e scrivendo l’output su un altro file
(fileOUT.txt).
C:> java ProvaRedirezione < fileIN.txt > fileOUT.txt
Per eseguire un programma dal console è sufficiente far seguire alla parola chiave java il nome del programma (file in byte code)
senza estensione4. Per redirezionare l’input da file (ovvero leggere l’input da file invece di introdurlo tramite la tastiera da console)
bisognerà inoltre far seguire all’operatore < il nome del file di input. Per redirezionare l’output su file (ovvero scrivere l’output su
file invece di visualizzarlo su console) bisognerà inoltre far seguire all’operatore > il nome del file di output.
Esercizio 1
Modificare il sorgente TryCryptographer.java realizzato nella scorsa esercitazione in modo tale da poter inserire la stringa
da decriptare da console.
L’esercizio precedente va risolto eseguendo i seguenti passi
1.
Scaricare dal sito i sorgenti delle classi Cryptographer e TryCryptographer in una stessa cartella. Compilarli e
lanciare la classe TryCryptographer. NB: Scaricare le soluzioni non i file da modificare.
2.
modificare il main di TryCryptographer.java utizzando le classi BufferedReader ed InputStreamReader
ed IOException necessarie per l’input da console.
Vedi pag. 118, Horstmann, “Concetti di Informatica e Java 2”, ed. Apogeo Milano 2002.
Si osserva inoltre che un qualsiasi metodo in cui viene instanziato un lettore di console deve contenere la dicitura “throws
IOException” alla fine della segnatura del metodo ad indicare che non si intende gestire l’eccezioni derivanti dall’immissione di dati
di input non corretti . Per poter utizzare le classi BufferedReader ed InputStreamReader ed IOException necessarie
per l’input da console è necessario importare i relativi pacchetti nel programma.
3
Vedi pag. 118, Horstmann, “Concetti di Informatica e Java 2”, ed. Apogeo Milano 2002.
4
Nell’esempio di cui sopra si ipotizza che il direttorio in cui è contenuto sia il file di input che il programma sia c:\. Prima di
utilizzare il comando java è necessario che il direttorio corrente sia uguale a quello in cui è contenuto il file in bytecode. Inoltre in
generale il nome di un file va indicato con il suo percorso assoluto o relativo (corrispondente al nome del file nel caso in cui il file si
trova nel direttorio corrente).
1
2
Esercizio 2
Scrivere un programma che legge 10 numeri positivi da console e stampa il massimo su console.
SUGGERIMENTO: Utilizzare una variabile nella quale memorizzare il massimo corrente man mano che si inserisco i numeri da
console.
Esercizio 3
Scrivere un programma che stampa quello che legge. Utilizzare il programma per provare la redirezione dell’I/O specificando un
file di input da cui acquisire la stringa da leggere ed un file di output sul quale riscrivere la stringa.
Esercizio 4
Modificare l’esercizio 2 in modo tale che stampi il secondo numero più grande. Nel caso in cui non esista il secondo più grande,
ovvero tutti i numeri siano uguali, il programma deve stampare un opportuno messaggio che informi che il secondo più grande non
esiste.
ESEMPIO
INPUT: 3-7-1-9-9-5-12-11-10-5
OUTPUT: 11
INPUT: 3-5-7-11-11-10-1-9-9-5
OUTPUT: 10
INPUT: 3-1-9-12-10-10-9-5-5-7
OUTPUT: 10
INPUT: 3-11-11-11-1-9-9-5-5-7
OUTPUT: 9
INPUT: 1-1-1-1-1-1-1-1-1-1
OUTPUT: -
....