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: - ....