# Name und Alter von Personen ausgeben (Aufgabe)



## Lestas89 (26. Apr 2016)

Ich muss folgende Aufgabe lösen (Siehe Bild).

Den ersten Part hab ich schon geschafft: Mit Dialogboxen nacheinander Namen und Alter einlesen bis ein leerer Name eingegeben wird. Der Code:


```
import javax.swing.JOptionPane;
class NameUndAlter{
    public static void main(String []args){
   
    String name = "";
    String alter = "";
   
    int zahl1 = 0;
   
    while(true){
   
    name = JOptionPane.showInputDialog("Geben Sie einen Namen ein:");
   
    if(name.equals("")){   
    break;
    }
   
    alter = JOptionPane.showInputDialog("Geben Sie das Alter ein:");
    zahl1 = Integer.parseInt(alter);
   
    }
   
    }
}
```

Jetzt soll ich den Namen der ältesten Person ausgeben. Wie mach ich das? Gibt es dafür eine eigene Methode?

Ich danke im Voraus!


----------



## lam_tr (26. Apr 2016)

Dann ist es wohl sinnvoll zuerst ein Objekt für die Person zu machen mit den Attributen Name und Alter.

Dann packst du die Eingaben der Personen in eine Liste.

Und über Collectsions#sort oder auch seit Java 8 gibt es Streams kannst du über filter Predicate den ältesten herausfinden.

Oder du kannst über die For Schleife alle Personen iterieren und der mit der Älteste bestimmen.


----------



## Lestas89 (26. Apr 2016)

Hallo lam_tr,

Mit Objekten haben wir noch nicht gearbeitet und mit Listen auch nicht. Gibt es nicht eine andere Möglichkeit die Aufgabe zu lösen?

Wie meinst du das mit der for-Schleife?


----------



## Elenteria (26. Apr 2016)

Bau dir eine Klasse Person mit den Attributen name und alter. Füge die Eingegebenen Personen dann einer Liste hinzu. Suche dann in der Liste nach dem größten Wert, merk dir den und gib ihn am Ende aus.


----------



## lam_tr (26. Apr 2016)

Hallo Lestas89,

habt ihr Array schon besprochen?
Falls ja benötigst du zwei Arrays die die Namen und das Alter merkt.

Jedes mal wenn du die Eingabe machst, sollen die Werte in die zwei Arrays gespeichert werden.

Und für die Eingabe würde ich eine While Schleife benutzen bis keine Eingabe mehr eingegeben wird.


----------



## Joose (26. Apr 2016)

Die Lösung ohne Array/Liste bzw. ohne eigener Person Klasse:

Speichere dir den Namen der zuletzt eingegeben Person und ihr Alter in extra Variablen.
Wenn du weitere Personen einliest, dann überprüfst du ob diese Person älter ist oder nicht. Wenn älter ersetzt du die Werte dieser Variablen.
Nach der Schleife gibst du einfach den Namen aus.


----------



## lam_tr (26. Apr 2016)

Hallo Lestas89,

ja die lösung von joose ist die einfachste ohne Datenstrucktur.


----------



## Lestas89 (26. Apr 2016)

Danke für die zahlreichen Antworten!

@Joose : Wie mach ich das genau?
"Speichere dir den Namen der zuletzt eingegeben Person und ihr Alter in extra Variablen."


----------



## lam_tr (26. Apr 2016)

ich würd sagen du machst tempName, tempAlter und weist die EingabeWerte da zu.

Überprüfst dann tempAlter mit dem vorhergespeicherten alter, wenn es größer ist, dann überschreibst du alter.


----------



## Joose (26. Apr 2016)

Du hast in dem aktuellen Code (vom 1.Post) eine Variable für den Namen und eine für das Alter, welches von dir eingelesen wird.
Zusätzlich zu diesen beiden Variablen deklarierst du nochmals Variablen (wieder für Name und Alter) und gibst diesen einen entsprechenden Namen.
In deiner Schleife musst du dann eben die Überprüfung einbauen.


----------



## Lestas89 (26. Apr 2016)

Hallo Joose,

meinst du das in etwa so?


```
import javax.swing.JOptionPane;
class NameUndAlter{
    public static void main(String []args){
   
    String name = "";
    String alter = "";
   
    String tempName = "";
    String tempAlter = "";
   
    int zahl1 = 0;
    int zahl2 = 0;
   
    while(true){
   
    name = JOptionPane.showInputDialog("Geben Sie einen Namen ein:");
   
   
    if(name.equals("")){   
    break;
    }
   
    alter = JOptionPane.showInputDialog("Geben Sie das Alter ein:");
    zahl1 = Integer.parseInt(alter);
   
    tempName = JOptionPane.showInputDialog("Geben Sie einen Namen ein:");
   
    if(tempName.equals("")){   
    break;
    }
   
    tempAlter = JOptionPane.showInputDialog("Geben Sie das Alter ein:");
    zahl2 = Integer.parseInt(tempAlter);
   
    }
   
    }
}
```


----------



## lam_tr (26. Apr 2016)

Hallo Lestas89,

mit der while Schleife meinte ich eher


```
while(!name.equals("")){
   // Werte speichern
}
[code]
```


----------



## Lestas89 (26. Apr 2016)

Jetzt versteh ich garnichts mehr. Kannst du meinen Code mal für den Anfang so verändern, dass ich damit fortsetzen kann? Ich weiß gerade nicht was ich tun muss.


----------



## Lestas89 (26. Apr 2016)

Ich habe das nun so gemacht: Ist das richtig?


```
import javax.swing.JOptionPane;
class NameUndAlter {
  public static void main(String []args) {   
     String name = "";
     String alter = "";
     String ausgabe = "";
     
     String tempName = "";
     String tempAlter = "";
     
     int zahl1 = 0;
     int zahl2 = 0;
     
     while(true) {   
       name = JOptionPane.showInputDialog("Geben Sie einen Namen ein:");
       if(name.equals("")){  
         break;
       }       
       alter = JOptionPane.showInputDialog("Geben Sie das Alter ein:");
       zahl1 = Integer.parseInt(alter);
       
       tempName = JOptionPane.showInputDialog("Geben Sie einen Namen ein:");
       
       if(tempName.equals("")){  
         break;
       }       
       tempAlter = JOptionPane.showInputDialog("Geben Sie das Alter ein:");
       zahl2 = Integer.parseInt(tempAlter);     
     }
     
     if(zahl1 > zahl2){
       ausgabe += name;
     } else {
       ausgabe += tempName;
     }     
     JOptionPane.showMessageDialog(null, ausgabe);   
  }
}
```


----------



## lam_tr (26. Apr 2016)

Hi, ist nicht ganz perfekt aber ich würde so vorgehen


```
import javax.swing.JOptionPane;

class NameUndAlter {
   public static void main(String[] args) {
     String name = "";
     int alter = 0;
     String tempName = "initial";
     int tempAlter = 0;

     while (!tempName.equals("")) {
       tempName = JOptionPane.showInputDialog("Geben Sie einen Namen ein:");
       tempAlter = Integer.parseInt(JOptionPane.showInputDialog("Geben Sie das Alter ein:"));
       if(!tempName.equals(name) && alter<tempAlter) {
       }
     }
     System.out.println("Alter: "+alter);
   }
}
```


----------



## Lestas89 (26. Apr 2016)

Hallo lam_tr,

ich habe oben meinen Code geposted. Könntest du kurz drüber schauen ob man das auch so machen kann?


----------



## lam_tr (26. Apr 2016)

Was passiert denn wenn du ausführst, ich denke das ist etwas komplizierter weil du zwei abfragen in einer Iteration machst.


----------



## Lestas89 (26. Apr 2016)

Was bei meinem Code das Problem ist, dass die Namen überschrieben werden, ist das denn normal?
Und zu deinem Code hätte ich auch noch eine Frage:

int alter wird bei dir garnicht per Dialogbox ein Wert zugewiesen. Wie soll das genau funktionieren?


----------



## Joose (26. Apr 2016)

So hier mal etwas Pseudocode:

```
var name
var alter

var tmpName
var tmpAlter

do {
   name = liesName();
   alter = liesAlter();
  
   if(??????) { // diese bedingung muss noch formuliert werden
     tmpName = name;
     tmpAlter = alter;
   }
} while(name nicht leer)

print name;
```

Ich würde eine do/while Schleife verwenden da diese Abfragen nach Name und Alter min 1x ausgeführt werden, außerdem ist ein `while(true)` eine schlechte Wahl. Lieber immer eine Abbruchbedingung definieren.


----------



## Lestas89 (26. Apr 2016)

Hallo Joose,

danke für deinen Pseudo-Code und das du mir auf die Sprünge helfen willst, leider versteh ich deinen Code nicht so richtig. Was genau sind die leeren Klammern bei liesName und liesAlter?


----------



## Joose (26. Apr 2016)

Das soll nur den Aufruf von Code darstellen welcher den Namen bzw. das Alter einliest. Wie schon gesagt Pseudocode: kein richtiger Code, dient nur zur Veranschauchlichung


----------



## Lestas89 (26. Apr 2016)

Okay, Joose. Ich versuche deinen Pseudocode dann Schritt für Schritt in einen richtigen Code umzuwandeln.
Ist bis hierhin schonmal alles richtig?


```
import javax.swing.JOptionPane;
class NameUndAlter2 {
    public static void main(String[] args) {

    String name = "";
    String alter = "";
    String ausgabe = "";
   
    String tmpName = "";
    String tmpAlter = "";
   
    do{
    name = JOptionPane.showInputDialog("Geben Sie einen Namen ein:");
    alter = JOptionPane.showInputDialog("Geben Sie das Alter ein:");
   
   
   
   
    }while(!name.equals(""))
   
    JOptionPane.showMessageDialog(null, ausgabe);
   
    }
}
```


----------



## Lestas89 (26. Apr 2016)

Schön, dass dir mein Beitrag gefällt . Das schien also richtig zu sein. Ich brauche nun einen kleinen Denkanstoß für die if-Bedingung. Wie muss die genau aussehen? Einen kleinen Tipp vielleicht?


```
import javax.swing.JOptionPane;
class NameUndAlter2 {
    public static void main(String[] args) {

    String name = "";
    int alter = 0;
    String ausgabe = "";
  
  
    int zahltmpalter = 0;
    String tmpName = "";
    String tmpAlter = "";
  
    do{
    name = JOptionPane.showInputDialog("Geben Sie einen Namen ein:");
    alter = Integer.parseInt(JOptionPane.showInputDialog("Geben Sie das Alter ein:"));
  
      if(??????) {
     tmpName = name;
     tmpAlter = alter;
   }
  
  
    }while(!name.equals(""));
  
    JOptionPane.showMessageDialog(null, ausgabe);
  
    }
}
```


----------



## Joose (26. Apr 2016)

Lestas89 hat gesagt.:


> Ich brauche nun einen kleinen Denkanstoß für die if-Bedingung. Wie muss die genau aussehen? Einen kleinen Tipp vielleicht?


Mein Tipp:


Joose hat gesagt.:


> Wenn du weitere Personen einliest, dann überprüfst du ob diese Person älter ist oder nicht. Wenn älter ersetzt du die Werte dieser Variablen.



Frage: Warum ist `alter` zwar ein int, aber `tmpAlter` ein String?


----------



## Lestas89 (26. Apr 2016)

Das mit tmpAlter ist mein Fehler, danke für deinen Hinweis! Aber wie soll ich den Vergleich durchführen, wenn ich vorher in tmpName und tmpAlter garkeine Werte eingetragen habe?


----------



## Joose (26. Apr 2016)

Dann überlege dir doch logische und passende Startwerte


----------



## Lestas89 (26. Apr 2016)

Ich dachte das wäre so richtig, es funktioniert aber nicht:


```
import javax.swing.JOptionPane;
class NameUndAlter2 {
    public static void main(String[] args) {

    String name = "";
    int alter = 0;
    String ausgabe = "";
   
    String tmpName = "";
    int tmpAlter = 0;
   
    do{
    name = JOptionPane.showInputDialog("Geben Sie einen Namen ein:");
    alter = Integer.parseInt(JOptionPane.showInputDialog("Geben Sie das Alter ein:"));
   
      if(tmpAlter > alter) {
        ausgabe = tmpName;
       
        tmpName = name;
        tmpAlter = alter;
   } else {
        ausgabe = name;
  
   }
   
   
    }while(!name.equals(""));
   
    JOptionPane.showMessageDialog(null, ausgabe);
   
    }
}
```

was muss ich verändern?


----------



## Joose (26. Apr 2016)

Lestas89 hat gesagt.:


> Ich dachte das wäre so richtig, es funktioniert aber nicht:


Funktioniert nicht ist keine Fehlerbeschreibung!
Was passiert? Was sollte passieren? Fliegt eine Exception? Wenn ja, welche?


```
if(tmpAlter > alter) {
  ausgabe = tmpName;
   
  tmpName = name;
  tmpAlter = alter;
  } else {
  ausgabe = name;
  }
```

Schau dir deine Bedingung nochmal an und überlege dir ob sie so stimmen kann.
Sag dir laut vor was verglichen wird. Verwende den Debugger, damit du an dieser Stelle auch siehst was verglichen wird wenn du es testest.


----------



## Lestas89 (26. Apr 2016)

Was ist ein Debugger? Sorry für diese Anfängerfrage aber sowas besitze ich leider nicht 
Es kommt keine Ausgabe, sondern ein Fehler NumberFormatException.forInputString.

Kannst du mir vllt noch einen kleinen Tipp geben für die if-Bedingung?


----------



## Joose (26. Apr 2016)

Lestas89 hat gesagt.:


> Was ist ein Debugger?


https://de.wikipedia.org/wiki/Debugger
Ist bei einer IDE für gewöhnlich dabei, solltest du keine IDE verwenden wäre es sehr ratsam auf eine umzusteigen.



Lestas89 hat gesagt.:


> Es kommt keine Ausgabe, sondern ein Fehler NumberFormatException.forInputString.


Dann versuchst du etwas was keine Zahl ist in eine Zahl umzuwandeln.



Lestas89 hat gesagt.:


> Kannst du mir vllt noch einen kleinen Tipp geben für die if-Bedingung?


Meine Tipps stehen oben, weitere sollte es eigentlich nicht brauchen.


----------



## Lestas89 (26. Apr 2016)

Könnte ich erstmal folgenden Fehler beheben bevor ich damit weiter fortführe:

Ich muss noch eine Zahl eingeben, bevor die Schleife beendet wird. Kann ich da nicht eine break-Anweisung einfügen? Laut Aufgabenstellung soll die Schleife aber bei einem leeren Namen beendet werden.


----------



## Joose (26. Apr 2016)

Natürlich kannst du da eine break-Anweisung einfügen. Wie hast du es denn am Anfang gemacht? Du hattest ein entsprechendes if nach der Namensabfrage und die break-Anweisung.
Keiner verbietet dir diese wieder einzufügen


----------



## Lestas89 (26. Apr 2016)

Kann ich das so stehen lassen oder wäre dies nicht kompatibel mit der if-Bedingung die ich danach noch schreiben muss?


```
import javax.swing.JOptionPane;
class NameUndAlter2 {
    public static void main(String[] args) {

    String name = "";
    int alter = 0;
    String ausgabe = "";
   
    String tmpName = "";
    int tmpAlter = 0;
   
    do{
    name = JOptionPane.showInputDialog("Geben Sie einen Namen ein:");
   
    if(name.equals("")){
    break;
    }
   
   
    alter = Integer.parseInt(JOptionPane.showInputDialog("Geben Sie das Alter ein:"));
   
    }while(!name.equals(""));
   
    JOptionPane.showMessageDialog(null, ausgabe);
   
    }
}
```


----------



## Joose (26. Apr 2016)

Was wo stehen lassen? Was meinst du mit "kompatibel"? Welche if-Bedingung danach?


----------



## Lestas89 (26. Apr 2016)

Ich muss ja noch eine if-Bedingung schreiben um den Vergleich durchzuführen, das meinte ich damit.
Ich steh wirklich auf dem Schlauch was die if-Bedingung danach angeht. Ich hab mir deinen Tipp zu Herzen genommen doch komme trotzdem nicht weiter :/


----------



## Joose (26. Apr 2016)

Natürlich kannst du dann nachdem dem Einlesen des Alters noch die andere if-Bedingung hinschreiben.

Du willst ja schauen ob das neu eingelesene Alter größer als das bisher größte Alter ist oder? <- damit sollte die if-Bedingung doch selbsterklärend sein.


----------



## Lestas89 (26. Apr 2016)

Hallo Joose,

wo ich gerade an der Aufgabe hänge kommt mir noch eine andere Frage auf:

Ist die Aufgabe darauf ausgelegt, dass sämtliche vorher eingegebenen Namen überschrieben werden oder sollen die gemerkt werden?

Mein Programm sieht nun wie folgt aus, ich bekomme aber nicht den Ältesten ausgegeben.
Die if-Bedingung stimmt so nun, oder? Was muss ich in dem if-Block verändern?


```
import javax.swing.JOptionPane;
class NameUndAlter2 {
    public static void main(String[] args) {

    String name = "";
    int alter = 0;
    String ausgabe = "";
   
    String tmpName = "";
    int tmpAlter = 0;
   
    do{
    name = JOptionPane.showInputDialog("Geben Sie einen Namen ein:");
   
    if(name.equals("")){
    break;
    }
   
    alter = Integer.parseInt(JOptionPane.showInputDialog("Geben Sie das Alter ein:"));
   
    if(alter < tmpAlter){
   
    tmpName = name;
    tmpAlter = alter;
   
    ausgabe = tmpName;
    }else{
   
    ausgabe = name;
    }
   
    }while(!name.equals(""));
   
    JOptionPane.showMessageDialog(null, ausgabe);
   
    }
}
```


----------



## Joose (26. Apr 2016)

Lestas89 hat gesagt.:


> Ist die Aufgabe darauf ausgelegt, dass sämtliche vorher eingegebenen Namen überschrieben werden oder sollen die gemerkt werden?


Diese Frage kannst du dir selber oder der Aufgabensteller am besten beantworten.

Im 1.Post hast du die Aufgabenstellung genannt, dort habe nichts davon gelesen das die anderen Personen in irgendeiner Form gespeichert werden sollen.



Lestas89 hat gesagt.:


> Mein Programm sieht nun wie folgt aus, ich bekomme aber nicht den Ältesten ausgegeben.
> Die if-Bedingung stimmt so nun, oder? Was muss ich in dem if-Block verändern?


Nein die if-Bedingung stimmt nicht.

Gib dir testhalber vor dem if die beiden Werte die du vergleichst aus (oder du verwendest einen Debugger ) dann sollte dir klarer werden wo der Fehler liegt.


----------



## Lestas89 (26. Apr 2016)

Das versteh ich wirklich nicht. Ich habe doch genau das gemacht, was du hier gesagt hast:

"Du willst ja schauen ob das neu eingelesene Alter größer als das bisher größte Alter ist oder? <- damit sollte die if-Bedingung doch selbsterklärend sein."


----------



## Joose (26. Apr 2016)

Du vergleichst ob das neu eingelesene Datum kleiner als das bisher größte Alter ist, wenn ja speicher da kleinere Alter als neues größtes.


----------



## Lestas89 (26. Apr 2016)

Ich habe nun name und alter mit tmpname und tmpalter vertauscht aber es klappt trotzdem noch nicht, meintest du das?


```
if(alter < tmpAlter){
   
    name = tmpName;
    alter = tmpAlter;
   
    ausgabe = tmpName;
    }else{
   
    ausgabe = name;
    }
```


----------



## Joose (26. Apr 2016)

Du hast gefragt ob die if-Bedingung stimmt. Ich habe gesagt nein, und dir auch erklärt was du (fälschlicherweise) vergleichst.
Nun änderst du den Inhalt des if-Zweigs ...

Bitte überlege dir deine Änderungen gut! Was du machst ist "murks".
`name` und `alter` enthalten die Werte, welche du als Benutzer gerade eingegeben hast. Laut deinem Code soll diesen beiden Variablen der Wert von `tmpName` und `tmpAlter` zugewiesen werden. Welchen Zweck soll das haben? Damit überschreibst du die eingelesenen Werte einfach.

Wenn du schon keine IDE mit Debugger verwendest dann verwende Konsolenausgaben um etwas mehr Informationen zu bekommen.
Gib dir vor der if-Bedingung den Wert von `alter` und `tmpAlter` aus. Dann siehst du welchen Wert die eine Variable hat und welchen die andere, damit sollte dir schon klarer werden wie du die beiden vergleichen musst.


----------



## Lestas89 (26. Apr 2016)

Hallo Joose,

ich mache für heute eine Pause und melde mich morgen nochmal in diesem Thread und schaue mir dann alles nochmal genau an.

Ich danke dir für deine Hilfe bis hierhin!


----------



## Lestas89 (26. Apr 2016)

Irgendwie muss ich die ganze Zeit an die Aufgabe und an meinen Fehler denken! Komme nicht zur Ruhe .
Liegt der einzige Fehler wirklich nur in der if-Bedingung?


----------



## Joose (26. Apr 2016)

Ja, wirklich nur die if-Bedingung.
Folgender Code (von dir gepostet) stimmt außer einer Kleinigkeit in der Bedingung.

```
if(alter < tmpAlter) {
    tmpName = name;
    tmpAlter = alter;
    ausgabe = tmpName;
} else {
    ausgabe = name;
}
```

Ich probiers einfach nochmal:

Dein neu eingelesenes Alter (die Variable `alter`) muss größer sein als das bisherige größte/höchste Alter (die Variable `tmpAlter`).
Im Vergleich zu diesem Satz, versuche deine if-Bedingung in Worte zu fassen. Was beschreibt/vergleicht sie?


----------



## Lestas89 (26. Apr 2016)

Achso! Jetzt hab ichs 


```
if(alter > tmpAlter){
   
    tmpName = name;
    tmpAlter = alter;
   
    ausgabe = name;
    }else{
   
    ausgabe = tmpName;
    }
```

So sollte es nun stimmen 

Die Aufgabe hat noch zwei Teilaufgaben, die ich aber morgen versuchen werde zu lösen. Wenn ich Fragen habe, poste ich es hier nochmal rein. Ich danke dir für deine Mühe und Hilfe!


----------

