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.
Soluzione: MaxMedDaTastiera.java
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
Soluzione: SommaSequenzaRisolto.java
Un numero naturale è perfetto se è uguale alla somma dei suoi divisori, compreso il numero 1 ed escluso sé stesso. Ad esempio, il numero 28 è perfetto perché 1+2+4+7+14=28, mentre 15 non è perfetto perché 1+3+5=9.
Per verificare se un intero n è divisibile per un intero y basta verificare se il resto della divisione è 0. Il resto della divisione può essere calcolato con l'operatore %
.
Scrivere un programma che, dato in input un numero naturale, verifica se è un numero perfetto. Per verificare la correttezza del programma, si sappia che i numeri perfetti minori di 1000 sono solo i numeri 6, 28 e 496.
Soluzione: Perfetto.java
Soluzione: TrovaPerfetti.java
Immaginiamo di non conoscere il valore di π ma di sapere che l'area di un cerchio di raggio r è area = π r2. Possiamo quindi stimare il valore di π attraverso la stima dell'area di un cerchio.
Eseguiamo il seguente esperimento: assumendo di avere a disposizione un generatore di numeri casuali che restituisce valori in [0,1) con distribuzione uniforme si possono generare n punti (con n fornito in input), ciascuno dei quali ha coordinate casuali in [0,1).
Tutti questi punti sono all'interno di un quadrato di lato 1, mentre solo una parte di essi saranno all'interno del cerchio di raggio 0.5 e centro (0.5, 0.5)
Valutiamo il rapporto tra il numero di punti interni al cerchio e il numero di punti generati. Questa rapporto dovrebbe essere, per n elevato, molto vicino al rapporto tra l'area del cerchio e l'area del quadrato.
Per decidere se un punto (x,y) è interno al cerchio calcolo la distanza tra (x,y) e il centro del cerchio, che ha coordinate (0.5, 0.5), e controllo se questa distanza è minore o maggiore del raggio del cerchio (pari a 0.5).
Conoscendo la formula per il calcolo dell'area del cerchio di raggio 0.5, è possibile ottenere il valore approssimato di π a partire dall'area approssimata del cerchio.
Eseguire automaticamente una sequenza di esperimenti per n = 2, 4, 8, 16, 32, ..., fino a superare una soglia fissata da input, e per ciascun esperimento mostrare il valore stimato di π.
Formattando opportunamente l'output si dovrebbe ottenere, data ad esempio la soglia 1000000, una tabella simile a quella che segue:
| | n | stima | scarto | | ========================================== | | 2 | 4,00000000000000 | +27,3240 % 4 | 3,00000000000000 | -4,5070 % 8 | 4,00000000000000 | +27,3240 % 16 | 3,25000000000000 | +3,4507 % 32 | 3,50000000000000 | +11,4085 % 64 | 3,31250000000000 | +5,4401 % 128 | 3,00000000000000 | -4,5070 % 256 | 3,18750000000000 | +1,4613 % 512 | 3,16406250000000 | +0,7152 % 1024 | 3,17187500000000 | +0,9639 % 2048 | 3,17968750000000 | +1,2126 % 4096 | 3,16699218750000 | +0,8085 % 8192 | 3,17724609375000 | +1,1349 % 16384 | 3,14794921875000 | +0,2023 % 32768 | 3,12463378906250 | -0,5398 % 65536 | 3,13677978515625 | -0,1532 % 131072 | 3,14270019531250 | +0,0353 % 262144 | 3,14541625976563 | +0,1217 % 524288 | 3,14167785644531 | +0,0027 %Per stampare la tabella incolonnata come quella indicata è molto utile il metodo
System.out.printf(...)
, descritto in una esercitazione precedente.
Soluzione: StimaPiGreco.java