# Hilfe bei Aufgabe



## Coco (12. Jan 2005)

Wer könnte mir helfen! Bin am knobeln und komm grad nicht weiter bei meinem Programm!
Die Aufgabe lautet: 

Erstellen sie ein Programm, welches von der Kommandozeile Pegeldaten (Name des Pegels, Pegelstand in cm und gegebenenfalls den Namen des Flusses) einliest und die Daten ausgibt, wobei der Pegelstand in cm angegeben werden soll.
a) Erstellen sie eine öffentliche Klasse Pegel zur Aufnahme von Namen und Pegelstand des Pegels. Die Felder sollen im Konstruktor der Form public Pegel initialisiert und der Pegelstand in cm umgerechnet werden. In der Methode drucke() soll Name und Pegelstand ausgegeben werden.
b) Leiten sie von der Klasse Pegel eine öffentliche Klasse Flusspegel ab, die zusätzlich den Namen des Flusses speichert. Im Konstruktor soll zusätzlich der Name des Flusses initialisiert werden, ebenso soll zur Ausgabe aller Daten die Methode drucke() geeignet überschrieben werden.
c) Schreiben sie eine öffentliche Klasse PegelVerwaltung mit main-Methode, welche in Abhängigkeit der Anzahl der Kommandozeilenparameter eine Instanz von Pegel/Flusspegel erzeugt und die Daten auf dem Bildschirm ausgibt. Testen sie ihr Programm mit den Aufrufen java PegelVerwaltung Kelheim 2.20 und java PegelVerwaltung Passau 4.24 Donau.

Mit a und b bin ich soweit gut zurechtgekommen, nur bei c häng ich.  Kann mir jemand einen Tipp geben?????Danke

```
public class Pegel {
  public String name;
  public double Pegelstand;

  public Pegel( String name, double Pegelstand ) {
     this.name = name;
     this.Pegelstand = Pegelstand;
  }
public static double Pegelstand (double Pegelstand) {
return Pegelstand * 100;
}

public void drucke() {
 System.out.println("Name: " + name);
 System.out.println("Pegelstand: " + Pegelstand);
}

}
```


```
public class Flusspegel extends Pegel{
  private String Flussname;

public Flusspegel (String name, double Pegelstand, String Flussname){
super(name, Pegelstand);
this.Flussname=Flussname;
}
public void drucke(){
super.drucke();
System.out.println(" (Flusspegel von " + Flussname +")");
}
}
```


```
public class PegelVerwaltung {
	public static void main( String[] args) {
		Pegel[] pegelliste = {  
new Pegel ("Kelheim", 2.20, "Donau"),
new Pegel ("Passau", 4.24, "Donau")
};
for (int i = 0; i < args.length; i++)
System.out.println (args[i]); 
            
			
	}
}
```

_Edit KSG9|plak: Bitte Code-Tags (richtig) benutzen _


----------



## bellmann29 (13. Jan 2005)

Hallo, fast richtig.

Hier mal ein Vorschlag. Muß man so nicht machen, kann man aber. Also ich hab es zwar nicht getestet, aber es sollte funktionieren.


```
public class PegelVerwaltung{
  public void main(String[] args){
    Pegel pegel = null;
    int i = args.length();
    switch(i){
      case 2:
        pegel = new Pegel(args[0], args[1]);
      break;
      case 3:
        pegel = new FlussPegel(args[0], args[1], args[2]);
      break;
      default:
        System.out.println("Aufruf : java PegelVerwaltung Pegelname Pegelstand <opt> Flussname</opt>");
      }
      
      if(pegel != null){
        System.out.println(pegel.drucke());
      }else{
        System.out.println("Es wurde kein Pegel-Objekt erzeugt");
      }

      System.exit(0);
}
```

Probier es!


----------



## bellmann29 (13. Jan 2005)

Ich noch mal.

Hab die main-Methode nicht mit 
	
	
	
	





```
}
```
  abgeschlossen.

Sorry


----------



## mic_checker (13. Jan 2005)

Also a und b müssten soweit eigentlich stimmen, hab code nur überflogen.

Zur Pegelverwaltung:

Du darfst dort nicht den Konstruktor aufrufen:


```
Pegel[] pegelliste = {  new Pegel ("Kelheim", 2.20, "Donau"),
										new Pegel ("Passau", 4.24, "Donau")
									};
```

Der Compiler schaut in Pegel nach und findet diesen Konstruktor nicht.

Ich denke mal es ist so gedacht das du bei 3 Argumenten den Konstruktor aus Flusspegel aufrufst (mit den jeweiligen Argumenten), falls du nur zwei Argumente hast musst du wohl den entsprechenden Pegel-Konstruktor aufrufen.

Schätze zumindest mal das es so gedacht ist..


----------



## mic_checker (13. Jan 2005)

arg, das passiert wenn man postet und gleichzeitig chattet. post sollte eigentlich früher fertig sein...

bellmann29 hat das ganze soweit umgesetzt wie ich es ungefähr gedacht hab.



			
				bellmann29 hat gesagt.:
			
		

> Hallo, fast richtig.
> 
> Hier mal ein Vorschlag. Muß man so nicht machen, kann man aber. Also ich hab es zwar nicht getestet, aber es sollte funktionieren.
> 
> ...



Es heisst:


```
int i = args.length;
```



> ```
> switch(i){
> case 2:
> pegel = new Pegel(args[0], args[1]);
> ```


Pegel erwartet als zweites Argument double, nicht String



> ```
> break;
> case 3:
> pegel = new FlussPegel(args[0], args[1], args[2]);
> ```


Es heisst Flusspegel nicht FlussPegel...außerdem: Flusspegel erwartet ebenfalls als zweites argument ein double.



> ```
> if(pegel != null){
> System.out.println(pegel.drucke());
> ```



Das wird nicht funzen -> drucke ist vom Typ void()


----------



## bellmann29 (13. Jan 2005)

@mic

Ja, ja 

Du hast ja recht. 

@coco

Sorry, Coco war nicht mit Absicht. Aber eine IDE hätte dass sofort angezeigt. Du arbeitest sicher nicht so flüchtig wie ich.


----------



## mic_checker (13. Jan 2005)

bellmann29 hat gesagt.:
			
		

> @mic
> 
> Ja, ja
> 
> ...



natürlich =)

Ach, das sind ja noch Fehler die man schnell findet, die aber auch schnell im Eifer des Programmierens passieren können. Der Ansatz bei dem Code ist entscheidend.


----------



## bellmann29 (13. Jan 2005)

```
...
if(pegel != null){
  pegel.drucke();
}
...
```

Für die Konstruktoren:


```
...
pegel = new Pegel(arg[0], Double.parseDouble(arg[1]));
...

...
pegel = new Flusspegel(arg[0], Double.parseDouble(arg[1]), arg[2]);
...
```

@ mic

Besser so?


----------



## mic_checker (13. Jan 2005)

bellmann29 hat gesagt.:
			
		

> ```
> ...
> if(pegel != null){
> pegel.drucke();
> ...


ja



> Für die Konstruktoren:
> 
> 
> ```
> ...



Wenn du main ein Array übergibst das arg heisst ja...normalerweise heisst es ja args.
Eigentlich müsstest du noch Exceptions abfangen, falls einer z.B. für Pegelstand ausversehen "2,1" anstatt "2.1" eingibt (müsste NumberFormatException sein).

Aber so wird dein Programm noch nicht funktionieren. Der Compiler findet die Signatur der Methode main() nicht. Diese muss korrekterweise lauten:


```
public static void main(String[] args)
```

Alternativ zu deiner switch-lösung hier die gute alte if:


```
if(args.length == 2)
	   	pegel = new Pegel(args[0], Double.parseDouble(args[1]));
		else if(args.length == 3)
			pegel = new Flusspegel(args[0], Double.parseDouble(args[1]), args[2]);
		else
			System.out.println("Aufruf : java PegelVerwaltung Pegelname Pegelstand <opt> Flussname</opt>");
```

müsste eigentlich stimmen.

greets
mic_checker


----------



## bellmann29 (13. Jan 2005)

Man, wo war ich gestern bloß mit meinen Gedanken, als ich diesen Mist verzapft habe?


----------



## Coco (13. Jan 2005)

Lieben Dank ihr Zwei! Hab´s ausprobiert, funktioniert so .


----------



## mic_checker (13. Jan 2005)

Hi,
kein Problem.

Evtl. wäre es auch sinnvoll noch eine toString() Methode einzufügen, dort könntest du evtl. den Code von drucke() verwenden....


----------

