Output formattato con 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.

In tal modo si risolvono semplicemente alcuni inconvenienti di allineamento, come ad esempio nella stampa della tavola pitagorica proposta in una lezione precedente.

Infatti, se si stampano tre spazi prima di ogni valore della tavola pitagorica, nel caso della tavola 6 × 6, si ottiene
   1   2   3   4   5   6
   2   4   6   8   10   12
   3   6   9   12   15   18
   4   8   12   16   20   24
   5   10   15   20   25   30
   6   12   18   24   30   36

Per ottenere il risultato correttamente incolonnato
   1   2   3   4   5   6
   2   4   6   8  10  12
   3   6   9  12  15  18
   4   8  12  16  20  24
   5  10  15  20  25  30
   6  12  18  24  30  36

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 array può essere inizializzato con delle costanti al momento della dichiarazione nel modo seguente:

Sintassi del metodo 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

System.out.printf("la media vale %f", media); System.out.printf("la somma vale %d\n mentre la media vale %f", somma, media); È possibile utilizzare numerose specifiche di formato, di cui le più utili sono:

per ogni specifica di formato presente nella stringa di formato deve esserci una espressione di tipo adeguato adeguato tra i parametri successivi

Effetto del metodo 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:

Ad 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

Obiettivo 1

Dato in input un numero n minore di 15, stampare la tavola pitagorica n×n correttamente incolonnata

Stima del valore di π

Si vuole stimare l'area di un cerchio, senza ricorrere alla formula area = π r2.

Possiamo farlo attraverso la simulazione di un 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

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

Estensione

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 %