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.