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.