Anzeige:
Seite 3 von 3 ErsteErste 123
Ergebnis 31 bis 39 von 39

Thema: Wie programmierst du?

  1. #31
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Moin,

    Zitat Zitat von juan_ Beitrag anzeigen
    ...Interessant wäre es, die Kontrolle auch über RegExp zu realisieren, aber soweit bin ich noch nicht. Eine schlichte case-Abfrage (oder verschachtelte if-Abfragen) reichen mir vorerst.
    Hm, ich kenne regex ein wenig - ich bezweifle, dass eine, die das Datum 100% korrekt abprüft:
    a) noch halbwegs lesbar ist
    b) kürzer ist als eine selbstgebastelte Funktion
    c) effektiver arbeitet als eine selbstgebastelte Funktion

    Das Problem liegt darin, dass in dieser Prüfung Berechnungen angestellt werden müssen (Schaltjahr), Backreferences auftreten müssten (die Gültigkeit des Tags hängt ab vom Monat und beim Februar auch vom Schaltjahr) und schon allein eine Prüfung auf einen gültigen Monat nicht mehr so trivial ist (wobei der Monat noch der einfachste Kandidat ist). In Perl würde eine Prüfung auf einen Wert zwischen 01 und 12 z. B. so aussehen:
    Code:
    jan@jack:~/tmp> echo 01 | perl -ne 'print $_ if /^(0[0-9]|1[012])$/;'
    01
    jan@jack:~/tmp> echo 12 | perl -ne 'print $_ if /^(0[0-9]|1[012])$/;'
    12
    jan@jack:~/tmp> echo 13 | perl -ne 'print $_ if /^(0[0-9]|1[012])$/;'
    jan@jack:~/tmp>
    Das Jahr ginge auch noch - dass wir eine 4-stellige Zahl haben, wissen wir ja schon aus der Eingangs-Prüfung:
    Code:
    jan@jack:~/tmp> echo 1701 | perl -ne 'print $_ if /^(1[7-9]|2[012])\d\d$/;'
    1701
    jan@jack:~/tmp> echo 1601 | perl -ne 'print $_ if /^(1[7-9]|2[012])\d\d$/;'
    jan@jack:~/tmp> echo 2299 | perl -ne 'print $_ if /^(1[7-9]|2[012])\d\d$/;'
    2299
    jan@jack:~/tmp> echo 2301 | perl -ne 'print $_ if /^(1[7-9]|2[012])\d\d$/;'
    jan@jack:~/tmp>
    Das Ganze wird haarig beim Tag. Die Gültigkeit hängt nämlich sowohl vom Jahr als auch vom Monat ab, da kann '0[1-9]' oder '1[0-9]' (alle Monate) gültig sein, und dann abh. vom Monat / Jahr: '2[0-8]' (Februar in Nicht-Schaltjahren), '2[0-9]' (alle anderen Monate), '30' (alle Monate außer Februar), '31' (alle Monate mit 31 Tagen).

    Reguläre Ausdrücke dienen der Mustererkennung in Zeichenketten. Dafür sollte man sie nutzen. Wenn es wie bei einem Datum um Zahlen inkl. Berechnungen geht, dann sollte man dafür geeignete Werkzeuge benutzen, nämlich numerische Operatoren.

    Du nimmst ja wohl (hoffentlich ;-) keinen Bohrhammer, wenn Du eine lockere Schraube in einem Festplattengehäuse anziehen willst.

    Jan

  2. #32
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Moin,

    Zitat Zitat von juan_ Beitrag anzeigen
    ...Dummer Fehler, das kommt davon, wenn man zwischen dem Programmieren immer eine Woche Zeit verstreichen lässt und man dann später nicht mehr aufpasst...
    nein das trifft es nicht ganz. Sauberen Code kann man auch nach ein paar Jahren noch lesen und korrekt interpretieren (von der anderen Sorte hab ich auch einiges auf meiner Platte liegen %-/ - da guck ich dann immer erstmal rein wie ein Schwein ins Uhrwerk - und das ab und zu auch bei eigenen Programmen) und da gehören zutreffende Variablennamen genauso dazu wie Quellcode-Kommentare (oder kann Ruby das nicht? ;-). Kompakte Programmierung ist durchaus o.k., aber man muss dann doch mal kommentieren, so nach dem Motto "was wollte uns der Dichter damit sagen".

    Jan

  3. #33
    Registrierter Benutzer
    Registriert seit
    22.11.2007
    Beiträge
    26
    Hallo Jan,
    natürlich hast du recht, dass es ein relativ schweres Unterfangen ist. Ob es kürzer oder sauberer ist, kann ich nicht beurteilen. Ich hätte es jedenfalls vermutet.
    Wobei, wenn ich jetzt so überlege und ich einfach ein Hash mit der "Monat => Anzahl_der_Tage - Zuweisung" mache, kann ich das ja auch ganz lescher überprüfen.
    Danke! (hier mal ein rubytechnischer Ansatz, den ich gefunden habe : klick)


    nein das trifft es nicht ganz. Sauberen Code kann man auch nach ein paar Jahren noch lesen und korrekt interpretieren (von der anderen Sorte hab ich auch einiges auf meiner Platte liegen %-/ - da guck ich dann immer erstmal rein wie ein Schwein ins Uhrwerk - und das ab und zu auch bei eigenen Programmen) und da gehören zutreffende Variablennamen genauso dazu wie Quellcode-Kommentare (oder kann Ruby das nicht? ;-). Kompakte Programmierung ist durchaus o.k., aber man muss dann doch mal kommentieren, so nach dem Motto "was wollte uns der Dichter damit sagen".
    ok, hier hast du natürlich auch recht
    Aber ist mein Code sooo unsauber (bis auf die Schaltjahrberechnung) ? ich war eigentlich recht stolz (hihi), was die Einrückungen und Kommentare anging.

    Ciao
    Geändert von juan_ (25-02-2008 um 08:35 Uhr)

  4. #34
    Registrierter Benutzer
    Registriert seit
    24.04.2007
    Ort
    Leipzig
    Beiträge
    20
    Hallo zusammen,

    freut' mich, dass der Durchbruch gelungen ist und Du auch um eine Erfahrung reicher bist, denn dumme kleine Fehler macht jeder (auch wenn's keiner gerne zugibt). Mein Tipp: Jeder hat Vorlieben für bestimmte Arten von kleinen Fehlern, deshalb lege Dir Dein kleines feines "Fehlerbüchlein" an. Vielleicht A5 und in Leder gebunden, damit's echt edel aussieht. Der Sinn ist, dass, wenn mal wieder nichts klappen will, Du in dem Büchlein nach vergangenen Fehlern suchst und schaust ob Dir in deinem aktuellen Projekt nichts ähnliches passiert sein könnte. Damit verbessern sich auf jeden Fall deine Skills und Du hast so etwas wie einen ganz persönlichen Debugging-Fahrplan an der Hand, wenn Du einmal überhaupt nicht weißt woran es liegt, dass Dein Programm falsch läuft.

    Zum Ruby-Code:
    Ich habe ja Deine Programmiervorlage nun auch entdeckt und versteh auch warum Du keine Lösungsstrategie hattest, da - nun klar - Du die Strategie eines Artikel genommen hast.

    Ich habe Dir eine andere Lösung angeboten, in der ich die Datumseingabe nicht näher prüfe, als dass ich will, dass der Tag und der Monat zwei Digits und das Jahr 4 Digits hat. (55.23.9234 geht also durch!)

    Zum Prüfen des Datums:
    Ich stimme zu, dass sich RegExp weniger für Datumsprüfung eignet, da es sich auf Stringfolgen bezieht. Man kann es dennoch versuchen, doch unter uns, ich hätte mir die Mühe, wie das Beispiel im Quakenet nicht gemacht. Zu mal, wie will man dem Benutzer bei falscher Eingabe nun mitteilen, was genau falsch war. In dieser Form wird über eine höchst komplizierte RegExp-Beschreibung, doch nur eine einfaches Weiterverarbeiten möglich. Bei Fallunterscheidung/Prüfungen mittels Kontrollanweisungen, wie SWITCH-CASE und ähnliches, wird es einfacher und übersichtlicher, zumal hier auch entsprechende Ausgaben/Reaktionen angehangen werden können. (Bsp: if month == 13 => "Hey Du Ei - das Jahr hat nur 12 Monate !")

    Zum Code: Ich habe für Dich die Einfachheit von Ruby durchblitzen lassen wollen und auch alles kommentiert. Aber da ich nicht Deinen Artikel umgesetzt habe, läuft wohl Dein Ruby-Alg. außer Konkurrenz Sei also weiterhin gespannt, erwarte aber nicht zu viel in Bezug auf Deinen Algorithmus. Auch weil es nur 20 Zeilen mit vielen Kommentaren sind.
    Wenn Du's Dir angeschaut hast, kannst Du gerne Fragen stellen. Vielleicht warum ich eine Array statt einem Hash nehme? Oder so ...

    Viel Erfolg noch
    Daniel
    Geändert von damue (25-02-2008 um 09:59 Uhr)

  5. #35
    Registrierter Benutzer
    Registriert seit
    22.11.2007
    Beiträge
    26
    Hallo,
    gute Idee, das mit dem Büchlein. Muss aber bestimmt sehr bald ein 2. angeschafft werden

    Zu deinem Code. Bin kurz drüber geflogen:
    Jap, das ist schon mal eine gute Frage. =)
    Eine andere Frage (die ich mir aber erstmal selber beantworten möchte) ist, was dein Array (in beiden Fällen) macht.

    Code:
    schaltjahrtag = [1, 0, 0, 0][($3.to_i % 4)]
    
    p "Du lebst in #{["k",""][schaltjahrtag]}einem Schaltjahr, das macht die Sache verdammt kompliziert! Ich ueberlege .."
    
    
    
    tage_bis_ersten_des_aktuellen_monats =
    
    [ 31 , 31+28 + schaltjahrtag, 31+28+31+ schaltjahrtag, 
    
    120 + schaltjahrtag, 151 + schaltjahrtag, 181 + schaltjahrtag, 
    
    212 + schaltjahrtag, 242 + schaltjahrtag, 273 + schaltjahrtag, 
    
    304 + schaltjahrtag, 334 + schaltjahrtag, 365 + schaltjahrtag]
    ist für mich grade irgendwie noch ein Rätsel. Ist "schaltjahrtag" ein 2.dimensionales Array (was genau das ist, weiß ich zwar grade auch nicht, aber fiele mir bei der Darstellung in den Sinn). Was genau macht die Variable, print "k", wenn array eintritt?
    Und das 2. verwirrt mich komplett Aber gut, ich beiße mich schon durch. Vielen Dank!

    Das dein Programm aber nicht ganz ordentlich rund läuft, weißt du aber schon, gell?

    Was mich aber wirklich interessiert: nach welcher Strategie bist du vorgegangen / welchen Ansatz verfolgst du?

    Adieu

  6. #36
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Moin,

    Zitat Zitat von juan_ Beitrag anzeigen
    ...Aber ist mein Code sooo unsauber (bis auf die Schaltjahrberechnung) ? ich war eigentlich recht stolz (hihi), was die Einrückungen und Kommentare anging.
    das war eher allgemein geschrieben. Ich rede mich manchmal auch (vor mir selbst ;-) damit raus, dass ich ja ewig nicht in meinen Code geguckt habe - aber wenn ich mir beim Coden mal die Zeit genommen habe und kommentiert habe, die Variablen vernünftig benannt habe usw., dann finde ich mich auch nach Jahren noch zurecht.

    In Bezug auf Deinen Code meinte ich nur das bereits angesprochene Problem mit den Variablennamen - wenn da irgendwo jahr drauf steht, sollte auch ein Jahr drin stecken. Sonst verwirrt das nur (ich bin bei Deiner Schaltjahresberechnung mehrmals in die falsche Richtung getappt, weil ich instinktiv davon ausgegangen bin, dass Du tatsächlich mit dem Jahr rechnest - erst als ich mir den Code nochmal im Zusammenhang angeguckt habe, fiel mir der Fehler auf). Du erleichterst Dir und vor allem anderen mit treffenden Bezeichnungen das Lesen.

    Jan

  7. #37
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Moin,

    Zitat Zitat von juan_ Beitrag anzeigen
    ...Das dein Programm aber nicht ganz ordentlich rund läuft, weißt du aber schon, gell?
    @damue: Da hat er Recht ;-) - 1900 z. B. war kein Schaltjahr, obwohl es durch 4 teilbar ist - die genaue Regel lautet: Durch 4 teilbar, aber nicht durch 100, es sei denn, durch 400 teilbar. Nur 2000, 2400 usw. sind Schaltjahre, die 100er dazwischen nicht.

    Jan
    Geändert von jan61 (25-02-2008 um 19:06 Uhr)

  8. #38
    Registrierter Benutzer
    Registriert seit
    22.11.2007
    Beiträge
    26
    Zitat Zitat von jan61 Beitrag anzeigen
    Moin,



    das war eher allgemein geschrieben. Ich rede mich manchmal auch (vor mir selbst ;-) damit raus, dass ich ja ewig nicht in meinen Code geguckt habe - aber wenn ich mir beim Coden mal die Zeit genommen habe und kommentiert habe, die Variablen vernünftig benannt habe usw., dann finde ich mich auch nach Jahren noch zurecht.

    In Bezug auf Deinen Code meinte ich nur das bereits angesprochene Problem mit den Variablennamen - wenn da irgendwo jahr drauf steht, sollte auch ein Jahr drin stecken. Sonst verwirrt das nur (ich bin bei Deiner Schaltjahresberechnung mehrmals in die falsche Richtung getappt, weil ich instinktiv davon ausgegangen bin, dass Du tatsächlich mit dem Jahr rechnest - erst als ich mir den Code nochmal im Zusammenhang angeguckt habe, fiel mir der Fehler auf). Du erleichterst Dir und vor allem anderen mit treffenden Bezeichnungen das Lesen.

    Jan
    Achso, dann bin ich ja beruhigt

  9. #39
    Registrierter Benutzer
    Registriert seit
    24.04.2007
    Ort
    Leipzig
    Beiträge
    20
    Ja, der Code ist nicht fertig - ist ja nicht mein Hauptanliegen. Juan, Du darfst gerne daran weiterbasteln.

    Nun zu den Fragen und Bemerkungen:

    @Juan + Jan
    Die Sonderregelung mit dem Schaltjahr kannte ich nicht => Ich schreibs mir gleich ins Büchlein. Hier die Korrektur, als Snippet.

    Code:
    p jahr_teilbar_400 = ((jahr % 400) == 0)
    p jahr_teilbar_100 = ((jahr % 100) == 0)
    p jahr_teilbar_4 = ((jahr % 4) == 0)
    p  schaltjahrtag = ((jahr_teilbar_4 and not jahr_teilbar_100) or jahr_teilbar_400) ? 1 : 0 # Pickaxe ~ Seite 97

    @Juan - 2D-Array?:
    Tja, was macht .. ?
    Code:
    schaltjahrtag = [1, 0, 0, 0][($3.to_i % 4)]
    Was Du hier siehst sind zwei Dinge in einem und kein 2D-Array. Als erstes wird eine Array erstellt. Ein Array ist im Vergleich zum Hash eine Struktur wo über die Position des Elements auf ein Element zugegriffen wird. In einem Hash nimmst Du ein Schlüssel, eine Zahl, ein Wort oder einen Code. Bei Dir war der Schlüssel der Monatsname und der Wert die Tage des Monats "{Mai => 31}". Im zweiten Schritt nimmst Du das Element aus einer bestimmten Position heraus. Damit ist das da oben ein SWITCH-CASE-Konstrukt und hätte auch so aussehen können:

    Code:
    schaltjahr_abfolge = [1, 0, 0, 0]
    schaltjahrtag = schaltjahr_abfolge[($3.to_i % 4)]
    Die Positionen in der schaltjahr_abfolge sind so gewählt, dass für den Modulowert aus der Jahreszahl, die Anzahl der zusätzlichen Tage eines Schaltjahres folgen. Ist das Jahr glatt durch 4 teilbar so ergibt das '0' und auf der Pos '0' im Array steht die '1'. Sonst liefert es bei den anderen Werten eine '0'. Damit habe ich eine Variable 'schaltjahrtag', die ich nun immer im Alg. benutzen kann, da sie falls kein Schaltjahr ist, in der Addition, keinen Einfluss hat.
    Hinweis: Mehr-dimensionale Arrays werden in Ruby durch eine explizite Deklaration oder durch eine deutliche Zuweisung erstellt. Beispiel:

    Code:
    schachbrett = Array.new(2){ Array.new}
    
    # erste Reihe links-nach-rechts
    schachbrett[1][1] = "Turm"
    schachbrett[1][2] = "Springer"
    schachbrett[1][3] = "Laeufer"
    schachbrett[1][4] = "Koenigin"
    schachbrett[1][5] = "Koenig"
    schachbrett[1][6] = "Laeufer"
    schachbrett[1][7] = "Springer"
    schachbrett[1][8] = "Turm"
    # zweite Reihe - nur Bauern!
    schachbrett[2] = Array.new( 8, "Bauer") # (1)
    
    p schachbrett[1][6], schachbrett[2][6] 
    p schachbrett[2][0], schachbrett[2][8]  # <- Einer meiner Lieblingsfehler, such den Bug (vielleicht Nahe (1))
    p schachbrett # Schau genau hin -> schachbrett[0][0]
    Ich denke jetzt klickts es auch mit der nächsten Frage: "print "k", wenn array eintritt?". Du siehst hier das gleiche Prinzip. Das 'k' ist nur eine Wert in einem 1D-Array und wird, falls schaltjahrtag = 0 ausgegeben, denn dann ist k_ein Schaltjahr. Falls schaltjahrtag = 1 dann ist natürlich _ein Schaltjahr. <= Ein Spiel mit der deutschen Sprache. (Hinweis: Arrays beginnen mit '0' statt mit '1' mit der Zählweise <= Und dass vergesse ich auch leider manchmal . Schaue in die Pickaxe ~ Seite 431 zu Arrays.)

    @Juan - Ansatz:
    Ich habe mir eine Referenzansatz gewählt (Erinnere in den Mathelink zu Zahlenfolgen). Wenn ich im Pogram fest einprogrammiere, dass der XX.YY.ZZZZ ein Montag war, dann brauche ich nur ausreichnen, wie viele Tage seit dem vergangen sind und Teile diese Zahl durch 7. Bsp: Diverenz ist 14, so ist 14 % 7 = 0. Also Monat + 0 = Montag. Ist ein allerdings 76 Tage her .. 76 % 7 = 6. Also Montag + 6 = Sonntag. Mein Beispielcode kann auch an dieser Stelle erweitert werden, denn es werden erstmal nur Tage diesen Jahres sinnvoll bestimmt.
    Dieser Ansatz ist nicht neu - denn selbst in Java wird die aktuelle Zeit als Referenzgröße auf ein festes Datum ausgegeben. Beleg
    Code:
    // get time in milliseconds since 1970 Jan 1
    long timestamp = System.currentTimeMillis();

    Gut. Fröhliches Kämpfen.
    Daniel

    PS: Ich geb zu ist im Code schon etwas dick aufgetragen, aber Ruby machts möglich.
    PPS: Irgendwie ist mein Deutsch heute komisch - naja - wer Fehler findet, darf sie behalten.
    Geändert von damue (26-02-2008 um 18:05 Uhr)

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •