Sekunden, Minuten und Stunden ausgeben

Lestas89

Bekanntes Mitglied
Hallo :) Folgende Aufgabe habe ich zu lösen:

Schreiben Sie eine Anwendung, die per Dialogbox eine beliebige Anzahl an
Sekunden einliest. Geben Sie die entsprechende Anzahl an Stunden, Minuten
und restlichen Sekunden aus. Die Stunden, Minuten und Sekunden sollen
jedoch nur ausgegeben werden, falls diese jeweils ungleich 0 sind. Beachten Sie
außerdem Singular und Plural bei der Ausgabe.
Das heißt: 60 Sekunden entsprechen „1 Minute“, 121 Sekunden entsprechen „2
Minuten 1 Sekunde“ etc.

Soweit bin ich bisher gekommen:

Java:
import javax.swing.JOptionPane;
class Sekunden{
    public static void main (String [] args){
   
   
   
    String ersteEingabe = JOptionPane.showInputDialog("Geben Sie eine Anzahl an Sekunden ein:");
   
   
    int a = Integer.parseInt(ersteEingabe);
    int stunden = a / 3600;
    int minuten = (a % 3600) / 60;
    int sekunden = (a % 3600) % 60;
   
    if(a > 1)
    JOptionPane.showMessageDialog(null, a + " Sekunden entsprechen " + sekunden + " Sekunden. ");
   
    if(a == 1)
    JOptionPane.showMessageDialog(null, a + " Sekunde entspricht " + sekunden + " Sekunde. ");
   
    if(a == 3600)
    JOptionPane.showMessageDialog(null, a + " Sekunden  entspricht " + stunden + " Stunde. ");
   
    }
}

Ich habe nun 2 Probleme:

1. Wie kann ich das ganz einfach machen, dass mir auch wirklich nur das nötigste ausgibst? Also bei 60 Sekunden "1 Minute" bei 3601 Sekunden "1 Stunde und 1 Sekunde" etc.

2. Und das hier auch noch:
Die Stunden, Minuten und Sekunden sollen
jedoch nur ausgegeben werden, falls diese jeweils ungleich 0 sind.

Ich danke im Voraus :)
 

Lestas89

Bekanntes Mitglied
Habe den Code nun runtergebrochen. Wie kann ich die if Bedingungen einfacher machen?

Edit: Habe das Programm ein wenig verändert. Alllerdings erkennt die if Bedingung int a in der Schleife nicht (unsichtbar). Er gibt mir immer Null aus, wie kann ich das ändern?

Java:
import javax.swing.JOptionPane;
class Sekunden{
    public static void main (String [] args){
   
    String ersteEingabe = "";
    int a = 1;
   
    int stunden = a / 3600;
    int minuten = (a % 3600) / 60;
    int sekunden = (a % 3600) % 60;
    boolean b = false;
   

   
    while(!b){
   
    ersteEingabe = JOptionPane.showInputDialog("Geben Sie eine Anzahl an Sekunden ein:");
    a = Integer.parseInt(ersteEingabe);
   
    if(a == 0)
    JOptionPane.showMessageDialog(null, "Ungültige Eingabe!");
   
    if(a != 0)
    b = true;
    }
       
    if(a > 1)
    JOptionPane.showMessageDialog(null, a + " Sekunden entsprechen " + sekunden + " Sekunden. ");
  

       
    }
}
 
Zuletzt bearbeitet:

Meniskusschaden

Top Contributor
Alllerdings erkennt die if Bedingung int a in der Schleife nicht (unsichtbar). Er gibt mir immer Null aus, wie kann ich das ändern?
Ich weiß nicht, was du damit meinst. Es wird doch gar nicht Null ausgegeben, sondern eine Sekunde. Das liegt daran, dass du a anfangs auf 1 setzt, dann die Umrechnung in Stunden, Minuten und Sekunden durchführst und erst danach die Sekundenanzahl vom Benutzer abfragst. Damit rechnest du dann aber nicht mehr, so dass natürlich immer der zu Beginn berechnete Wert heraus kommt: a=1 => Eine Sekunde.
 

Lestas89

Bekanntes Mitglied
Hallo Meniskusschaden,

ich meinte auch 1 sorry und nicht 0. Kannst du mir vielleicht bei den if-Bedingungen helfen? Wie kann ich das so implementieren, dass mir auch wirklich nur das ausgegeben wird was ausgegeben werden muss?

Also als Beispiel:

60 Sekunden "1 Minute" bei 3601 Sekunden "1 Stunde und 1 Sekunde" etc.
 

Meniskusschaden

Top Contributor
Die Logik ist ja eigentlich für Stunden, Minuten und Sekunden gleich. Deshalb würde ich mir einfach eine Hilfsmethode erstellen, die drei Parameter bekommt (Anzahl der Zeiteinheit, Singulartext und Pluraltext). Die Methode gibt dann den aufbereiteten Text für die Zeiteinheit zurück, also entweder einen leeren String, oder die Stunden-, Minuten-, Sekundenzahl inklusive korrektem Text. Im Hauptprogramm kannst du das dann einfach drei Mal aufrufen und die zurückgegebenen Texte aneinander hängen. Die Signatur der Hilfsmethode könnte beispielsweise so aussehen:
Java:
public static String erzeugeText(int anzahl, String singularText, String PluralText)
Du könntest die Hilfsmethode so aufrufen:
Java:
ausgabeText += erzeugeText(minuten, "Minute\n", "Minuten\n");
In der Hilfsmethode musst du dann nur noch die drei Fälle (0, 1, >1) unterscheiden, entweder mit if oder mit switch. In der Hilfsmethode ist die Fallunterscheidung auch etwas einfacher zu handhaben, weil du nach Bearbeitung einer zutreffenden Bedingung sofort mit return heraus springen kannst und dir dadurch komplizierte if/else-Verschachtelungen sparst.
 

Lestas89

Bekanntes Mitglied
Hallo Meniskusschaden,

ich danke dir für deine Hilfe! Allerdings versteh ich das noch nicht so recht. Könntest du mir das für einen Fall mal vormachen?

Ich danke dir im Voraus
 

Meniskusschaden

Top Contributor
Java:
public static String erzeugeText(int anzahl, String singularText, String PluralText) {
    if (anzahl==1) {
        return anzahl + " " + singularText;
    }
...
...
...
 

Meniskusschaden

Top Contributor
anzahl enthält die Stunden, Minuten oder Sekunden. Je nachdem, wie man es aufgerufen hat. Entsprechend enthält singularText je nach Aufruf "Stunde", "Minute" oder "Sekunde" und pluralText "Stunden", "Minuten" oder "Sekunden".

Wenn anzahl = 1 ist (also eine Stunde, Minute oder Sekunde), soll der entsprechend aufbereitete Text zurückgegeben werden:anzahl + " " + singularText, also beispielsweise bei einer Minute:1 + " " + "Minute"und das ergibt"1 Minute".

Wenn anzahl = 5 ist, würde es für das Beispiel Minutenanzahl + " " + pluralText ergeben, also5 + " " + "Minuten"und das ergibt"5 Minuten".
 

Lestas89

Bekanntes Mitglied
Ich danke dir sehr für deine Hilfe aber geht das nicht auch in der main Methode? Das ist für mich noch ein wenig zu kompliziert. So gut bin ich noch nicht :). Ich hab das noch nicht so begriffen wie du das meinst.
 
Zuletzt bearbeitet:

Meniskusschaden

Top Contributor
Klar, das geht auch:
Java:
String ausgabeText = a + " Sekunden entsprechen\n";
if (stunden == 1) {
    ausgabeText += stunden + " Stunde\n";
}
 

Lestas89

Bekanntes Mitglied
Und wie funktioniert das für Stunden und Minuten, Stunden und Sekunden, Stunden und Minuten und Sekunden, Minuten und Sekunden und nur Minuten? Wenn ich ja da mit if Anweisungen arbeite, kommen ja mehrere öfter vor.

Ich werde dir mal morgen meine Komplettlösung posten. Wäre dankbar wenn du mir dann sagst wie ich es verändern muss :)

Edit: Wie meinst du das in deinem obigen Beitrag mit if (stunden == 1) ? Das hab ich immer noch nicht so begriffen :/
 
Zuletzt bearbeitet:

Meniskusschaden

Top Contributor
Und wie funktioniert das für Stunden und Minuten, Stunden und Sekunden, Stunden und Minuten und Sekunden, Minuten und Sekunden und nur Minuten?
Um die verschiedenen Kombinationen brauchst du dich eigentlich gar nicht zu kümmern. Wenn ein Wert 1 ist hängst du einfach den entsprechenden Text an den Ergebnisstring an und wenn er größer als 1 ist den entsprechend anderen Text. Mehr machst du nicht und dadurch fallen die 0-Werte automatisch unter den Tisch. Zum Schluss gibst du einfach den Ergebnisstring aus.
 

Lestas89

Bekanntes Mitglied
Ich versuche das mal morgen und poste dir meine Ergebnisse. Aber bei welchem Fall z.B. ist denn if (stunden == 1) ? Bei welchem Fall soll ich Stunden gleich 1 setzen und gleich was soll ich die anderen setzen? Nur 0 oder 1 ?
 

Meniskusschaden

Top Contributor
Du sollst stunden gar nicht auf 1 setzen. Du musst stunden berechnen. minuten und sekunden ebenfalls. Die Variable stunden muß nach deiner Berechnung die richtige Stundenzahl enthalten, egal ob das 0, 1 oder etwas anderes ist. Den Code dazu hast du bereits richtig programmiert, nur eben an der falschen Stelle.

Später musst du dann abfragen, ob dein berechneter Wert stunden gleich 1 ist oder ob er größer als 1 ist. Aber nicht um den stunden-Wert zu setzen, denn der stimmt ja bereits, sondern um den Stundenwert und die passende Bezeichnung an den Ergebnisstring anzuhängen.
Aber bei welchem Fall z.B. ist denn if (stunden == 1) ?
Wenn die Ganzzahldivisiona / 3600den Wert 1 ergibt, also wenn a mindestens 3600 und höchstens 7199 beträgt.
 

Lestas89

Bekanntes Mitglied
So ich habe damit nun angefangen und habe direkt wieder Probleme. Es wird hier zweimal Ausgabe aufgerufen. Wie kann ich das umgehen?

Java:
import javax.swing.JOptionPane;
class Sekunden{
    public static void main (String [] args){
   
   
    String ersteEingabe = JOptionPane.showInputDialog("Geben Sie eine Anzahl an Sekunden ein:");
    int a = Integer.parseInt(ersteEingabe);
   
    if(a == 0){
    JOptionPane.showMessageDialog(null, "Ungültige Eingabe!");
    System.exit(0);
    }
   
    int stunden = a / 3600;
    int minuten = (a % 3600) / 60;
    int sekunden = (a % 3600) % 60;

    String ausgabeText = a + " Sekunden entsprechen\n";
        if (stunden == 1) {
    ausgabeText += stunden + " Stunde\n";
    JOptionPane.showMessageDialog(null, ausgabeText);
        }
        if (stunden > 1){
    ausgabeText += stunden + " Stunden\n";   
    JOptionPane.showMessageDialog(null, ausgabeText);
        }
        if (stunden == 0){
    ausgabeText += minuten + " Minuten und " + sekunden + " Sekunden. ";
    JOptionPane.showMessageDialog(null, ausgabeText);
        }
        if (minuten == 1){
    ausgabeText += minuten + "Minute.";
    JOptionPane.showMessageDialog(null, ausgabeText);
       
        }
    }
}
 

Lestas89

Bekanntes Mitglied
Hallo Meniskusschaden,

schau mal so weit bin ich bisher gekommen:
EDIT: Danke für deinen Hinweis, habe den Code nun vereinfacht:

Java:
import javax.swing.JOptionPane;
class Sekunden{
    public static void main (String [] args){
   
   
    String ersteEingabe = JOptionPane.showInputDialog("Geben Sie eine Anzahl an Sekunden ein:");
    int a = Integer.parseInt(ersteEingabe);
   
    if(a == 0){
    JOptionPane.showMessageDialog(null, "Ungültige Eingabe!");
    System.exit(0);
    }
   
    int stunden = a / 3600;
    int minuten = (a % 3600) / 60;
    int sekunden = (a % 3600) % 60;

     String ausgabeText = a + " Sekunden entsprechen\n";
        if (stunden == 1) {
    ausgabeText += stunden + " Stunde\n";
  
        }
        if (stunden > 1){
    ausgabeText += stunden + " Stunden\n"; 
  
        }
        if (stunden == 0 && minuten != 0 && sekunden != 0){
    ausgabeText += minuten + " Minuten und " + sekunden + " Sekunden. ";
 
        }
        if (minuten == 1 && stunden == 0 && sekunden == 0){
    ausgabeText += minuten + "Minute.";
   
        }
        if(sekunden == 1 && minuten == 0 && stunden == 0){
    ausgabeText += sekunden + " Sekunde.";
   
        }
        if(sekunden > 1 && minuten == 0 && stunden == 0){
    ausgabeText += sekunden + "Sekunden.";
   
        }
     JOptionPane.showMessageDialog(null, ausgabeText);
   
   
   
   
   
    }
}

Das sind viel zu viele Fälle die ich unterscheiden muss, ich bin noch nichtmals ganz fertig. Wie kann ich das einfacher machen ? Ich danke dir für deine Hilfe.
 
Zuletzt bearbeitet:

Meniskusschaden

Top Contributor
Ich würde die Kombinationen erst mal gar nicht betrachten, sondern nur die Fälle =1 und >1, genau so wie du es für die Stunden schon gemacht hast. So kommst du mit sechs einfachen Abfragen aus. Den MessageDialog benötigst du nur einmal ganz am Ende. Es wird schon viel übersichtlicher, wenn das nicht mehr innerhalb der if-Abfragen steht.

Eventuell bist du dann noch nicht ganz fertig, denn möglicherweise hat sich die Aufgabenstellung inzwischen etwas verändert. Im ersten Posting hattest du kein "und" gefordert, sondern nur beispielsweise: 121 Sekunden entsprechen „2 Minuten 1 Sekunde“. Falls ein "und" dazwischen muß, ist noch etwas mehr zu tun. Das würde ich im ersten Schritt aber ignorieren, sonst erschlagen dich die Bedingungen. Wenn es ohne "und" sauber funktioniert, ist der Rest einfacher.
 

Lestas89

Bekanntes Mitglied
Ich fass es nicht. Bin ich jetzt schon fertig? Das Programm scheint zu funktionieren:

Java:
import javax.swing.JOptionPane;
class Sekunden{
    public static void main (String [] args){
 
 
    String ersteEingabe = JOptionPane.showInputDialog("Geben Sie eine Anzahl an Sekunden ein:");
    int a = Integer.parseInt(ersteEingabe);
 
    if(a == 0){
    JOptionPane.showMessageDialog(null, "Ungültige Eingabe!");
    System.exit(0);
    }
 
    int stunden = a / 3600;
    int minuten = (a % 3600) / 60;
    int sekunden = (a % 3600) % 60;

     String ausgabeText = a + " Sekunden entsprechen\n";
        if (stunden == 1) {
    ausgabeText += stunden + " Stunde\n";
        }
     
        if (stunden > 1){
    ausgabeText += stunden + " Stunden\n";
        }
     
        if (minuten > 1){
    ausgabeText += minuten + " Minuten\n"; 
        }
     
        if (minuten ==1){
    ausgabeText += minuten + " Minute\n"; 
        }
     
        if (sekunden ==1){
    ausgabeText += sekunden + " Sekunde\n"    ;
        }
     
        if (sekunden > 1){
    ausgabeText += sekunden + "Sekunden\n"; 
        }
     
     JOptionPane.showMessageDialog(null, ausgabeText);
    }
}

Ich hatte anscheinend ein Verständnisproblem was die if-Bedingungen anging.
Mir werden jetzt entweder nur Stunden, oder Minuten oder Sekunden oder alles ausgegeben. So wie es in der Aufgabenstellung gefordert ist :)

Geht das Programm in mehrere if-Bedingungen rein sodass ausgabetext mehrere if-Bedingungen ausgibt?
 
Zuletzt bearbeitet:

Meniskusschaden

Top Contributor
Geht das Programm in mehrere if-Bedingungen rein sodass ausgabetext mehrere if-Bedingungen ausgibt?
Ja genau. Das Programm geht in jede if-Bedingung, die zutrifft. Das können also auch mehrere sein. Dadurch, dass wir bei der Zuweisung zum Ausgabetext += statt = verwendet haben, bleibt der vorige Inhalt von ausgabeText erhalten, sofern schon etwas drin stand. ausgabeText += " angehängter Text"ist dasselbe wieausgabeText = ausgabeText + " angehängter Text".
 

Neue Themen


Oben