"Schaltjahrprüfung" geht nicht
-
Nimda schrieb:
Mit der anderen If-Abfrage von oben wird daraus:
if(!(jahr%4)) return true; if(!(jahr%100)) return false; if(!(jahr%400)) return true;
Das ist doch sehr viel eleganter!
@nimda: nimm es mir nicht böse, aber was ist das denn?
abgesehen davon, daß wir uns jetzt wieder über Programmierrichtlinienkonventionenstandardswirallediskutierenschonewigdrüber streiten könnten (schlage doch bloß keinem Anfänger die Verwendung von mehreren returns vor!! meine Meinung: wenn du strukturiert programmierst, dann nur 1 return; später in der OOP mit exceptions ist das eine andere Sache), ist die Logik doch ...
-
Stimmt.
Man muss die natürlich genau andersrum hinschreiben.
Zuerst auf 400, dann auf 100 und zum Schluss auf 4 testen.
Und zu letzt noch ein "return false;" hinzu, falls es nix davon ist.@freshman:
Ich schreib niemandem etwas vor. Es ist nur ein Vorschlag. Vielleicht findet er es ja gut und ist nur nicht drauf gekommen(so geht es mir oft, beim stöbern in diesem Forum). Oder er findet es nicht gut und lässt's bleiben. Aber den Vorschlag zu machen, sollte niemanden stören. Wenn es ihm nicht gefällt akzeptiere ich das.
-
@nimda: nix gegen dich; stimmt grundsätzlich schon, aber ich dachte ja nur, daß, da man die Handschrift eines blutigen Anfängers im Code lesen kann, es ratsam ist extrem strukturiert zu bleiben
.....erst krabeln, dann gehen, dann laufen.....
der Vollständigkeithalber hier noch mein Vorschlag:bool isLeapYear(int year){ return(!(year%4)&&year%100||!(year%400)); }
sorry, aber ich habe gerade keinen Compiler (das erkläre ich jetzt lieber nicht) , kann mir jemand sagen, ob das stimmt? thanx'
-
Passt. Hab's Probiert!
Aber, warum hast du keinen Compiler???
-
Ich bin nämlich hier auf der Arbeit, habe gerade Pause(muss man ja sagen) und habe im Moment hier keinen Compiler zu Verfügung. Und gleich gehe ich nach Hause, da habe ich einen noch schöneren Rechner samt schöner Entwicklungsumgebung, aber bin nicht am Netz; also: alles hat hier eine Krücke
Aber ich bin voller Zuversicht, daß die das hier bald gebacken bekommen mit dem Compiler und ich auch mit meinem cast vom standAlone zum vernetzten Gerät
-
Nimda schrieb:
Nochwas?
if(jahr%4==0)
Die Idee, Modulo(%) zu benutzen ist gut, aber bei C++ steht 0 für false und alles andere für true.(Wie das mit Negativen Zahlen ist, weis ich nicht.)
Daher würd ich schreiben:if(!(jahr%4))
Wenn jahr%4 Null ergibt, zählt das als false, dann noch das NOT hinzu und du hast true. Probiers aus, ist wesentlich eleganter.
Wer kommt nur immer auf solche Ideen? Naja, über Eleganz lässt sich sicherlich streiten. Beim Codingstyle geht es aber in erster Linie nicht um Eleganz, sondern um Lesbarkeit, inhaltlich und optisch. Und da gefällt mir die zweite Variante nicht halb so gut wie die erste. Der ! Operator ist, falls du's noch nicht mitbekommen hast, ein logischer Operator, genauer gesagt logisch nicht oder auch logisch negiert. Dh, dessen Benutzung macht vor allem dort Sinn wo ein logischer Ausdruck vorhanden ist (natürlich nicht nur, zB auch bei Zeigern), und
jahr%4
ist nun mal kein logischer Ausdruck. Und nur weil der Compiler das implizit in bool wandeln kann und ausgerechnet auch noch auf 0 geprüft wird (wozu false evaluiert), ist die Verwendung von ! noch lange kein MUSS. Sicherlich ist es Geschmackssache, aber ich mag's an dieser Stelle allein schon wegen der doppelten Klammerung überhaupt nicht.
-
Nimda schrieb:
if(ist_schalt_jahr (jahr))
Das ist schneller und braucht weniger Speicherplatz!
falsch. aber trotdem schreibt man nicht ==true dahinter.
if(!(jahr%4))
Wenn jahr%4 Null ergibt, zählt das als false, dann noch das NOT hinzu und du hast true. Probiers aus, ist wesentlich eleganter.
falsch. es ist ausgesprochen unelegant für c++ (es war mal mode in c) so viele verscheidene welten zu mischen. der ausdruck jahr%4==0 geschieht von vorn bis hinten in der integer-welt und ist deshalb feiner, als ein ausdruck, der mischt und geheime c++-sachen reinbringt. du magst ja wissen, daß 0 zu fals wird und >0 wird zu true und <0 weißte halt nicht. ein anderewr wqird vielleicht nur wissen, daß 0 zu false wird und 1 zu true. der muss bei !(jahr%4) erstmal in ein BUCH gucken, bei jahr%4==0 ist hingegen alles klar. alles klar?
if(jahr%4==0) return true; if(jahr%100==0) return false; if(jahr%400==0) return true;
sehr gut.
Man sollte möglichst nicht, einfach nur
int Jahr;
machen. Das ist schlechter portierbar. Mach lieber:
unsigned short int Jahr;
also immer einen ganz speziellen Typ angeben, nix dem Compiler überlassen.
[/quote]
das ist große kacke und ein riesenmist. schreib ersten nicht mehr short ist, sondern nur short (ohne int). short ist kein verkommener typmodifizierer mehr, sondern ein echter typ.
und zweitens benutze entweder int und in begründeten ausnahmen short (wegen speicher sparen oder sowas, also nie auf dem stack) oder konkrete typen, die die länge angeben, wie __int32. aber unsigned short int ist doch nutzlos. weißt ja eh nicht, wieviele bits der hat. warum also nicht int (der typ, der schnell sein sollte).
-
freshman schrieb:
@nimda: nimm es mir nicht böse, aber was ist das denn?
abgesehen davon, daß wir uns jetzt wieder über Programmierrichtlinienkonventionenstandardswirallediskutierenschonewigdrüber streiten könnten (schlage doch bloß keinem Anfänger die Verwendung von mehreren returns vor!! meine Meinung: wenn du strukturiert programmierst, dann nur 1 return; später in der OOP mit exceptions ist das eine andere Sache), ist die Logik doch ...welch ein unfug.
bitt schlagt anfängern die verwendung von mehreren returns vor.
sobald das ergebnis der funktion feststeht, soll man sofort rausreturnen!die alte regel beim strukturieten programmieren hatte gründe, die lange tot sind. denk mal drüber nach, warum man nicht rausreturnen sollte, als man noch überall open()/close()-paare hatte.
heute mit den destruktoren ist das hinfällig. und der code mit den vielen returns ist einfacher zu verstehen, also besser.
-
freshman schrieb:
@nimda: nix gegen dich; stimmt grundsätzlich schon, aber ich dachte ja nur, daß, da man die Handschrift eines blutigen Anfängers im Code lesen kann, es ratsam ist extrem strukturiert zu bleiben
.....erst krabeln, dann gehen, dann laufen.....
der Vollständigkeithalber hier noch mein Vorschlag:bool isLeapYear(int year){ return(!(year%4)&&year%100||!(year%400)); }
sorry, aber ich habe gerade keinen Compiler (das erkläre ich jetzt lieber nicht) , kann mir jemand sagen, ob das stimmt? thanx'
das ist unlesbarer müll.
abgelehnt.
ok, es wäre in ordnung, wenn nicht bereits ne viel besser lesbare version gepostet worden wäre.
-
volkard schrieb:
if(jahr%4==0) return true; if(jahr%100==0) return false; if(jahr%400==0) return true;
sehr gut.
Huh? Wußte garnicht, daß 1900 ein Schaltjahr war.
-
Da ihr euch ja alle nicht einigen könnt geb ich der armen Sabi_Mueller mal eine funtionierende Version, an der sich dann alle die Mäuler zerreissen können
bool isLeapYear(int year) { if (year % 400 == 0) return true; if (year % 4 == 0 && year % 100 != 0) return true; return false; }
Meine Güte pampt ihr euch hier unnötig an
-
@volkard: jetzt krieg' ich sie aber dicke, was
aber ich lasse mich natürlich immer gerne eines Besseren belehren
Daß mein Code-Bsp nicht leserlich und außerdem wahrscheinlich auch noch ziemlich lahm ist weiß ich auch. Nehmen wir es eben als Negativbeispiel
Das mit dem 1 return habe ich nämlich mal so gelernt und wahrscheinlich zu sehr verinnerlicht; abgesehen davon bin ich ja auch noch ein Anfänger (wie man ja unschwer an meinem NAmen erkennen kann) und wollte niemanden irreleiten. Ist wahrscheinlich nur mein persönlicher Geschmack, daß ich es übersichtlicher finde nur mit einem return zu arbeiten (an der Verschachtelung erkennt man ja ab wo nix mehr gemacht wird), jedoch ohne mich darauf zu versteifen. Habt ihr über dieses Thema irgendwo eine Diskussion in eurer FAQ liegen?
-
freshman schrieb:
Das mit dem 1 return habe ich nämlich mal so gelernt und wahrscheinlich zu sehr verinnerlicht;
mir scheint eh, daß es unwahrscheinlich schwer ist, sich von was zu trennen, das man einmal gelernt hat. es gibt etliche, die diese 1-return-regel (oft genannt single entry,single exit oder so) einfach nicht loslassen können und verfechten, als sei sie noch sinnvoll. andere halten an un fest, noch andere an uml-diagrammen.
am allerschlimmsten sind die leute, die lange c gemacht haben und jetzt nach c++ umsteigen. da sieht man dann, daß es manchmal besser ist nichts gelernt zu haben, als was behinderndes (c ist ja nichtmal irgendwie falsch).abgesehen davon bin ich ja auch noch ein Anfänger (wie man ja unschwer an meinem Namen erkennen kann) und wollte niemanden irreleiten.
mach bloß weiter so. die anderen leser sollen doch auch was lernen. das geht am besten, wenn diskutiert wird, denn da fallen auch mal argumente. ich kann hoffen, daß auch diesmal wieder 5 leute gelesen haben, daß und warum die 1-return-regel veraltet und schädlich ist.
das meiste an deinem beitrag war richtig und das bißchen falsche war trotzdem hilfreich.Ist wahrscheinlich nur mein persönlicher Geschmack, daß ich es übersichtlicher finde nur mit einem return zu arbeiten (an der Verschachtelung erkennt man ja ab wo nix mehr gemacht wird), jedoch ohne mich darauf zu versteifen. Habt ihr über dieses Thema irgendwo eine Diskussion in eurer FAQ liegen?
nö. die faq ist nur nachschlagewerk. da kommt nix kontroverses rein.
-
@volkard: thanx'->Balsam für die Seele
Kannst ja neben dem garbageForum (Idee von gestern) auch ein SeelsorgeForum für verletzte Freshmen einrichten, ach ja und ein battleForum für solche Diskussionen;-)
-
Das ist echt unglaublich.
Der Junge wollte einfach ein wenig Hilfe fuer seinen Code und keine Excursion in die tiefen des C++ bekommen.
Das ist jetzt schon die 25. Antwort auf seine einfache Frage.
So kann einem auch die Lust vergehen.
Den PERFEKTEN Stiel kann man wohl nicht beim ersten Programm entwickeln.Man bekommt ja Komplexe hier was zu posten aus Angst 10 x geruegt zu werden fuer eine einfache Frage.
-
Darkfalcon schrieb:
Das ist echt unglaublich.
Der Junge wollte einfach ein wenig Hilfe fuer seinen Code und keine Excursion in die tiefen des C++ bekommen.
Das ist jetzt schon die 25. Antwort auf seine einfache Frage.
So kann einem auch die Lust vergehen.
Den PERFEKTEN Stiel kann man wohl nicht beim ersten Programm entwickeln.Man bekommt ja Komplexe hier was zu posten aus Angst 10 x geruegt zu werden fuer eine einfache Frage.
[OT]
Die ganzen Antworten muss er sich doch gar nicht durchlesen! Er hat mehrere Lösungen bekommen die funktionieren, wenn er jetzt noch Lust hat, dann kann er sich noch anschauen welche die beste ist. Wenn nicht, dann hat er trotzdem eine Lösung.Für die fortgeschritteneren unter uns ist es aber mit Sicherheit interessant, WELCHE Lösung die beste ist und vor allem WARUM. Volkards Erklärung bzg. des mehrfachen returns fand ich zum Beispiel sehr interessant und genau deswegen lese ich auch Threads mit simplen Problemen, weil man daran meistens am besten lernen kann!
[/OT]
-
Darkfalcon schrieb:
Das ist echt unglaublich.
Der Junge wollte einfach ein wenig Hilfe fuer seinen Code und keine Excursion in die tiefen des C++ bekommen.
Das ist jetzt schon die 25. Antwort auf seine einfache Frage.
So kann einem auch die Lust vergehen.
Den PERFEKTEN Stiel kann man wohl nicht beim ersten Programm entwickeln.
Man bekommt ja Komplexe hier was zu posten aus Angst 10 x geruegt zu werden fuer eine einfache Frage.wer lesen kann, ist klar im vorteil.
ich schrieb:mach bloß weiter so. die anderen leser sollen doch auch was lernen.
die ausführlichen sachen gingen nicht an den ursprünglichen fragsteller, sondern an den wißbegierigen mitleser.
und wenn es nur KPC wäre, der es lesen mag, und 10000 user das nicht lesen wollen, dann würde ich es dennoch posten.
-
Darkfalcon schrieb:
Den PERFEKTEN Stiel kann man wohl nicht beim ersten Programm entwickeln.
auch nach 20 jahren hat man den noch nicht. und ich mache mir echt viele gedanken über den guten stil.
und es geht nicht darum, einen bestimmten stil (viele returns) zu propagieren, sondern darum, denkschablonen wie STRUKTURIERTES PROGRAMMIEREN zu demontieren.Man bekommt ja Komplexe hier was zu posten aus Angst 10 x geruegt zu werden fuer eine einfache Frage.
wer hier nur 10x gerügt wird, hat das als lob zu verstehen. normale postings werden häufiger gerügt.
-
[provokationsmodus]
In den guten, alten BASIC-Zeiten gab's Meisterschaften im Schnellschießen von Q&D Einzeilern. Warum nicht auch mal in C±void main(){int y;cout<<"Jahr?";cin>>y;cout<<((!(y&3)&&((y%100)||!(y%400)))?"Ja, es ist ":"Nein, es ist k");cout<<"ein Schaltjahr";}
Na, was gibt's daran auszusetzen? Unlesbarer Müll? Na und? Genie beherrscht das Chaos ...:D
[/provokationsmodus]
-
Nulliver schrieb:
Na, was gibt's daran auszusetzen? Unlesbarer Müll? Na und? Genie beherrscht das Chaos ...:D
klar sollste auch sowas üben.
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))); }
bei sowas verinnerlicht man dann erst die de-morgan'schen regeln und schwupps, kann man sie auch einsetzen, um code besser zu machen.