# Variablen in Arrays speichern?



## peter1234 (19. Dez 2009)

Hallo,
ich muss hier fuer die Uni eine aufgabe lösen. Zu der Aufgabe gibts es bereits im Forum hier ein paar Ansätze. Jedoch komme ich damit nicht mit meinem Ansatz weiter.

Zur Aufgabe: Es geht um Aktien wo Tageskurse eingegeben werden sollen. Nach 2 Kursdaten soll abgefragt werden ob ein weiterer Kurs eingegeben werden soll.
Zu letzt wird gefragt wie lange die Aktienprognose fuer die nächsten Tage dauern soll.
Von den eingegeben Kursdaten sollen nun die Kursänderungen bestimmt werden.
Von diesen Kursänderungen wiederum soll der Durchschnitt gebildet werden.
Auf den letzten Tageswert soll nun der Durchschnittaddiert werden. (Wenn zb für 5 Tage prognostiziert werden soll muss der Durchschnitt 5x jeweils draufaddiert werden).

Mein Code bislang:

```
import javax.swing.JOptionPane;


public class StockEstimation {

	
	public static void main(String[] args) {
		
		
          String Tageskurs1 = JOptionPane.showInputDialog("Bitte geben sie den Wert des ersten Tageskurses ein:");
          double Tageskurs11 = Double.parseDouble(Tageskurs1); 
          do{
          String Tageskurs2 = JOptionPane.showInputDialog("Bitte geben sie den Wert des naechsten Tageskurses ein:");
          double Tageskurs22 = Double.parseDouble(Tageskurs2);
          
          int abfrage =  JOptionPane.showConfirmDialog(null, "Ja", "Nein", JOptionPane.YES_NO_OPTION);
          
           while ( abfrage == 1); {
        	  
        	  String TageskursN = JOptionPane.showInputDialog("Bitte geben sie den Wert des naechsten Tageskurses ein:");
              double TageskursNN = Double.parseDouble(Tageskurs2);
              
              int abfrageN =  JOptionPane.showConfirmDialog(null, "Ja", "Nein", JOptionPane.YES_NO_OPTION);
              
              
           
           
	
           }
    	 
          }
          
         
         
	String laenge = JOptionPane.showInputDialog("Bitte geben sie die Länge des Zeitraumes ein für den prognostiziert werden soll (mindestens 1 Tag):");
	int laenge1 = Integer.parseInt(laenge);
	
	

	}
}
```

Jetzt müsste ich ja die einzelnen eingegebenen Werte Subtrahieren. Kurs1-Kurs2, Kurs2-Kurs3, Kurs3-Kurs4....etc...
Da ich im endeffekt aber nicht weiss wie viele Werte ich habe steh ich hier vor einem Problem. In anderen threads wurden Arrays verwendet. Aber wie ich das hier machen soll versteh ich nicht


----------



## javimka (19. Dez 2009)

Scheint eine beliebte Aufgabe zu sein, gehört bald in die FAQ
http://www.java-forum.org/java-basi...liste-erstellen-vielen-unendlichen-weren.html
http://www.java-forum.org/java-basics-anfaenger-themen/92954-neue-variablen-schleife-anlegen.html


----------



## peter1234 (19. Dez 2009)

Erstmal vielen dank dass du dir die Mühe gemacht hast dich hiermit zu beschäftigen und die Links rauszusuchen.

Allerdings war mir der erste Link bereits bekannt und bei dem zweiten link sind die entscheidenen Sachen vom Themenstarter entfernt worden.


----------



## javimka (19. Dez 2009)

Nun, ich bin ja unterdessen geübt in dieser Aufgabe 

Am besten, du machst eine ArrayList, in der du beliebig viele Tageskurse eintragen kannst:
[c] ArrayList<Double> list = new ArrayList<Double>();[/c]

Um einen Tageskurs einzutragen, rufst du [c]list.add(TageskursNN)[/c] auf. Du musst die ersten beiden Tageskurse eintragen und dann noch jene in aus der while-Schleife. Um den i-ten Eintrag aus der Liste zu entnehmen, rufst du [c]list.get(i)[/c] auf.

In der while-Schleife hast du einen Fehler. Du speicherst da nämlich die Antwort, ob noch weitere Kurse kommen, auf einen neuen int ab. Die while-Schleife geht aber weiter bis sich abfrage verändert hat, das tut sie aber in dieser Schleife nicht. In Zeile 23 musst du deshalb abfrageN durch abfrage ersetzen.

Um später mit den Werten rechnen zu können, kannst du die Liste in ein Array verwandeln:
[c]Double[] array = list.toArray(new Double[list.size()]);[/c]

Um die Differenzen zu erhalten, brauchst du ein weiteres Array mit einem Eintrag weniger
[c]Double[] diff = new Double[array.length-1];[/c]

Mit einer for-Schleife interierst du denn durch alle EInträge und rechnest die Differenzen aus. Der Kopf der for-Schleife sieht so aus:
[c]for (int i=0;i<diff.length;i++) { ... [/c]

Du kannst dann mit array_ und array[i+1] die Differenzen ausrechnen und ins Array diff speichern.

Diese Schritte sind auch schon im anderen Thread diskutiert worden, der wo der Themenstarter keine so grosse Angst gehabt hat, man könnte ihm was abschreiben._


----------



## peter1234 (20. Dez 2009)

Ok ich hab mich einmal hingesetzt mir noch ein paar Sachen über Arrays durchgelesen und versucht deine Tipps einmal mit einzubringen.
Mein Quelltext sieht mittlerweile folgendermaßen aus:



Zu deinem Tipp mit Zeile 23. Wenn ich das ändere kommt aber folgende Fehlermeldung: Duplicate local variable abfrage. 
Wo hab ich jetzt noch fehler drin? er sagt mir das der 
	
	
	
	





```
list.get( Tageskurs11, Tageskurs22, TageskursNN);
```
 befehl noch falsch ist und er erkennt nicht wie ich die liste2 angelegt habe und dadurch enstehen noch ein paar weitere fehler glaub ich.

Das letzte was mir jetzt noch fehlt ist das er aus der ausgangsliste den letzten Wert ausliest und diesen so oft drauf addiert wie die eingabe bei "laenge" ist.

Als Bsp: der Letzte Wert ist 100 und der Durschnitt ist 1. die Laenge beträgt 3. Somit müsste die ausgabe dann 101 102 und 103 sein.

Hoffe du oder jmd anders kann mir hier nocheinmal helfen. bin da echt am verzweifeln.


----------



## javimka (20. Dez 2009)

In Zeile 23, jetzt 33 musst du das int natürlich wegnehmen. [c]abfrage =  JOptionPane.sho...[/c]

Dein Befehl in Zeile 37 ist tatsächlich falsch. Was sollte der denn bewirken?

Den letzten Wert aus einem Array kriegst du mit [c]array[array.length-1][/c], den letzten Wert einer Liste mit [c]list.get(list.getSize()-1)[/c]


----------



## Murmeltier1985 (20. Dez 2009)

Und noch von mir nen kleinen Tipp: Poste nicht deinen kompletten Quellcode. Sonst werden das alle anderen aus unserem Kurs kopieren und abgeben und du bekommst keine Punkte, da Duplikate. Ist schon vorgekommen in diesem Forum


----------



## peter1234 (20. Dez 2009)

In zeile 37 soll der die zuvor gespeicherten Werte in folgender reihenfolge abfragen: zuerst den Tageskurs11 dann Tageskurs22 und zum Schluss die restlichen weil im moment speichert er das ja in verschiedene listen. Diese muss ich ja zusammenfügen.


----------



## javimka (20. Dez 2009)

peter1234 hat gesagt.:


> speichert er das ja in verschiedene listen.


Nein, tut er nicht. Es gibt nur eine einzige ArrayList, nämlich list.


----------



## peter1234 (20. Dez 2009)

Achso dann muss das einfach 
	
	
	
	





```
list.get()
```
 heissen?

Dann hab ich aber das Problem wenn ich weiter unten die "differenz" in eine liste speichern müsste.


```
for (int i=0;i<diff.length;i++) {         //differenz der tageswerte
         double differenz=array[i+1]-array[i];
    list.add(differenz)              //in neue liste speichern
```
Dann hab ich ja nicht nur Tageskurs11, Tageskurs22, TageskursN sondern auch noch Differenz drin.
Wie bekomme ich das hin das er nur differenz dort speichert?


----------



## javimka (20. Dez 2009)

Die Differenz musst du ja nicht in die Liste speichern, sondern ins Array diff.
Alos diff_ = differenz_


----------



## eRaaaa (20. Dez 2009)

?? sorry dass ich kurz dazwischenfunke..aber sollen die differenzen etc. überhaupt extra in einem array abgelegt werden? die interessierne doch eig. garnicht:


```
int diff = 0;
    for (int i = 0; i < list.size() - 1; i++) {
        diff += list.get(i + 1) - list.get(i);
    }
    double durchAnstieg = 1.0 * diff/ (list.size() - 1);
```

dann einfach letzter wert + x * durchAnstieg und das wars? ???:L


----------



## peter1234 (20. Dez 2009)

Ah ja ich glaub ich weiss was du meinst.
Das is so fast richtig.
Den letzten Tageswert rufe ich mit

```
doulbe endergebnis = array[array.length-1]+durchAnstieg
```
Allerdings addiert er hier ja nur auf den letzten Wert den Durchschnitt.
also wir haben das Array von zB 101 102 und 103. Dann addiert er ja auf 104. Wenn ich jedoch eine 3tagesprognose haben möchte, was ich mit 

```
String laenge = JOptionPane.showInputDialog("Bitte geben sie die Länge des Zeitraumes ein für den prognostiziert werden soll (mindestens 1 Tag):");
```
 festlege, muss als antwort "104 105 und 106" rauskommen.

//edit. Das muss ich glaub ich mit einer Schleife machen.

```
for(int=0;i<laenge;i++)
```
. Allerdings weiss ich nicht wie ich die jetzt fortsetzen müsste.


----------



## javimka (20. Dez 2009)

was soll denn rauskommen?


----------



## peter1234 (20. Dez 2009)

//edit:
Ok hab die Aufgabe falsch gelesen. Hab jetzt erstmal alles was ich brauche. Es muss nur 1 Wert ausgegeben werden das erleichtert die Sache natürlich. Ich schau jetzt nochma ob ich das Programm nun zum laufen bekomme und dann kriegt ihr gleich ein dickes danke!


----------



## peter1234 (20. Dez 2009)

Das Programm zeigt jetzt nur noch einen Fehler an. Und zwar habe ich die do schleife scheinbar nicht formgerecht beendet.


Folgender Fehler kommt:
Syntax error, insert "while ( Expression ) ;" to complete DoStatement

Neuerer Code (Post:#5)
Die do schleife startet in Zeile 18 und die Fehlermeldung kommt in Zeile 54.

Wie bekomme ich nun die Schleife richtig beendet?


----------



## javimka (20. Dez 2009)

Eine do Schleife sieht so aus:

```
do {
...
} while(Bedingung)
```
Du musst hinter die schliessende Klammer also noch ein while mit einer Bedingung setzen. Solange die Bedingung true ergibt, wird die Schleife wiederholt.


----------



## eRaaaa (20. Dez 2009)

es gibt keine do schleife  es gibt nur eine do-while und genau das ist wohl dein problem, du hast das while(...); vergessen

/edit: too late


----------



## peter1234 (20. Dez 2009)

Er soll ja die Schleife nur durchlaufen wenn folgender Code 
	
	
	
	





```
int abfrage =  JOptionPane.showConfirmDialog(null, "Ja", "Nein", JOptionPane.YES_NO_OPTION);
```
 true ist.

Wie lautet dann die bedingung bei while().


----------



## javimka (20. Dez 2009)

Das ist ja keine Bedingung, sondern eine Anweisung. Eine Bedingung für die while-Klausel könnte etwas wie anfrage==1 oder anfrage!=2 oder was auch immer sein. Wenn du abfrage aber in der while-Klausel verwenden willst, musst du die Variabeln-Deklaration aus der Schleife rausnehmen, also das "int abfrage" muss raus.


----------



## peter1234 (20. Dez 2009)

Wenn ich die int abfrage rausnehme und while ( false ) setze, funktioniert das Programm. Allerdings wird bei beiden Antwortmoeglichkeiten "Yes" oder "No" nicht wiederholt.  

Wenn ich die int abfrage weiterhin drinnen lasse, und while (abfrage = JOptionPane.YES_OPTION) setze, sagt er dass abfrage nicht resolved werden kann. 

Weiß nicht was ich sonst noch machen kann.


----------



## javimka (20. Dez 2009)

```
int abfrage = 0;
do {
... Dein Code
abfrage =  JOptionPane.showConfirmDialog(null, "Ja", "Nein", JOptionPane.YES_NO_OPTION);
} while(abfrage==JOptionPane.YES_OPTION)
```


----------



## peter1234 (20. Dez 2009)

Alles klar das Programm läuft jetzt.

Danke Danke Danke vielmals für die nette Hilfe.


----------



## babuschka (20. Dez 2009)

Wollte das hier noch ein mal aufgreifen.

Verstehe den Code noch nicht.

Aufbau ist der gleiche und ich gebe dann das hier ein


```
ArrayList<Double> list = new ArrayList<Double>();
list.add(Tageskurs)
list.get(i)
Double[] array = list.toArray(new Double[list.size()]);
Double[] diff = new Double[array.length-1];
for (int i=0;i<diff.length;i++) {         
double differenz=array[i+1]-array[i];
list.add(differenz)
```

Kann mir das jemand noch mal erläutern und den Abschnitt evtl auf Fehler überprüfen?


----------



## javimka (20. Dez 2009)

Fehler/Warnungen:
Zeile 2: Tageskurs sollte nach Konvention klein geschrieben werden
Zeile 3 ist unnötig, es wird das i-te Element aus der Liste gelesen und nichts damit gemacht
Zeile 8 ist wahrscheinlich auch unnötig, weil die Differenz nicht in der Liste aufgenommen werden muss.

Der Rest macht folgendes:
Zuerst wird eine neue Liste list erstellt, die Double Elemtne aufnimmt. Was auch immer in Tageskurs gespeichert ist, wird da gleich mal reingelegt. Dann wird diese Liste in ein Double[] Array konvertiert (Zeile 4) und ein neues Array diff für die Differenzen angelegt, das einen Eintrag weniger hat. Über die Elemente von diff wird dann iteriert und jeweils die i-te Differenz ausgerechnet.


----------



## babuschka (20. Dez 2009)

Gut, vielen Dank.

Eine Sache habe ich noch. Für list.add muss ich ja import java.util.* wie heißt das genau, damit er es im Programm nicht als Fehler sieht?

Dann müsste das Programm doch eigtl folgendes machen

Ich gebe x Werte ein als den Tageskurs und gebe den Zeitraum an, für den ein Kurs prognostiziert werden soll.
Die werden alle aufgenommen, berechnet und dann soll das Programm mir den voraussichtlichen Wert ausgeben.


----------



## eRaaaa (20. Dez 2009)

fjordschritt hat gesagt.:


> Eine Sache habe ich noch. Für list.add muss ich ja import java.util.* wie heißt das genau, damit er es im Programm nicht als Fehler sieht?




```
import java.util.ArrayList;
//import java.util.List;
```

wobei import java.util.*; doch auch geht? wo ist also das problem ???:L


----------



## babuschka (20. Dez 2009)

Komisch, diesen import habe ich schon, trotzdem sagt er mir dass die method add irgendeinen Fehler besitzt. Ist rot unterkringelt.


----------



## eRaaaa (20. Dez 2009)

fjordschritt hat gesagt.:


> Komisch, diesen import habe ich schon, trotzdem sagt er mir dass die method add irgendeinen Fehler besitzt. Ist rot unterkringelt.



wenn du es genauso stehen hast wie oben genannt, dann fehlt da ein semikolon am ende  (in Z.3 und 8 übrigens auch)
desweiteren muss es die variable Tageskurs natürlich geben ?!


----------



## babuschka (20. Dez 2009)

Das ist richtig. Habe ich auch alles. Tageskurs gibt es auch!

Tut mir leid, wüsste nicht wo der Fehler jetzt liegt. Hab alles und trotzdem klappt es nicht.

Desweiteren befürchte ich, dass auch die Rechnung nicht wirklich stimmt.

Gebe ich zB 101,103,102,104,103 ein, dazu einen Zeitraum von 3 Tagen, kommt ein Anstieg von 0,5 heraus, das mit 3 multipliziert ergibt 1,5 und dass auf die letzte Eingabe addiert, müsste 104,5 ausgeben.

Wenn ich das Programm richtig verstehe wird es diese Rechnung nicht vollführen können!


----------



## eRaaaa (20. Dez 2009)

okay. also dann schauen wir uns jetzt auch nochmal das 3. programm zu dem gleichen thema an: wie sieht dein kompletter code jetzt aus?


----------



## free99 (21. Dez 2009)

Muss ich bei der Aufgabe mit array arbeiten?
Ich habe es ohne array gemacht und das Programm läuft auch!


----------



## javimka (21. Dez 2009)

Von welcher Universität seit ihr denn eigentlich? Habt ihr da kein eigenes Forum für euren Studiengang, wo man Tipps und Lösungen austauschen könnte. Wäre für euch doch viel einfacher.


----------



## free99 (21. Dez 2009)

Das ist von der TU Clausthal. Doch wir haben ein eignes Forum.


----------



## div0r (22. Dez 2009)

und es gibt Übungen und die Vorlesung sogar als Videoaufzeichnung..
und wenn mich nicht alles täuscht wurden Arrays noch gar nicht behandelt.. 

@free
Ich besuch zwar weder VL noch Übung, aber dem Skript vom letzten Jahr nach habt ihr bestimmt dieses MyScanner beispiel mit beliebig vielen Eingaben gemacht.. musste mal im Skript suchen.. vielleicht hilfts. Ansonsten ist es natürlich wirklich bequemer die Sache mit Arrays oder Vectoren zu lösen. Die erste Aufgabe mit den Büchern kannst du ohne Array / Vektor lösen, es sollen ja lediglich 3 Bücher angelegt werden.. wird zwar ne Menge code, ist aber auch viel Copy Paste.. Zum Sortieren kannst Du einen einfachen Algorithmus mit compareTo() schreiben, mehr dazu: String (Java 2 Platform SE v1.4.2))
oder auf dem Übungszettel. Danach solltest du das Ergebnis < > = 0 mit ner If Abfrage kombinieren können und dir die Reihenfolge zurecht tauschen 

Grüße


----------



## clausthalerBier (22. Dez 2009)

ja, das gibt es zwar schon, jedoch ist das Skript kein richtiges Skript sondern ein nicht nachvollziehbarer Lückentext, womit man relativ wenig anfangen kann (wenn man was sucht findet man es nicht ; und sollte man es dann doch einmal gefunden haben hat man Probleme es umzusetzen, da es nicht verständlich geschrieben ist. Die Vorlesung ist auch nicht so der Hammer. 

Ich vermute mal das deswegen auch die Mehrheit der Studenten verzweifelt versucht die Scheinaufgaben mit Hilfe externer Mittel zu lösen, weil es auf Basis der Vorlesung/Skript schlichtweg nicht möglich ist.


----------

