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
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.
 
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?
 
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.
 
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.
 
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.
 
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.
 
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.
 
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);
   
    }
   
    }
}
 
Hallo Lestas89,

mit der while Schleife meinte ich eher

Code:
while(!name.equals("")){
   // Werte speichern
}
[code]
 
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.
 
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:
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:
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?
 
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.
 
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?
 
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
 
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);
   
    }
}
 
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?

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);
  
    }
}
 
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?
 
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?
 
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.
 
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?
 
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.
 
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.
 
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 😉
 
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);
   
    }
}
 
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 :/
 
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.
 
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);
   
    }
}
 
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.
 
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:
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.
 
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;
    }
 
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.
 
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!
 
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?
 
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?
 
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


Zurück
Oben