The Nightfly Geschrieben 27. Januar 2005 Geschrieben 27. Januar 2005 Wenn man ein Kalender programmiert, wo dass Datum je nach Monat automatisch weiter springt (also z.B im Januar ist der Mo. ein 3. und im Februar ist der Mo ein 7.), welche Schleife benutzt man dann am klügsten?? do- while oder for ?? Was würdet ihr sagen? Danke schonmal im vorraus für eure Hilfe Zitieren
Klotzkopp Geschrieben 27. Januar 2005 Geschrieben 27. Januar 2005 Zwei Dinge: 1. "Ich brauch mal wieder Hilfe!" ist so ziemlich der schlechteste Betreff, den du hättest wählen können. Jeder, der hier einen Thread erstellt, sucht Hilfe. Das "du" es "mal wieder" bist, ist auch jedem klar. Dein Threadtitel liefert also Null Information, was das eigentliche Problem angeht. Ein potentieller Helfer, der in der Übersicht nur den Threadtitel sieht, könnte gar nicht erkennen, dass du ein Problem hast, das er leicht lösen könnte. 2. Die Problembeschreibung ist schwer verständlich. Ich sehe bei der geschilderten Situation überhaupt keine Einsatzmöglichkeit für eine Schleife. Um 1 kümmere ich mich diesmal noch (soweit ich das Problem verstanden habe), bei 2 legst du jetzt bitte nach. Zitieren
U-- °LoneWolf° Geschrieben 27. Januar 2005 Geschrieben 27. Januar 2005 also du willst eine wochen tags berechung machen oder ? Zitieren
The Nightfly Geschrieben 27. Januar 2005 Autor Geschrieben 27. Januar 2005 @Klotzkopp: tut mir Leid..... Ich stehe der Aufgabe im Moment sehr ratlos gegenüber, versuche aber mein Problem ganauer zu erläutern. Ja es ist eine Wochentagsberechnung und soll in der Ansichtsform eines Kalenderblattes ausgegeben werden.... Zitieren
Manfred.Becker Geschrieben 27. Januar 2005 Geschrieben 27. Januar 2005 Hi, ich hab mal vor Jahren einen Kalender in c programmiert. Vielleicht hilft dir der Quellcode weiter: /*******************************************************\ ** Programm: KALENDER.CPP ** Version : 1.00 ** Funktion: Ausgabe eines Kalenders (incl. Kalenderwochen) ** Sprache : Borland Turbo C++ ** Datum : 25.02.1996 ** Autor : Manfred Becker (Mani.Becker@web.de) \*******************************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <dos.h> // // Konstannten... // #define GOOD 0 #define BAD -1 #define MONTAG 0 #define DIENSTAG 1 #define MITTWOCH 2 #define DONNERSTAG 3 #define FREITAG 4 #define SAMSTAG 5 #define SONNTAG 6 #define DY 0 // // Funktions-Prototypen... // int wochentag(const char *datum); int kalenderwoche(const char *datum, int &wjahr); int schalttag(const int jahr); int anzahl_tage_des_monats(const int monat, const int jahr); int anzahl_tage_des_jahres(const int jahr); int anzahl_wochen_des_jahres(const int jahr); // // Globale Variable... // char kalender[59][80]; //-------------------------------------------------------------- int main(int argc, char *argv[]) // Ausgabe eines Kalenders Als Uebergabeparameter kann eine // Jahreszahl zwischen 1582 und 9999 angegeben werden. Ansonsten // wird das aktuelle Jahr ausgegeben. //-------------------------------------------------------------- { int year = -1; if (argc>1) { // Auswertung der Uebergabeparameter... year = atoi(argv[1]); if (year<1582 || year>9999) { fprintf(stderr,"Fehler: Falsche Jahreszahl! Moegliche Jahreszahlen sind 1582 bis 9999."); exit (BAD); } } if (year<0) { // Ermittlung der aktuellen Jahreszahl... struct date d; getdate(&d); year = d.da_year; } int i,j,x,y,z; int kwoche,endwoche,m; int wt,wzy,wzx,tzy,tzx; int wof,tyo,txo,tag,endtag; int dummy; char jahr[5]; char datum[11]; char ww[3]; char tt[3]; // // Entwurf des Kalenders... // for (i=0; i<59; i++) { sprintf(kalender[i]," "); } sprintf(datum,"01.01.%4d",year); endwoche = anzahl_wochen_des_jahres(atoi(jahr)); for (m=1; m<13; m++) { // Alle Monate durchlaufen... sprintf(datum,"01.%2d.%4d",m,year); // Monatsanfang kwoche = kalenderwoche(datum, dummy); // 1. Kalenderwoche sprintf(ww,"%2d",kwoche); // im String ablegen wt = wochentag(datum); // 1. Wochentag wzy = (m-1) / 3 * 12 + DY+3; // Zeile der Woche wzx = ((m-1) % 3) * 23 + 7; // Spalte der Woche wof = 0; // Spalten-Offset tzy = (int)(m-1) / 3 * 12 + DY+5; // Zeile des Tages tzx = ((m-1) % 3) * 23 + 7; // Spalte des Tages tyo = wt; // Zeilen-Offset txo = 0; // Spalten-Offset tag = 1; // 1. Tag sprintf(tt,"%2d",tag); // im String ablegen endtag = anzahl_tage_des_monats(m,year);// letzter Tag do { // Alle Tage durchlaufen... kalender[wzy][wzx+wof+0] = ww[0]; // Kalenderwoche kalender[wzy][wzx+wof+1] = ww[1]; // einfuegen do { // Bis Sonntag durchlaufen... kalender[tzy+tyo][tzx+txo+0] = tt[0];// Tag kalender[tzy+tyo][tzx+txo+1] = tt[1];// einfuegen tag++; sprintf(tt,"%2d",tag); tyo++; if (tyo==7) { // weiter mit naechster Woche... tyo=0; txo+=4; wof+=4; kwoche++; sprintf(ww,"%2d",kwoche); } } while ((tyo!=0) && (tag<=endtag)); if ((m==1 || m==12) && (kwoche>endwoche)) { // Korrektur der ersten bzw. letzten Kalenderwoche... kwoche = 1; sprintf(ww,"%2d",kwoche); } } while (tag<=endtag); } // // Ausgabe des Kalenders... // for (i=0; i<59; i++) printf(" %s\n",kalender[i]); // // Das wars schon... // return GOOD; } // End of main() //------------------------------------------------------------- int wochentag(const char *datum) // Berechnet zu jedem Datum des Gregor. Kalenders den Wochentag // nach dem Verfahren des Geistlichen Zeller. // // Hinweis: Der Gregor. Kalender wurde 1582 von Papst // Gregor XIII eingefuehrt! // // 0=Montag, 1=Dienstag usw., //-------------------------------------------------------------- { int tag, monat, jahr, jr, jhdt, wt; char dat[11]; sprintf(dat,"%10s",datum); jahr = atoi(&dat[6]);dat[5] = '\0'; monat = atoi(&dat[3]);dat[2] = '\0'; tag = atoi(&dat[0]); if (monat>2) monat -= 2; else { monat += 10; jahr--; } jr = jahr % 100; jhdt = (int)(jahr/100); wt = ((13*monat-1)/5+jr/4+jhdt/4+jr+tag-2*jhdt)%7-1; if (wt<0) wt += 7; return wt; } // End of wochentag() //-------------------------------------------------------------- int kalenderwoche(const char *datum, int &kwjahr) // Berechnet zu jedem Datum des Gregor. Kalenders die Kalender- // woche. In der Variablen kwjahr wird das zugehoerige Kalender- // jahr geliefert. //-------------------------------------------------------------- { int tag, monat, jahr; int wt, startwoche, endwoche, tage, i; int anzahl_wochen, kwoche; char dat[11]; sprintf(dat,"%10s",datum); jahr = atoi(&dat[6]);dat[5] = '\0'; monat = atoi(&dat[3]);dat[2] = '\0'; tag = atoi(&dat[0]); sprintf(dat,"01.01.%4s",&datum[6]); wt = wochentag(dat); startwoche = 1; if (wt==SONNTAG || (wt==SAMSTAG && !schalttag(jahr-1))) startwoche = 52; if (wt==FREITAG || (wt==SAMSTAG && schalttag(jahr-1))) startwoche = 53; endwoche=anzahl_wochen_des_jahres(jahr); tage = 0; for (i=1; i<monat; i++) { tage += anzahl_tage_des_monats(i,jahr); } tage += tag; anzahl_wochen = (int)((tage+wt-1)/7); kwoche = startwoche+anzahl_wochen; kwjahr = jahr; // Korrekturen... if (kwoche>endwoche && anzahl_wochen==endwoche) { kwoche -= endwoche; if (kwoche==1) kwjahr = jahr+1; } if (kwoche>endwoche && anzahl_wochen>0) { kwoche = anzahl_wochen; kwjahr = jahr; } if (kwoche>=endwoche && anzahl_wochen==0) { kwjahr = jahr-1; } return kwoche; } // End of kalenderwoche() //-------------------------------------------------------------- int schalttag(const int jahr) // Berechnet zu jedem Jahr des Gregor. Kalenders den Schalttag //-------------------------------------------------------------- { int sTag = 0; if ( !(jahr % 4) && ((jahr % 100) || !(jahr % 400)) ) sTag = 1; return (sTag); } // End of schalttag() //-------------------------------------------------------------- int anzahl_tage_des_monats(const int monat, const int jahr) // Berechnet zu jedem Monat eines Jahres die Anzahl der Tage //-------------------------------------------------------------- { int anzahl_tage = 0; switch(monat) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: anzahl_tage = 31; break; case 4: case 6: case 9: case 11: anzahl_tage = 30; break; case 2: anzahl_tage = 28 + schalttag(jahr); break; } return (anzahl_tage); } // End of anzahl_tage_des_monats() //-------------------------------------------------------------- int anzahl_tage_des_jahres(const int jahr) // Berechnet zu jedem Jahr die Anzahl der Tage //-------------------------------------------------------------- { return (365+schalttag(jahr)); } // End of anzahl_tage_des_jahres() //-------------------------------------------------------------- int anzahl_wochen_des_jahres(const int jahr) // Berechnet zu jedem Jahr die Anzahl der Wochen //-------------------------------------------------------------- { int anzahl_wochen, wt; char datum[11]; sprintf(datum,"01.01.%4d",jahr); anzahl_wochen = 52; wt = wochentag(datum); if ((wt==DONNERSTAG) || ((wt==MITTWOCH) && (schalttag(jahr)))) anzahl_wochen++; return anzahl_wochen; } // End of anzahl_wochen_des_jahres() Leider musste ich die Routine für das Zeichnen des Rahmens rauslöschen, damit ich den Quellcode posten konnte. Zitieren
The Nightfly Geschrieben 27. Januar 2005 Autor Geschrieben 27. Januar 2005 Ja Danke! Das hilft mir sehr weiter, immerhin weiß ich jetzt, wie ich dass Programm aufbauen muss und habe einen Anhaltspunkt, was alles rein muss Vielen Dank und liebe Grüße Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.