Kompliziertere Schleife
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
beitrag
daten
day
durchgang
durchlauf
funktion
jahr
leserlichkeit
letzte
mindestens
neuling
rekursion
schaltjahr
schleifen
script
summen
umrechnung
variable
verstehe
zeile
-
Hi!
Ich bin ein relativer PHP-Neuling und habe ein Problem:
Ich entwickle moementan eine Programmbibliothek zur umrechnung zwischen verschiedenen Kalendersystemen.
Allerdings habe ich nun ein ProbleM:
Ich achte sehr auf leserlichkeit innerhalb meiner Scripts, da ich manchmal keine Lust mehr an einem Projekt habe und es dann nach einen Monat Pause noch sehr gut nachvollziehen k?nnen muss.
Im betreffenden Programmabschnitt wird gerade die Summe der Tage, die auf das Ausgangsdatum zugerechnet wird, eingearbeitet.
Das Problem ist, dass ich nicht wei?, wie man es ?bersichtlich schreiben kann. Ich versuche den zu schreibenden Code einfach mal in Pseudocode aufzuschreiben
$days: Variable f?r die einzurechnenden Tage
$years: Variable f?r die Jahre des Ergebnisdatums
is_gregor($year): Funktion zur Feststellung, ob ein gregorianisches Jahr ein Schaltjahr ist
/* Wenn das zu addierende Jahr ein Schaltjahr ist, dann pr?fe, ob $days 366 Tage hat um fortzufahren. Wenn es dagegen kein Schaltjahr ist, pr?fe, ob es 365 Tage hat. Wenn nicht genug da ist, ?berspringe es. Und: Ich wei?, dass das nicht korrektes PHP ist!*/ If (If ($is_gregor($years){ $year >= 366 } else { $year >= 365 }{ //F?ge Jahr hinzu $years++; /* Wenn das zu addierende Jahr ein Schaltjahr ist, ziehe 366 Tage von $days ab. Wenn es hingegen kein Shclatjahr ist, rechne 365 ab. If {is_gregor($years)){ $years = $years - 366; } else { $years = $years - 365; } /* Frage nun nochmal ab. */
Wie kann man das ?bersichtlich coden?
Hoffe auf schnelle Hilfe
mfg
Zualio
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Ich wei? ja net ob du es schon gesehn hast, aber es gibt in PHP schon einige Funktionen zur Umwandlung von Daten.
http://de3.php.net/manual/de/ref.calendar.php
kannst ja mal reinschauen vllt is das was du brauchst ja dabei -
HI!
Ja, ich wei? das.
Allerings mache ich das nicht um besonderen Nutzen zu haben, sondern weil mir scripten Spa? macht.
Au?erdem gibt es noch andere Kalendersysteme als die im dortigen Artikel genannten.
Ich speziell mache gerade einen Umrechner f?r die Kalendersysteme der Ramanreihe "Gezeitenwelt" (http://www.gezeitenwelt.de).
Bevor einer fragt, wieso ich mir die Arbeit machen w?rde und wieso ich so einen Schwachsinn fabriziere sei das gesagt: Es macht mir Spa?...
mfg
Zualio
-
Ich frag mich eher was dir an deinem Pseudo Code nicht ?bersichtlich genug ist. Ich hab in den letzten Jahren schon viel Code gesehen, auch Pseudo Code und der hier ist doch sehr sauber.
//edit: F?r die Rekursion die wohl am Ende stattfinden soll, kannst du den relevanten Teil auch in eine Funktion auslagern.
Beitrag ge?ndert am 28.06.2006 11:16 von evil-devil -
Hi!
Also, erst mal danke f?r die Tipps, evil.
Ich w?rde es nicht gerade gerne in eine Funktion auslagern, weil es dadruch un?bersichtlicher wird.
Also, ich habe glaube ich doch eine M?glichkeit gefunden, wie das zu relisieren ist, nur ist diese etwas umst?ndlich. Verbesserungsvorschl?ge werden gerne angenommen:
While ($days >= 365) { If ((is_gregor($year)) AND ($days >= 366){ $year++; $days -= 366; } elseif ((is_gregor($year)) AND ($days < 366) { break; } else { $year++; $days -= 365; } }
Ich habe es so gel?st:
Au?en herum ist eine While-Schleife, die solange l?uft, bis nicht genug Tage zur Uumrechnung in Jahre bereitstehen.
In der Schleife wird gepr?ft, ob ein zu addierendes Jahr ein Schaltjahr ist und daf?r auch die gen?genden Tage zur Verf?gung stehen.
Wenn nicht genug Tage im Falle eines Schalttages zur verf?gung stehen, beende die Schleife mit "break".
Hmmm... Ist das gut?
mfg
Zualio
-
Hab das nen wenig gek?rzt.
while ($days > 365) { if (is_gregor($year)) { if ($days >= 366) $days -= 366; } else { $days -= 365; } $year++; }
Das elseif brauchst du nicht. Einfach die While ab?ndern und du sparst dir einen durchlauf und die Abruchbedingung da diese nun direkt ?ber die Schleife geht :)
Ebenso kommt nun das inkrementieren des Jahres ans Ende, da die elseif nicht mehr da ist und somit $year immer erh?ht werden kann :)
//edit: Oder die Ultrakurz Variante ;)
while ($days > 365) { $days = is_gregor($year) && $days >= 366 ? $days -= 366 : $days -= 365; $year++; }
Beitrag ge?ndert am 28.06.2006 13:15 von evil-devil -
Hi!
@evil-devil:
Ich verstehe Zeile 3 nichtr so ganz. Da ist eine If-Abfrage ohne geschweifte Klammern. Was bringt die?
Wieso geht die Abbruchbedingung direkt ?ber die Schleife?
$days kann auch genau bei 365 liegen ud die Schleife sollte abgespielt werden(bei keinem Schaltjahr), wieso dann in Zeile 1 ">" statt ">="?
Auch verstehe ich nicht, warum man Grunds?tzlich eine inkrementierung machen kann. Wenn man n?mlich nur genau 365 in $days hat, kann es ja sein, dass im Falle eines Schaltjahres abgebrochen werden muss.
Zur Ultrakurzen Variante:
Die habe ich jetzt mal nicht ?berpr?ft, ich finde sie s?? und knuffig, aber wirklich nicht ?bersichtlich...
mfg
Zualio
Beitrag ge?ndert am 28.06.2006 15:15 von zualio -
Die If-Abfrage ohne Klammern ist die Kurzfassung f?r den Fall das nur eine Anweisung folgt. DAnn kann man die Klammern weglassen.
@Abbruchbedingung: Was genau macht die "is_gregor()" FUnktion denn? In meiner PHP Doku gibt es die nicht. Ist es eine eigene?
@rest: ?hm...
Ein Jahr mit 365 Tagen ist f?r mich halt kein Schaltjahr, da ein Schaltjahr nunmal 366 Tage hat, also brauch ich nichts abbrechen.
Und somit kann ich immer inkrementieren.
Oder wie wird die Schleife aufgerufen?
Bin bisher davon ausgegangen das du alle Tage der Jahre zusammengez?hlt hast und die dann irgendwie durchgehst. Und falls beim letzten Durchgang ein Schaltjahr ist wird entsprechend 366 abgezogen und bei einem normalen Jahr entsprechen 356.
@ultrakurz: Ja die ?bersicht leidet, obwohl sie noch recht "kurz" ist. Hab schon selbst l?nger verschachtelte geschrieben und gesehen. -
Hi!
is_gregor($Jahr, $Kalendersystem) ist eine selbstgeschriebene Funktion zur Schaltjahresberechnung in verschiedenen Kalendersystemen (Solange die Kalendersysteme so etwas wie Schaltjahre haben). Wenn man das zweite Attribut wegl?sst, nimmt er an, dass es die gregorianische Zeitrechnung ist, also unsere.
Sie gibt TRUE oder FALSE aus.
Ich verstehe die Erste Zeile nicht, weil du dort sagst, dass $days mindestens 366 Tage haben muss.
Daraus w?rde sich schlie?en, dass wenn nurnoch 365 Tage in $days verzeichnet sind, also noch genug um ein Jahr zu f?llen, die Schleife nicht ein letztes Mal ausgef?hrt wird.
Es ist nicht so, dass jedes Mal hier ein Schaltjahr berechnet wird. Mit is_gregor() wird berechnet, OB es ?BERHAUPT ein Schaltjahr ist.
Wenn man aber wie ich am anfang dieses Beitrags gesagt auch $days durchl?sst, wenn nur 365 Tage drauf sind, dann muss eine Abbrechenfuntkion drin sein, weil das letzte Jahr, das du damit berechnest, auch ein Nicht-Schaltjahr sein k?nnte.
Ich bin kein guter erkl?rer, aber ich hoffe, du hast mich verstanden.
mfg
Zualio -
Ah ok.
Dann kann man in der Schleifenbedingung getrost wieder >= 365 schreiben. Der Rest kann so bleiben, da wie du schon sagtest is_gregor() pr?ft ob es sich um ein Schaltjahr handelt. Dann d?rfte man eigentlich auch die Abfrage mit den >= 366 weglassen k?nnen, da doch bereits is_gregor() true liefern sollte sofern es sich um ein Schaltjahr handelt und die >= 366 dann unn?tig w?ren.
Oder hab ich da was verpasst? -
Hi!
Nein, das ">= 366" darf nicht weg gelassen werden, (ich meine das zweite in Zeile 3), weil wenn in der ersten Zeile statt "> 365" ">= 365" steht, werden auch Daten durchgelassen, wenn sie auch unter dem ben?tigten Tagessatz f?r ein Schaltjahr stehen.
Daher wird eine weitere ?berpr?fung notwendig.
mfg
Zualio -
pr?fst du denn in der Funktion nicht ob das Jahr 266 Tage hat? Oder wie ?berpr?ft man auf Schaltjahr? Hab das noch nie in PHP gemacht. Andere Sprachen hatten daf?r ne extra Funktion ^^
-
Hi!
is_gregor habe ich gemacht, weil es auch Schaltjahre von anderen Kalendersstemen bearbeiten kann. Den Kalednertyp kann man mit einem zweiten, optionalen Attrbut einf?gen.
Beim Gregorianischen Kalender (unsere) macht er jedenfalls das:
If ($year mod 4 = 0) { return true; } else { return false; }
Das ist nat?rlich nichts gro?es, aber bei anderen Systemen kann das komplizierter sein...
mfg
Zualio
Beitrag ge?ndert am 28.06.2006 17:55 von zualio -
Ok...dann ist das mit den 366 aber trotzem hinf?llig, ein SChaltjahr hat 366 Tage und nicht 356 ;)
-
Hi!
Du verstehtst mich falsch.
Es wird nicht ?berpr?ft, ob ein Schaltjahr 366 Tage ha, und dies doppelt, sondern ob $days mindestens 366 Tage hat!
In der ersten Zeile des Scripts wird ja nach $year >= 365 gefragt, weshalb in der Schaltjahresrechnung dies noch einmal ?berpr?ft werden sollte. Falls es NICHT reicht, muss die Schleife unterbroche werden und darf keine inkrementierung unternommen werden.
Klar, oder nicht?
mfg
Zualio
PS: Sorry f?r das Doppelposting! Bitte l?schen... Sorry
Beitrag ge?ndert am 28.06.2006 21:09 von zualio -
Hi!
Du verstehtst mich falsch.
Es wird nicht ?berpr?ft, ob ein Schaltjahr 366 Tage ha, und dies doppelt, sondern ob $days mindestens 366 Tage hat!
In der ersten Zeile des Scripts wird ja nach $year >= 365 gefragt, weshalb in der Schaltjahresrechnung dies noch einmal ?berpr?ft werden sollte. Falls es NICHT reicht, muss die Schleife unterbroche werden und darf keine inkrementierung unternommen werden.
Klar, oder nicht?
mfg
Zualio -
Ok, ok ^^
Dann halt mit der Abbruch Bedingung.
while ($days >= 365) { if (is_gregor($year)) { $days = $days >= 366 ? $days -= 366 : break; } else { $days -= 365; } $year++; }
Beitrag ge?ndert am 29.06.2006 09:35 von evil-devil -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage