Probleme Stream?



  • Hallo Gemeinde,

    ich bin in sachen C++ absoluter Neuling. Ich fummel immer noch an meine,m ersten program.

    Ich will die Differenz der Tage zwischen zwei Kalendertagen bstimmen. Das Program läuft auch zunächst, nur wenn eines der beiden Daten im Jahr 200 liegt läuft es in irgendeine Endlosschleife.

    Hier der Code des kleinen Programs:

    // in diesem Programm möchte ich die Ein - und Ausgabe eines Datums testen. Datum.cpp
    //Datumseingabe als char-Variable und Einlesen der einzelnen Daten in einen Integerwert.
    
    #include <sstream>
    #include <string>
    #include <iostream>
    using namespace std;
    
    //Einführung der Klasse Datum
    class Datum{
    
    public:
    
    	int Tag;
    	int Monat;
    	int Jahr;
    	char Datumstring[15];
    	};
    
    //Funktion Datumswandel
    
    Datum Datumswandel(char dstr[15])
    {
      stringstream str(dstr);
      Datum d;
      char c;
      str>>d.Tag>>c>>d.Monat>>c>>d.Jahr>>c;
      strcpy(d.Datumstring,dstr);
      return d;
    } 
    
    //Funktion zur Bestimmung Schaltjahr oder nicht
    bool Schaltjahr(int datum)
    {
      // Die Regel lautet: Alles, was durch 4 teilbar ist, ist ein Schaltjahr.
      // Es sei denn, das Jahr ist durch 100 teilbar, dann ist es keins.
      // Aber wenn es durch 400 teilbar ist, ist es doch wieder eins.
    
      if ((datum % 400) == 0)
        return true;
      else if ((datum % 100) == 0)
        return false;
      else if ((datum % 4) == 0)
        return true;
    
      return false;
    }
    
    //Berechnung der Tage zwischen dem ersten und zweiten Jahr
    int Jahrdifftag(int Jahr1, int Jahr2)
    {
    int i;
    int Tage = 0;	//tagesanzahl zwischen den Jahren
    
    for (i =(Jahr2 -1); i > Jahr1 ; i = i - 1)
    	{
    	 	 if (Schaltjahr(i) == true)	
    	 		Tage  = Tage + 366;		//Schaltjahr?
       else 	Tage = Tage + 365;
    	}
    	return Tage;
    
    }
    
    //Berechnung der Tage im Kalenderjahr
    int KalenderJahrTag(Datum datstr)
    {
    int Tage = 0;
    int Monat[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    
    while (Schaltjahr(datstr.Jahr) == true ) // Korrektur Schaltjahr
    	{
    		Monat[2] = 29;
    	}
    
    	for (int i=1; i < datstr.Monat; i++) //Berechnung der vollen Monate
    	{
    		Tage = Tage + Monat[i];
    	}
    
    	Tage = Tage + datstr.Tag; //Addition der Monatstage
    
    return Tage;
    }
    
    //Berechnung der Tage im Geburtsjahr
    
    int GeburtJahrTag(Datum datstr)
    {
    int Tage = 0;
    int Monat[14] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31,0};
    
    while (Schaltjahr(datstr.Jahr) == true) //Korrektur Schaltjahr
    	{
    	Monat[2] = 29;
    	}
    
    for (int i =12; i > datstr.Monat; i = i -1) //Berechnung der vollen Monate
    	{
    	Tage = Tage + Monat[i];
    	}
    
    Tage = Tage + (Monat[datstr.Monat] - datstr.Tag);
    
    return Tage;
    }
    
    int main(){
    
    Datum geburtstag;	//Klasse Geburtstag
    Datum kalendertag;	//Klasse für das Datum
    char datum1[15];		//Geburtstag als string
    char datum2[15];		//Datum als String
    int Tage1 = 0;			//Tage zwischen den Jahren
    int Tage2 = 0;			// Tage im Geburtsjahr
    int Tage3 = 0;			//Tage im kalenderjahr
    int Tage = 0;				//Die wirklich abgelaufenen Tage
    
    cout<<"\nDies ist ein Programm zur Abfrage des Geburtstages und eines weiteren Datums!\n";
    
    cout<<"\nGeben Sie einen Geburtstag ein [tt.mm.jjjj]: ";
    cin>> datum1;
    
    cout<<"\nGeben Sie ein Datum ein [tt.mm.jjjj]: ";
    cin>> datum2;
    
    cout<< "\nDer Geburtstag (String) ist der: "<<datum1<<"\n"; //reine Kontrollausgabe
    
    geburtstag = Datumswandel(datum1);
    
    cout<< "\nDer Geburtstag klasse ist der: "<<geburtstag.Datumstring <<"\n"; //reine Kontrollausgabe
    
    kalendertag = Datumswandel(datum2);
    
    cout<< "\nDer Kalendertag klasse ist der: "<<kalendertag.Datumstring <<"\n";  //reine Kontrollausgabe
    
    Tage1 = Jahrdifftag(geburtstag.Jahr, kalendertag.Jahr); //Tage zwischen den Jahren
    
    Tage2 = GeburtJahrTag(geburtstag);									//Tage im Geburtsjahr
    
    Tage3 = KalenderJahrTag(kalendertag);										//Tage im Kalenderjahr
    
    Tage = Tage1 + Tage2 + Tage3;														//Summe der Tage
    
    cout<< "\n Die Klasse geburtstag lautet: " <<geburtstag.Datumstring <<"\n";
    
    cout<< "\n Die Klasse kalendertag lautet: " <<kalendertag.Datumstring <<"\n";
    
    cout<< "\n Die Anzahl der Tage zwischen den Jahren: " <<Tage1 <<"\n";
    
    cout<< "\n Die Anzahl der Tage im Geburtsjahr: " <<Tage2 <<"\n";
    
    cout<< "\n Die Anzahl der Tage im Kalenderjahr: " <<Tage3 <<"\n";
    
    cout<< "\n Zwischen dem Geburtstag und dem Kalendertag sind: " <<Tage <<" Tage vergangen!\n \n";
    
    return 0;
    }
    

    Das Progrm läuft bei Eingabe eines Datum mit dem Jahr 2000 bis zur Zeile 141. Dann funzt nichts mehr.

    Hilfe!!!

    Dank an Alle.

    Gruß Georg



  • in den funktionen KalenderJahrTag() und GeburtJahrTag() hast du

    while (Schaltjahr(datstr.Jahr) == true ) // Korrektur Schaltjahr
    

    stehen. das muß natürlich if statt while heißen. weil das jahr 2000 ein schaltjahr ist, geht dein programm in eine endlosschleife.



  • 🙂 🙂
    Das war es. Ich habe mich beim Testen irgendwie verrand. Danke für die Hilfe.

    Ich hatte erst vermutet es liegt am Stream beim auslesen.

    Gruß Georg



  • hatte ein wenig zeit und hab versucht das ganze ein bisschen mehr nach c++ aussehen zu lassen... der code oben ist eher c (außer ein paar dinge wie streams und das schlüsselwort class, welches man aber ohne probleme mit typedef struct auswechseln könnte, also hier)

    also code ist ungefähr genauso wie der ausgangscode, hab mir da auch nicht zu viel überlegt. Aja.. weiß nicht ob das eine sehr tolle lösung ist, kann natürlich sein, dass ich sachen komisch mache die andre nicht so machen würden, aber die werden das ja hoffentlich eh anmerken...

    // date.h
    #ifndef _DATE_
    #define _DATE_
    
    #include <string>
    #include <cstdlib>
    
    namespace util
    {
    
      template<class T> const T& min(const T& a, const T& b)
      {
        return (a>b) ? a  : b;
      }
    
      class date
      {
        friend std::ostream& operator<< (std::ostream& os, const date& obj);
        friend std::istream& operator>> (std::istream& is, date& obj);
    
      public:
        date(void);
        date(const unsigned int day, const unsigned int month, const unsigned year);
        date(const std::string& txt);
    
        inline bool is_leap_year(void) const
        { return date::leap_year(m_year);}
    
        unsigned int days_till (const date& obj) const;
    
        inline ~date(void){}
    
      private:
        bool check_date(void);
    
        unsigned int m_day;
        unsigned int m_month;
        unsigned int m_year;
    
        bool m_val;
    
        static bool leap_year(const unsigned int year);
      };
    
      extern std::ostream& operator<< (std::ostream& os, const date& obj);
      extern std::istream& operator>> (std::istream& is, date& obj);
    
    };  // end namespace util
    
    #endif
    
    // date.cc
    #include "date.h"
    #include <sstream>
    
    namespace util
    {
    
    date::date(void)  : m_day(0), m_month(0), m_year(0), m_val(false)
    {}
    
    date::date(const unsigned int day, const unsigned int month,
      const unsigned year)
      : m_year(year), m_month(month), m_day(day), m_val(check_date())
    {}
    
    date::date(const std::string& txt)  : m_val(false)
    {
      std::istringstream is(txt);
      char c=0;
      is>>m_day>>c>>m_month>>c>>m_year;
      m_val=check_date();
    }
    
    bool date::check_date(void)
    {
      if(m_month>12 || m_month==0)
      {
        m_month=0;
        m_day=0;
        m_year=0;
        return false;
      }
      else
      {
        unsigned char days_of_month[12]={31, 28, 31, 30, 31,
          30, 31, 31, 30, 31, 30, 31};
    
        if(is_leap_year())
          days_of_month[1]=29;
    
        if(m_day==0 || m_day>days_of_month[m_month+1])
        {
          m_day=0;
          m_month=0;
          m_year=0;
          return false;
        }
        else
          return true;
      }
    }
    
    unsigned int date::days_till (const date& obj) const
    {
      if(!obj.m_val || !m_val)
        return 0;
      else if((obj.m_year< m_year)||
        (obj.m_year==m_year && obj.m_month<m_month)||
        (obj.m_year==m_year && obj.m_month==m_month && obj.m_day<m_day))
      {
        return obj.days_till(*this);
      }
      else
      {
        unsigned char days_of_month[12]={31, 28, 31, 30, 31,
            30, 31, 31, 30, 31, 30, 31};
        const unsigned int years=obj.m_year-m_year;
        unsigned int days=0;
    
        for(unsigned int i=0; i<years; ++i)
        {
          days+=365;
          if(leap_year(m_year+i))
            ++days;
        }
    
        if(obj.is_leap_year())
          days_of_month[1]=29;
    
        for(unsigned int i=1; i<obj.m_month; ++i)
          days+=days_of_month[i-1];
    
        days+=obj.m_day;
    
        if(is_leap_year())
          days_of_month[1]=29;
        else
          days_of_month[1]=28;
    
        days-=m_day;
        for(unsigned int i=1; i<m_month; ++i)
          days-=days_of_month[i-1];
    
        return days;
      }
    }
    
    bool date::leap_year(const unsigned int year)
    {
      if(year%400==0)
        return true;
      else if(year%100==0)
        return false;
      else if(year%4==0)
        return true;
      else
        return false;
    }
    
    std::ostream& operator<< (std::ostream& os, const date& obj)
    {
      if(obj.m_val)
        os<<obj.m_day<<"."<<obj.m_month<<"."<<obj.m_year;
      else
        os<<" datum ungültig...";
      return os;
    }
    
    std::istream& operator>> (std::istream& is, date& obj)
    {
      char c;
      is>>obj.m_day>>c>>obj.m_month>>c>>obj.m_year;
      obj.m_val=obj.check_date();
      return is;
    }
    
    };  // end namespace util
    
    // main.cc
    #include <cstdlib>
    #include <iostream>
    #include "date.h"
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
      util::date a(1, 2, 2007);
      util::date b(1, 3, 2010);
      util::date c;
      cout<<a<<endl<<b<<endl<<endl<<a.days_till(b)<<endl;
      cin>>c;
      cout<<endl<<c.days_till(a)<<endl;
      system("PAUSE");
      return EXIT_SUCCESS;
    }
    

    na ich hoffe du kannst was damit anfangen... naja sonst machts ja auch nix.
    mfg Manuel


Anmelden zum Antworten