Den Tag am Datum ermitteln (If, Funktionen, Modulo)



  • Hey Leute!
    Ich hänge hier ein bisschen fest. Ich habe jetzt einen Code geschrieben, der unerwartete Ergebnisse liefert. Genau genommen, liefert der leapCounter unerwartete Ergebnisse. So wie ich meinen Code verstehe, darf der leapCounter sich nur verändern, wenn sich auch das Jahr verändert. Leider verändert sich der leapCounter parallel zum dayCounter und ich kann nicht feststellen woran das liegt.

    Bitte löst mir nicht die Aufgabe oder gebt mir (noch) nicht Optimierungshinweise.
    Ich nutze diese Aufgaben zum Üben und Lernen der Programmiersprache, daher würde ich gerne selbst weiter optimieren und korrigieren.

    Wie gesagt, leider hänge ich gerade fest und würde nur gerne wissen:

    Warum ändert sich der leapCounter obwohl das Jahr konstant bleibt?

    Als Testwerte habe ich probiert:

    years = 1, months = 1, days = 1
    years = 1, months = 1, days = 2
    years = 1, months = 1, days = 3
    years = 1, months = 1, days = 4

    EDIT:

    Ich habe die Funktion in ein neues Projekt kopiert gehabt und dort hat es einwandfrei Funktioniert, ich bin echt super ratlos 😕 😕 😕

    // Thomas Davies
    // unsw computing 1
    // Day Checker
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <assert.h>
    #define EVEN_MONTH 30
    #define UNEVEN_MONTH_CONST 1
    #define REMAIN_DEZ_CONST 5  //Restdezember % 7 = 5
    #define JANUARY 31
    #define WEEK 7
    #define CYCLE 63
    
    int isLeapYear(int year);
    void tellLeapYear (int isLeapYear, int year);
    int isDayCounter (int days, int months);
    int isLeapCounter (int years);
    int isDay (int dayCounter, int leapCounter);
    
    int main (int argc, const char *argv[]) {
    
       int years, days, months; 
       int dayCounter;
       int leapCounter;
    
       printf ("Which year is it? Please enter the number!\n");
       scanf ("%d", &years);
       printf ("Which month is it? Please enter the number!\n");
       scanf ("%d", &months);
       printf ("Which day is it? Please enter the number!\n");
       scanf ("%d", &days);
    
       tellLeapYear (isLeapYear(years),years);                  
    
       dayCounter = isDayCounter (days, months) % WEEK;         //puts dayCounter in a range from 0-6
    
       leapCounter = isLeapCounter (years) % WEEK;              //puts leapCounter in a range from 0-6
    
       if ((months < 3) && (isLeapYear(years) == 1)){           //correction of leap year if february isnt reached yet
           leapCounter--;
       }
    
       dayCounter = isDay (dayCounter, leapCounter);            //gets the day number in relation to leap number
    
       /*if (dayCounter == 0){
           printf ("That is a Saturday!");
       } else if (dayCounter == 1){
           printf ("That is a Sunday!");
       } else if (dayCounter == 2){
           printf ("That is a Monday!");
       } else if (dayCounter == 3){
           printf ("That is a Tuesday!");
       } else if (dayCounter == 4){
           printf ("That is a Wednesday!");
       } else if (dayCounter == 5){
           printf ("That is a Thursday!");
       } else if (dayCounter == 6)
           printf ("That is a Friday!");
       */    
    
       return EXIT_SUCCESS;
    }
    int isLeapYear (int year){
        int leap;
        if (year % 400 == 0){
            leap = 1;
        }
        else {
            if ((year % 100 != 0) && (year % 4 == 0)){
                leap = 1;
            }
            else {
                leap = 0;
            }
        }
        return leap;
    }
    void tellLeapYear (int isLeapYear, int year){
        if (isLeapYear == 1){
           printf ("%d is a leap year\n", year);
       }
       else {
           printf ("%d is not a leap year\n", year);
       }
    }
    int isDayCounter (int days, int months){
        int dayCounter;
        if (months > 2){
            if (months % 2 == 0){
                if (months > days){
                    dayCounter = CYCLE - months - days;
                }
                else {
                    dayCounter = days - months;
                }
            }
            else{
                dayCounter = days - months + EVEN_MONTH + UNEVEN_MONTH_CONST;
            }
        }
        else{
            if (months == 1){
                dayCounter = days + REMAIN_DEZ_CONST;
            }
            else if (months == 2){
                dayCounter = days + JANUARY + REMAIN_DEZ_CONST;
            }
        }
        return dayCounter;
    }
    int isLeapCounter (int years){
        int leapCounter;
        years = years - (years % 4);
        while (years != 0){
            if ((years % 400 == 0) || ((years % 100 != 0) && (years % 4 == 0))){
                leapCounter++;
            }
            years = years - 4;
        }
        return leapCounter;
    }
    int isDay (int dayCounter, int leapCounter){
        if (dayCounter < leapCounter){
            dayCounter = leapCounter - dayCounter;
        }
        else {
            dayCounter = dayCounter - leapCounter;
        }
        return dayCounter;
    }
    

    Cheers 🙂



  • Du hast leapCounter nicht initialisiert.

    Das sagt dir auch der Compiler (als Warnung), wenn du ihn richtig eingestellt hast.



  • DirkB schrieb:

    Du hast leapCounter nicht initialisiert.

    Das sagt dir auch der Compiler (als Warnung), wenn du ihn richtig eingestellt hast.

    Ist das in Zeile 42 keine korrekte Initialisierung? Ich initialisiere doch leapCounter mit dem Ergebnis von (isLeapCounter (year) % 7).



  • C_Newbe schrieb:

    DirkB schrieb:

    Du hast leapCounter nicht initialisiert.

    Das sagt dir auch der Compiler (als Warnung), wenn du ihn richtig eingestellt hast.

    Ist das in Zeile 42 keine korrekte Initialisierung? Ich initialisiere doch leapCounter mit dem Ergebnis von (isLeapCounter (year) % 7).

    Dann drück mal Strg+f und suche *alle* Vorkommen von leapCounter und schau, ob alle initialisiert sind.
    Hast Du eins vergessen? Oder lügt DirkB?



  • Ahhh der leapCounter in Zeile 123 ist nicht initialisiert! 😃 😮 🤡

    Ne dachte nicht, dass er lügt oder Schmarn erzählt. Hatte es nur nicht begriffen, dass er den in Zeile 123 meint. Das nächste mal checke ich erstmal alles mit strg + f durch. Danke!



  • C_Newbe schrieb:

    Hatte es nur nicht begriffen, dass er den in Zeile 123 meint.

    Genauer wollte ich nicht werden. Wegen

    C_Newbe schrieb:

    Bitte löst mir nicht die Aufgabe oder gebt mir (noch) nicht Optimierungshinweise

    C_Newbe schrieb:

    Das nächste mal checke ich erstmal alles mit strg + f durch.

    Das nächste mal schaltest du die Warnstufe vom Compiler auf Maximum.
    Und dann behebst du die Ursache für jede Warnung. (Wenn du die nicht verstehst, dann frag nach)



  • DirkB schrieb:

    C_Newbe schrieb:

    Hatte es nur nicht begriffen, dass er den in Zeile 123 meint.

    Genauer wollte ich nicht werden. Wegen

    C_Newbe schrieb:

    Bitte löst mir nicht die Aufgabe oder gebt mir (noch) nicht Optimierungshinweise

    C_Newbe schrieb:

    Das nächste mal checke ich erstmal alles mit strg + f durch.

    Das nächste mal schaltest du die Warnstufe vom Compiler auf Maximum.
    Und dann behebst du die Ursache für jede Warnung. (Wenn du die nicht verstehst, dann frag nach)

    Danke, ja so ist es wirklich besser, je mehr ich darüber nachdenke, desto fester sitzt die (hoffentlich immer) folgende Erkenntnis 🙂


Log in to reply