Esaminare il programma
SommaInput.java
,
che accetta in input due interi da tastiera e stampa la loro somma. Modificare il programma in modo che vengano letti due
interi e venga stampato solo il maggiore dei due.
Negli esercizi proposti di seguito, utilizzare lo stesso schema per immettere valori da tastiera.
Per leggere un double
si può ricorrere al metodo nextDouble()
. Per esempio:
... int a; double x; Scanner lettore; lettore = new Scanner(System.in); System.out.print("Digita un numero intero: "); a = lettore.nextInt(); System.out.print("Digita un numero reale: "); x = lettore.nextDouble(); ...
Scrivere un programma che accetta da tastiera tre numeri reali e ne stampa massimo e media.
System.out.printf(...)
Il metodo System.out.printf(...)
, introdotto nelle versioni più recenti del linguaggio Java,
permette di visualizzare valori numerici e stringhe utilizzando un numero prefissato di caratteri, o di intervenire sul numero di decimali o sulla presenza dei separatori per le migliaia.
In tal modo si risolvono semplicemente alcuni inconvenienti di allineamento, come ad esempio nella stampa della sequenza seguente:
1 2 4 8 16 32 64 128Infatti, se si stampano tre spazi prima di ogni valore, si otterrebbe
1 2 4 8 16 32 64 128Per ottenere il risultato correttamente incolonnato dovremmo stampare ciascun valore intero utilizzando esattamente 4 spazi, ad esempio 3 spazi e una cifra, oppure due spazi e due cifre, oppure uno spazio e tre cifre. Un altro uso comune del metodo riguarda la limitazione del numero di cifre decimali quando si stampano valori
double
e float
.
System.out.printf(...)
Il metodo System.out.printf(...)
può essere invocato con un numero variabile di parametri,
di cui il primo è una stringa di formato, e i successivi sono espressioni qualsiasi.
System.out.printf(stringa di formato, espressione, espressione, ..., espressione)
La stringa di formato è una stringa che contiene caratteri qualsiasi,
caratteri speciali come \n
per tornare a capo, ed eventuali specifiche di formato
%d
un valore intero (tipi byte
, short
, int
e long
)%f
un valore floating point (tipi float
e double
)%g
un valore floating point in notazione scientifica (tipi float
e double
)%s
un valore di tipo stringa di caratteriper ogni specifica di formato presente nella stringa di formato deve esserci una espressione di tipo adeguato adeguato tra i parametri successivi
System.out.printf(...)
La chiamata al metodo causa la visualizzazione della stringa di formato, nella quale la prima specifica di formato viene sostituita con il valore della prima espressione, la seconda specifica di formato viene sostituita con il valore della seconda espressione, la terza specifica di formato viene sostituita con il valore della terza espressione, e così via.
Ad esempio, se somma
è una variabile int
e media
è una variabile double
, la chiamata
System.out.printf("la somma vale %d e la media vale %f\n", somma, media);
causa la visualizzazione del testo seguente:
la somma vale XXXX e la media vale YYYY
dove XXXX e YYYY sono rispettivamente il contenuto delle variabili somma
e media
È possibile indicare il numero di posizioni da utilizzare per la stampa di ciascun valore modificando come segue le specifiche di formato:
%Nd
dove N è un numero intero: verranno premessi spazi fino ad utilizzare un totale di N posizioni%X.Yf
dove X e Y sono numeri interi: verranno premessi spazi fino ad utilizzare un totale di X posizioni, di cui esattamente Y per le cifre a destra del punto decimaleAd esempio, se la variabile somma
contiene il valore 25 e la variabile media
contiene il valore 12.5, la chiamata
System.out.printf("la somma vale %5d e la media vale %6.2f\n", somma, media);
causa la visualizzazione del testo seguente:
la somma vale 25 e la media vale 12.50
JOptionPane
La classe JOptionPane
fornisce metodi per l'input e l'output di valori attraverso la comparsa di finestre di dialogo.
Per poter essere utilizzati deve essere presente, all'inizio del sorgente, la direttiva
import javax.swing.JOptionPane;
I metodi più utili sono:
JOptionPane.showMessageDialog(null, VALORE DA VISUALIZZARE)
, che fa comparire una finestra con il valore indicato. Per esempio:
double a, b; ... if (a > b) JOptionPane.showMessageDialog(null, "il massimo è"+a); else JOptionPane.showMessageDialog(null, "il massimo è"+b);
JOptionPane.showInputDialog(MESSAGGIO)
, che fa comparire una finestra in cui viene visualizzato il messaggio e una zona in cui l'utente può scrivere.
Il metodo restituisce una stringa di caratteri contenente i caratteri digitati dall'utente. Se si vuole permettere l'immissione di valori numerici, la stringa restituita deve essere convertita nel tipo numerico desiderato utilizzando un metodo parse...
.
Per esempio:
int n; ... n = Integer.parseInt(JOptionPane.showInputDialog("Scrivi un intero")); long m; ... m = Long.parseLong(JOptionPane.showInputDialog("Scrivi un intero")); float a; ... a = Float.parseFloat(JOptionPane.showInputDialog("Scrivi un reale")); double b; ... b = Double.parseDouble(JOptionPane.showInputDialog("Scrivi un reale"));
Esaminare il programma
SommaSequenza.java
,
che accetta in input una sequenza di numeri interi terminata dal valore 0 (che non deve essere
considerato parte della sequenza), e calcola la somma dei valori esaminati.
Modificare il programma in modo da ottenere i seguenti obiettivi.
Si raccomanda di aggiungere un obiettivo alla volta, realizzando un programma funzionante ogni volta che si aggiunge una funzionalità.
Anche quando si aggiungono nuove funzionalità la sequenza deve essere letta una sola volta, visualizzando alla fine della lettura tutti i risultati richiesti.
Il programma deve funzionare correttamente, in particolare per quanto riguarda gli ultimi due punti, anche in presenza di sequenze che contengono solo valori negativi (il massimo nella sequenza -7, -3, -4 è il valore -3).
Suggerimento: Per la ricerca del minimo e del massimo, può essere utile sapere che il
valore Integer.MAX_VALUE
rappresenta il massimo valore
positivo rappresentabile in una variabile di tipo
int
. Quindi, se a
è una variabile int
, è possibile assegnarle il massimo possibile con l'istruzione a = Integer.MAX_VALUE;
Il minimo valore (di segno negativo) è invece
Integer.MIN_VALUE
Il metodo Math.random()
restituisce un valore double
pseudocasuale compreso tra 0 (incluso) e 1 (escluso). Ad ogni chiamata del metodo Math.random()
viene restituito un nuovo valore. Quindi, il frammento di codice seguente stampa una successione di 10 numeri casuali compresi in [0, 1):
double x; for(int i=0; i<10; i++) { x = Math.random(); System.out.println(x); }
Prendendo spunto dal frammento di codice proposto, scrivere un programma che:
n
,n
valori pseudocasuali.Modificare il programma in modo da raggiungere, uno alla volta, i seguenti obiettivi (deve essere generata una sola sequenza):
Scrivere un programma che, dato in input un numero naturale, stampa la sua scomposizione in fattori primi.
Ad esempio, se fosse dato in input il numero 792, il programma dovrebbe stampare
792 = 2 * 2 * 2 * 3 * 3 * 11Suggerimenti:
792: 2 * 396 396: 2 * 198 198: 2 * 99 99: 3 * 33 33: 3 * 11 11: 11 * 1 fine
Invece di stampare più volte lo stesso fattore, stampare il suo esponente. Ad esempio:
792 = 2^3 * 3^2 * 11^1