Frage zu einem Algorithmus

  • Frage zu einem Algorithmus

    Hallo,

    folgendes Problem: gegeben ist ein Datum über int year, int month, double day. ich möchte nun herausfinden ob das Datum vor dem 15.10.1582 liegt, also im Julianischen Kalender.

    Einfach so über AND geht das ja nicht, monat und tag kommen ja alle in jedem Jahr vor.

    ich hab das jetzt so:

    Quellcode

    1. BOOL julian = NO;
    2. if (year < 1582) { // ist das Datum vor 1582?
    3. julian = YES;
    4. } else {
    5. if (year == 1582) { // liegt das Datum im jahr 1582...
    6. if (month <10) { // ...und ist es vor Oktober
    7. julian = YES;
    8. } else { // ist es 1581 und Oktober, schauen wir auf den Tag
    9. if (month == 10) {
    10. if (day < 15) { // war es vor dem 15.?
    11. julian = YES;
    12. }
    13. }
    14. }
    15. }
    16. }
    Alles anzeigen

    aber bei dem Geschachtel wird einem ja schlecht.

    Könnte man das einfacher machen? (NSDate beforeDate gilt nicht)

    Gruß Manfred
    Seminare, Artikel, Code. ObjectiveCeeds - alles für die Apfelzucht.
  • RE: Frage zu einem Algorithmus

    Ich finde es so gar nicht mal so schlimm:

    Quellcode

    1. BOOL julian = NO;
    2. if (year < 1582) // ist das Datum vor 1582?
    3. {
    4. julian = YES;
    5. }
    6. else if (year == 1582) // liegt das Datum im jahr 1582...
    7. {
    8. if (month <10) // ...und ist es vor Oktober
    9. {
    10. julian = YES;
    11. }
    12. else if (month == 10) // ist es 1582 und Oktober, schauen wir auf den Tag
    13. {
    14. if (day < 15) // war es vor dem 15.?
    15. {
    16. julian = YES;
    17. }
    18. }
    19. }
    Alles anzeigen
  • RE: Frage zu einem Algorithmus

    Quellcode

    1. BOOL julian = NO;
    2. if ((year < 1582) || (year == 1582 && month < 10) || (year == 1582 && month == 10 && day < 15))
    3. julian = YES;


    Wenn ich da jetzt keine gravierenden Fehler drin habe... ;)
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Jip.
    Aber das Geschachtel fällt so nicht auf.

    (gibt es eigentlich irgendwelche aussagekräftigen Tests darüber, welches Verfahren schneller ist?)
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Quellcode

    1. return ((year < 1582) || (year == 1582 && month < 10) || (year == 1582 && month == 10 && day < 15)) ? YES : NO;


    ?! ;)

    Um es besser lesbarer zu gestalten würde ich jeweils eine lokale bool für Jahr Monat und Tag anlegen und disee drei im if einsetzen.

    Quellcode

    1. if( before1582 || in1582beforeOctober || in1582inOctoberBefore15)
    2. return YES;
    3. else
    4. return NO;
  • Original von Juju

    Quellcode

    1. return ((year < 1582) || (year == 1582 && month < 10) || (year == 1582 && month == 10 && day < 15)) ? YES : NO;


    Ist ? YES : NO nicht obsolet?
    Und wenn ja, warum nicht?

    Entweder die IF trifft zu (return YES) oder eben nicht (return NO)

    Ich bin ja eh dafür, dass aus der if() eine is() wird.
    Wer meldet nen Bug? ;)

    Original von Juju
    Um es besser lesbarer zu gestalten würde ich jeweils eine lokale bool für Jahr Monat und Tag anlegen und diese drei im if einsetzen.

    Quellcode

    1. if( before1582 || in1582beforeOctober || in1582inOctoberBefore15)
    2. return YES;
    3. else
    4. return NO;


    Und wer sagt den drei bools jetzt, welchen Wert sie haben? ?(
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Original von hns
    Das ?YES:NO kann man sich auch noch sparen, weil die als 1 und 0 definiert sind.

    Wo wir wieder bei der Frage sind,

    Quellcode

    1. if(YES == 1 && NO == 0)
    2. return YES;
    3. return NO;

    +scnr+
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Original von joedelord
    nur so ein Gedanke, aber wie wärs damit:

    Quellcode

    1. if(year <= 1852 && month <= 10 && day < 15) return true


    also wenn diese if-clause stimmt dann ist das Datum vor dem 15.10.1852


    +öhm+
    1852 -> YES
    10 -> YES
    15 -> NO

    Passt.

    ABER!

    1851 -> YES
    12 -> NO
    16 -> NO

    Du siehst: das geht so nicht. ;)
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Original von Tom9811
    Tsss, ich klammere sogar Vergleiche, um das lesbarer zu machen:

    Quellcode

    1. if( (something == 2) && (other == 1) ) {

    Da siehht man mal die Geschmächer …

    Da kannst Du aber Gift drauf nehmen daß ich das auch so mache. Klammern kosten schließlich keine Performance und machen das ganze meiner Meinung nach _wesentlich_ lesbarer. -- Und sei's für den Doppelklick auf eine der Klammern.
    if (!exit(-1)) fprintf(stderr, "exit call failed. Program will continue\n");