Tageszeit Projekt -> Zeitausagbe in Worten



  • Hallo,

    wir haben in der FH die Aufgabe bekommen eine Tageszeit Funktion zu schreiben und um eine Funtkion unserer Wahl zu ergänzen.

    Hier mal die Dateien

    daytime.h

    // daytime.h: interface for the daytime class.
    //
    //////////////////////////////////////////////////////////////////////
    
    #pragma once
    
    class daytime  
    {
    	private:
    		int hour;
    		int minute;
    		int second;
    		static int NumberOfTimeObjekts;
    
    	public:
    		daytime();
    		~daytime();
    		void print12hFormat();
    		void print24hFormat();
    		void setHMS(int, int, int);
    		void endTime();
    		int getTimeInSeconds();
    		void setS(int);
    		void timeInBit();
    
    };
    

    main.cpp

    //////////////////////////////////////////////////////////////////////
    // File: main.cpp
    // Author: Gunnar Goebel
    // Date: 06-04-28
    // Version 1.0
    // Copyright: This File is released under a creative Common Licence. See Link for further Information
    // Licence Link: http://creativecommons.org/licenses/by-nc-sa/2.0/de/
    //////////////////////////////////////////////////////////////////////
    #include "daytime.h"
    #include <iostream>
    
    using std::cout; using std::endl;
    
    int getDurationInSeconds(daytime, daytime);
    
    int main() {
    
    	daytime begin, end, duration;
    	// define Starttime: 18:05:00
    	begin.setHMS(18,5,0);
    	cout << "Das Abendessen beginnt um: ";
    	// Display Time in 24h 
    	begin.print24hFormat();
    	cout << " oder in Bit: ";
    	begin.timeInBit();
    	// define Endtime: 20:14:10
    	end.setHMS(20,40,59);
    	cout << "Das Abendessen endet um: ";
    	// Display Time in 24h
    	end.print24hFormat();
    	cout << " oder in Bit: ";
    	end.timeInBit();
    	// calculate Time between Start an End 
    	int durationInSeconds = getDurationInSeconds(end, begin);
    	// Display Time in hours, minutes and seconds
    	duration.setS(durationInSeconds);
    	cout << "Das Abendessen dauert: ";
    	// Display Time in 24h
    	duration.print24hFormat();
    	cout << " oder in Bit: ";
    	duration.timeInBit();
    
    return 0;
    }
    

    daytime.cpp

    // File: daytime.cpp: implementation of the daytime class.
    // Author: Gunnar Goebel
    // Date: 06-04-28
    // Version 1.0
    // Copyright: This File is released under a creative Common Licence. See Link for further Information
    // Licence Link: http://creativecommons.org/licenses/by-nc-sa/2.0/de/
    //////////////////////////////////////////////////////////////////////
    
    #include "daytime.h"
    #include <iostream>
    #include <cassert>
    using namespace std;
    
    //////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////
    int daytime::NumberOfTimeObjekts = 0;
    
    daytime::daytime()
    {
    	++ NumberOfTimeObjekts;
    	cout << "Vorhandene Objekte: " << NumberOfTimeObjekts <<endl;
    }
    
    daytime::~daytime()
    {
    	-- NumberOfTimeObjekts;
    	cout << "Vorhandene Objekte: " << NumberOfTimeObjekts <<endl;
    }
    
    void daytime::print24hFormat()
    {
    	cout << ( hour < 10 ? "0" : "" ) << hour << ":"
             << ( minute < 10 ? "0" : "" ) << minute << ":"
             << ( second < 10 ? "0" : "" ) << second;
    }
    
    void daytime::print12hFormat()
    {
    	cout << (( hour==0 || hour==12 ) ? 12 : hour % 12 )
             << ":" << ( minute < 10 ? "0" : "" ) << minute
             << ":" << ( second < 10 ? "0" : "" ) << second
             << ( hour < 12 ? " AM" : " PM" );
    }
    
    void daytime::setHMS(int HMShour, int HMSminute, int HMSsecond)
    {
    	assert(hour < 24);
    	assert(minute < 60);
    	assert(second < 60);
    	HMShour = HMShour > 0 ? HMShour : -HMShour;
    	hour = HMShour;
    	HMSminute = HMSminute > 0 ? HMSminute : -HMSminute;
    	minute = HMSminute;
    	HMSsecond = HMSsecond > 0 ? HMSsecond : -HMSsecond;
    	second = HMSsecond;
    }
    
    void daytime::endTime()
    {
    	cout << "Abendessen endet um: ";
    	cout << ( hour < 10 ? "0" : "" ) << hour << ":"
    		 << ( minute < 10 ? "0" : "" ) << minute << ":"
    		 << ( second < 10 ? "0" : "" ) << second <<endl;
    }
    
    int daytime::getTimeInSeconds()
    {
    	int sec;
    	sec = hour*60*60 + minute*60 + second;
    return sec;
    }
    
    void daytime::setS(int sec)
    {
    	assert(sec < 86401);
    	hour = sec/3600;
    	sec = sec%3600;
    	minute = sec/60;
    	second = sec%60;
    }
    
    void daytime::timeInBit()
    {
    	int number, number1, number2, number3, number4, number5;
    
    	number = hour;
    	number5 = number%2;
    	number = number/2;
    	number4 = number%2;
    	number = number/2;
    	number3 = number%2;
    	number = number/2;
    	number2 = number%2;
    	number = number/2;
    	number1 = number%2;
    	number = number/2;
    	number = number%2;
    
    	cout << number << number1 << number2 << number3 << number4 << number5 << " : ";
    
    	number = minute;
    	number5 = number%2;
    	number = number/2;
    	number4 = number%2;
    	number = number/2;
    	number3 = number%2;
    	number = number/2;
    	number2 = number%2;
    	number = number/2;
    	number1 = number%2;
    	number = number/2;
    	number = number%2;
    
    	cout << number << number1 << number2 << number3 << number4 << number5 << " : ";
    
    	number = second;
    	number5 = number%2;
    	number = number/2;
    	number4 = number%2;
    	number = number/2;
    	number3 = number%2;
    	number = number/2;
    	number2 = number%2;
    	number = number/2;
    	number1 = number%2;
    	number = number/2;
    	number = number%2;
    
    	cout << number << number1 << number2 << number3 << number4 << number5 << endl;
    }
    
    int getDurationInSeconds(daytime end, daytime begin)
    {
    	int durationInSeconds;
    	durationInSeconds = end.getTimeInSeconds() - begin.getTimeInSeconds();
    return durationInSeconds;
    }
    

    Ich würde nun gerne die Funktion der Anzeige in Bits nutzen bzw so ändern, das es nicht binär angezeigt wird, sondern in Worten.

    Also die 1 = eins, 2 = zwei setzen etc.

    Wie genau kann ich das nun machen?

    würde es über

    hour ==1 = eins
    hour == 2 = zwei
    etc
    

    gehen?

    Da wir zwar bereits Klassen durchnehmen, aber vorher sehr wenig Funktionen kennengelernt haben, kann ich nur mit sehr einfachen Dingen Arbeiten (keine schleifen etc)

    MfG

    Gunnar



  • Hallo Gunnar,

    is bestimmt nicht die beste Lösung, aber ich lerne auch erst grad C++ und würde das mit einem Sting-Array machen.

    string hourWords[] = {"", "eins", "zwei", "drei", "vier", "fuenf", "sechs",
                              "sieben", "acht", "neun", "zehn", "elf", "zwoelf" };                
    cout << hourWords[4] << endl;
    

    Gruß Chris



  • ThaRealMatix schrieb:

    Da wir zwar bereits Klassen durchnehmen, aber vorher sehr wenig Funktionen kennengelernt haben, kann ich nur mit sehr einfachen Dingen Arbeiten (keine schleifen etc)

    Schleifen gehören zu den Grundlagen jeder Programmiersprache - also ehe du dich mit weitergehenden Aspekten der Sprache beschäftigst, solltest du dich erst darum kümmern 😉

    PS: Übrigens sollte die setHMS besser prüfen, ob die übergebenen Parameter im Limit liegen, sonst macht dein Programm Unsinn:

    daytime now;
    now.setHMS(25,30,0);//problemlos akzeptiert
    now.setHMS(11,55,0);//'assert(hour<24);' schießt dein Programm ab
    

    Desweiteren ist die Methode "endTime()" imho unnötig (aber das ist deine Entscheidung) und die Klasse sollte ein Set Konstruktoren erhalten, die die Werte vernünftig initialisieren.



  • ich würde mich ja liebend gerne um schleifen etc kümmern, nur unser Prof sagt, das wir ohnehin keine Funktionen nutzen dürfen, die er in der Vorlesung noch nicht vorgestellt hat --> also keine Schleifen 😢

    Wie genau könnte ich denn die Prüfung umsetzen, ich dachte der assert würde das machen 😞



  • Ja, der assert ist schon das richtige (zumindest für die hartgesottenen, normalerweise überprüft man besser per if(), da bekommt der User noch die Möglichkeit, Fehler zu berichtigen), aber du solltest besser die neu übergebenen Werteauf ihre Richtigkeit überprüfen:

    void daytime::setHMS(int HMShour, int HMSminute, int HMSsecond)
    {
        assert(HMShour < 24 && HMShour >= 0);// das fängt zusätzlich noch negative Werte ab
        assert(HMSminute < 60 && HMSminute >= 0);
        assert(HMSsecond < 60 && HMSsecond >= 0);
    
        hour = HMShour;
        minute = HMSminute;
        second = HMSsecond;
    }
    

    Bessere Lösung wäre es übrigens, statt dem "assert(xyz);" (das schießt bei "Erfolg" dein Programm ohne weitere Rückmeldungen ab) ein "if(!xyz) return;" einzbauen (damit wird nur die Setzen-Methode beendet, wenn du ungültige Werte übergeben hast).

    PS: Sag deinem Prof, er soll doch bitte bei den Grundlagen beginnen. Bevor ihr nicht solche elemantare Steuerstrukturen wie Schleifen oder if() erklärt bekommt, macht alles weitere keinen Sinn.



  • *g*

    Das hab ich ihm schon gesagt, das eiegentlich jedes Buch das ich kenn erst mit elementaren Methoden etc anfängt... er sagt er macht erst Klassen und Objekte weil er uns von Anfang an an objektorientierte Programmierung gewöhnen möchte und nicht an prozessorientierte

    Ich muss dazu sagen wir sind ja noch nicht weit... ca 1 Monat 😉

    Ich lese aber nebenbei auch ein Buch wo ich es denke ich so mache, wie es Dir lieber wäre.

    Nur darf ich halt nur das benutzen, was in der Vorlesung bereits vorkam um mich ans "Pflichtenheft" zu halten.

    ....

    Die Ausgabe in Worten bekomme ich aber leider nicht hin 😞



  • Was spricht denn gegen den Vorschlag von chris?

    int hour12 = (( hour==0 || hour==12 ) ? 12 : hour % 12 )
    string hourWords[] = {"", "eins", "zwei", "drei", "vier", "fuenf", "sechs",
                              "sieben", "acht", "neun", "zehn", "elf", "zwoelf" }; cout << hourWords[hour12] << endl;
    

    PS: Ja, Klassen aufzubauen ist ein guter Einstieg in die OOP - nur was nützen diese Klassen, wenn man ihre Methoden nicht vernünftig strukturieren kann 😉



  • Hm... sorry aber ich bin wohl zu doof, wenn ich das nun einbau geht nüx ^^



  • Wo (und wie) hast du das denn eigebaut? Und was erwartest du, daß gehen soll?



  • Hm...

    ich hatte nun euren Code in die daytime.cpp eingesetzt. Dann hab ich noch in der daytime.h unter public int hour12(); eingetragen

    Wenn Du Dir meinen Code ansiehst, wirst Du sehen, das die Uhrzeit auch in Bit ausgegeben wird.

    Diese Funktion würde ich gern dadurch ersetzen, das es nicht in Bit sondern in Worten ausgegeben wird ^^



  • die hour12 brauchst du nicht als Element deiner Klasse, das reicht, wenn du sie lokal in der entsprechenden Ausgabemethode definierst:

    //neue Methode:
    void daytime::printHourText()
    {
      int hour12 = (( hour==0 || hour==12 ) ? 12 : hour % 12 )
      string hourWords[] = {"", "ein", "zwei", "drei", "vier", "fuenf", "sechs",
                              "sieben", "acht", "neun", "zehn", "elf", "zwoelf" };
      cout << hourWords[hour12]<<" Uhr\n";
    }
    
    //im Hauptprogramm
    ...
    daytime stunde;
    stunde setHMS(12,0,0);
    cout<<"Es ist jetzt ";
    stunde.printHourText();
    


  • hm.. ich bekomme folgenden Fehler beim kompilieren

    Compiling...
    daytime.cpp
    D:\Dateien\Studium\FH Darmstadt\Programmieren 1\Praktika\2006_05_05\Class2_Daytime\daytime.cpp(146) : error C2146: syntax error : missing ';' before identifier 'string'
    D:\Dateien\Studium\FH Darmstadt\Programmieren 1\Praktika\2006_05_05\Class2_Daytime\daytime.cpp(146) : error C2146: syntax error : missing ';' before identifier 'hourWords'
    D:\Dateien\Studium\FH Darmstadt\Programmieren 1\Praktika\2006_05_05\Class2_Daytime\daytime.cpp(146) : error C2275: 'string' : illegal use of this type as an expression
    c:\programme\microsoft visual studio\vc98\include\xstring(612) : see declaration of 'string'
    D:\Dateien\Studium\FH Darmstadt\Programmieren 1\Praktika\2006_05_05\Class2_Daytime\daytime.cpp(146) : error C2065: 'hourWords' : undeclared identifier
    D:\Dateien\Studium\FH Darmstadt\Programmieren 1\Praktika\2006_05_05\Class2_Daytime\daytime.cpp(146) : error C2059: syntax error : ']'
    D:\Dateien\Studium\FH Darmstadt\Programmieren 1\Praktika\2006_05_05\Class2_Daytime\daytime.cpp(146) : error C2143: syntax error : missing ';' before '{'
    D:\Dateien\Studium\FH Darmstadt\Programmieren 1\Praktika\2006_05_05\Class2_Daytime\daytime.cpp(147) : error C2143: syntax error : missing ';' before '}'
    D:\Dateien\Studium\FH Darmstadt\Programmieren 1\Praktika\2006_05_05\Class2_Daytime\daytime.cpp(148) : error C2109: subscript requires array or pointer type
    Error executing cl.exe.

    Class2_Daytime.exe - 8 error(s), 0 warning(s)

    daytime.cpp

    // File: daytime.cpp: implementation of the daytime class.
    // Author: Gunnar Goebel
    // Date: 06-04-28
    // Version 1.0
    // Copyright: This File is released under a creative Common Licence. See Link for further Information
    // Licence Link: http://creativecommons.org/licenses/by-nc-sa/2.0/de/
    //////////////////////////////////////////////////////////////////////
    
    #include "daytime.h"
    #include <iostream>
    #include <cassert>
    #include <string>
    using namespace std;
    
    //////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////
    int daytime::NumberOfTimeObjekts = 0;
    
    daytime::daytime()
    {
    	++ NumberOfTimeObjekts;
    	cout << "Vorhandene Objekte: " << NumberOfTimeObjekts <<endl;
    }
    
    daytime::~daytime()
    {
    	-- NumberOfTimeObjekts;
    	cout << "Vorhandene Objekte: " << NumberOfTimeObjekts <<endl;
    }
    
    void daytime::print24hFormat()
    {
    	cout << ( hour < 10 ? "0" : "" ) << hour << ":"
             << ( minute < 10 ? "0" : "" ) << minute << ":"
             << ( second < 10 ? "0" : "" ) << second;
    }
    
    void daytime::print12hFormat()
    {
    	cout << (( hour==0 || hour==12 ) ? 12 : hour % 12 )
             << ":" << ( minute < 10 ? "0" : "" ) << minute
             << ":" << ( second < 10 ? "0" : "" ) << second
             << ( hour < 12 ? " AM" : " PM" );
    }
    
    void daytime::setHMS(int HMShour, int HMSminute, int HMSsecond)
    {
    	// check if hour >=0 and <24
        assert(HMShour < 24 && HMShour >= 0);
    	// check if minute >=0 and <60
        assert(HMSminute < 60 && HMSminute >= 0);
    	// check if second >=0 and <60
        assert(HMSsecond < 60 && HMSsecond >= 0);
    
        hour = HMShour;
        minute = HMSminute;
        second = HMSsecond;
    }
    
    void daytime::endTime()
    {
    	cout << "Abendessen endet um: ";
    	cout << ( hour < 10 ? "0" : "" ) << hour << ":"
    		 << ( minute < 10 ? "0" : "" ) << minute << ":"
    		 << ( second < 10 ? "0" : "" ) << second <<endl;
    }
    
    int daytime::getTimeInSeconds()
    {
    	int sec;
    	sec = hour*60*60 + minute*60 + second;
    return sec;
    }
    
    void daytime::setS(int sec)
    {
    	assert(sec < 86401);
    	hour = sec/3600;
    	sec = sec%3600;
    	minute = sec/60;
    	second = sec%60;
    }
    
    void daytime::printHourText()
    {
      int hour12 = (( hour==0 || hour==12 ) ? 12 : hour % 12 )
      string hourWords[] = {"", "ein", "zwei", "drei", "vier", "fuenf", "sechs",
                              "sieben", "acht", "neun", "zehn", "elf", "zwoelf" };
      cout << hourWords[hour12]<<" Uhr\n";
    } 
    /*void daytime::timeInBit()
    {
    	int number, number1, number2, number3, number4, number5;
    
    	number = hour;
    	number5 = number%2;
    	number = number/2;
    	number4 = number%2;
    	number = number/2;
    	number3 = number%2;
    	number = number/2;
    	number2 = number%2;
    	number = number/2;
    	number1 = number%2;
    	number = number/2;
    	number = number%2;
    
    	cout << number << number1 << number2 << number3 << number4 << number5 << " : ";
    
    	number = minute;
    	number5 = number%2;
    	number = number/2;
    	number4 = number%2;
    	number = number/2;
    	number3 = number%2;
    	number = number/2;
    	number2 = number%2;
    	number = number/2;
    	number1 = number%2;
    	number = number/2;
    	number = number%2;
    
    	cout << number << number1 << number2 << number3 << number4 << number5 << " : ";
    
    	number = second;
    	number5 = number%2;
    	number = number/2;
    	number4 = number%2;
    	number = number/2;
    	number3 = number%2;
    	number = number/2;
    	number2 = number%2;
    	number = number/2;
    	number1 = number%2;
    	number = number/2;
    	number = number%2;
    
    	cout << number << number1 << number2 << number3 << number4 << number5 << endl;
    }
    */
    int getDurationInSeconds(daytime end, daytime begin)
    {
    	int durationInSeconds;
    	durationInSeconds = end.getTimeInSeconds() - begin.getTimeInSeconds();
    return durationInSeconds;
    }
    

    main.cpp

    //////////////////////////////////////////////////////////////////////
    // File: main.cpp
    // Author: Gunnar Goebel
    // Date: 06-04-28
    // Version 1.0
    // Copyright: This File is released under a creative Common Licence. See Link for further Information
    // Licence Link: http://creativecommons.org/licenses/by-nc-sa/2.0/de/
    //////////////////////////////////////////////////////////////////////
    #include "daytime.h"
    #include <iostream>
    using std::cout; using std::endl;
    
    int getDurationInSeconds(daytime, daytime);
    
    int main()
    {
    
    	daytime begin, end, duration;
    	// define Starttime: 18:05:00
    	begin.setHMS(18,5,0);
    	cout << "Das Abendessen beginnt um: ";
    	// Display Time in 24h 
    	begin.print24hFormat();
    	cout << " oder in Bit: ";
    	begin.printHourText();
    	// define Endtime: 20:14:10
    	end.setHMS(20,40,59);
    	cout << "Das Abendessen endet um: ";
    	// Display Time in 24h
    	end.print24hFormat();
    	cout << " oder in Bit: ";
    	end.timeInBit();
    	// calculate Time between Start an End 
    	int durationInSeconds = getDurationInSeconds(end, begin);
    	// Display Time in hours, minutes and seconds
    	duration.setS(durationInSeconds);
    	cout << "Das Abendessen dauert: ";
    	// Display Time in 24h
    	duration.print24hFormat();
    	cout << " oder in Bit: ";
    	duration.timeInBit();
    
    return 0;
    }
    

    daytime.h

    // daytime.h: interface for the daytime class.
    //
    //////////////////////////////////////////////////////////////////////
    
    #pragma once
    
    class daytime  
    {
    	private:
    		int hour;
    		int minute;
    		int second;
    		static int NumberOfTimeObjekts;
    
    	public:
    		daytime();
    		~daytime();
    		void print12hFormat();
    		void print24hFormat();
    		void setHMS(int, int, int);
    		void endTime();
    		int getTimeInSeconds();
    		void setS(int);
    		void timeInBit();
    		void daytime::printHourText();
    };
    


  • Das steht doch genau, was er will "missing ';' before identifier 'string'" - am Ende der vorigen Zeile fehlt das Semikolon (sorry). Alles andere dürften dann Folgefehler sein.

    (und in der Klassendeklaration ist das "daytime::" vor dem Methodennamen überflüssig)



  • oh hm habs selber gelöst,

    aber wie bekomme ich nun noch die anzeige der Minuten und Sekunden hin? einfach funktion kopieren und hour12 durch minute60 ersetzen bzw das anpassen?



  • Für Minuten und Sekunden benötigst du ein etwas größeres Array (mit den Strings von "eins" bis "neunundfünfzig") oder du mußt die Zahl passend zerlegen und stückweise umsetzen.

    (ich hab' noch irgendwo zu Hause ein Pascal-Programm, das Zahlen bis 1 Million als Text darstellen konnte)



  • Hm... bei Minuten hab ich es noch hinbekommen (mal abgesehen davon, das sie nicht bis 59 definiert sind), aber bei den sekunden sagt mri der kompiler keine fehler, führt das programm aus und dann kackt die konsole ab und ich kann nur schließen

    Class2_Daytime.exe hat ein Problem festgestellt und muss beendet werden.

    // File: daytime.cpp: implementation of the daytime class.
    // Author: Gunnar Goebel
    // Date: 06-04-28
    // Version 1.0
    // Copyright: This File is released under a creative Common Licence. See Link for further Information
    // Licence Link: http://creativecommons.org/licenses/by-nc-sa/2.0/de/
    //////////////////////////////////////////////////////////////////////
    
    #include "daytime.h"
    #include <iostream>
    #include <cassert>
    #include <string>
    using namespace std;
    
    //////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////
    int daytime::NumberOfTimeObjekts = 0;
    
    daytime::daytime()
    {
    	++ NumberOfTimeObjekts;
    	cout << "Vorhandene Objekte: " << NumberOfTimeObjekts <<endl;
    }
    
    daytime::~daytime()
    {
    	-- NumberOfTimeObjekts;
    	cout << "Vorhandene Objekte: " << NumberOfTimeObjekts <<endl;
    }
    
    void daytime::print24hFormat()
    {
    	cout << ( hour < 10 ? "0" : "" ) << hour << ":"
             << ( minute < 10 ? "0" : "" ) << minute << ":"
             << ( second < 10 ? "0" : "" ) << second;
    }
    
    void daytime::print12hFormat()
    {
    	cout << (( hour==0 || hour==12 ) ? 12 : hour % 12 )
             << ":" << ( minute < 10 ? "0" : "" ) << minute
             << ":" << ( second < 10 ? "0" : "" ) << second
             << ( hour < 12 ? " AM" : " PM" );
    }
    
    void daytime::setHMS(int HMShour, int HMSminute, int HMSsecond)
    {
    	// check if hour >=0 and <24
        assert(HMShour < 24 && HMShour >= 0);
    	// check if minute >=0 and <60
        assert(HMSminute < 60 && HMSminute >= 0);
    	// check if second >=0 and <60
        assert(HMSsecond < 60 && HMSsecond >= 0);
    
        hour = HMShour;
        minute = HMSminute;
        second = HMSsecond;
    }
    
    void daytime::endTime()
    {
    	cout << "Abendessen endet um: ";
    	cout << ( hour < 10 ? "0" : "" ) << hour << ":"
    		 << ( minute < 10 ? "0" : "" ) << minute << ":"
    		 << ( second < 10 ? "0" : "" ) << second <<endl;
    }
    
    int daytime::getTimeInSeconds()
    {
    	int sec;
    	sec = hour*60*60 + minute*60 + second;
    return sec;
    }
    
    void daytime::setS(int sec)
    {
    	assert(sec < 86401);
    	hour = sec/3600;
    	sec = sec%3600;
    	minute = sec/60;
    	second = sec%60;
    }
    
    void daytime::printHourText()
    {
      int hour12 = (( hour==0 || hour==12 ) ? 12 : hour % 12 );
      string hourWords[] = {"", "ein", "zwei", "drei", "vier", "fuenf", "sechs",
                              "sieben", "acht", "neun", "zehn", "elf", "zwoelf" };
      cout << hourWords[hour12]<<" Uhr\n";
    } 
    
    void daytime::printMinuteText()
    {
      int minute60 = (( minute==0 || minute==60 ) ? 60 : minute % 60 );
      string minuteWords[] = {"", "ein", "zwei", "drei", "vier", "fuenf", "sechs",
                              "sieben", "acht", "neun", "zehn", "elf", "zwoelf" };
      cout << minuteWords[minute60]<<" Minuten\n";
    } 
    
    void daytime::printSecondText()
    {
      int second60 = (( second==0 || second==60 ) ? 60 : second % 60 );
      string secondWords[] = {"", "ein", "zwei", "drei", "vier", "fuenf", "sechs",
                              "sieben", "acht", "neun", "zehn", "elf", "zwoelf" };
      cout << secondWords[second60]<<" Sekunden\n";
    } 
    /*void daytime::timeInBit()
    {
    	int number, number1, number2, number3, number4, number5;
    
    	number = hour;
    	number5 = number%2;
    	number = number/2;
    	number4 = number%2;
    	number = number/2;
    	number3 = number%2;
    	number = number/2;
    	number2 = number%2;
    	number = number/2;
    	number1 = number%2;
    	number = number/2;
    	number = number%2;
    
    	cout << number << number1 << number2 << number3 << number4 << number5 << " : ";
    
    	number = minute;
    	number5 = number%2;
    	number = number/2;
    	number4 = number%2;
    	number = number/2;
    	number3 = number%2;
    	number = number/2;
    	number2 = number%2;
    	number = number/2;
    	number1 = number%2;
    	number = number/2;
    	number = number%2;
    
    	cout << number << number1 << number2 << number3 << number4 << number5 << " : ";
    
    	number = second;
    	number5 = number%2;
    	number = number/2;
    	number4 = number%2;
    	number = number/2;
    	number3 = number%2;
    	number = number/2;
    	number2 = number%2;
    	number = number/2;
    	number1 = number%2;
    	number = number/2;
    	number = number%2;
    
    	cout << number << number1 << number2 << number3 << number4 << number5 << endl;
    }
    */
    int getDurationInSeconds(daytime end, daytime begin)
    {
    	int durationInSeconds;
    	durationInSeconds = end.getTimeInSeconds() - begin.getTimeInSeconds();
    return durationInSeconds;
    }
    


  • Du hast ein Array mit (aktuell) 13 Elementen - wenn du jetzt einen Sekundenwert über 12 ausgeben willst, liest du von Speicher, der dir nicht gehört - und das ergibt undefiniertes Verhalten (dein Programm interpretiert irgendwelche Mülldaten als "string"-Objekt).

    Versuch's mal in etwa so:

    //global in der daytime.cpp
    static string numbers[]=
    {"null","ein","zwei","drei",...,"achtundfünfzig","neunundfünfzig"};
    //ich weiß, das ist eine Menge Schreibarbeit, alle Zahlwörter zusammenzutragen
    
    void daytime::printHour12()
    {
      int h12 = (( hour==0 || hour==12 ) ? 12 : hour % 12 );
      cout << numbers[h12] << " Uhr";
    }
    
    void daytime::printHour24()
    {cout << numbers[hour] << " Uhr";}
    void daytime::printMinute()
    {cout << numbers[minute] << (minute==1)?" Minute":" Minuten";}
    void daytime::printSecond()
    {cout << numbers[second] << (second==1)?" Sekunde":" Sekunden";}
    


  • so nun mal das komplette Porjekt so wie es fertig ist, compiler meckert nicht, das Programm stürzt aber ab 😞

    daytime.cpp

    // File: daytime.cpp: implementation of the daytime class.
    // Author: Gunnar Goebel
    // Date: 06-04-28
    // Version 1.0
    // Copyright: This File is released under a creative Common Licence. See Link for further Information
    // Licence Link: http://creativecommons.org/licenses/by-nc-sa/2.0/de/
    //////////////////////////////////////////////////////////////////////
    
    #include "daytime.h"
    #include <iostream>
    #include <cassert>
    #include <string>
    using namespace std;
    
    //////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////
    int daytime::NumberOfTimeObjekts = 0;
    
    daytime::daytime()
    {
    	++ NumberOfTimeObjekts;
    	cout << "Vorhandene Objekte: " << NumberOfTimeObjekts <<endl;
    }
    
    daytime::~daytime()
    {
    	-- NumberOfTimeObjekts;
    	cout << "Vorhandene Objekte: " << NumberOfTimeObjekts <<endl;
    }
    
    void daytime::print24hFormat()
    {
    	cout << ( hour < 10 ? "0" : "" ) << hour << ":"
             << ( minute < 10 ? "0" : "" ) << minute << ":"
             << ( second < 10 ? "0" : "" ) << second;
    }
    
    void daytime::print12hFormat()
    {
    	cout << (( hour==0 || hour==12 ) ? 12 : hour % 12 )
             << ":" << ( minute < 10 ? "0" : "" ) << minute
             << ":" << ( second < 10 ? "0" : "" ) << second
             << ( hour < 12 ? " AM" : " PM" );
    }
    
    void daytime::setHMS(int HMShour, int HMSminute, int HMSsecond)
    {
    	// check if hour >=0 and <24
        assert(HMShour < 24 && HMShour >= 0);
    	// check if minute >=0 and <60
        assert(HMSminute < 60 && HMSminute >= 0);
    	// check if second >=0 and <60
        assert(HMSsecond < 60 && HMSsecond >= 0);
    
        hour = HMShour;
        minute = HMSminute;
        second = HMSsecond;
    }
    
    void daytime::endTime()
    {
    	cout << "Abendessen endet um: ";
    	cout << ( hour < 10 ? "0" : "" ) << hour << ":"
    		 << ( minute < 10 ? "0" : "" ) << minute << ":"
    		 << ( second < 10 ? "0" : "" ) << second <<endl;
    }
    
    int daytime::getTimeInSeconds()
    {
    	int sec;
    	sec = hour*60*60 + minute*60 + second;
    return sec;
    }
    
    void daytime::setS(int sec)
    {
    	assert(sec < 86401);
    	hour = sec/3600;
    	sec = sec%3600;
    	minute = sec/60;
    	second = sec%60;
    }
    
    void daytime::printHourText()
    {
      int hour12 = (( hour==0 || hour==12 ) ? 12 : hour % 12 );
      string hourWords[] = {"", "ein", "zwei", "drei", "vier", "fuenf", "sechs",
                              "sieben", "acht", "neun", "zehn", "elf", "zwoelf" };
      cout << hourWords[hour12]<<" Uhr\n";
    } 
    
    void daytime::printMinuteText()
    {
      int minute60 = (( minute==0 || minute==60 ) ? 60 : minute % 60 );
      string minuteWords[] = {"", "ein", "zwei", "drei", "vier", "fuenf", "sechs",
                              "sieben", "acht", "neun", "zehn", "elf", "zwoelf", "dreizehn",
    						  "vierzehn", "fuenfzehn", "sechzehn", "siebzehn", "achtzehn",
    						  "neunzeh", "zwanzig", "einundzwanzig", "zweiundzwanzig", "dreiundzwanzig",
    						  "vierundzwanzig", "fuenfundzwanzig", "sechsundzwanzig", "siebenundzwanzig"
    						  "achtundzwanzig", "neunundzwanzig", "dreissig", "einunddreissig",
    						  "zweiunddreissig", "dreiunddressig", "vierunddreissig",
    						  "fuenfunddreissig", "sechsunddreissig", "siebenunddreissig", 
    						  "achtunddreissig", "neununddreissig", "vierzig", "einundvierzig", "zweiundvierzig",
    						  "dreiundvierzig", "vierundvierzig", "fuenfundvierzig", "sechsundvierzig", "siebenundvierzig"
    						  "achtundvierzig", "neunundvierzig", "fuenfzig", "einundfuenzig", "zweiundfuenzig",
    						  "dreiundfuenzig", "vierundfuenzig", "fuenfundfuenzig", "sechsundfuenzig", "siebenundfuenzig"
    						  "achtundfuenzig", "neunundfuenzig",};
      cout << minuteWords[minute60]<<" Minuten\n";
    } 
    
    void daytime::printSecondText()
    {
      int second60 = (( second==0 || second==60 ) ? 60 : second % 60 );
      string secondWords[] = {"", "ein", "zwei", "drei", "vier", "fuenf", "sechs",
                              "sieben", "acht", "neun", "zehn", "elf", "zwoelf", "dreizehn",
    						  "vierzehn", "fuenfzehn", "sechzehn", "siebzehn", "achtzehn",
    						  "neunzeh", "zwanzig", "einundzwanzig", "zweiundzwanzig", "dreiundzwanzig",
    						  "vierundzwanzig", "fuenfundzwanzig", "sechsundzwanzig", "siebenundzwanzig"
    						  "achtundzwanzig", "neunundzwanzig", "dreissig", "einunddreissig",
    						  "zweiunddreissig", "dreiunddressig", "vierunddreissig",
    						  "fuenfunddreissig", "sechsunddreissig", "siebenunddreissig", 
    						  "achtunddreissig", "neununddreissig", "vierzig", "einundvierzig", "zweiundvierzig",
    						  "dreiundvierzig", "vierundvierzig", "fuenfundvierzig", "sechsundvierzig", "siebenundvierzig"
    						  "achtundvierzig", "neunundvierzig", "fuenfzig", "einundfuenzig", "zweiundfuenzig",
    						  "dreiundfuenzig", "vierundfuenzig", "fuenfundfuenzig", "sechsundfuenzig", "siebenundfuenzig"
    						  "achtundfuenzig", "neunundfuenzig",};
      cout << secondWords[second60]<<" Sekunden\n";
    } 
    /*void daytime::timeInBit()
    {
    	int number, number1, number2, number3, number4, number5;
    
    	number = hour;
    	number5 = number%2;
    	number = number/2;
    	number4 = number%2;
    	number = number/2;
    	number3 = number%2;
    	number = number/2;
    	number2 = number%2;
    	number = number/2;
    	number1 = number%2;
    	number = number/2;
    	number = number%2;
    
    	cout << number << number1 << number2 << number3 << number4 << number5 << " : ";
    
    	number = minute;
    	number5 = number%2;
    	number = number/2;
    	number4 = number%2;
    	number = number/2;
    	number3 = number%2;
    	number = number/2;
    	number2 = number%2;
    	number = number/2;
    	number1 = number%2;
    	number = number/2;
    	number = number%2;
    
    	cout << number << number1 << number2 << number3 << number4 << number5 << " : ";
    
    	number = second;
    	number5 = number%2;
    	number = number/2;
    	number4 = number%2;
    	number = number/2;
    	number3 = number%2;
    	number = number/2;
    	number2 = number%2;
    	number = number/2;
    	number1 = number%2;
    	number = number/2;
    	number = number%2;
    
    	cout << number << number1 << number2 << number3 << number4 << number5 << endl;
    }
    */
    int getDurationInSeconds(daytime end, daytime begin)
    {
    	int durationInSeconds;
    	durationInSeconds = end.getTimeInSeconds() - begin.getTimeInSeconds();
    return durationInSeconds;
    }
    

    main.cpp

    //////////////////////////////////////////////////////////////////////
    // File: main.cpp
    // Author: Gunnar Goebel
    // Date: 06-04-28
    // Version 1.0
    // Copyright: This File is released under a creative Common Licence. See Link for further Information
    // Licence Link: http://creativecommons.org/licenses/by-nc-sa/2.0/de/
    //////////////////////////////////////////////////////////////////////
    #include "daytime.h"
    #include <iostream>
    using std::cout; using std::endl;
    
    int getDurationInSeconds(daytime, daytime);
    
    int main()
    {
    
    	daytime begin, end, duration;
    	// define Starttime: 18:05:00
    	begin.setHMS(18,5,0);
    	cout << "Das Abendessen beginnt um: ";
    	// Display Time in 24h 
    	begin.print24hFormat();
    	cout << " oder in Worten: ";
    	begin.printHourText(); begin.printMinuteText(); begin.printSecondText();
    	// define Endtime: 20:14:10
    	end.setHMS(20,40,59);
    	cout << "Das Abendessen endet um: ";
    	// Display Time in 24h
    	end.print24hFormat();
    	cout << " oder in Worten: ";
    	end.printHourText(); end.printMinuteText(); end.printSecondText();
    	// calculate Time between Start an End 
    	int durationInSeconds = getDurationInSeconds(end, begin);
    	// Display Time in hours, minutes and seconds
    	duration.setS(durationInSeconds);
    	cout << "Das Abendessen dauert: ";
    	// Display Time in 24h
    	duration.print24hFormat();
    	cout << " oder in Worten: ";
    	duration.printHourText(); duration.printMinuteText(); duration.printSecondText();
    
    return 0;
    }
    

    daytime.h

    // daytime.h: interface for the daytime class.
    //
    //////////////////////////////////////////////////////////////////////
    
    #pragma once
    
    class daytime  
    {
    	private:
    		int hour;
    		int minute;
    		int second;
    		static int NumberOfTimeObjekts;
    
    	public:
    		daytime();
    		~daytime();
    		void print12hFormat();
    		void print24hFormat();
    		void setHMS(int, int, int);
    		void endTime();
    		int getTimeInSeconds();
    		void setS(int);
    		// void timeInBit();
    		void daytime::printHourText();
    		void daytime::printMinuteText();
    		void daytime::printSecondText();
    };
    


  • Lass doch mal bei den Minuten- und Sekunden-Angaben die Vor-Umrechnung weg und gib direkt minuteWords[minute] bzw. secondWords[second] aus* - der maximale Index der Arrays ist 59 und wenn du eine Zeit mit 0 Sekunden ausgibst, greifst du auf das (nicht vorhandene) Element 60 zu.

    (*) oder noch besser, du nutzt ein globales Array, aus dem alle drei Methoden ihre Stringwerte ziehen - siehe der Beispielcode in meinem vorigen Beitrag.



  • Hallo,

    das Programm läuft nun dank deinem Code soweit, nur hinten die Sekunden Ausgabe ist total verquert.

    Es kommt ein

    0Null0

    meine daytime.cpp

    // File: daytime.cpp: implementation of the daytime class.
    // Author: Gunnar Goebel
    // Date: 06-04-28
    // Version 1.0
    // Copyright: This File is released under a creative Common Licence. See Link for further Information
    // Licence Link: http://creativecommons.org/licenses/by-nc-sa/2.0/de/
    //////////////////////////////////////////////////////////////////////
    
    #include "daytime.h"
    #include <iostream>
    #include <cassert>
    #include <string>
    using namespace std;
    
    //////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////
    static string numbers[]= {"null", "ein", "zwei", "drei", "vier", "fuenf", "sechs",
                              "sieben", "acht", "neun", "zehn", "elf", "zwoelf", "dreizehn",
                              "vierzehn", "fuenfzehn", "sechzehn", "siebzehn", "achtzehn",
                              "neunzeh", "zwanzig", "einundzwanzig", "zweiundzwanzig", "dreiundzwanzig",
                              "vierundzwanzig", "fuenfundzwanzig", "sechsundzwanzig", "siebenundzwanzig"
                              "achtundzwanzig", "neunundzwanzig", "dreissig", "einunddreissig",
                              "zweiunddreissig", "dreiunddressig", "vierunddreissig",
                              "fuenfunddreissig", "sechsunddreissig", "siebenunddreissig",
                              "achtunddreissig", "neununddreissig", "vierzig", "einundvierzig", "zweiundvierzig",
                              "dreiundvierzig", "vierundvierzig", "fuenfundvierzig", "sechsundvierzig", "siebenundvierzig"
                              "achtundvierzig", "neunundvierzig", "fuenfzig", "einundfuenzig", "zweiundfuenzig",
                              "dreiundfuenzig", "vierundfuenzig", "fuenfundfuenzig", "sechsundfuenzig", "siebenundfuenzig"
                              "achtundfuenzig", "neunundfuenzig",};
    
    int daytime::NumberOfTimeObjekts = 0;
    
    daytime::daytime()
    {
        ++ NumberOfTimeObjekts;
        cout << "Vorhandene Objekte: " << NumberOfTimeObjekts <<endl;
    }
    
    daytime::~daytime()
    {
        -- NumberOfTimeObjekts;
        cout << "Vorhandene Objekte: " << NumberOfTimeObjekts <<endl;
    }
    
    void daytime::print24hFormat()
    {
        cout << ( hour < 10 ? "0" : "" ) << hour << ":"
             << ( minute < 10 ? "0" : "" ) << minute << ":"
             << ( second < 10 ? "0" : "" ) << second;
    }
    
    void daytime::print12hFormat()
    {
        cout << (( hour==0 || hour==12 ) ? 12 : hour % 12 )
             << ":" << ( minute < 10 ? "0" : "" ) << minute
             << ":" << ( second < 10 ? "0" : "" ) << second
             << ( hour < 12 ? " AM" : " PM" );
    }
    
    void daytime::setHMS(int HMShour, int HMSminute, int HMSsecond)
    {
        // check if hour >=0 and <24
        assert(HMShour < 24 && HMShour >= 0);
        // check if minute >=0 and <60
        assert(HMSminute < 60 && HMSminute >= 0);
        // check if second >=0 and <60
        assert(HMSsecond < 60 && HMSsecond >= 0);
    
        hour = HMShour;
        minute = HMSminute;
        second = HMSsecond;
    }
    
    /*void daytime::endTime()
    {
        cout << "Abendessen endet um: ";
        cout << ( hour < 10 ? "0" : "" ) << hour << ":"
             << ( minute < 10 ? "0" : "" ) << minute << ":"
             << ( second < 10 ? "0" : "" ) << second <<endl;
    }*/
    
    int daytime::getTimeInSeconds()
    {
        int sec;
        sec = hour*60*60 + minute*60 + second;
    return sec;
    }
    
    void daytime::setS(int sec)
    {
        assert(sec < 86401);
        hour = sec/3600;
        sec = sec%3600;
        minute = sec/60;
        second = sec%60;
    }
    
    void daytime::printHour12()
    {
      int h12 = (( hour==0 || hour==12 ) ? 12 : hour % 12 );
      cout << numbers[h12] << " Uhr ";
    }
    
    void daytime::printHour24()
    {
    	cout << numbers[hour] << " Uhr ";
    }
    
    void daytime::printMinute()
    {
    	cout << numbers[minute] << (minute==1)?" Minute ":" Minuten ";
    }
    
    void daytime::printSecond()
    {
    	cout << numbers[second] << (second==1)?" Sekunde ":" Sekunden " ;
    }
    
    int getDurationInSeconds(daytime end, daytime begin)
    {
        int durationInSeconds;
        durationInSeconds = end.getTimeInSeconds() - begin.getTimeInSeconds();
    return durationInSeconds;
    }
    

    Desweiterebn bekomme ich keine Leerzeichen bzw zeilenschübe zwischen der ausgabe in Worten und der ausgabe der vorhandenen objekte hin 😞



  • Woher die Ausgabe "0Null0" kommt, bin ich auch überfragt.

    Desweiterebn bekomme ich keine Leerzeichen bzw zeilenschübe zwischen der ausgabe in Worten und der ausgabe der vorhandenen objekte hin

    Leerzeichen kannst du mit "cout<<' ';" ausgeben, Zeilenwechsel mit "cout<<'\n';" oder "cout<<endl;".


Anmelden zum Antworten