Grafico di una funzione

Vediamo qui un esempio di procedura: la stampa del grafico di una funzione usando solo caratteri di testo. Sia quindi data una funzione f=|x|/20.0+20sin(x/10)+30 da visualizzare. Vogliamo visualizzare graficamente i valori di questa funzione con x che va da -100 a +100.

Per effettuare questo grafico usando esclusivamente la finestra di testo, usiamo il trucco di visualizzare il grafico ``in verticale'': per ogni valore di x stampiamo una linea, in cui mettiamo un asterisco "*" in posizione tanto più a destra in funzione del valore f(x).

Per stampare l'asterisco a destra, usiamo la funzione System.out.print, che è simile alla println, ma non va a capo una volta stampato. Per stampare l'asterisco a destra, facciamo prima una stampa di tanti spazi quanto vale la funzione, e poi stampiamo ``*" con andata a capo.

Il programma GraficoFunzione.java realizza questa funzione.

/*
  Grafico di una funzione usando solo testo
  (con funzione)
*/

class GraficoFunzione {
  static void linea(int n) {
    int i;

    for(i=1; i<=n; i=i+1) {
      System.out.print(" ");
    }
    System.out.println("*");
  }

  public static void main(String[] args) {
    double f;
    int x;

    for(x=-100; x<=100; x=x+1) {
      f=Math.abs(x)/20.0+20*Math.sin(x/10.0)+30;
      linea(Math.round((float) f));
    }
  }
}

La funzione linea ha un argomento di tipo intero, ossia si aspetta di ricevere un valore di tipo intero. Questo valore viene memorizzato nella variabile n. Usando il valore di questa variabile, è facile stampare la linea voluta: si fa un ciclo for in cui si stampano n spazi bianchi (senza andare a capo), e poi si stampa un singolo asterisco ``*'', andando a capo. La funzione linee stampa quindi una singola linea del grafico.

Per stampare tutto il grafico, occorre chiamare la funzione per ogni valore di x da -100 a +100. Il programma fa esattamente questo: c'è un ciclo for che assegna alla variabile x valori progressivi da -100 a +100. Per ogni valore di x si valuta la funzione, e si assegna il valore risultato alla variabile f. A questo punto, si chiama la funzione usando il valore memorizzato in f.

Un punto da notare nel programma è la presenza della funzione di arrotondamento Math.round. È necessario usare questa funzione perchè il risultato della funzione è un numero reale. Quindi, non si può passare alla procedura linea, che si aspetta un numero intero. La espressione Math.round((float) f) rappresenta un numero intero che è la più vicina approssimazione del numero reale contenuto nella variabile f.