Zum Inhalt springen

Datum je nach Monat automatisch weitersetzen (war: Ich brauch mal wieder Hilfe!)


Empfohlene Beiträge

Geschrieben

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 ;)

Geschrieben

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. :)

Geschrieben

@Klotzkopp: tut mir Leid..... :rolleyes:

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....

Geschrieben

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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...