Grafico di una funzione in solo testo

Si vuole stampare il grafico della funzione f(x)=|x|/20+20*sin(x/10)+30, usando solo le istruzioni viste fino ad ora. Un metodo semplice per fare questo è usare una riga di testo per ogni valore di x: su ogni riga viene stampata una sequenza di caratteri * lunga quando il valore della funzione f(x).

Supponendo di volere il grafico per x che va da -100 a +100, occorre un ciclo for in cui la x assume valori progressivi da -100 a +100. Ad ogni passo, si calcola il valore di f(x). A questo punto, occorre stampare una stringa composta da tanti asterischi quanto è il valore della funzione.

Il problema è ora come realizzare questa stringa. Il programma GraficoTesto.java risolve questo problema con un ciclo for, in cui si parte da 1 e si arriva al valore della funzione. Ad ogni iterazione si aggiunge un asterisco alla variabile riga. Dal momento che le iterazioni sono tante quanto è il valore della funzione, la stringa alla fine è fatta da tanti * quanto è il valore della funzione.

/*
  Grafico solo testo di una funzione.
*/

class GraficoTesto {
  public static void main(String[] args) {
    double x,f;
    int i;
    String riga;

    for(x=-100; x<=100; x=x+1) {
      f=Math.abs(x)/20+20*Math.sin(x/10)+30;

      riga="";
      for(i=1; i<=f; i=i+1) {
        riga=riga+"*";
      }

      System.out.println(riga);
    }
  }
}

Alcune precisazioni: le funzioni Math.abs e Math.sin calcolano il valore assoluto e il seno di un numero reale. La istruzione riga=""; assegna alla variabile riga la stringa vuota: questa è la sequenza di caratteri che non contiene nessun carattere, ossia la stringa di lunghezza 0. Questa è una stringa valida come tutte le altre. Si può quindi usare come una qualsiasi altra stringa. Quando la stringa vuota viene concatenata a un'altra stringa, si ottiene questa seconda stringa. In termini algebrici, la stringa vuota è l'elemento neutro della operazione di concatenazione fra stringhe.

Il programma GraficoTestoLimitato.java è una variante del precedente in cui si è tenuto conto del fatto che la funzione può superare in valore la larghezza dello schermo. In questo caso, si è scelto di limitare la stringa riga a 60 caratteri. Se la funzione supera questo valore, si aggiunge a riga il carattere "+", e si esce dal ciclo.

/*
  Grafico solo testo di una funzione.
*/

class GraficoTestoLimitato {
  public static void main(String[] args) {
    double x,f;
    int i;
    String riga;

    for(x=-100; x<=100; x=x+1) {
      f=Math.abs(x)/5+20*Math.sin(x/10)+30;

      riga="";
      for(i=1; i<=f; i=i+1) {
        riga=riga+"*";
        if( i>60 ) {
          riga=riga+"+";
          break;
        }
      }

      System.out.println(riga);
    }
  }
}

L'unica differenza rispetto al programma precedente è la presenza della istruzione condizionale in cui si controlla se i ha raggiunto il valore 60. In questo caso, si aggiunge il + alla stringa, e si esce dal ciclo, per cui la stringa risulta fatta di 60 asterischi più il segno di addizione.