Schaltjahr oder nicht
-
Kann mir jemand sagen, was ich hier falsch gemacht habe?
include <iostream.h>
int ergebnis
void main() {
int i;cout<<"Geben Sie eine Jahreszahl ein:";
cin>>i; {
if (i%4>0) << ergebnis = 0<<endl;
else if (i%4%100>0)<< ergebnis = 0<<endl;
else if (i%4%400>0)<< ergebnis = 0<<endl;
else << ergebnis = 1<<endl;
}
if ergebnis = 0 cout<<"Das ist kein Schaltjahr"<<endl;
else cout<<"Das ist ein Schaltjahr"<<endl;char p[50];
cin.getline(p,50);
cin.getline(p,50);
}
-
1.: was macht dein Programm richtig, oder falsch?
Zunächst weiß ich nicht, ob deine Berechnung für das Schaltjahr so stimmt, oder nicht, ich meine, es kommt alle 4 Jahre eines vor, aber ob der Modulo-Wert hier das gewünschte Ergebnis liefert, weiß ich nicht
2. Würde ich vor jedesmal, wenn ich etwas ausgeben möchte, cout<< schreiben, anstatt einmal und nur cout und dann davon auszugehen, dass es immer ausgegeben wird.
Dann stellt sich mir die Frage, warum du ergebnis global deklariert, brauchst du es außerhalb von main?
Außerdem verwundert es mich, dass du nach cin, vor dem if, einen AWB öffnest, hier wird eigentlich gar keiner benötigt.
Was du mit den if/else Zweigen versuchst wird mir hier nicht ganz klar, weil so weit ich weiß, kann man nicht mit <<, oder >> arbeiten, wenn man nicht mit einer Methode der ios arbeitet, oder sie vorher nicht definiert hat.
Du könntest erstmal versuchen, mir diese Fragen zu beantworten, dann kann ich dir helfenkönnte es sein, dass du so was wolltest:
#include <iostream.h> int main() { int i,ergebnis; cout<<"Geben Sie eine Jahreszahl ein:"; cin>>i; if (i%4>0) ergebnis = 0; else if (i%4%100>0)ergebnis = 0; else if (i%4%400>0)ergebnis = 0; else ergebnis = 1; if (ergebnis == 0 )cout<<"Das ist kein Schaltjahr"<<endl; else cout<<"Das ist ein Schaltjahr"<<endl; char p[50]; cin.getline(p,50); cin.getline(p,50); return 0; }Hab jetz meinen Code nicht kontrolliert auf Sinn, aber zumindest mal die Syntaxfehler raus, die mir aufgefallen sind.
-
bin zwar selber noch nicht gerade der vollprofi aber da blutet mein Herz, also erst mal
#include <iostream.h> //veraltet, statt dessen #include <iostream> void main() //macht man auch nicht int main() //is da schon angebrachterund was der Rest sollte...
vielleicht arbeitest du lieber mal ein paar Tutorials durch
so sollte es funktionieren:
#include <iostream> using namespace std; int main() { int i; cout<<"Geben Sie eine Jahreszahl ein:"; cin>>i; //was sollte die Klammer hier? if (i%4>0||i%4%100>0||i%4%400>0) cout<<"Das ist kein Schaltjahr\n"; else cout<<"Das ist ein Schaltjahr\n"; cin.clear(); cin.ignore(std::cin.rdbuf()->in_avail()); cin.get(); return 1; }mit den besten Wünschen

theduke
-
i%4%400?
-
hab nicht auf die berechnung selber geachtet^^
es geht ja: wenn %4=0(Schaltjahr) außer %100=0(kein Schaltjahr) außer %400=0(dann doch Schaltjahr)
funktionieren würds dann wohl so:
if(j%4==0) ergebnis=IS_LEAPYEAR; //enum halt else if(j%100==0) ergebnis=NO_LEAPYEAR; else if(j%400==0) ergebnis=IS_LEAPYEAR; else ergebnis=NO_LEAPYEAR;theduke
-
bool isSchaltjahr(int jahr) { if( jahr % 400 == 0 ) return true; if( jahr % 100 == 0 ) return false; if( jahr % 4 == 0 ) return true; return false; }So?
edit: ops... sollte nun stimmen so
-
FireFlow schrieb:
bool isSchaltjahr(int jahr) { if( jahr % 400 == 0 ) return true; if( jahr % 100 > 0 ) return false; if( jahr % 4 == 0 ) return true; return false; }So?
Nein. Korrekt ist so:
bool is_leap_year(size_t year) { if( ( !(year % 4) && year % 100 ) || !(year % 400) ) return true; return false; }Bei deiner Funktion wird das Jahr 2004 z.B. nicht als Schaltjahr erkannt...
Caipi
-
Caipi schrieb:
Nein. Korrekt ist so:
bool is_leap_year(size_t year) { if( ( !(year % 4) && year % 100 ) || !(year % 400) ) return true; return false; }Bei deiner Funktion wird das Jahr 2004 z.B. nicht als Schaltjahr erkannt...
Caipida hab ich aber den nicht so korrekten code lieber. den kann ich wenigstens verstehen und gegebenefalls reparieren. deinen versteh ich nicht.
-
volkard schrieb:
Caipi schrieb:
Nein. Korrekt ist so:
bool is_leap_year(size_t year) { if( ( !(year % 4) && year % 100 ) || !(year % 400) ) return true; return false; }Bei deiner Funktion wird das Jahr 2004 z.B. nicht als Schaltjahr erkannt...
Caipida hab ich aber den nicht so korrekten code lieber. den kann ich wenigstens verstehen und gegebenefalls reparieren. deinen versteh ich nicht.
Sorry, aber ich verstehe nicht worauf du hinaus willst
(Falls es Ironie ist, diese zu erkennen ist nicht unbedingt meine Stärke).Klär mich auf. Bitte

Caipi
-
Caipi schrieb:
Klär mich auf. Bitte

ich kann einfach
bool isSchaltjahr(int jahr) { if( jahr % 400 == 0 ) return true; if( jahr % 100 > 0 ) return false; if( jahr % 4 == 0 ) return true; return false; }viel besser lesen als deinen code.
den les ich da so von oben nach unten.
wenn das jahr durch 400 teilbar ist, dann ist es ein schaltjahr.
ansonsten, wenn das jahr durch 100 teilbar ist, dann ist es kein schaltjahr.
ansonsten, wenn das jahr durch 4 teilbar ist, dann ist es ein schaltjahr.
ansonsten ist es kein schaltjar.
das kann ich irgendwie ganz leicht nachvolziehen. das direkte rausreturnen (bin ja eh fan von singe-entry/multiple-exit) erlaubt mir, gedankengänge früb abzuschließen und unabhängig vom rest zu beurteilen.
aber ich muss heut zu müde sein für sowas. ich seh grad den 2004-fehler nicht, den du gezeigt hast.
-
naja ich denk mal er will drauf hinaus das man Fireflows Code nach 3 Sekunden verstanden hat, während man über deinen um einiges länger nachdenken muss(ich würd mal sagen zwischen 6 und 9 Sekunden, also immerhin das doppelte oder dreifache)^^
//edit zu langsam

theduke
-
volkard schrieb:
ich seh grad den 2004-fehler nicht, den du gezeigt hast.
Die Bedingung für ein Schaltjahr (nach dem Gregorianischen) Kalender heißt: Ein Jahr ist dann ein Schaltjahr (und nur dann) wenn es durch 4 teilbar ist aber dann *nicht* durch 100. Außerdem ist es ein Schaltjahr wenn es durch 400 teilbar ist.
Caipi
-
Dast ist reine Gewohnheit. Ich kann den Einzeiler da schneller lesen als die vielen Zeilen die du benötigst, die noch dazu nicht korrekt sind:
Das jahr 2004:
Da greift dann dein 2. if: 2004 % 100 = 4 > 0 --> return false.
// edit ebenfalls zu langsam

-
Ich habs bereits lange korrigiert...

-
muhzilla schrieb:
Dast ist reine Gewohnheit. Ich kann den Einzeiler da schneller lesen als die vielen Zeilen die du benötigst, die noch dazu nicht korrekt sind:
ah, klar. da muß natürlich auch == stehen. sonst wär der code auch nicht so hübsch, wie er jetzt ist.
dann vermute ich, du würdest diesen wust dadurch heilen, daß du ein paar leerzeichen einfügst?
bool datumIstGueltig(int tag,int monat,int jahr){ return monat>0&&monat<13&&tag>0&&tag<32&&(tag<31¦¦(monat>7!=monat%2==1)) &&(monat!=2¦¦(tag<30&&(((jahr%4==0&&jahr%100!=0)¦¦jahr%400==0)¦¦tag<29))); }
-
Da sollte man wohl abwiegen, wie weit man damit gehen kann etwas scheinbar cryptisch auszudrücken. Der von dir gezeigte Ausdruck ist wirklich recht unübersichtlich, allerding würden Leerzeichen tatsächlich zur Lesbarkeit beitragen

-
naja, kryptischer code ist bekanntlich schneller als viele zeilen. ich muß wohl mehr üben, lange ausdrücke zu schreiben, wenn ich den zahn der zeit noch erwischen will.
-
das mit dem schaltjahr hat papst gregor im mittelalter eingeführt. deswegen
fehlen im einführungsjahr ein paar tage und weil das mit dem schaltjahren
noch zu kleinen abweichungen führt werden von zeit zu zeit noch korrektur-
sekunden eingesetzt. ausserdem wurde das schaltjahr nicht überall in europa
im selben jahr eingeführt sondern nur im politischen einflussbereich des
papstes. ich kann mich irren: hatten die franzosen zur revolutionszeit nicht
noch einen anderen kalender.
für genaue rechereche bin ich zu müde. nur als hinweis.mfg f.-th.