# Problem Methoden, Klassen, Listen



## Copy (1. Jun 2009)

Hallo

Ich habe ein (Verständniss)Problem in der Sprache Java. Diesmal geht es um Klassen, Listen und Methoden.

Ich soll folgendes Programm umschreiben, damit es mit Klassen, Listen und Methoden arbeitet.

Code fertiges erstes Programm.


```
import java.util.Scanner;
public class StrassenAbrechnung 
{
 /**
  * A = (a+c)/2 *h    (h = länge [station], a und c straßenbreiten)
  * @param args
  */
 public static void main(String[] args)
 {
  int station = 1, statalt = 1;
  double volumen;  
  double flaeche = 0;
    double breite = 0, laenge = 0, alte_breite = 0, 
           alte_laenge = 0, neue_breite = 0, neue_laenge = 0; 
    Scanner sc = new Scanner(System.in); 
    System.out.print("Eingabe Sollbreite der Straße : "); 
    double sollbreite = sc.nextDouble(); 
    System.out.println(); 
    System.out.print("Eingabe Straßendicke : "); 
    double strassendicke = sc.nextDouble(); 
    while (station >= 0) 
      {   
     System.out.println("Stationsnummer eingeben : ");
     statalt = station;
     station = sc.nextInt();
     if (station < 0)
      break;
     System.out.println("Breite der Straße [m] an dieser Station : "); 
     alte_breite = neue_breite;
     neue_breite = sc.nextDouble();
     if (neue_breite > 6.00)
     {
      neue_breite = sollbreite;
     }
     System.out.println("Streckenlange [m] an dieser Station : ");
     alte_laenge = neue_laenge;
     neue_laenge = sc.nextDouble();
     if (station != statalt)
     {
      laenge = neue_laenge - alte_laenge;
      flaeche = flaeche + (neue_breite + alte_breite) / 2 * laenge;
     }
      } /*end of while */
    volumen = flaeche * strassendicke;
    System.out.println("Gesamtfläche beträgt : " + flaeche);
    System.out.println("Gesamtvolumen beträgt : " + volumen);
    System.out.print("Kosten für Bitumen [€/m³] : ");
    double kosten = sc.nextDouble();
    kosten = volumen * kosten;
    System.out.println("Die Kosten für die Straße betragen : " + kosten);
 }
}
```

Das soll damit gemacht werden:

3. Klasse Station 
• Erstellen Sie eine Klasse StationsPunkt mit den Attributen station und breite (beide vom Da-
tentyp „double“). 
4. Klasse Strasse 
• Erstellen Sie eine Klasse Strasse. Diese Klasse soll folgende Attribute haben: 
Eine Liste m_stationen für den Datentyp StationsPunkt. 
Ein Attribut m_dicke mit dem Datentyp double. 
• Weiterhin soll die Klasse folgende Methoden haben: 
void addStation( StationsPunkt s ) Diese Methode soll die übergebene Station in die 
Liste eintragen. 
double getFlaeche() Diese Methode soll die Gesamtfläche der Straße berechnen 
und zurückgeben. 
double getVolumen() Diese Methode soll das Gesamtvolumen der Straße berech-
nen und zurückgeben. 
Get-Methoden für das Attribut m_stationen. 
Get-und Set-Methoden für das Attribut m_dicke. 

 Erstellen des Hauptprogramms 
• Erstellen Sie eine Klasse StrassenBerechnung mit main-Methode. Darin soll ein Objekt vom Typ 
Strasse erzeugt werden. 
• Dann soll in einer while-Schleife in jedem Durchlauf ein Objekt vom Typ StationsPunkt erzeugt 
werden. Station und Breite sollen eingelesen und dem Objekt zugewiesen werden. Das Objekt soll 
dann an das Strasse-Objekt übergeben werden. Die Schleife soll solange wiederholt werden, bis 
eine negative Zahl für die Station eingegeben wird. 
• Lesen Sie mittels eines Scanner-Objektes die Dicke [m] ein und übergeben diesen Wert and das 
Strasse-Objekt. 
• Lesen Sie mittels eines Scanner-Objektes die Kosten [€/m³] ein und speichern diesen Wert in einer 
Variablen. 
• Berechnen Sie die Kosten der Straße und geben Sie diese am Bildschirm aus.

 Klasse StationPunkt:


```
public class StationsPunkt
{
  double station, breite;
}
```

Klasse Strassen:


```
import java.util.ArrayList;
public class Strassen
{
  double m_dicke;
  void addStation(StationsPunkt s)
  {
  }
  double getFlaeche()
  {
  }
  double getVolumen()
  {
  }
```

Hier wird alles mit get rot unterstrichen und mit den Get und Set-Methoden habe ich vorher noch nie gearbeitet und kam auch noch in keiner Vorlesung bzw Übung dran.
Hauptprogramm:

```
public class StrassenBerechnung
{
  public static void main (String[] args)
  {
    Strasse strasse = new Strasse();
    while (station >=1)
    {
```
Da schon bin ich mit meinem Latein am Ende.
Das mit dem gesamtkosten und bekomm ich hin. Sollbreite ist dieses mal auch egal, also fällt schonmal eine If-Anweisung weg.
Ich hoffe ihr könnt mir helfen.
MfG


----------



## SlaterB (1. Jun 2009)

> Hier wird alles mit get rot unterstrichen und mit den Get und Set-Methoden habe ich vorher noch nie gearbeitet und kam auch noch in keiner Vorlesung bzw Übung dran.

ohne Grundkenntnisse braucht man solche Aufgaben nicht angehen, 
wieviel davon in der Vorlesung drankam bzw. verschlafen wurde brauchen wir gar nicht diskutieren,
es steht alles groß und breit in Lehrbüchern,

du musst erstmal 100 Seiten durchlesen, dann hast du ein Grundverständnis der benötigten Bausteine und diverse Beispiele, auch für getter + setter,
siehe z.B. 
Galileo Computing :: Java ist auch eine Insel (8. Auflage)
Kapitel 6, da wird eine Klasse Player mit Methode setName() geschrieben und kommentiert,

idealerweise alle Kapitel 1-6 kennenlernen


----------



## Copy (1. Jun 2009)

Die Grundlagen beherrsche ich zum Teil. Es geht mir nur darum, wie ich das verknüpfen soll.
Verschlafen habe ich in der Vorlesung nichts 

Nach dem Link, müsste ich also bei
getFlaeche den Wert Flaeche zurückgeben und zwar so:

```
double getFlaeche()
{
return flaeche
}
```
Wobei hier flaeche = seite_a * seite_b sein kann oder?
also anstatt einfach flaeche als rückegabewert die Funktion zur flächenberechnung. Würde das gehen?
Das mit dem Set habe ich nicht ganz verstanden.


----------



## SlaterB (1. Jun 2009)

was meinst du mit Set? eine Klasse Set (sowas ähnliches wie List) brauchst du nicht,
wenn du die set-Methode für m_dicke meinst, dann ist das jetzt aber wirklich wie setName() in dem Beispiel in dem Buch,

getFlaeche ist ja etwas anders, das hast du korrekt erkannt,
da musst du aus der Liste der Stationspunkte, die derzeit noch fehlt, die Fläche berechnen, ziemlich kompliziert,
male dir das auf Papier als ein Beispiel auf,
eine Ansammlung von Trapezen, denke ich


----------



## Copy (1. Jun 2009)

Das bild habe ich vorgegeben. Das was ich jetzt machen soll ich Teil 2 der Aufgabe. Teil 1 hatte ich komplett fertig und richtig gemacht (Verteidigung mit Übungsleiter war Abnahme)
Vielleicht kommt ja morgen in der Vorlesung endlich was dazu dran


----------



## Copy (1. Jun 2009)

Könntest du mir helfen bei der Liste mit den Stationspunkten? Ich weiß nicht genau wie ich das machen soll und das Buch hilft mir auch nicht wirklich weiter.
für die breite brauche ich ja eine liste und für die stationen eigtl auch
wenn die formel für die flächenberechnung so ist:
A = (alte_breite + neue_breite) / 2 * länge
brauche ich für breite eine liste, wobei die liste bei alter breite den alten wert annimmt damit das richtige ergebniss rauskommt
und die länge braucht ne liste für die einzelnen stationen wo man die neue station - alte station rechnet, damit man auf die rictige länge kommt.
Wie ich das mit listen bewerkstelligen soll, habe ich keine Ahnung


----------



## SlaterB (1. Jun 2009)

du brauchst genau eine Liste, in welcher die Station-Objekte drin sind,
wenn das fertig ist, kann man über weiteres reden, nicht gleichzeitig schon intensiv über die Fläche nachdenken


----------



## Copy (1. Jun 2009)

Ich brauche ja diese Methode
void addStation( StationsPunkt s )
Rückgabewert exisitert bei Void ja nicht (glaub ich) 
die liste müsste vom Wert Double sein, damit man auch Teilstrecken von 15.45 Metern hineinschreiben kann.
Die Lsite müsste also so ungefähr aussehen:
	
	
	
	





```
ArrayList<Double> liste = new ArrayList<Double>();
```
Aber wie pack ich das dann rein, wenn mein Scanner sc heißt?
VARIABLE = sc.nextDouble();
muss es dann
liste.add(VARIABLE = sc.netDouble()); sein? 
bin gerade sehr verwirrt


----------



## SlaterB (1. Jun 2009)

in der Liste speicherst du die Stationen,
lösche aus deinem Kopf die Idee, Double in einer Liste zu speichern

Vergleichsbeispiel:
eine Bibliothek braucht auch nur eine Liste von Büchern,
wenn man die Seitenzahl pro Buch summieren will, dann nimmt man sich später alle Bücher aus der Liste und fragt deren jeweilige Seitenzahl ab,
eine separate Liste nur der Seitenzahlen ist nicht nötig


----------



## Copy (1. Jun 2009)

Ahja ok 
Aber wie soll ich das dann realisieren, wenn Double-Werte in die Liste gespeichert werden müssen, wiel eine Strecke muss ja nicht unbedingt immer ganzzahlig sein


----------



## SlaterB (1. Jun 2009)

den double speicherst du in der Station, die Station in der Liste, was ist daran so unverständlich?


----------



## Copy (1. Jun 2009)

Alles?
Also soll ich zuerst die Station einlesen
Station = sc.nextDouble();
und dann die Station an die liste übertragen so:
add.liste(Station) ???
Wenn es jetzt immernoch falsch ist, dann zeige mir bitte mal Code wie du das meinst


----------



## SlaterB (1. Jun 2009)

du musst schon double einlesen, aber die double kannst du dann in einem Station-Objekt speichern


----------



## Copy (1. Jun 2009)

ich lasse es ja als double einlesen ( sc.nextDouble(); )
und speichern im Station-Objekt ?
also z.B.
station.Station = station;
so?


----------



## SlaterB (1. Jun 2009)

ein Befehl
station.Station = station;
ist ausgeschlossen, denn du kannst nicht gleichzeitig eine double-Variable station haben als auch eine Stationsobjekt-Variable mit Namen station, 
zudem ist das Attribut station in Stationsobjekt kleingeschrieben,

im Grunde aber in etwa so, ja 
schöne wäre noch eine set-Methode:

stationsobjekt.setStation(eingelesenerDouble);


----------



## Copy (1. Jun 2009)

Ok diesen Befehl habe ich vorher noch nie gesehen.
Trotzdem danke


----------



## Copy (2. Jun 2009)

Ok bin nun viel weiter, nachdem ich gelernt habe ^^
Hier meine klasse Strassen:

```
public class Strasse 
{
	double m_station;
	public double m_dicke;
	ArrayList<StationsPunkt> StationsPunkt = new ArrayList<StationsPunkt>();	
	public double getM_dicke() 
	{
		return m_dicke;
	}
	public void setM_dicke(double m_dicke) 
	{
		this.m_dicke = m_dicke;
	}	
	void addStation (StationsPunkt punkt)
	{
		StationsPunkt.add(punkt);
	}
	double getFlaeche()
	{
		double flaeche = 0;
		//flaeche = flaeche + 
		//flaeche = flaeche + (neue_breite + alte_breite) / 2 * laenge;
		return flaeche;
	}
	double getVolumen()
	{
		double volumen = 0;
		return volumen;
	}
	public double getM_station() 
	{
		return m_station;
	}
}
```
und hier mein hauptprogramm soweit es bisher fertig ist:

```
import java.util.Scanner;
public class StrassenBerechnung 
{
	public static void main(String[] args) 
	{
		double dicke, kosten;
		Strasse strasse = new Strasse();
		Scanner sc = new Scanner(System.in);
		while(true)
		{
			StationsPunkt punkt = new StationsPunkt();
			punkt.station = sc.nextDouble();
			if (punkt.station < 0)
				break;
			punkt.breite = sc.nextDouble();
			strasse.addStation(punkt);
			
		}
		System.out.println("Eingabe Straßendicke  : ");	
		dicke = sc.nextDouble();
		System.out.println("Eingabe Kosten [€/m³] : ");
		kosten = sc.nextDouble();
	}
}
```
Könnt ihr mir bei der Fläche helfen?  Habe da keine Ahnung wie ich das machen soll...
Thx


----------



## SlaterB (2. Jun 2009)

> Eine Liste m_stationen für den Datentyp StationsPunkt. 

> ArrayList<StationsPunkt> StationsPunkt = new ArrayList<StationsPunkt>();

Variablen immer klein schreiben und generell möglichst nie wie Klassennamen nennen
(String string = "test" klingt auch nicht schön)

-----

nun solltest du doch wieder erstmal in einem separaten neuen Programm eine ArrayList<Double> ausprobieren
(nein, das heißt nicht, dass du auch in deinem Programm eine ArrayList<Double> bauchst!)

erstelle eine solche Liste, fülle sie mit 5 Double und addiere diese in einer Schleife,
bekommst du das soweit hin?
wenn nicht
Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 12 Datenstrukturen und Algorithmen

wenn doch, dann erstelle dir als nächstes genau zwei Stationsobjekte, keine Liste und auch keine Benutzereingaben, falls du das nicht bei jedem Test neu eintippen möchtest,
sondern in der main-Methode konkrete Test-Daten vorgeben

diese beiden Stationsobjekte haben nun einen Abstand und unterschiedliche Breite,
dazu musst du die Fläche ausrechnen, eine überwiegend mathematische Aufgabe, male sie dir auf Papier auf,


wenn das geschafft ist, muss die letztlich die Liste der Stationsobjekte durchlaufen und zwischen je zwei die Fläche berechnen + aufaddieren


----------



## Copy (2. Jun 2009)

Ich soll es aber leider so machen -.-
Double in einer Liste? das geht doch gar nicht... (siehe dein Beitrag weiter oben)

man soll aber solange eingeben, bis für station ein negativer Wert eingegeben wird.
ICh habe es ja vorgegeben wie es aussieht, nur ich habe keine Ahnung wie ich das mit den Flächen machen soll, da alle Werte in der verdammten Liste drin sind. 

EDIT: nein das mit liste und addieren in einer schleife bekomm ich nicht hin. sonst würde ich ja nicht fragen


----------



## SlaterB (2. Jun 2009)

Copy hat gesagt.:


> Double in einer Liste? das geht doch gar nicht... (siehe dein Beitrag weiter oben)


ich habe doch extra darauf hingewiesen, dass es nun um ein ganz anderes Übungsprogramm geht..


Copy hat gesagt.:


> Ich soll es aber leider so machen -.-


verbietet nicht, andere Testprogramme komfortabel zu gestalten



> EDIT: nein das mit liste und addieren in einer schleife bekomm ich nicht hin. sonst würde ich ja nicht fragen


tja, immerhin: in dem Fall musst du über so komplizierte Dinge wie List<StationsObjekt> gar nicht erst nachdenken

siehe Buch-Link, oder auch
java schleife arraylist beispiele - Google-Suche


----------



## Copy (2. Jun 2009)

Ahja...
Danke für die Hilfe, auch wenn sie mich nicht weiter bringt ^^


----------



## Landei (2. Jun 2009)

Copy hat gesagt.:


> Ich soll es aber leider so machen -.-
> Double in einer Liste? das geht doch gar nicht... (siehe dein Beitrag weiter oben)
> 
> man soll aber solange eingeben, bis für station ein negativer Wert eingegeben wird.
> ...






```
public class DingsBums {
   //im richtigen Leben gibt es Getter, Setter und Konstruktoren, aber na ja...
   public double tollerWert;  
}

public class Test {
   static List<DingsBums> liste = new ArrayList<DingsBums>();

   static double einlesen() {
     //das Einlesen kannst du ja schon selber...
      return Math.random() - 0.0001; 
   }

   public static void main(String[] args) {
        boolean einlesenFertig =  false;
        while(! einlesenFertig) {
            double einWert = einlesen();
            if (einWert < 0) {
                 einlesenFertig == true;
            } else {
                DingsBums dingsBums = new DingsBums();
                dingsBums.tollerWert = einWert;
                liste.add(dingsBums);
            }  
        }

        //summieren
        double summe = null;
        for(DingsBums dingsBums : liste) {
             summe = summe + dingsBums.tollerWert; //oder kürzer: summe += dingsBums.tollerWert;
        }
        System.out.println("Summe von ganz tollen Werten: " + summe);  
   }
}
```

Und ja, ich habe es absichtlich anders benannt.


----------



## Copy (3. Jun 2009)

Ok bin wieder ein Stückchen weiter.
Trotzdem hängt es immernoch an der Fläche.
Klasse Stations.Punkt

```
import java.util.ArrayList;

public class StationsPunkt 
{
	public double station,breite;
}
```
Klasse Strasse

```
import java.util.ArrayList;
public class Strasse 
{
	double m_station;
	public double m_dicke;
	ArrayList<StationsPunkt> StationsPunkt = new ArrayList<StationsPunkt>();	
	public double getM_dicke() 
	{
		return m_dicke;
	}
	public void setM_dicke(double m_dicke) 
	{
		this.m_dicke = m_dicke;
	}	
	void addStation (StationsPunkt punkt)
	{
		StationsPunkt.add(punkt);
	}
	double getFlaeche()
	{
		double einzelflaeche, flaeche = 0;
		//flaeche = flaeche + 
		//flaeche = flaeche + (neue_breite + alte_breite) / 2 * laenge;
		for (int i = 1; i < StationsPunkt.size(); ++i) 
		{
			StationsPunkt p0 = StationsPunkt.get(i-1);
			StationsPunkt p1 = StationsPunkt.get(i);
			einzelflaeche = ((p1) - (p0)) *( (p0)+ (p1)) /  2;
			flaeche += einzelflaeche;
		} 

		return flaeche;
	}
	double getVolumen()
	{
		double volumen = 0;
		return volumen;
	}
	public double getM_station() 
	{
		return m_station;
	}
}
```
und zum Schluss Klasse StrassenBerechnung

```
import java.util.Scanner;
public class StrassenBerechnung 
{
	public static void main(String[] args) 
	{
		double dicke, kosten;
		Strasse strasse = new Strasse();
		Scanner sc = new Scanner(System.in);
		while(true)
		{
			StationsPunkt punkt = new StationsPunkt();
			punkt.station = sc.nextDouble();
			if (punkt.station < 0)
				break;
			punkt.breite = sc.nextDouble();
			strasse.addStation(punkt);
			
		}
		System.out.println("Gesamtflaech = "+strasse.getFlaeche());
		System.out.println("Eingabe Straßendicke  : ");	
		dicke = sc.nextDouble();
		System.out.println("Eingabe Kosten [€/m³] : ");
		kosten = sc.nextDouble();
		System.out.println("Gesamtvolumen = "+strasse.getVolumen());
		kosten = kosten * strasse.getVolumen();
		System.out.println("Gesamtkosten = "+kosten+" Euro");
	}
}
```
mein Problem liegt hier:

```
double getFlaeche()
	{
		double einzelflaeche, flaeche = 0;
		//flaeche = flaeche + 
		//flaeche = flaeche + (neue_breite + alte_breite) / 2 * laenge;
		for (int i = 1; i < StationsPunkt.size(); ++i) 
		{
			StationsPunkt p0 = StationsPunkt.get(i-1);
			StationsPunkt p1 = StationsPunkt.get(i);
			einzelflaeche = ((p1) - (p0)) *( (p0)+ (p1)) /  2;
			flaeche += einzelflaeche;
		} 

		return flaeche;
```
Da wird immer das gesagt: "The operator - is undefined for the argument type(s) belegTeilB.StationsPunkt, belegTeilB.StationsPunkt"
und das: "The operator + is undefined for the argument type(s) belegTeilB.StationsPunkt, belegTeilB.StationsPunkt"
Demzufolge sind die nicht definiert, aber wie mache ich das, dass es definiert ist? Vom logisch aus betrachtet würde es funktionieren, aber der will das mit der Fläche nicht machen


----------



## SlaterB (3. Jun 2009)

du musst auf die doube-Variablen in Stationspunkt zugreifen, davon gibts ja auch mehrere verschiedene

StationsPunkt p0 = StationsPunkt.get(i-1);
StationsPunkt p1 = StationsPunkt.get(i);
double laenge = p0.station - p1.station; // das Attribut breite ist dagegen für die Längenberechnung irrelevant

ist das wirklich derart fremd?
erstaunliche Einstellung

-----


ich erinnere noch mal



SlaterB hat gesagt.:


> > Eine Liste m_stationen für den Datentyp StationsPunkt.
> 
> > ArrayList<StationsPunkt> StationsPunkt = new ArrayList<StationsPunkt>();
> 
> ...


----------



## Landei (3. Jun 2009)

Nenn deine Liste bitte stationsPunkt*e* oder so (es sind ja auch _mehrere_ Punkte), eine Variable groß und dann auch noch _exakt so wie eine Klasse_ zu nennen, verwirrt total.


----------



## Copy (3. Jun 2009)

Ich muss mich leider an die Vorgaben halten.
Habe es dann aber doch geschafft!

```
for (int i = 1; i < liste.size(); ++i) {
         StationsPunkt p0 = StationsPunkt.get(i-1);
         StationsPunkt p1 = Stationspunkt.get(i);
         einzelflaeche = (p1.station - p0.station) *(( p0.breite+p1.breite)/2);
         flaeche += einzelflaeche;
 }
```

Und verstanden habe ich es auch 
Vielen Dank für eure Hilfe


----------



## SlaterB (3. Jun 2009)

Copy hat gesagt.:


> Ich muss mich leider an die Vorgaben halten.


Spassvogel,

die Vorgabe lautet
> Eine Liste m_stationen für den Datentyp StationsPunkt. 

oder steht da etwa
"Eine Liste StationsPunkt für den Datentyp StationsPunkt. "?


----------



## Copy (5. Jun 2009)

ist doch egal jetzt. bin fertig und es funzt


----------

