Aufgabe zu lösen.



  • clem schrieb:

    ok jetzt schnall ichs. und was bedeutet dieses modulo 7?

    Wieviele Tage sind vergangen bis zum 2.1.1901?

    1 - also welcher Tag ist? Dienstag+1 == Mittwoch

    Wieviele Tage sind vergangen bis zum 10.1.1901?

    9 - also welcher Tag ist? Dienstag+9 == ?

    Ok, Dienstag+9 geht nicht. Die Woche hat nur 7 Tage. Dienstag+7=Dienstag
    Dienstag+2=Donnerstag

    Ok, wie kommen wir von 9 auf 2?
    Wir muessen 7 sooft abziehen bis es nicht mehr geht, das was rest bleibt ist dann die Zahl die wir suchen.

    Aber warte mal... sooft abziehen... Das klingt mir vertraut:
    Dividieren
    Und wie bekomme ich bei einer Division den Rest? Modulo



  • ja gut. und wie programmier ich das, wenn ich z.b. als datum 23.04.2005 hab und ich die tage vom 1.1.1901 bis dahin rechnen will? ich steh voll auf der leitung!



  • fuer jedes ganze jahr kannst du erstmal 365 addieren - beim schaltjahr einen mehr.



  • clem schrieb:

    ja gut. und wie programmier ich das, wenn ich z.b. als datum 23.04.2005 hab und ich die tage vom 1.1.1901 bis dahin rechnen will? ich steh voll auf der leitung!

    wieviele tage hat ein monat?

    wenn du das beantworten kannst, kannst du beantworten wieviele tage ein jahr hat

    bis zum 23.4.2005 sind es somit:

    22 Tage
    3 Monate
    104 Jahre



  • ja theorietisch versteh ich sja, aber praktisch nicht. könnt ihr nichtmal kleine code beispiele geben? wär nett von euch!



  • clem schrieb:

    ja theorietisch versteh ich sja, aber praktisch nicht. könnt ihr nichtmal kleine code beispiele geben? wär nett von euch!

    Nein. Denk selber.
    Der Sinn einer Aufgabe ist es, dass du etwas lernst.

    Mach aus den Tipps mal etwas.

    Sag mir welcher Tag der 1.2.1901 war.
    und zeig mir den code den du verwendet hast um die antwort zu berechnen.



  • verstehst du nicht? ich weiß nicht einmal wie ich es angehen soll? for schleife? so irgendwie?



  • Sagen wir mal ganz unpolitisch vom 11. September 2001 bis zum 20. September 2001 sind es 9 Tage

    tage = 20-11;
    print tage
    9
    wochen = tage/7;
    rest   = tage%7;
    print wochen
    1
    print rest
    2
    

    Wenn also der 11 ein Donnerstag gewesen wäre, dann wäre der zwanzigste Donnerstag + rest = Samstag

    Man beachte die Anzahl der Wochen ist unerheblich



  • clem schrieb:

    verstehst du nicht? ich weiß nicht einmal wie ich es angehen soll? for schleife? so irgendwie?

    mit stift und papier

    du nimmst dir einen bleistift und ein stueck papier und setzt dich hin.
    du suchst dir 3 daten aus und rechnest fuer diese haendisch den wochentag aus.

    und dann hast du bereits einen algorithmus den du in C implementieren kannst.



  • Wenn Du schon von for-Schleife redest, dann sind vielleicht andere Dinge etwas schnell an Dir vorbeigerauscht. Gehört dazu vielleicht das 'Frame' einer Funktion?

    int dayOfWeek(int day, int month, int year)
    {
      int antwort;
    
      antwort = (day-1) + 30*(month-1) + 365*(year-1901);
    
    /* das gäbe jetzt die Anzahl in Tagen, wenn da nicht das Problem mit der unterschiedlichen Taganzahl der Monate wäre, und die Sache mit dem Schaltjahr */
    
      antwort = antwort % 7;
    /* und jetzt hat die modulo-Funktion ihre Arbeit gemacht
      und alles in den Bereich 0...6 gebracht */
    
      return antwort;
    /* damit wird der Wert zurückgegeben. 
     Aber ... nicht nur, dass das Problem mit Monat und Schaltjahr noch zu lösen ist,
     die Falle ist hier noch, dass für den 1.1.1901 eine 0 zurückgegeben wird, es aber ein Dienstag war.
     Dieses +1, von dem die Rede war, muss auch noch irgendwo rein. Wo? */
    }
    

    Soooo einfach wäre das im Prinzip.
    Welche Möglichkeiten fallen Dir ein, um die drei bestehenden Probleme zu lösen?



  • ok danke 🙂

    also das problem mit dem +1, löst man denk ich so:

    antwort = (day-1) + 30*(month-1) + 365*(year-1901) + 1;
    

    aber das mit den schaltjahren und unterschiedlichen tagen weiss ich noch imme rnicht.



  • Ne, falsch.

    Ignorieren wir mal das +1.

    Wie findest du heraus wieviele tage der januar hat?

    Wenn du das weisst, dann kannst du die Monate fuer Maerz, April, Mai, Juni, Juli, August, September, Oktober, November und Dezember auch berechnen.

    Die Frage bleibt nur: was ist mit dem Feburar:

    Der hat 28 Tage, es sei denn es ist ein Schaltjahr.
    Ich wette ihr habt im Kurs schon durchgemacht wie man ein Schaltjahr berechnet.



  • ja, schaltjahr is ja eigentlich ganz isi

    if((year % 4) == 0)
    		s_month = 29;
    	else 
    		s_month = 28;
    

    aber das jetzt in die rehcnung einzubauen is ein problem für mich. haben die restlichen monate nicht immer die fixe tageszahl? wozu muss ich diese dann "berechnen"?



  • clem schrieb:

    ja, schaltjahr is ja eigentlich ganz isi

    if((year % 4) == 0)
    		s_month = 29;
    	else 
    		s_month = 28;
    

    naja, nicht ganz:

    aus wikipedia
    Alle Jahre, welche durch 4 ohne Rest teilbar sind, sind Schaltjahre.
    Alle Jahre, welche durch 100 ohne Rest teilbar sind, sind keine Schaltjahre.
    Alle Jahre, welche durch 400 ohne Rest teilbar sind, sind wiederum Schaltjahre.

    aber das jetzt in die rehcnung einzubauen is ein problem für mich. haben die restlichen monate nicht immer die fixe tageszahl? wozu muss ich diese dann "berechnen"?

    exakt. fuer januar,maerz,april,mai,juni,juli, august,september,oktober,november und dezember ist die tages anzahl immer fix.

    du musst aber fuer jedes jahr rausfinden wieviele tage der februar hat.
    aber das sollte ja mit der wikipedia beschreibung moeglich sein, oder?



  • int dayOfWeek(int day, int month, int year)
    {
    int day_week = (month + day + year + year/4 - year/100 + year/400);
    
    day_week = day_week % 7;
    
    return day_week;
    }
    

    so irgendwie?



  • clem schrieb:

    int dayOfWeek(int day, int month, int year)
    {
    int day_week = (month + day + year + year/4 - year/100 + year/400);
    
    day_week = day_week % 7;
    
    return day_week;
    }
    

    so irgendwie?

    Du hast doch sicher einen Compiler, in dem du testen kannst, was du codest, oder!?

    Also frag nicht "so irgendwie?", sondern gibt deine Testdaten ein und schau nach, was hinten rauskommt.



  • ja ok habs compliert und es komtm freitag raus! also isses falsch!



  • In Anbetracht der Tatsache, dass du es scheinbar wirklich nicht hinbekommst, ist hier der Algorithmus (ich hoffe, ich hab nix vergessen, wenn ja, dann bitte berichtigen 😉 ). Kann auch sein, dass es noch einfacher geht...

    1) Berechne, wieviele Jahre seit damals vergangen sind.
    2) Gehe jedes Jahr durch und prüfe, ob es ein Schaltjahr war.
       (Wenn ja -> 366 Tage, Wenn nicht -> 365 Tage)
    3) Berechne die verbleibende Differenz zwischen den Monaten beider Daten.
       (Wenn ein Februar dabei ist -> checken, obs ein Schaltjahr ist)
       (Wenn ja -> 29 Tage, Wenn nicht -> 28 Tage)
    4) Berechne die verbleibende Differenz zwischen den Tagen beider Daten.
    5) Summiere alles auf.
    6) Addiere 1.
    7) Gib das Ergebnis modulo 7 zurück.
    

    Das musst du jetzt nur noch in C umsetzen.



  • dankesehr. dann versuch ichs mal umzusetzen!

    edit: wie gehe ich die jahre durch und überprüfe das? sagt mir bitte infach wie da der code is. dann versteh ichs auch leichter!



  • den rest solltest du alleine loesen koennen:

    int day=1; // 1.1.1901 = dienstag;
    
    // schleifenzaehler
    int year;
    int month;
    
    int inputyear= xxxx; // >=1901
    int inputmonth= yy;  // 1..12
    int inputday= zz;    // 1..31
    
    int daysPerMonth[12]={31,28,31,30,...};
    
    // jahre durchgehen
    for (year=1901;year<inputyear;year++)
    {
      if (schaltjahr(year))
        day+=366;
      else
        day+=365;
    }
    
    // monate durchgehen
    // ...
    
    // restliche tage addieren
    // ...
    

    extrapunkte gibt's vermutlich, wenn die berechnung des wochentags eines datums vor 1901 auch funktioniert...


Anmelden zum Antworten