1   /**
2    * 183.592 Programmierpraxis TU Wien WS2014/15 H.Moritsch
3    * Plot einer Funktion y = f(x) mittels '*'-Zeichen 
4    * im Intervall von a bis b mit n Schritten,
5    * Berechnung der Zeichenposition direkt aus dem Funktionswert,
6    * Erstellung einer Zeile mittels eigener Methode
7    * z. B. a = -2.0, b = 2.0, n = 30 
8    */
9   public class FunktionPlotV3 {
10      public static void main(String[] args) {
11  
12          double a  = -2.0;
13          double b  = -2.0;
14  
15          /********/
16          int    n  = 30;                 // Anzahl der Schritte
17          /********/
18  
19          double x;
20   
21          // Berechnung von dx aus n:
22          /***********************/        
23          double dx = (b - a) / n ;       // automatische Typumwandlung für n: int -> double
24          /***********************/        
25  
26          x = a;
27          // *solange* x innerhalb des Intervalls liegt:    
28          while (x <= b) {
29  
30              double y = f(x);            
31  
32              // Zeichenposition entspricht dem y-Wert:
33              /*************************/             
34              int pos = (int) ( y / dx ); // explizite Typumwandlung double -> int
35              /*************************/             
36  
37              // Erstellung einer Zeile 
38              /***************************************/        
39              String s = positionszeichen(pos, 2, '*');
40              /***************************************/        
41  
42              System.out.println(s);
43  
44              x = x + dx;                 // nächster x-Wert
45          }
46   
47      }
48  
49      /**
50      * Erzeugung einer Zeichenkette, die aus n Leerzeichen, gefolgt von einem Zeichen ch, besteht
51      */
52      private static String positionszeichen(int n, int k, char c) {
53  
54          String s = ""; // mittels dieser lokalen Variablen wird das Ergebnis aufgebaut
55  
56          // n*k-maliges Anfügen eines Leerzeichens
57          for(int i = 0; i < k*n; i++)
58              s += ' ';
59  
60          // abschließendes Anfügen des Zeichens ch
61          s += c;
62  
63          return s;   // Rückgabe der fertigen Zeichenkette
64      }
65  
66      /**
67      * Berechnung der Funktion -0.01*x^5 + 0.08*x^4 - 0.26*x^3 - 0.31*x^2 + 1.4*x + 2.36
68      */ 
69      private static double f(double x) {
70          return -0.01*x*x*x*x*x + 0.08*x*x*x*x - 0.26*x*x*x - 0.31*x*x + 1.4*x + 2.36;
71      }
72  
73  }
74