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