Endlos schleife?

Skini

Erfahrenes Mitglied
Hey Leute, ich hab Folgendes Vor:
Ich möchte ein Programm schreiben, wass mir zu jedem datum dess Gregorianischen Kalendars den Wochentag ausspuckt.
Ich habe beriets vor einiger Zeit ein dem entsprechendes Programm geschrieben,
allerdings schreibt mir es die Konsole nur mit 001001001001001001001001001001... zu.
Ich hab schinbar ne Endlosschleife mit ausgaben Fehler :P Ich komm aber nicht dahinter, wo das problem ist. Wäre über hilfe Dankbar, Skini

C++:
#include <iostream>
int year, month, day, days, cy, cyears, mod, y;

void main()
{
restart:
year = 0;
month = 0;
day = 0;
days = 0;
//eingabe dess Datums:
 cout <<  Jahr:  ;
 cin >> year;
 cout << endl <<  Monat:  ;
 cin >> month;
 cout << endl <<  Tag :  ;
 cin >> day;
 cout << endl;

//Überprüfung ob schaltjahr.
 days = 1
for (cyear == 2008; cyear == year +1; --cyear)
{
 if (cyear%4 == 0)
{
 cy = 1;
 if (cyear%100 = 0)
{
 cy = 0;
 if (cyear%400 = 0)
{
 cy = 1;
}
}
}
 if (cy == 0)
{
 days += 365;
}
 if (cy == 1)
{
 days += 366;
}
 cy = 0;
}

//Zählung der Tage unter berücksichtigung von Schaltjahren.

if (month = 1)
{
 days += 334;
}
if (month == 2)
{
 days += 306;
}
if (month == 3)
{
 days += 275;
}
if (month == 4)
{
 days += 244;
}
if (month == 5)
{
 days += 214;
}
if (month == 6)
{
 days += 183;
}
if (month == 7)
{
 days += 153;
}
if (month == 8)
{
 days += 122;
}
if (month == 9)
{
 days += 92;
}
if (month == 10)
{
 days += 61;
}
if (month == 11)
{
 days += 31
}
if (month == 12)
{
 days += 0;
}

if(month == 3|| month == 5|| month == 7|| month == 8|| month == 10|| month == 12)
{
 days += 31-day;
}
if (month == 4|| month == 6|| month == 9|| month == 11)
{
 days += 30-day;
}
if (month == 2&&y == 0)
{
 days += 28-day;
}
if (month == 2&&y == 1)
{
 days += 29-day;
}
if (month == 1&&y == 0)
{
 days += 31-day;
}
if (month == 1&&y == 1)
{
 days += 32-day;
}
y = 0 ;
//ausgabe des Ergebnisse, "referenz datum" ist der 01,01,2008
mod = days%7 ;
cout <<  Der   << day <<  .   << month <<  .   << year <<  , ;
cout << endl <<  ist ein  ;
if (mod == 0)
{
cout <<  Dienstag ;
}
 if (mod == 1)
{
cout <<  Montag ;
}
if (mod == 2)
{
cout <<  Sonntag ;
}
if (mod == 3)
{
cout <<  Samstag ;
}
if (mod == 4)
{
cout <<  Freitag ;
}
if (mod == 5)
{
cout <<  Donnerstag ;
}
if (mod == 6)
{
cout <<  Mittwoch ;
}
 cout << endl <<  Neue Berechnung? j/n  << endl;//Neustart?
cin >> q;
if (q = 0x6A)
{
 cout << /n;
 goto .restart;
}
}
 
?
Muss ich das verstehen?
Was für ein Kompiler benutzt du der dir dies so Compiliert?
Sytanx? Bist du sicher das, dass alles stimmt? z.B.:

if (cyear%100 = 0)
{
cy = 0;
if (cyear%400 = 0)
{
cy = 1;
}

muss das nciht == heißen

auch in der ersten Schleife:

for (cyear == 2008; cyear == year +1; --cyear)

for(int cyear=2008; cyear==year+1;--cyear) ok das int ist nicht schlimm bei manchen Compilern aber mit == setzt man nichts.

und der Schluss:

if (q == 0x6A)
{

cout << "\n";
goto restart;

}

return 0;
}
goto .restart kenne ich nicht. Wobei goto auch nicht mehr im sinner der Zeit des C++ ist Schleifen und/oder switch case Anweisungen.

Return-Wert ok mache ich da bei Konsolenanwendungen die Main normal int ist brauch dich aber nicht stören.

Fazit: bei mir gibt es keine Endlosschleife die Ausgabe wird erzeugt die dein Programm vorgesehen hat. Nur die Berechung naja deine Sache z.b. sagt mir die Konsole Der 9.9.2008, ist ein Sonntag.

Naja ich hoffe ich hab dir geholfen

lg nik
 
achso ... Zitat:"Gregorianischen Kalendars".
ok als ich den Code getestet habe hatte ich dies schon wieder vergessen als streich das letzte von meinem vorherigem Beitrag.
 
...und noch was zur Snytax hab mir gerade nocheinmal meine Beiträge durchgelesen. Fazit: es fehtl etwas.
Die ganzen cout's z.B.:
cout << " Der " << day << "." << month << ". " << year << ", ";
cout << endl << " ist ein " ;

alles was keine Variable ist in "" setzen.
 
Was cout betrifft: Ich hab denn code vor ca. einem Jahr aus pseudo-code umgeschrieben, da passiert so was.
Du sagst, dass programm funktioneirt bei dir?
Ich benutze Visual c++ 2005, er kompiliert zwar alles Anstandslos, gibt mir aber diese komischen ausgaben.
Zu deienm datums "versuch": Es können nur Tage VOR dem Referenzdatum(1,1,08) berechnet werden. sonst gibts müll :P
Zusammenfassend liegts wohl am compiler.
*nach 2 minuten weiterschreib*
Ich hab grad mal ne for-schleife Kompiliert, die zwei mal "XY" ausgebne sollte. Was macht Visual c++? es ballert mir die Konsole mit XYXYXYXYXYXYXYXYXYXY... zu.
Liegt Wohl wirklich am Kompilier.
Greetz Skini
 
Also ich hab dein Programm jetzt mit meinen Compilern Microsoft Visual C++ 6.0 , Dev C++, und Visual C++ 9.0 getestet überall einwandfrei und bei diesem Compiler fehler kann ich nicht weiterhelfen (das einzige was ich dir sagen kann: Neuinstallation könnte dieses Problem beheben XD).
 
Ich hab grad mal ne for-schleife Kompiliert, die zwei mal "XY" ausgebne sollte. Was macht Visual c++? es ballert mir die Konsole mit XYXYXYXYXYXYXYXYXYXY... zu.
Liegt Wohl wirklich am Kompilier.
Greetz Skini

Sicher... Der Compiler ist schuld wenn Du etwas falsch machst ;) Lass erstmal die Schleife sehen ;)

Erstmal: Nur weil etwas syntaktisch den Regeln entspricht muss es noch LANGE nicht richtig sein. Ich kann Dir hunderte Beispiele von Code erstellen die jeder Compiler einwandfrei compiliert und die Trotzdem falsch sind.

Du hast in Deinem Code gleich en mehreren Stellen = und == durcheinandergebracht.

z.B.

if (month = 1)

Die setzt den value von month auf 1, damit ist die if-Bedingung also immer 1, was in C/C++ automatisch nach bool convertiert wird und demnach immer true ist.

mit anderen Worten, dieser Teil der if-Anweisung wird IMMER ausgeführt, weil die Bedingung immer true ist.

Auch Spaßig ist diese Schleife:

for (cyear == 2008; cyear == year +1; --cyear)

Ok, also was passiert hier wirklich? Erstmal hast Du cyear NICHT initialisiert (cyear == 2008 ist ein Vergleich, keine Zuweisung). Damit kann cyear einen beliebigen Wert annehmen (im debug fall wahrscheinlich aber 0, im release-fall zufaelliger int wert).

Die Abbruchbedingung sagt das die Schleife solange rückwärts zählen soll bis sie den Wert year+1 erreicht. Also, angefangen vom Wert 0 Rückwärt auf z.B. 1901 ist ne ziemlich lange Schleife, denn der zählt erstmal von 0 runter auf MIN_INT (- 2^16), macht dann den roll-over auf +2^16 und zaehlt dann von MAX_INT wieder runter auf 1901... Das macht pi mal Daumen 2^32 -1901 Durchläufe, oder in Zahlen: 4294967296 - 1901 Schleifendurchläufe bevor die Abbruchbedingung erfüllt wird. Zwar keine Endlosschleife per se, aber sehr sehr viele Durchläufe.


(Ach ja, auf ner 64 bit Kiste sind das 2^64 Durchläufe...)

Mein Tip: Man sollte immer erstmal den Fehler bei sich selber suchen, ganz besonders wenn man ein Anfänger ist anstatt es auf "den Compiler" zu schieben...
 
Zuletzt bearbeitet von einem Moderator:
Hallo Skini,

BTW: das zuvor von jsendrow erwähnte Problem gibt es in Deinem Code übrigens auch noch in Zeile 157!!

Code:
// also: streiche 
if (q = 0x6A)

// und setze
if (q == 0x6A)

Gruß
Klaus
 
@ jsindrow?
Kann man mein Beitrag nicht lesen oder warum erklärst du Sachen noch einaml die ich ihm oben schon erzählt hab?
 
Zurück