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 Schaltjahrstehen. 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