# Java-Programm für "Börsenanalyse" schreiben



## super-girl (2. Apr 2014)

Hallo ihr schlauen und hübschen Menschen!

Bin Wirtschaftsinformatik-Studentin und im zweiten Semester. Ich muss sagen, Programmieren ist nicht meine Stärke, eher BWl. Aber JAVA-Programmieren gehört halt dazu.

Wir haben jetzt folgende Aufgabe gestellt bekommen, an der ich hänge (Meine Ansätze schreibe ich nach der Aufgabe):

Für eine Analyse des Börsenkurses einer speziellen Aktie soll der Kursverlauf in einem bestimmten
Zeitraum untersucht werden. Dabei soll nachträglich der beste Einkaufstag festgestellt werden.
Es wird angenommen, dass in dem gesamten Zeitraum nur einmal ein Kauf und ein Verkauf
stattfindet. Der beste Einkaufstag wäre derjenige gewesen, der zu einem eingesetzten Betrag den
höchsten Gewinn erbracht hätte (Steuern etc. ausgelassen).
Der Kursverlauf der Aktie in dem betrachteten Zeitraum ist durch eine Zahlenfolge gegeben. Die
erste Zahl ist der Kurs der Aktie am ersten Börsentag und jede folgende Zahl gibt die Kursveränderung gegenüber dem Vortag an. Der Kurs, der sich für einen gewissen Tag ergibt, gilt für
alle Käufe und Verkäufe dieses Tages.
Zum Beispiel liefert die Eingabe
127.5 -0.5 2 -1 1 3.5 -13 7 -2 -6 -9 -21 -17 -5 0.5 4 -7 -12 2.5 -3 2
das Ergebnis:
Ein bester Einkaufstag wäre der 14. Börsentag gewesen,
ein dazugehöriger Verkaufstag der 16. Börsentag.
Der so realisierte Gewinn wäre 6.7669 % vom eingesetzten Betrag gewesen.

Schreiben Sie ein Java-Programm, das für die Aktie aus einer gegebenen Zahlenfolge nachträglich
einen besten Einkaufstag, einen besten Verkaufstag und den dabei höchsten erzielbaren Gewinn
(in Prozent vom eingesetzten Betrag) ermittelt.
Das Programm soll für einen beliebig vorgegebenen Anfangskurs (größer 0) und beliebig viele
Kursdifferenzen funktionieren. Alle Kurse mit dem zugehörigen Tag sowie das Ergebnis sollen auf
dem Bildschirm ausgegeben werden.

Um den Verlauf des Aktienkurses darzustellen, verwenden Sie ein Array, das entsprechend viele Objekte der Klasse StockTick enthält, die folgendermaßen definiert ist: Die einzige private
Komponente ist der Tageskurs double kurs der Aktie.

Neben geeigneten Konstruktoren und Methoden zur Ein- und Ausgabe enthält die Klasse die folgenden zwei Methoden:
double getKurs(); //Gibt den Tageskurs zurÄuck.
void setKurs(double letztKurs, float kursDiff); //Berechnet den aktuellen Kurs aus dem Kurs des Vortages letztKurs und der Kursdifferenz kursDiff.

Verwenden Sie zunächst den Anfangskurs und die Kursänderungen des obigen Beispiels um zu
testen, ob Ihr Programm für diese Zahlen funktioniert.
Erzeugen Sie dann mit einem Zufallszahlengenerator einen Anfangskurs zwischen 600€ und 800€
sowie 20 Kursdifferenzen zwischen -30 € und +30 €. Hierbei genügt es, Integer-Zahlen zu verwenden.


--

Wollte jetzt zunächst die sich aus den Kursdifferenzwerten ergebenden tatsächlichen Kurse in ein Array speichern. Also z. B.: Der Anfangskurs ist 100, der Kurs am nächsten Tag ist -10, am dritten +30. Jetzt wollte ich praktisch in die Werte 100, 90 und 120 in ein Array speichern. Daran hänge ich, hier meine Code: (Tipps bzgl., was ich falsch mache, genügen. Will es ja auch verstehen. Gern gesehen sind auch Tipps, was ich anders machen soll oder generell, wie ich die Aufgabe angehe. DANKE! )


```
package exerciseTwo;

public class StockAnalysis {

	public static void main(String[] boss) {
		
		double stockInstantiate[] = {127.5, -0.5, 2, -1, 1, 3.5, -13, 7, -2, -6,
									-9, -21, -17, -5, 0.5, 4, -7, -12, 2.5, -2, 2};	
		
		double dayRate[] = null;
		
		double firstStockRate = stockInstantiate[0];
		
		for (int counter = 0; counter < stockInstantiate.length; counter++) {
			
		dayRate[counter] = firstStockRate + stockInstantiate[counter+1];
		
		}
		
		for (int printOut = 0; printOut < dayRate.length; printOut++) {
			
			System.out.println(dayRate[printOut]);
			
		}	
	}
}
```


----------



## Tom299 (2. Apr 2014)

Ich habs nur schnell überflogen, aber denke das ist falsch. Du iterierst immer mit der firstStockRate als Basis, aber die Änderung bezieht sich doch auf den Vortag, oder?


```
dayRate[counter] = firstStockRate + stockInstantiate[counter+1];
```

Ich glaub es müßte eher so sein:

```
if (counter == 0) {
   //dayRate[counter] = firstStockRate (ist wohl nicht notwendig)
   dayRate[counter] = stockInstantiate[counter] // counter ist ja 0
}
else {
   dayRate[counter] = dayRate[counter-1] + stockInstantiate[counter]
   // Tageswert = Vortageswert + Änderung
}
```

Alles Ohne Gewähr und für Börsenverluste komme ich auch nicht auf ;-)


----------



## Highchiller (2. Apr 2014)

Ich versteh deine Frage nicht.

Und was die Aufgabe an sich angeht steht eigentlich auch alles da was du tun sollst, oder wo ist dein Problem?

Dir einfach die Lösung posten tun wir sicher nicht 



super-girl hat gesagt.:


> Schreiben Sie ein Java-Programm, das für die Aktie aus einer gegebenen Zahlenfolge nachträglich
> einen besten Einkaufstag, einen besten Verkaufstag und den dabei höchsten erzielbaren Gewinn
> (in Prozent vom eingesetzten Betrag) ermittelt.



Also erst mal eine Klasse schreiben die über eine Main-Methode verfügt. Am sinnvollsten wäre es, wenn der Kurs dabei als Parameter übergeben wird. Dann musst du aus dem String[] nur erst mal ein double[] machen. Aber das ist ja kein Problem.

Um diese Main Methode baust du dann deine Klasse auf.



super-girl hat gesagt.:


> Das Programm soll für einen beliebig vorgegebenen Anfangskurs (größer 0) und beliebig viele
> Kursdifferenzen funktionieren. Alle Kurse mit dem zugehörigen Tag sowie das Ergebnis sollen auf
> dem Bildschirm ausgegeben werden.
> 
> ...



Also bekommt dein Konstruktor ein double Array übergeben und die Klasse besitzt ein double Array mit dem Kurs.
Sinnvoll wäre es wenn du dieses Array nicht veränderst. Also leg dir lieber ein neues Array an das dann den tatsächlichen aktuellen Wert speichert.



super-girl hat gesagt.:


> Neben geeigneten Konstruktoren und Methoden zur Ein- und Ausgabe enthält die Klasse die folgenden zwei Methoden:
> double getKurs(); //Gibt den Tageskurs zurÄuck.
> void setKurs(double letztKurs, float kursDiff); //Berechnet den aktuellen Kurs aus dem Kurs des Vortages letztKurs und der Kursdifferenz kursDiff.



Steht ja schon da. Jetzt noch 2 Methoden implementieren. Allerdings ist die Aufgabe hier sehr irreführend. Ich würd der Methode getKurs() noch ein Parameter übergeben, nämlich den Tag. Aus der Aufgabenstellung wird für mich nicht ersichtlich von welchem Tag getKurs den Kurs zurück geben soll.
setKurs setzt einfach die Werte deines 2. Arrays. Das kannst du direkt im konstruktor einmal durchlaufen. Das hast du in deinem Beispielcode ja quasi schon gemacht.



super-girl hat gesagt.:


> Erzeugen Sie dann mit einem Zufallszahlengenerator einen Anfangskurs zwischen 600€ und 800€
> sowie 20 Kursdifferenzen zwischen -30 € und +30 €. Hierbei genügt es, Integer-Zahlen zu verwenden.



Zufallszahlen kannst du mit Math.random() erzeugen. Allerdings nur zufallszahlen zwischen als double zwischen 0 und 1. Bissl rechnen und du kannst das so biegen das zufallszahlen zwischen 600 und 800 rauskommen. Danach einfach auf int casten.

Das wars schon.

Nu hab ichs doch sehr umfangreich gemacht. Eigentlich sollte alles klar sein.

Grüße
Highchiller

PS: Hups da war einer schneller als ich  stimmt der Code war falsch  naja jetzt haste gleich noch ne Anleitung für die Aufgabe bekommen


----------



## super-girl (2. Apr 2014)

Hey!

Wow, danke ihr beiden! 

@Tom299, ich habe mir deinen Programmcode angeguckt und habe ihn verstanden. Bevor ich ihn in Eclipse gepastet habe, dachte ich auch, dass er klappen würde. Leider sagt Eclipse aber, "Exception in thread "main" java.lang.NullPointerException at exerciseTwo.StockAnalysis.main(StockAnalysis.java:14)"

Zeile 14 ist: dayRate[counter] = stockInstantiate[counter];

Sehr komisch! Ich bin deinen Code sicher 10 mal durchgegangen und finde ihn eigentlich sehr clever.

@Highchiller. Danke für deine ausführliche Beschreibung! Und ich will sicher nicht, dass mir hier einer die Lösung einfach hinklatscht . Ich finde deine Idee, schon beim Programmaufruf Parameter zu übergeben, interessant. Ich weiß, wie das normalerweise geht. Aber wie kann ich das in Eclipse machen? Habe da ja nicht die Konsole, wo ich Parameter mit gebe.

Danke!!


----------



## Highchiller (2. Apr 2014)

das liegt an Zeile 10:

```
double dayRate[] = null;
```

Klar das dann eine NullPointer fliegt, wenn du dayRate gar nicht instanziiert hast.
Also

```
double dayRate[] = new double[stockInstantiate.length];
```
sollte das Problem lösen.

Was Eclipse angeht:
Run -> Run Configurations
Dann links die Klasse auswählen die du starten möchtest.
Rechts wechselst du zu "Arguments" und dort fügst du in "Program arguments:" deine Übergabewerte ein.
Aber achte darauf nicht ein Array einzugeben. Der compiler trennt bei Leerzeichen die Schriftblöcke und steckt sie in das Array von main(String[] args).
Wenn du da also eingibst.
"10 -1 -4 5 12"
Dann wird main aufgerufen mit: main( ["10", "-1", "-4", "5", "12"] ).
Und das sind Strings UND du musst drauf achten eine Kommastelle als Punkt zu verwenden. Also 1.5 und nicht 1,5. 

Ein String in ein Integer umwandelst machst du dann mit:

```
public static void main(String[] args){
    double[] values = new double[args.length];
    for ( int i = 0; i < values.length; i++ ) {
        values[i] = Double.parseDouble( args[i] );
    }
}
```

Fertig. Damit stehen alle Werte aus args in values.
Die Fehlerbehandlung hab ich weggelassen. Kann ja sein das jemand auf die doofe idee kommt und das programm mit "du du du" startet. Dann fliegt dir natürlich alles um die Ohren


----------

