Programm Sekunden in Min,Std,...



  • Hi,
    zuerst: sorry falls so eine ähnliche Frage schon mal gestellt wurde, habe es so wie ich es habe nirgends gefunden.
    habe eine Frage: Ich habe ein Programm geschrieben (bin noch Anfänger)
    aber ich verstehe die Werte nicht, zuerst kamen bei einer zu hohen Zahl negative Werte raus, dann hab ich unsigned dazu, aber die Werte sind nicht richtig.
    Ich möchte, dass wenn jemand eine Eingabe in Sekunden macht, dass er die Sekunden auf Minuten, Stunden etc. herausbekommt. Aber nicht direkt auf Stunden zb sondern dass er auf Minuten konvertiert, dann weiter auf Stunden und strukturiert ausgibt.
    Hoffe ich habe die Stunden nicht sinnlos verbracht und der Quellcode ist nicht zu gebrauchen ^^.

    Danke im Voraus.

    #include <iostream>
    #include <cmath>
    using namespace std;
    
    int main() {
    	long double Sek = 0, Min = 0, Std = 0, Tag = 0, Jahr = 0, a = 0;
    	unsigned int hilf;
    	cout << "Geben Sie die Anzahl an Sekunden ein: ";
    	cin >> Sek;
    	cout << "Sekunden: " << (unsigned int)Sek % 60 << endl;
    
    	Min = Sek / 60;	
    	hilf = (unsigned int)Min;		//Min ganzzahlig gespeichert!
    	Min = hilf % 60 + Min;
    	if (Min >= 60) {
    		hilf = (unsigned int) Min;
    		Min = hilf % 60 ;
    		a = hilf/60;
    		cout << "Minuten: " << Min << endl;
    		hilf = (unsigned int)a;
    		Std = hilf % 24 + hilf; 
    			if (Std >= 24) {
    			hilf = (unsigned int) Std;
    			Std = hilf % 24;
    			a = hilf/24;
    			cout << "Stunden: " << Std << endl;
    			hilf = (unsigned int)a; 
    			Tag = hilf % 365 + hilf; 
    				if (Tag >= 365) {
    				hilf = (unsigned int)Tag;
    				Tag = hilf % 365;
    				cout << "Tage: " << Tag << endl;
    				Jahr = Tag/365;
    				hilf = (unsigned int)Jahr;
    				cout << "Jahr: " << hilf << endl;
    
    				}
    
    				else {
    				cout << "Tage: " << Tag << endl;
    				Jahr = Tag/365;
    				hilf = (unsigned int)Jahr;
    				cout << "Jahr: " << hilf << endl;
    				}
    
    				}
    
    			else   {
    			cout << "Stunden: " << Std << endl;
    			Tag = Std/24; 			
    			hilf = (unsigned int)Tag; 
    			Tag = hilf % 365 + hilf; 
    				if (Tag >= 365) {
    				hilf = (unsigned int)Tag;
    				Tag = hilf % 365;
    				cout << "Tage: " << Tag << endl; 
    				Jahr = Tag/365;
    				hilf = (unsigned int)Jahr;
    				cout << "Jahre: " << hilf << endl;
    				}
    
    				else {
    				cout << "Tage: " << Tag << endl;
    				Jahr = Tag/365;
    				hilf = (unsigned int)Jahr;
    				cout << "Jahre: " << hilf << endl;
    				}
    			}}
    
    	else    {
    		cout << "Minuten: " << Min << endl;
    		Std = Min/60;
    		hilf = (unsigned int)Std;
    		Std = hilf % 24 + hilf; 
    		if (Std >= 24) {
    			hilf = (unsigned int)Std;
    			Std = hilf % 24;
    			a = hilf/24;
    			cout << "Stunden: " << Std << endl;
    			hilf = (unsigned int)a;
    			Tag = hilf % 365 + hilf; 
    				if (Tag >= 365) {
    				hilf = (unsigned int)Tag;
    				Tag = hilf % 365;
    				cout << "Tage: " << Tag << endl;
    				Jahr = Tag/365;
    				hilf = (unsigned int)Jahr;
    				cout << "Jahre: " << hilf << endl; }
    
    				else {
    				cout << "Tage: " << Tag << endl;
    				Jahr = Tag/365;
    				hilf = (unsigned int)Jahr;
    				cout << "Jahre: " << hilf << endl; }
    
    	}
    		else {
    		cout << "Stunden: " << Std;
    		Tag = Std/24;
    		hilf = (unsigned int)Tag;
    		Tag = hilf % 365 + hilf;
    			if (Tag >= 365) {
    				hilf = (unsigned int)Tag;
    				Tag = hilf % 365;
    				cout << "Tage: " << Tag << endl;
    				Jahr = Tag/365;
    				hilf = (unsigned int)Jahr;
    				cout << "Jahr: " << hilf << endl;
     }
    
    				else {
    				cout << "Tage: " << Tag << endl;
    				Jahr = Tag/365;
    				hilf = (unsigned int)Jahr;
    				cout << "Jahr: " << hilf << endl; }
    		}
    	}
    
    	return 0;
    }
    


  • Lass das double sein. Nimm dazu unsigned long.

    Und dann

    Eingabe von Sekunden.
    ss = Sekunden % 60 // Sekunde zwischen 0..59
    xx = Sekunden / 60 // Minuten
    mm = xx % 60       // Minute  zwischen 0..59
    xx = xx / 60       // Stunden
    hh = xx % 24       // Stunde  zwischen 0..23
    xx = xx / 24       // Tage
    Tag = xx % 30      // Tag  zwischen 0..29
    ...
    


  • Erstmal Danke für die schnelle Antwort.

    Wäre mein Quellcode sonst richtig sprich mit den ganzen verschachtelten if-Verzweigungen?

    Wenn ich demnach auf unsigned long ändere sollte das richtige Ergebnis kommen.
    Wäre toll wenn es so einfach wäre :).
    Werde ich morgen versuchen. Die Formeln habe ich ja eigentlich wie du geschrieben.

    Lg



  • Ich bin durch deinen Code nicht durchgestiegen.

    Was soll das ?

    Min = Sek / 60;
        hilf = (unsigned int)Min;       //Min ganzzahlig gespeichert!
        Min = hilf % 60 + Min; 
        if (Min >= 60) {
    

    Beispiel für 120 Sekunden:
    Min = 120 / 60 ergibt 2.0
    hilf = 2
    Min = 2 % 60 + 2.0 = 2+2.0 = 4.0 😮

    Tut mir Leid, das ist Schrott.



  • Habe ich das falsch interpretiert. Ich dachte wenn ich eben 120sekunden durch 60 sind 2 Minuten ok
    Dann die 2 minuten durch 60 (hätte ich stunden) davon benötige ich den Rest weil ich den ja noch zu den minuten dazuzählen muss usw.
    Blick grad nicht durch

    Lg



  • Der Rest sind die Minuten. Und die werden dann nicht größer als 59.

    Falls du mit den 60 und 24 Schwierigkeiten hast, probier es mit Längen aus.
    Eingabe in mm und Ausgabe in Kilometer, Meter , Centimeter und Millimeter.
    Das Prinzip ist das selbe, du hast da aber nur Zehnerpotenzen als Teiler und die Zahlenwerte ändern sich dadurch auch nicht.

    123456789 mm = 123 km & 456 m & 78 cm & 9 mm



  • DirkB schrieb:

    Lass das double sein. Nimm dazu unsigned long.

    Wozu unsigned-Arithmetik? Die ist u.U. langsamer und bringt u.U. Probleme mit sich. Ich würde long nehmen.



  • philipp2100 schrieb:

    Ich würde long nehmen.

    Was letztlich auf int hinausläuft da long und int gleich groß sind (auf nahezu allen Systemen).



  • Ähh.. nein? Auf den meisten unixoiden Systemen nicht, siehe:
    http://de.wikipedia.org/wiki/64-Bit-Architektur#Programmiermodell



  • philipp2100 schrieb:

    Ähh.. nein? Auf den meisten unixoiden Systemen nicht, siehe:
    http://de.wikipedia.org/wiki/64-Bit-Architektur#Programmiermodell

    Ich hatte lediglich die Programmiermodelle mal verglichen und da gibt es nur Unterschiede zwischen int und long bei LP32 und LP64. Das sind dann nur 2 von 6 Modellen die ich gefunden habe. Die Verbreitung habe ich scheinbar nicht genau überprüft. LP64 wird ja wohl von den meisten Linux und Unix-Systemen verwendet. Deswegen hast du natürlich Rechte und ich ziehe meine Aussage zurück.



  • Wenn ich jetzt bsp eingebe
    1 000 000 Sek
    1.) 1 000 000 / 60 = 16666,666...
    16 666 = Min; 1 000 000 % 60 = 40;
    2.) 16 666 / 60 = 277,76...
    277 = Std; und jetzt muss ich doch noch en Rest den ich habe sind ja noch Minuten also die .76... * 60 oder eben 16 666 % 60. Und diesen Wert noch den Min = 16 666 zuordnen oder ...
    Ok ich glaube ich habe meinen Fehler erkannt!!
    Den Wert 16 666 darf ich nicht als Min interpretieren, sondern ich muss hier Modulo 60 nehmen = Minuten! ... Die 16 666 wandle ich ja dann noch um in Stunden also wieder durch 60; 277 --> sind aber auch nicht die Stunden sondern dann durch 24 = 11,54 ---> Die Stunden sind dann 277%24 ...usw
    So gesehen sind die ganzen if Verzweigungen unnötig.
    Ich brauche gar keine! ...
    Vielen Dank für die Hilfe 😉

    Lg



  • Ja. Oder auch:
    `Tage = Sek / (3600 * 24).

    Stunden = (Sek - (Tage * 3600 * 24)) / 3600 = (Sek % (3600 * 24)) / 3600.

    Minuten = (Sek - (Tage * 3600 * 24) - (Stunden * 3600)) / 60 = (Sek % 3600) / 60.

    Sekunden = Sek - (Tage * 3600 * 24) - (Stunden * 3600) - (Minuten * 60) = Sek % 60.`

    Das / bedeutet jeweils ganzzalige Division (der Rest wird ignoriert, es wird also abgerundet). Jetzt verstehst du bestimmt, warum sich hier Ganzzahlarithmetik (-> Integervariablen) anbieten.
    Fließkommaarithmetik braucht man nur bei skalenübergreifenden (es kommen sehr kleine und sehr große Zahlen in der selben Rechnung vor) Rechnungen. Für alles andere nimmt man besser Ganzzahlen. Also auch z.B. bei Geldbeträgen lieber mit ints in Cent rechnen.



  • Yep danke vielen Dank 😉


Anmelden zum Antworten