Name und Alter von Personen ausgeben (Aufgabe)

Lestas89

Bekanntes Mitglied
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:

Java:
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!
 

Anhänge

  • Aufgabe.jpg
    Aufgabe.jpg
    52,5 KB · Aufrufe: 103

lam_tr

Top Contributor
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

Bekanntes Mitglied
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

Bekanntes Mitglied
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

Top Contributor
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

Top Contributor
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.
 

Lestas89

Bekanntes Mitglied
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

Top Contributor
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

Top Contributor
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

Bekanntes Mitglied
Hallo Joose,

meinst du das in etwa so?

Java:
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

Top Contributor
Hallo Lestas89,

mit der while Schleife meinte ich eher

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

Lestas89

Bekanntes Mitglied
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

Bekanntes Mitglied
Ich habe das nun so gemacht: Ist das richtig?

Java:
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);   
  }
}
 
Zuletzt bearbeitet von einem Moderator:

lam_tr

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

Java:
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);
   }
}
 
Zuletzt bearbeitet von einem Moderator:

Lestas89

Bekanntes Mitglied
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

Top Contributor
So hier mal etwas Pseudocode:
Java:
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

Bekanntes Mitglied
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

Top Contributor
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

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

Java:
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

Bekanntes Mitglied
Schön, dass dir mein Beitrag gefällt :D. 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?

Java:
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

Top Contributor

Lestas89

Bekanntes Mitglied
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?
 

Lestas89

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

Java:
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

Top Contributor
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?

Java:
  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

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

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

Joose

Top Contributor
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.

Es kommt keine Ausgabe, sondern ein Fehler NumberFormatException.forInputString.
Dann versuchst du etwas was keine Zahl ist in eine Zahl umzuwandeln.

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

Bekanntes Mitglied
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

Top Contributor
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

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

Java:
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);
   
    }
}
 

Lestas89

Bekanntes Mitglied
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

Top Contributor
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

Bekanntes Mitglied
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?

Java:
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

Top Contributor
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.

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

Bekanntes Mitglied
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."
 
Zuletzt bearbeitet:

Joose

Top Contributor
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

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

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

Joose

Top Contributor
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

Bekanntes Mitglied
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

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

Joose

Top Contributor
Ja, wirklich nur die if-Bedingung.
Folgender Code (von dir gepostet) stimmt außer einer Kleinigkeit in der Bedingung.
Java:
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

Bekanntes Mitglied
Achso! Jetzt hab ichs :)

Java:
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!
 

Neue Themen


Oben