Zeitwerte d:hh:mm:ss



  • Hallo Leute,

    ich habe hier eine Frage auf englisch, dass ich gerne lösen möchte. Leider habe ich es nicht so ganz verstanden. Vlt kann mir da jemand Ansatzpunkte geben?

    Hier die Frage:

    Write a C program that inputs two time values in the form d:hh:mm:ss, (1 digit for days, 2 digits each for hours, minutes and seconds in 24 hour clock format) screening the inputs to check that they are valid times. The program should output their sum and difference(absolute value!), again as normalised time values. You will need to be able to accommodate two digits in the day field of the results.

    Wäre super nett, wenn ein paar Vorschläge kommen würden. In etwas so:

    #include <stdio.h>
    #include <time.h>
    
    int main(void)
    {
        time_t     now;
        struct tm *ts;
        char       buf[80];
    
        /* Derzeitige Zeit finden */
        now = time(NULL);
    
        /* Format und print Zeit */
        ts = localtime(&now);
        strftime(buf, sizeof(buf), "%d:%H:%M:%S %Z");
        puts(buf);
    
        return 0;
    }
    


  • Hi
    Die beiden Zeitwerte sollen vom Benutzer eingegeben und angezeigt werden.
    Das Programm soll prüfen, ob die Eingabe korrekt ist und(wenn ja) die Summe und die Differenz bilden(Absolutwert, also positiv).



  • Habe jetzt hier ein versuch gestartet, aber zum laufen bringe ich es nicht. Was mache ich hier falsch? Danke für Eure Hilfe. 👍

    #include <stdio.h>
    
    struct value
    {
       int tag;
       int stunde;
       int minuten;
       int sekunden;
    }datum;
    
    void eingaben()
    {
    datum.tag;
    printf("Bitte geben ein Tag ein: ");
    scanf("%d", tag);
    datum.stunde;
    printf("Bitte geben Sie die Stunden ein: ");
    scanf("%d", stunde);
    datum.minuten;
    printf("Bitte geben Sie die Minuten ein: ");
    scanf("%d", minuten);
    datum.sekunden;
    printf("Bitte geben Sie die Sekunden ein: ");
    scanf("%d", sekunden);
    
    while(eingabe)
    {
    if(datum.tag || datum.stunde || datum.minuten || datum.sekunden != 0)
    printf("Tag: %d:Stunde: %d:Minuten: %d:Sekunden: %d", datum.tag, datum.stunde, datum.minuten, datum.sekunden);
    
    }
    


  • Hast du kein Buch/Tutorial, in dem einfache Eingaben und Ausgaben erklärt sind?
    Am besten gleich Beispiele, wie man eingegebene Werte in Strukturmembern speichert.
    Was willst du mit den Zeilen 13, 16, 19, 22 bezwecken? Die tun nichts, absolut gar nichts. Die Werte in deiner Einlese-Funktion müssen wieder irgendwie ins Hauptprogramm gelangen, dazu brauchst du das Kapitel Funktionen mit Parameterübergabe.
    Und/oder Vergleiche macht man so:

    if( 0 != datum.tag || 0 != datum.stunde || 0 != datum.minuten || 0!=datum.sekunden )
    ...
    

    Es wird also jedes Element einzeln abgefragt. Warum sollte in der Zeitangabe
    keine 0 vorkommen dürfen? 3:45:00:34
    Zum Einlesen mit scanf brauchst du den Adressoperator, wenn die Variable kein Array und kein Zeiger ist(siehe C-Buch/Tutorial).
    Okay, genug gemeckert, oder? 😃
    Starthilfe folgt:

    #include <stdio.h>
    
    void clear_stdin ( void )
    {
    	int c;
    	while (( c = getchar()) != '\n' && c != EOF )
    	{}
    }
    
    struct my_time
    {
    	int d, h, m, s;
    };
    
    int main ( void )
    {
    	struct my_time mt = { 0 }; // Alle Member mit 0 initialisieren.
    
    	printf ( "Anzahl Tage eingeben(0-9): ");
    
    	if ( 1 != scanf ( "%d", &mt.d )) // Adressoperator: & 
    		puts ( "Falsche Eingabe!" );
    	else if ( mt.d < 0 || mt.d > 9 )
    			puts ( "Falsche Eingabe!" );
    	else
    		printf ( "Ihre Eingabe: %d Tage\n", mt.d );
    
    	clear_stdin(); // Eingabestrom für die nächste Eingabe leeren.
    
    	printf ( "Anzahl Stunden eingeben(0-23): ");
    	// ...
    	return 0;
    }
    


  • Super, vielen Dank! Ich kann Kritik vertragen. Werde es gleich morgen ausprobieren. 👍



  • Wenn ich die Aufgabe richtig lese, soll die Datumseingabe mit einem vollständigen String und nicht mit Einzelabfragen erfolgen. Daher würde ich folgenden Weg vorschlagen:

    1. Datum als String einlesen
    2. Datum mit strtok an den Doppelpunkten zerlegen
    3. Die jeweils gelieferten Anteile mit den Regeln für die Zeitangaben (24/60/60) in Sekunden umrechnen
    4. Zweites Datum entsprechen behandeln
    5. Differenz auf Sekundenebene bilden, ggf. Betrag erzeugen
    6. Ergebnis aus dem Sekundenformat in ein menschenlesbares Format konvertieren (Modulo und Ganzzahldivision sind hier gefragt)

    Alles natürlich mit hübschen Funktionen. Die Konvertierung könnte den schon geplanten struct benutzen, aus der dann der printf-Befehl seine Werte zur Anzeige holt.

    Auf der Sekundenebene sind dann (fast) beliebige Operationen, also auch die Addition zweier Daten oder das Abziehen von 30 Tagen usw. machbar.


Anmelden zum Antworten