Zeiten Umrechnen

Adi18

Grünschnabel
// Hallo liebe Leute, ich hätte eine Frage zu dieser Aufgabe. Ich würde gerne wissen, wie man diese Aufgabe besser lösen kann, weil so wie ich das vorhabe dauert es Ewigkeiten, wie ihr weiter unten sehen könnt. Nur zur Info, mein Code ist noch lange nicht fertig. Habe ihn nur hochgeladen damit ihr meinen Lösungsansatz sehen könnt. Ich freue mich auf eure Antworten!



Aufgabe:

// Leider vergeht eine Reise immer viel zu schnell. Drei Wochen sind aber auch echt nicht lange. Wobei in Sekunden angegeben kommen bestimmt ein paar zusammen. Nur wie viele?

Das Programm soll neben Längeneinheiten nun auch folgende Zeiteinheiten unterstützen: s = sec, min, hour, day, week, month, year, decade, century und millennium.

Definition ausgewählter Einheiten:

month year decade century millenium
1/12 year 365.242198781 day 10 year 100 year 1000 year
Um den unterschiedlichen Einheitstypen gerecht zu werden sollen auch die Ausgaben angepasst werden. Außerdem ist nun darauf zu achten, dass die Einheiten untereinander konform sind.

Vorhandene Einheit: week
Wert in week: 3
Gewünschte Einheit: sec
Wert in sec: 1814400
Vorhandene Einheit: week
Wert in week: 3
Gewünschte Einheit: mm
Einheiten sind nicht konform!




Code:

Java:
import java.util.Scanner;

public class zeitenUmrechnen {

    public static void main(String[] args) {
       
        System.out.println("Vorhandene Einheit: ");
        Scanner adi = new Scanner(System.in);
        String userEingabe = adi.next();
       
        if(userEingabe.equals("sec") | (userEingabe.equals("s"))) {
            System.out.println("Wert in sec");
            long userEingabeZahl = adi.nextLong();
            System.out.println("Gewünschte Einheit: ");
            String userEingabeEinheit = adi.next();
            if(userEingabeEinheit.equals("sec")) {
                long ergebnis = userEingabeZahl;
                System.out.println("Wert in sec: " + ergebnis);
                    }else if(userEingabeEinheit.equals("min")) {
                        long ergebnis = userEingabeZahl * 60;
                        System.out.println("Wert in min: " + ergebnis);
            }else if(userEingabeEinheit.equals("hour")) {
                long ergebnis = userEingabeZahl * 60 * 60;
                System.out.println("Wert in hour: " + ergebnis);
    }else if(userEingabeEinheit.equals("day")) {
        long ergebnis = userEingabeZahl * 60 * 60 * 24;
        System.out.println("Wert in day: " + ergebnis);
}else if(userEingabeEinheit.equals("week")) {
    long ergebnis = userEingabeZahl / 60 * 60 * 24 * 7;
    System.out.println("Wert in week: " + ergebnis);
}else if(userEingabeEinheit.equals("month")) {
    long ergebnis = userEingabeZahl / 60;
    System.out.println("Wert in month: " + ergebnis);
}



   
           
           
        }
    }

}
 
Zuletzt bearbeitet von einem Moderator:

Yaslaw

alter Rempler
Moderator
Unlesbarer Code. Die komsiche Formatierung verhindert ein sauberes lesen.

Und leider verstehe ich die Aufgabe nicht. Sekunden sollen in mm angegeben werden?
Und was soll mit "month year decade century millenium" gemacht werden?
Das einzige was ich verstehe sind die 3 Wochen, die 3*7*24*60*60=1814400sec entsprechen.

Dein Code in lesbar
Java:
import java.util.Scanner;

public class zeitenUmrechnen {

    public static void main(String[] args) {
       
        System.out.println("Vorhandene Einheit: ");
        Scanner adi = new Scanner(System.in);
        String userEingabe = adi.next();
       
        if(userEingabe.equals("sec") | (userEingabe.equals("s"))) {
            System.out.println("Wert in sec");
            long userEingabeZahl = adi.nextLong();
            System.out.println("Gewünschte Einheit: ");
            String userEingabeEinheit = adi.next();
            if(userEingabeEinheit.equals("sec")) {
                long ergebnis = userEingabeZahl;
                System.out.println("Wert in sec: " + ergebnis);
            }else if(userEingabeEinheit.equals("min")) {
                long ergebnis = userEingabeZahl * 60;
                System.out.println("Wert in min: " + ergebnis);
            }else if(userEingabeEinheit.equals("hour")) {
                long ergebnis = userEingabeZahl * 60 * 60;
                System.out.println("Wert in hour: " + ergebnis);
            }else if(userEingabeEinheit.equals("day")) {
                long ergebnis = userEingabeZahl * 60 * 60 * 24;
                System.out.println("Wert in day: " + ergebnis);
            }else if(userEingabeEinheit.equals("week")) {
                long ergebnis = userEingabeZahl / 60 * 60 * 24 * 7;
                System.out.println("Wert in week: " + ergebnis);
            }else if(userEingabeEinheit.equals("month")) {
                long ergebnis = userEingabeZahl / 60;
                System.out.println("Wert in month: " + ergebnis);
            }
        }
    }

}
Warum nicht ein switch() anstelle einem endlosen else-if Konstrukt?
 

Adi18

Grünschnabel
Vielen Dank für Ihre Antwort und sorry wegen dem Code. In der Aufgabe soll ich jede angegebene Einheit zu jeder angegebenen Einheit umrechnen können, also z.B. sec zu den anderen Einheiten umrechnen, je nach dem was der User eingibt.
 
Zuletzt bearbeitet:

Yaslaw

alter Rempler
Moderator
Hab hier mal schnell in PHP ein Beispiel gemacht (hab auf diesem PC keine Javeentwicklerumgebung). Der Array $secFactor währe in Java etwa ein ArrayList-Objekt oder so. Dieses Objekt kann man auch statisch deklarieren, damit es nicht jedesmal neu erstellt werden muss.

PHP:
echo calc('d', 2, 'm');
//Gibt 2880 aus

function calc($unitIn, $value, $unitOut){
    //Array mit den Units in Sekunden
    $secFactor['s'] = 1;
    $secFactor['m'] = 60;
    $secFactor['h'] = 60*60;
    $secFactor['d'] = 60*60*24;
    $secFactor['w'] = 60*60*24*7;
   
    //Eingabewert in Sekunden umrechnen
    $sec = $secFactor[$unitIn] * $value;
    //Ausgabewer aus den Sekunden errechnen
    return $sec / $secFactor[$unitOut];
}[/php]
 

Adi18

Grünschnabel
Vielen Dank für Ihre Antwort. Nur leider kann ich damit nicht wirklich was anfangen, da ich noch Anfänger in Java bin und ich mich nur mit Arrays, Klassen, Schleifen und Methoden auskenne. Objektorientiertes programmieren kommt erst im 2 Semester dran. Ich weiß nicht wie ich PHP in Java umschreiben kann.
 

zerix

Hausmeister
Moderator
Vielen Dank für Ihre Antwort. Nur leider kann ich damit nicht wirklich was anfangen, da ich noch Anfänger in Java bin und ich mich nur mit Arrays, Klassen, Schleifen und Methoden auskenne. Objektorientiertes programmieren kommt erst im 2 Semester dran. Ich weiß nicht wie ich PHP in Java umschreiben kann.
Im PHP Code ist nichts, was du nicht auch in Java kennst.
Du musst lediglich aus den Variablen in PHP Java Variablen machen und den Methodenkopf in Java schreiben.

$secFactor könnte bspw ein int-Array (int[] secFactor) sein.
Statt function schreibst du int, da die Methode eine Ganzzahl zurückgibt.
 

Yaslaw

alter Rempler
Moderator
Kannst auch ohne Array, dafür mit switch() arbeiten.
Das Konzept bleibt gleich, zuerst in Sekunden umrechnen und von dort zurück zur Ausgabeeinheit

Alles ungetestet, da ich grad keine Javaumgebung zur Verfügung habe
Java:
public long calc(String unitIn, int value, String unitOut){
    long sec = 0;
    switch(unitIn){
        case "w":   
            sec = value * 7 * 24 * 60 * 60;
            break;
        case "d":   
            sec = value * 24 * 60 * 60;
            break;
        case "h":
            sec = value * 60 * 60;
            break;
        case "m":
            sec = value * 60;
            break;
        case "s":
            sec = value;
    }
    switch(unitOut){
        case "w":   
            return sec / (7 * 24 * 60 * 60);
        case "d":
            return sec / (24 * 60 * 60);
        case "h":
            return sec / (60 * 60);
        case "m":
            return sec / (60);
    }
}

Oder (mein Favorit) man lagert die SecFactor in eine eigene Methode aus
Java:
public long calc(String unitIn, int value, String unitOut){
    long sec = 0;
    sec = getSecFactor(unitIn) * value;
    return sec / getSecFactor(unitOut);
}

protected long getSecFactor(String unit){
    switch(unit){
        case "w": return 7 * 24 * 60 * 60;
        case "d": return 24 * 60 * 60;
        case "h": return 60 * 60;
        case "m": return 60;
        case "s": return 1;
    }

}
 
Zuletzt bearbeitet:

Neue Beiträge