Tage seit Jahresanfang berechnen

  • Hi,

    ich stehe auf dem Schlauch.

    Z.B. will ich berechenen, der wievielte Tag des Jahres ist der 3.2.07.
    Klar, Januar hat 31 Tag + 2 Tage für den Februar.

    Aber wie setze ich das in ein Struktogramm oder C/C++-Programm um?

    Irgendwie muss ich ja erstmal definieren, auch wenn ich weiß wieviel Tage welcher Monat hat, welcher Monat wieviel Tage hat.

    Auch muss ich das Schaltjahr berücksichtigen.

    Wie mache ich das?

    Wie fange ich an?

    Ich weiß noch nicht, wie ich das umsetzen kann.

    Danke für Tipps und Infos.

    Gruß
    Matt_informatic

  • Wird vermutlich nicht ganz funktionieren, nur so ungefähr:

  • Hi,

    danke. Denk Code verstehe ich nur Teilweise, weil Anfänger.

    Ich würde das gerne Schrittweise durchgehen, auch in einem Struktogramm darstellen.

    Wie funktioniert das mit den Tagen den Monaten zuweisen?

    Ich dachte eventuell, das ich 30 Tage als a, 31 Tage als b, 28 Tage als c definieren.
    Nachdem ich das Schaltjahr berechnet habe, dann einfach das zusammen gerechnete Ergebnis um 1 Erhöhe, wenn Schaltjahr stimmt.

    Habe nur keine Idee, wie ich Schrittweise da dran gehe.

    Gruß
    Matt_informatic

  • Wie funktioniert das mit den Tagen den Monaten zuweisen?

    Ich dachte eventuell, das ich 30 Tage als a, 31 Tage als b, 28 Tage als c definieren.

    Ich verstehe nicht ganz was du meinst. Wenn du einfach die Variablen a = 31, b = 30 und c = 28 anlegst, dann fehlt dir die Zuordnung welches Monat nun wie viele Tage hat. Ich hab einfach ein Array mit 12 Einträgen gemacht, wo für jedes Monat gespeichert ist wie viele Tage es hat.

    Natürlich gibt es noch andere Möglichkeiten.

  • Ah, verstehe, muss dann erstmal 12 Variablen mit Werten belegen.
    Im Struktogramm hätte ich dann erstmal 12 Aktionsfelder. Oder?
    Also:
    ----------------------------
    | Eingabe: Tag, Monat, Jahr |
    ----------------------------
    | Monat[0] = 31 |
    ----------------------------
    | Monat[1] = 28 |
    ----------------------------
    | Monat[2] = 31 |
    ----------------------------
    usw.

    Array kenn ich noch nicht, sind erstmal nur Grundlagen ohne Programmiersprache oder wenn, dann C/C++ angelehnt.

    Nach der Datumseingabe mache ich dann erstmal die Prüfung, ob Schaltjahr.

    Wie funktioniert, vom Prinzip (Struktogramm) das aufaddieren der Monate?

    Ich schätze mal, das das in einer Schleife gemacht wird.

    Wenn ich z.B. den 20.10.2007 eingebe, dann würde die Schleife von 1 bis 09 gehen.
    Im nächsten Schritt noch die 20 Tage vom Oktober dazu addieren.

    Aber diese Schleife an sich komme ich noch nicht klar.

    Gruß
    Matt_informatic

  • Ja. Obwohl ich da stattdessen einfach nur ein Aktionsfeld machen und verbal reinschreiben würde dass das Array gefüllt wird.

    Nach der Datumseingabe mache ich dann erstmal die Prüfung, ob Schaltjahr.

    Wie funktioniert, vom Prinzip (Struktogramm) das aufaddieren der Monate?

    Ich schätze mal, das das in einer Schleife gemacht wird.

    Wenn ich z.B. den 20.10.2007 eingebe, dann würde die Schleife von 1 bis 09 gehen.
    Im nächsten Schritt noch die 20 Tage vom Oktober dazu addieren.

    Genau.

    Aber diese Schleife an sich komme ich noch nicht klar.

    Wieso? Du hast es eh richtig erklärt.

  • ... zum vergleich, in java würde das so ausschaun:

    Code
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.YEAR, 2007);
    cal.set(Calendar.MONTH, 2);
    cal.set(Calendar.DAY_OF_MONTH, 3);
    int result = cal.get(Calendar.DAY_OF_YEAR);

    Es genügt nicht, keine Meinung zu haben. Man muss auch unfähig sein, sie auszudrücken. Karl Kraus

  • Am einfachsten loest man ein schwieriges Problem, indem man es in mehrere einfache Probleme aufteilt. Ein guter Weg das zu tun ist die sogenannte "Top-Down" Methode: Du loest das Problem erstmal ganz oberflaechlich und kuemmerst Dich dann erst um die Details.

    In deinem Fall gibt es z.B. einiges zu beachten, und du hast ja auch eingies aufgezaehlt. Wieviele Tage hat ein Monat? Wie behandele ich ein Schaltjahr?

    Aber wenn Du die ganzen Details erstmal weglaesst, dann ist das Problem gar nicht mehr so schwer:

    Code
    Programm: berechne_tage_im_jahr
    Input: monat, tage, jahr
    
    
    Ergebnis: tage_bis_zum_monat(monat) + tage

    Das war einfach. Wenn Du daraus ein Struktogramm machst, dann besteht das nur aus einem oder zwei Kaestchen und fertig. Und das Programm ist auch voellig korrekt, es fehlen halt nur noch ein paar Details.

    Schauen wir das naechste Problem an: Gegeben ist ein Monat, und wir wollen wissen, wie viele Tage bis dahin vergangen sind:

    So, das waehre auch geschafft. Ein Program, das die tage bis zu einem bestimmten Monat berechnet. Bastel daraus wieder ein Struktogramm. Das schaut ein wenig komplizierter aus als das Erste, ist aber immer noch recht einfach zu verstehen.


    Dein Professor ist jetzt aber vermutlich noch nicht gluecklich, denn wir haben bis jetzt einfach angenommen, das es ein Programm 'tage_des_monats' gibt, das als Input einen Monat bekommt und als Ergebnis die Anzahl der Tage ausgibt.

    Also lass uns dieses Programm einfach mal schreiben:

    Code
    Programm: tage_des_monats
    Input: monat
    
    
    wenn monat = 1 dann Ergebnis: 31
    wenn monat = 2 dann Ergebnis: ?
    wenn monat = 3 dann Ergebnis: 31
    wenn monat = 4 dann ....

    Moment: Was machen wir mit dem Februar? Da war ja noch die Sache mit dem Schaltjahr... Um das Schaltjahr zu berechnen, brauchen wir wohl das Jahr, in dem wir uns gerade befinden. Das Jahr hatten wir ja in unserem Programm 'berechne_tage_im_jahr' mal als Input bekommen. Aber bis jetzt haben wir es niemals gebraucht. Jetzt brauchen wir es aber doch, also aendern wir unsere bisherigen Programme von oben so, das jeweils auch das Jahr als input mitgegeben wird:


    Code
    Programm: berechne_tage_im_jahr
    Input: monat, tage, jahr
    
    
    Ergebnis: tage_bis_zum_monat(monat[B], jahr[/B]) + tage


    Jetzt koennen wir auch die Tage fuer den Monat Februar berechnen:

    Code
    Programm: tage_des_monats
    Input: monat, jahr
    
    
    wenn monat = 1 dann Ergebnis: 31
    wenn monat = 2 dann Ergebnis: tage_im_februar(jahr)
    wenn monat = 3 dann Ergebnis: 31
    ...


    Code
    Programm: tage_im_februar
    Input: jahr
     wenn ist_ein_schaltjahr(jahr) = WAHR dann 
     	  Ergebnis: 29
     sonst:
    	  Ergebnis: 28


    Juhu, fast geschafft! Jetzt fehlt nur noch ein einziges, letztes Programm:



    Natuerlich koenntest Du jetzt auch noch ein Programm 'zahl_teilbar_durch' schreiben, darin wieder ein Programm aufrufen, und so weiter und so fort. Tatsaechlich geht das fast beliebig weit. Aber fuer die Aufgabenstellung sollte das jetzt ersteinmal genug sein.


    Anstatt also ein einziges, kompliziertes Programm zu schreiben, haben wir 5 einfache Probleme geloest. Diese 5 einfachen Programme sind fuer sich viel besser zu verstehen, noch dazu koenntest Du ein Programm wie z.B. 'tage_des_monats' auch in einer anderen Aufgabenstellung wiederverwenden.

    Du kannst die 5 Programme entweder als 5 Struktogramme aufmahlen, und alle gemeinsam abgeben (das wuerde man in der Praxis so machen), oder, wenn Deine Aufgabe lautet, dass Du nur ein einziges Struktogramm abgeben darfst, dann kannst Du auch die einzelnen Programme zu einem einzigen zusammenfuegen. Dazu musst du nur die Programmaufrufe in den Struktogrammen durch die Struktogramme selbst ersetzen.

    Wie schon zu Beginn gesagt: Diese Art und Weise an ein Programm heranzugehen, nennt man Top-Down Strategie, weil man das Programm erst wie aus der Vogelperspektive betrachtet, und dann schrittweise naeher ins Detail hinabsteigt. Das Aufteilen des Problems in viele kleine, moeglichst unabhaengige Teile, nennt man modulares Programmieren, und der Ueberbegriff fuer all diese Konzepte ist Abstraktion.

  • ... zum vergleich, in java würde das so ausschaun:

    Code
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.YEAR, 2007);
    cal.set(Calendar.MONTH, 2);
    cal.set(Calendar.DAY_OF_MONTH, 3);
    int result = cal.get(Calendar.DAY_OF_YEAR);


    Weil wir ja jetzt mit Implementierungen um uns werfen (wieso eigentlich?): So schaut's in Ruby aus:

    Code
    Time.mktime(jahr, monat, tag).yday
  • ... zum vergleich, in java würde das so ausschaun:

    Code
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.YEAR, 2007);
    cal.set(Calendar.MONTH, 2);
    cal.set(Calendar.DAY_OF_MONTH, 3);
    int result = cal.get(Calendar.DAY_OF_YEAR);


    Nein.

    Dipper dipper dii dipper dii dipper dii duuu

  • christof R.
    [quote]
    Wieso? Du hast es eh richtig erklärt.
    [\quote]
    Wieso ist eine gute Frage. Ich verstehe nicht, wie ich das theoretische Wissen, was
    ja scheinbar stimmt umsetze, sprich das Struktogramm schreibe, bzw. den Code.
    *seufz* Wenn ich wüsste, wie ich es erklären kann... *nochmalseufz*
    Habs weiter unten mal probiert.


    Jensi und concealer
    Danke für den Code, aber den verstehe ich noch nicht. Dazu komme ich erst noch.
    Aber irgendwie entdecke ich da keine Schleife. *seufz*


    a9bejo
    Hey, das habe ich schonmal gehört "Top-down". :) (Immerhin etwas.)

    Super Erklärung, so verstehe ich das jedenfalls besser. Danke.

    Ahhhh, Dein erstes Beispiel kann ich gut nachvollziehen.
    Also erstmal nur das "einfachste" Darstellen. Was ist die Aufgabenstellung?
    Ein Datum eingeben und heraus kommen die Tage im Jahr.

    Aha, den nächsten Code verstehe ich auch einigermassen.
    Wie funktioniert hier "tage_des_monats(monat)"?
    Das ist doch jetzt erstmal nur so formuliert, richtig?

    Oje, da fehlt mir ja noch einges Wissen bzw. Vorstellungen so vorgehen zu können.

    Ein paar Dinge habe ich mittlerweile auch rausbekommen.

    Im Prinzip ähnlich.
    Erstmal Eingabe von Tag, Monat und Jahr.
    Dann erstmal 12 Variablen (monat(1)=31, monat(2)=28, usw.) mit den Tagen des Monats versehen.
    Nun überprüfung ob Schaltjahr.
    Wenn Schaltjahr wollte ich hintennach einfach +1 machen.

    Also die Schleife, die die Monate hochzählt und addiert. ----->Das hier ist mein Verständnisproblem gewesen.

    Hätte eine For-Schleife gemacht.

    Tageszahl = 0
    For i = 1 - (monat-1)
    Tageszahl = Tageszahl + monat(i)

    Tageszahl = Tageszahl + Tag

    oder bei Schaltjahr
    Tageszahl = Tageszahl + Tag + 1

    Und dann halt die Ausgabe = Tageszahl

    Jetzt muss ich nur noch verstehen, wie die Schleife richtig ist.
    Oder ist die soweit OK?

    Werde mich gleich nochmal dran setzen und das durchgehen.

    Danke für Eure Hilfe.

    Gruß
    Matt_informatic

  • die beispiele haben standardfunktionen von c++ bzw. java verwendet, die das, was du selbst programmieren willst, schon können. hilft dir in dem fall nix weil dus ja selbst implementieren willst, aber es schadet auch nix :) hab schon oft genug selber unnötige sachen geschrieben die eh irgendwelche standard libaries viel besser können...

    Es genügt nicht, keine Meinung zu haben. Man muss auch unfähig sein, sie auszudrücken. Karl Kraus

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!