geloescht_Kaffeemacher Geschrieben 11. Oktober 2003 Geschrieben 11. Oktober 2003 Hi @all, brauch Hilfe beim Programm Schaltjahr. Wenn man ein Jahr eingibt, wird einem angezeigt, ob es ein Schaltjahr ist oder nicht. Bei der Eingabe "0" soll das Programm beendet werden. Nun zu meinem Problem: 1. Wenn ich 0 eingebe bringt er mir erst die Ausgabe "Dies ist kein Schaltjahr" und beendet dann. 2. Wenn ich zum Beispiel 2004 eingebe, bringt er mir auch als Ergebnis "Dies ist kein Schaltjahr".... Was mach ich falsch?????:confused: :confused: Bitte helft mir.... thx kaffeemacher Hier der Quellcode: //--------------------------------------------------------------------------- #pragma hdrstop #pragma argsused #include <iostream.h> #include <conio.h> //--------------------------------------------------------------------------- int main(int argc, char* argv[]) { //Variablendeklaration und -initialisierung int iJahr = 1; //char cEingabe = NULL; //Wiederhole solange iJahre nicht gleich 0 do { while(iJahr != 0) { //Eingabe des Jahres cout << "Bitte geben Sie das Jahr zur Ueberpruefung ein: " << endl; cout << "Programmende mit 0" << endl; cout << endl; cout << "Jahr: "; cin >> iJahr; if(iJahr % 4 == 0) { if(iJahr % 100 == 0) { if(((iJahr % 400) == 0) && (iJahr >= 1600)) { cout << "Dies ist ein Schaltjahr" << endl; getch(); } else { cout << "Dies ist kein Schaltjahr" << endl; getch(); } } else { cout << "Dies ist kein Schaltjahr" << endl; getch(); } } else { cout << "Dies ist kein Schaltjahr" << endl; getch(); } //Bildschirminhalt löschen clrscr(); } }while(iJahr != 0); getch(); return 0; } [/PHP] Zitieren
Klotzkopp Geschrieben 11. Oktober 2003 Geschrieben 11. Oktober 2003 Original geschrieben von Kaffeemacher 1. Wenn ich 0 eingebe bringt er mir erst die Ausgabe "Dies ist kein Schaltjahr" und beendet dann.Wenn du das verhindern willst, musst du zwischen der Eingabe und der Berechnung aus der Schleife springen, z.B. mit break, oder die Berechnung in ein Block mit if(iJahr != 0) einschließen. 2. Wenn ich zum Beispiel 2004 eingebe, bringt er mir auch als Ergebnis "Dies ist kein Schaltjahr"....So steht's auch in deinem Code: Ist das Jahr durch vier, aber nicht durch 100 teilbar, gibst du "kein Schaltjahr" aus. Du hast übrigens eine do-while und eine while Schleife mit identischer Abbruchbedingung verschachtelt. Eine tut's auch. Zitieren
GrEnE Geschrieben 13. Oktober 2003 Geschrieben 13. Oktober 2003 Naja ein do-while ist hier schon inordnung, so wird es wenigstens einmal aufgerufen. Also so: bool isLeapYear( int year ) { if( year % 4 == 0 ) { if( year >= 1582 ) { if( !(year % 100 == 0) || (year % 400 == 0)) { return true; } } } return false; } // main do { // Ausgabe Sachen mit cout int year; std::cin >> year; isLeapYear(year) ? std::cout << "Schaltjahr\n" : std::cout << "kein Schaltjahr\n" } while( year != 0 ) [/PHP] Was ich aber noch machen würde, ist das verhindern ungültiger/falscher Eingaben, was z.B. passiert, wenn ich eine string eingeben und keine Zahl? Zitieren
geloescht_Kaffeemacher Geschrieben 13. Oktober 2003 Autor Geschrieben 13. Oktober 2003 Hi @ALL; ich mein Problem mit Eurer Hilfe gelöst. So und hier die Lösung: //--------------------------------------------------------------------------- #pragma hdrstop #pragma argsused #include <iostream.h> #include <conio.h> //--------------------------------------------------------------------------- int main(int argc, char* argv[]) { //Variablendeklaration und -initialisierung int iJahr = 1; //Wiederhole solange iJahre nicht gleich 0 while(iJahr != 0) { //Eingabe des Jahres cout << "Bitte geben Sie das Jahr zur Ueberpruefung ein: " << endl; cout << "Programmende mit 0" << endl; cout << endl; cout << "Jahr: "; cin >> iJahr; if(iJahr == 0) { break; } else { if(iJahr % 4 == 0) { if(iJahr % 100 == 0) { if(((iJahr % 400) == 0) && (iJahr >= 1600)) { cout << "Dies ist ein Schaltjahr" << endl; getch(); } else { cout << "Dies ist kein Schaltjahr" << endl; getch(); } } else { cout << "Dies ist ein Schaltjahr" << endl; getch(); } } else { cout << "Dies ist kein Schaltjahr" << endl; getch(); } //Bildschirminhalt löschen clrscr(); } } getch(); return 0; } //--------------------------------------------------------------------------- [/PHP] thx kaffeemacher Zitieren
geloescht_Kaffeemacher Geschrieben 13. Oktober 2003 Autor Geschrieben 13. Oktober 2003 Hi, hab allerdings noch eine Frage: Und zwar: Normalerweise müsste die Schleife doch abbrechen, wenn iJahre=0, oder??? while( iJahre ==0 ) { Bedingung } Wieso passiert das nicht???? Danke für EURE Bemühungen Zitieren
Guybrush Threepwood Geschrieben 13. Oktober 2003 Geschrieben 13. Oktober 2003 Original geschrieben von Kaffeemacher Normalerweise müsste die Schleife doch abbrechen, wenn iJahre=0, oder??? while( iJahre ==0 ) { Bedingung } Wieso passiert das nicht???? Diese Schleife läuft solange iJahre gleich 0 ist. Erst wenn iJahre ungleich 0 ist, bricht die Schleife ab. Gruß Guybrush Zitieren
GrEnE Geschrieben 13. Oktober 2003 Geschrieben 13. Oktober 2003 Original geschrieben von Kaffeemacher Und zwar: Normalerweise müsste die Schleife doch abbrechen, wenn iJahre=0, oder??? while( iJahre ==0 ) { Bedingung } Wieso passiert das nicht???? Was meinst du und was hast du geschrieben? - Denn oben in deinem Quelltext steht "while(iJahre!=0)", also so wie es richtig ist und deine Frage ist anders rum. Ich würde die Schaltjahre Funktionalität in eine Funktion packen ist lesbarer und man kann mal schnell umbauen! :cool: Frage (hatte ich schonmal gestellt): Was passiert, wenn ich "a" eingebe? Zitieren
bigpoint Geschrieben 14. Oktober 2003 Geschrieben 14. Oktober 2003 Original geschrieben von Kaffeemacher Hi, hab allerdings noch eine Frage: Und zwar: Normalerweise müsste die Schleife doch abbrechen, wenn iJahre=0, oder??? while( iJahre ==0 ) { Bedingung } Wieso passiert das nicht???? Danke für EURE Bemühungen if(iJahr == 0) { return 0; } [/PHP] Zitieren
bigpoint Geschrieben 14. Oktober 2003 Geschrieben 14. Oktober 2003 Original geschrieben von GrEnE Frage (hatte ich schonmal gestellt): Was passiert, wenn ich "a" eingebe? einfach int iJahr = 0; und while(iJahr != 0) aus dem spiel lassen Zitieren
geloescht_Kaffeemacher Geschrieben 14. Oktober 2003 Autor Geschrieben 14. Oktober 2003 Hi Und zwar hab ich folgendes gemeint: Z.B: int iJahre = 1; while ( iJahre != 0 ) { cout << "Bitte Jahr eingeben:" << endl; cin>> iJahre if ( iJahre % 4 = 0 ) { cout << "Es ist ein Schaltjahr"; } } Wenn man nun bei der EINGABE => 0 eingibt, sollte er doch eigentlich die Schleife beenden, oder ??? Wieso muss ich also erst irgendwo in die WHILE-Schleife folgendes einbauen, damit er die Schleife beendet?`??? if (iJahre == 0) { break; } thx kaffeemacher Zitieren
Klotzkopp Geschrieben 14. Oktober 2003 Geschrieben 14. Oktober 2003 Die Schleife wird beendet, auch wenn du das break nicht machst. Allerdings erst dann, wenn der Schleifenkörper abgearbeitet wurde, weil erst dann die Schleifenbedingung wieder geprüft wird. Eine while-Schleife ist keine Laufzeitüberwachung der Schleifenvariable. Die Schleife wird nicht verlassen, nur weil iJahre irgendwo im Schleifenkörper den Wert Null annimmt. Das sieht so aus: 1. Prüfung: wenn iJahre == 0, dann raus 2. cout << 3. cin >> 4. if( ... ) 5. zurück nach 1. Du siehst, nach dem cin >> kommt immer erst der Rest des Körpers. Den willst du aber nicht ausführen lassen, wenn 0 eingegeben wurde. Da du hier break verwendest, könntest du die Schleifenbedingung auch ganz weglassen, indem du while( true ) schreibst. Oder - wie bereits gesagt - du schließt die ganze Prüfung und Ausgabe nach dem cin >> in ein if( iJahre != 0 ) { // Hier Prüfung und Ausgabe } ein. Zitieren
FinalFantasy Geschrieben 15. Oktober 2003 Geschrieben 15. Oktober 2003 Mal ne etwas andere Frage zu deinem Code: Ich dachte es wäre generell jedes Jahr ein Schaltjahr, welches durch 4 teilbar ist. Du prüfst aber trotzdem noch ab, ob sie zusätzlich durch 100 und 400 teilbar sind. Demnäch wäre eben 2004 kein Schaltjahr. Und warum >1600?? Gibts erst seit 1600 Schaltjahre?? Zitieren
GrEnE Geschrieben 15. Oktober 2003 Geschrieben 15. Oktober 2003 Original geschrieben von 007ski einfach int iJahr = 0; und while(iJahr != 0) aus dem spiel lassen Mit dieser Initialisierung wirst du nie in die while-Schleife kommen. Und zur Auflösung - wenn er in der while-Schlefie ist und ich gebe dann einen Buchstaben ein - hat er eine perfekte Endlosschleife. Original geschrieben von FinalFantasy Mal ne etwas andere Frage zu deinem Code: Ich dachte es wäre generell jedes Jahr ein Schaltjahr, welches durch 4 teilbar ist. Du prüfst aber trotzdem noch ab, ob sie zusätzlich durch 100 und 400 teilbar sind. Demnäch wäre eben 2004 kein Schaltjahr. Und warum >1600?? Gibts erst seit 1600 Schaltjahre?? Nicht ganz, nicht jedes Jahr was durch 4 teilbar, sondern jedes Jahr was durch 4 teilbar ist, nicht durch 100 teilbar, aber durch 400 und vor 1583 spielt! Und korrekterweise musst man nicht 1600 nehmen, sondern 1582. Warum? - Habe ich vergessen, aber da gab es noch keins? - Aber so einfach war die Antwort glaube ich nicht. Zitieren
GrEnE Geschrieben 15. Oktober 2003 Geschrieben 15. Oktober 2003 Sorry für Doppelpost, aber selbst wenn man im editieren ist werden die 15 Minuten gezählt? Nicht ganz, nicht jedes Jahr was durch 4 teilbar, sondern jedes Jahr was durch 4 teilbar ist, nicht durch 100 teilbar, aber durch 400 und vor 1583 spielt! Weil, die Erde umkreist die Sonne in 365 Tage, 6 Minuten und ein paar Sekunden im Jahr - also nicht genau 365 Tage und wegen diesen Minuten musst man ncoh die anderen Sachen abfragen! Und korrekterweise musst man nicht 1600 nehmen, sondern 1582. Warum? - Hmm, ich glaube dass hat mit Cesar zu tun. Ich weiß aber nicht merh was genau. Könnte ein admin vielleicht den Teil von oben gegen diesen ersetzen? Zitieren
bigpoint Geschrieben 15. Oktober 2003 Geschrieben 15. Oktober 2003 Original geschrieben von GrEnE Mit dieser Initialisierung wirst du nie in die while-Schleife kommen. ist auch richtig so, denn die while-Schleife existiert nicht mehr, wo zu auch ? Zitieren
FinalFantasy Geschrieben 15. Oktober 2003 Geschrieben 15. Oktober 2003 Nene, irgendwas kann da nicht stimmen. Wenn das Jahr "nur 6,5min" länger als 365 Tage sein sollte, dann würde man mit diesen 6,5min nur alle 221Jahre einen Tag mehr pro Jahr voll bringen. Mit deiner Formel hat man aber trotzdem annähernd alle 4 Jahre ein Schaltjahr. Dafür müsste aber ein Jahr dann 365Tage und 6 Stunden dauern. Dann würden sich aber alle zwei Jahre Tag und Nacht umkehren. Hm, ich glaub ich hab da irgendwo einen Denkfehler drin. Zitieren
geloescht_Kaffeemacher Geschrieben 15. Oktober 2003 Autor Geschrieben 15. Oktober 2003 MEINE FRAGE !!!!!!!! Mein Programm funkt. OK. Ich wollte nur wissen warum die Schleife nicht abgebrochen wird, obwohl ich doch gesagt habe dass die Schleife so lange durchlaufen soll bis iJahre nicht gleich 0. Gibt jemand also dann NULL ein sollte die Schleife doch abgebrochen werden. Dass passiert aber erst wenn ich folgendes in die Schleife einfüge: if ( iJahre == 0) { break; } thx kaffeemacher Zitieren
Klotzkopp Geschrieben 15. Oktober 2003 Geschrieben 15. Oktober 2003 Ich habe deine Frage doch 6 Beiträge weiter oben beantwortet :confused: Zitieren
FinalFantasy Geschrieben 15. Oktober 2003 Geschrieben 15. Oktober 2003 if(....) ist ja keine Schleife sondern eine bedingung, d.h. das break wird nur ausgeführt, wenn Ijahre == 0. Zitieren
GrEnE Geschrieben 16. Oktober 2003 Geschrieben 16. Oktober 2003 Original geschrieben von Kaffeemacher Ich wollte nur wissen warum die Schleife nicht abgebrochen wird, obwohl ich doch gesagt habe dass die Schleife so lange durchlaufen soll bis iJahre nicht gleich 0. Gibt jemand also dann NULL ein sollte die Schleife doch abgebrochen werden. Bitte nicht in diesen Zusammenhang "NULL" verwenden, dass ist was anderes. Hmm, hatte mal bei mir schnell folgendes eingegeben und bei bricht das Programm bzw. die Schleife ab. int y = 0; do { std::cin >> y; std::cout << y << std::endl; } while( y != 0); std::cout << "ENDE!"; [/PHP] Er bricht sofort die Schleife ab, wenn die Zahl eingeben wurde. Wo sind jetzt die genaue Frage? Zitieren
geloescht_Kaffeemacher Geschrieben 16. Oktober 2003 Autor Geschrieben 16. Oktober 2003 Orginal geschrieben von klotzkopp: Ich habe deine Frage doch 6 Beiträge weiter oben beantwortet Entschuldige hab ich ganz übersehen.... thx. kaffee.macher Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.