In Java l'istruzione per comunicare un messaggio o un risultato sullo standard
output (solitamente la console di windows) è la seguente:
// visualizzazione di un messaggio statico
// Essi vanno racchiusi tra virgolette doppie
System.out.print("Ciao mondo!");
// visualizzazione del valore contenuto in una variabile
System.out.print(variabile);
Notare l'uso delle virgolette per delimitare del testo statico, che deve essere stampato esattamente come
scritto.
I nomi delle variabili, di cui si vuole stampare il
valore,
non vanno racchiusi tra
virgolette.
Queste istruzioni stampano il messaggio o il valore della variabile indicata e lasciano il
cursore al
termine dell'informazione stampata. Questo vuol dire che eventuali successivi comandi di stampa
continueranno accodando a quanto precedentemente stampato.
Se, invece, si vuole inserire un ritorno di riga alla fine di
quanto
stampato, in modo che eventuali
comandi di stampa successivi agiscano su una nuova riga, occorre utilizzare i comandi che
seguono:
System.out.println("Ciao mondo!");
System.out.println(variabile);
Più in generale, le istruzioni print/println richiedono una informazione trasformabile in testo
che
può
anche essere ottenuto attraverso la valutazione di una espressione più articolata. Nell'esempio
che
segue si costruisce un messaggio da visualizzare concatenando del testo statico al valore
contenuto
un
una variabile di tipo stringa.
System.out.println("Ciao mondo da " + nome);
Se il contenuto della variabile nome fosse, ad esempio, Mario, il risultato del comando
precedente
produrrebbe in uscita il messaggio "Ciao mondo da Mario".
Notare lo spazio prima delle virgolette
chiuse per separare il testo dal valore contenuto nella variabile
nome.
Ci sono diverse modalità per permettere all'utente l'introduzione di informazioni attraverso lo
standard
input.
Ne analizziamo un paio, in particolare l'uso della classe Scanner
o, in alternativa, delle classi InputStreamReader e
BufferedReader, in combinazione.
Entrambi richiedono la definizione e creazione degli oggetti necessari, da fare una sola volta,
possibilmente nella sezione di dichiarazione variabili, come
mostrato negli esempi che seguono.
Ovviamente l'indicazione sul posizionamento di tali istruzioni è un suggerimento. Esso può
essere
sensato nella maggior parte dei casi, tuttavia, in situazioni in cui l'input sarà richiesto solo
al
verificarsi di determinate condizioni, tali istruzioni possono anche essere posizionate in altri
punti specifici del nostro codice.
La classe Scanner è di più recente introduzione rispetto alle classi
InputStreamReader/BufferedReader e, pertanto, dispone di
funzionalità per eseguire alcuni compiti in modo più agevole.
Vediamo, nell'esempio di codice che segue, come essa si utilizza.
package primoprogrammaconinput;
// istruzioni di collegamento alla libreria che definisce
// le classi che vogliamo usare
import java.util.Scanner;
public class PrimoProgrammaConInput {
// dichiarazione degli oggetti necessari ad acquisire input
// tali oggetti possono essere definiti in questa sezione
// destinata alla dichiarazione delle variabili globali
// oppure, come alternativa, all'interno del main, nella
// sezione destinata alle variabili locali
Scanner tastiera=new Scanner(System.in);
public static void main(String[] args) {
// come già specificato sopra, in alternativa, gli oggetti necessari
// per effettuare l'input dei dati possono essere dichiarati in questa
// sezione, destinata alla dichiarazione delle variabili locali al main
Scanner tastiera=new Scanner(System.in);
// ora posso utilizzare l'istruzione che segue per acquisire
// input in formato stringa (alfanumerico) dall'utente
System.out.print("Inserisci il tuo nome: ");
String nome=tastiera.nextLine();
// se si volesse invece acquisire dei valori numerici
// occorre invece utilizzare le istruzioni che seguono
// Acquisizione di un numero intero
// l'input è restituito direttamente come numero intero
// non è necessaria nessuna azione di trasformazione
System.out.print("Inserisci un numero intero: ");
int numIntero = tastiera.nextInt();
// Acquisizione di un numero decimale float
// l'input è restituito direttamente come numero decimale
// non è necessaria nessuna azione di trasformazione
System.out.print("Inserisci un numero decimale: ");
float numDecimale = tastiera.nextFloat();
// Acquisizione di un numero decimale double
// l'input è restituito direttamente come numero decimale
// non è necessaria nessuna azione di trasformazione
System.out.print("Inserisci un numero decimale: ");
double numDecimale = tastiera.nextDouble();
}
}
Vediamo ora, in alternativa, nell'esempio di codice che segue, le istruzioni da utilizzare per
acquisire input dall'utente
attraverso le classi InputStreamReader/BufferedReader.
package primoprogrammaconinput;
// istruzioni di collegamento alla libreria che definisce
// le classi che vogliamo usare
import java.io.InputStreamReader;
import java.io.BufferedReader;
public class PrimoProgrammaConInput {
// dichiarazione degli oggetti necessari ad acquisire input
// tali oggetti possono essere definiti in questa sezione
// destinata alla dichiarazione delle variabili globali
// oppure, come alternativa, all'interno del main, nella
// sezione destinata alle variabili locali
InputStreamReader input=new InputStreamReader(System.in);
BufferedReader tastiera = new BufferedReader(input);
// notare l'uso di throws Exception per aggirare un errore segnalato
// dall'utilizzo delle classi InputStreamReader e BufferedReader
// Si tratta di una tecnica che utilizziamo al momento per aggirare
// l'ostacolo, in quanto non conosciamo ancora gli strumenti da utilizzare
// per indirizzare correttamente questi tipi di errore.
// Tale tecnica non è assolutamente corretta ed è da intendersi solo
// ed esclusivamente come soluzione temporanea
public static void main(String[] args) throws Exception {
// come già specificato sopra, in alternativa, gli oggetti necessari
// per effettuare l'input dei dati possono essere dichiarati in questa
// sezione, destinata alla dichiarazione delle variabili locali al main
InputStreamReader input=new InputStreamReader(System.in);
BufferedReader tastiera = new BufferedReader(input);
// ora posso utilizzare l'istruzione che segue per acquisire
// input in formato stringa (alfanumerico) dall'utente
System.out.print("Inserisci il tuo nome: ");
String nome=tastiera.readLine();
// se si volesse invece acquisire dei valori numerici
// è necessario convertire la stringa inserita dall'utente
// nel valore numerico opportuno
// Acquisizione di un numero intero
// Si possono utilizzare, in alternativa, le due istruzioni che seguono
// per trasformare l'input alfanumerico in un numero intero
System.out.print("Inserisci un numero intero: ");
int numIntero = Integer.parseInt(tastiera.readLine);
int numIntero = (int)tastiera.readLine();
// Acquisizione di un numero decimale float
// Si possono utilizzare, in alternativa, le due istruzioni che seguono
// per trasformare l'input alfanumerico in un numero decimale
System.out.print("Inserisci un numero decimale: ");
float numDecimale = Float.parseFloat(tastiera.readLine);
float numDecimale = (float)tastiera.readLine();
// Acquisizione di un numero decimale double
// Si possono utilizzare, in alternativa, le due istruzioni che seguono
// per trasformare l'input alfanumerico in un numero decimale
System.out.print("Inserisci un numero decimale: ");
double numDecimale = Double.parseDouble(tastiera.readLine);
double numDecimale = (double)tastiera.readLine();
}
}