c++ Kalender



  • Hallo,
    Ich wollte ein Programm schreiben der mir Kalender ausgibt.
    Unzwar von 1901 bis 2099 in form wie unten:
    Dezember
    MO DI MI DO FR SA SO
    --------------------
    1 2 3 4 5 6
    7 8 9 10 11 12 13

    und so weiter.

    Hab ein beispiel für Wochentage schon
    #include <iostream>
    #include <iomanip>
    #include <cstdio>
    #include <cstdlib>
    #include <cmath>

    using namespace std;

    // Programm zur Demonstration der
    // switch-Anweisung (Mehrfachverzweigung)
    int main ()
    {
    int tag;

    cout << "Nr. des Tages [1..7]: ";
    cin >> tag;

    switch (tag)
    {
    case 1: cout << "Montag";
    break;
    case 2: cout << "Dienstag";
    break;
    case 3: cout << "Mittwoch";
    break;
    case 4: cout << "Donnerstag";
    break;
    case 5: cout << "Freitag";
    break;
    case 6: cout << "Samstag";
    break;
    case 7: cout << "Sonntag";
    break;
    default: cout << "Fehler! Nur 1 ... 7 erlaubt.";
    }

    getchar ();
    getchar ();
    return 0;
    }

    Kann mir jemand weiterhelfen wie ich das auf ein kalender umsetze?
    MFG


  • Mod

    c++dummy schrieb:

    Kann mir jemand weiterhelfen wie ich das auf ein kalender umsetze?

    Überhaupt nicht? Das Beispiel hat doch überhaupt nichts mit der Funktionalität eines Kalenders zu tun, außer dass die Namen der Wochentage drin vorkommen. Eine Kalenderanzeige musst du von Grund auf anders planen. Mein Tipp: Osterformel. Damit kann man ausrechnen welcher Wochentag zu einem Datum gehört.

    Für mehr Ratschläge musst du eine konkretere Frage stellen.

    edit: Hmm, ich hab das in der Schule als Gaußsche Osterformel kennengelernt, aber anscheinend nennt man das doch anders: Gaußsche Wochentagsformel



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Rund um die Programmierung in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • du kannst bequem die ctime bibliothek benutzen, ohne dir nen wolf zu rechnen.

    mfg.



  • was genau ist das ?





  • kann das hier einer vll umsetzen?
    jahr ( zwichen 1901 und 2099)
    variable start ( 0 = montag 1 = dienstag ...)
    Nach Ausgabe des kopfes (name der wochentage) geben sie in einer schleife die richtige anzahl der leerzeichen aus ( start * 4 stück)
    anschliessend in einer schleife die nummer der tage ( variable tag, 1bis31)
    cout << setw(4) << tag;
    jahreszahl einlesen mit variable jahr, start= (jahr+(jahr-1)/4+5)%7
    .....

    #include <iostream>
    #include <math.h>
    #include <iomanip>
    
    using namespace std;
    char janein;
    int wiederholung;
    
    float jahr,monat,januar,start;
    
    int main()
    { 
    
    	do
    	{
    
    		cout << "Geben Sie bitte das Jahr ein : "
    		cin >> jahr;
    
    		if (jahr <=1901 && jahr >= 2099)				// EVA Schleife
    		{
    			start = (jahr+(jahr -1)/4+5)%7 				
    		}
    		else
    		{
    			cout << " Bitte zwichen 1901 und 2099 eingeben. THX." << endl;
    		}
    
    		do
    		{									// Abfrageschleife die nur j, n akzeptiert
    			cout << " Programm wiederholen? (j/n)   \n" ;
    			cin >> janein;
    		}	
    		while (( janein != 'j') && (janein != 'n'));
    
    	}
    	while (janein =='j');
    
    }
    

    weiss net wie ich das machen soll



  • c++dummy schrieb:

    if (jahr <=1901 && jahr >= 2099)
    

    Nenn mir einen Wert für jahr , welcher diese Bedingung erfüllt.

    c++dummy schrieb:

    weiss net wie ich das machen soll

    Hirn einschalten, Arschbacken zusammenkneifen und durch ...

    Wenn Du konkrete C++-relevante Frage hast, die man beantworten kann, ohne Deine Hausaufgabe gleich mitzuerledigen, schieß los ...



  • #include <iostream>
    #include <math.h>
    #include <iomanip>
    
    using namespace std;
    char janein;
    int wiederholung;
    
    int main()
    { 
    
    	do
    	{
    
    		int jahr,monat,januar,start,anzahl,tag;
    
    		cout << "Geben Sie bitte das Jahr ein : ";
    		cin >> jahr;
    
    		if (jahr >=1901 && jahr <= 2099)				// EVA Schleife
    		{
    			start = (jahr+(jahr -1)/4+5)%7 		;
    
    		}
    		else
    		{
    			cout << " Bitte zwischen 1901 und 2099 eingeben " << endl;
    		}
    
    		cout << " monat ";
    		cin >> monat;
    		switch(monat)
    		{	
    		case 1: cout << "Januar"; jahr ; anzahl = 31;
    			break;
    		case 2: cout << "Februar" ; << jahr ;
    			break;
    		case 3: cout << "Maerz" ; << jahr ; anzahl = 31;
    			break;
    		case 4: cout << "April"; << jahr ; anzahl = 30;
    			break;
    		case 5: cout << "Mai"; << jahr ; anzahl = 31;
    			break;
    		case 6: cout << "Juni"; << jahr ; anzahl = 30;
    			break;
    		case 7: cout << "July"; << jahr ; anzahl = 31;
    			break;
    		case 8: cout << "August"; << jahr ; anzahl = 31;
    			break;
    		case 9: cout << "September"; << jahr ; anzahl = 30;
    			break;
    		case 10: cout << "Oktober"; << jahr ; anzahl = 31;
    			break;
    		case 11: cout << "November"; << jahr ; anzahl = 30;
    			break;
    		case 12: cout << "Dezember"; << jahr ; anzahl = 31;
    			break;
    		}
    
    		do
    		{									// Abfrageschleife die nur j, n akzeptiert
    			cout << " Programm wiederholen? (j/n)   \n" ;
    			cin >> janein;
    		}	
    		while (( janein != 'j') && (janein != 'n'));
    
    	}
    	while (janein =='j');
    
    }
    

    case 1: cout << "Januar"; jahr ; anzahl = 31;
    break;
    case 2: cout << "Februar" ; << jahr ;
    break;
    case 3: cout << "Maerz" ; << jahr ; anzahl = 31;

    wie mache ich das richtig? mit mehrfach anweisung



  • #include <iostream>
    #include <math.h>
    #include <iomanip>
    
    using namespace std;
    char janein;
    int wiederholung;
    
    int main()
    { 
    
    	do
    	{
    
    		int jahr,monat,januar,start,anzahl,tag,y;
    
    		cout << "Geben Sie bitte das Jahr ein : ";
    		cin >> jahr;
    
    		if (jahr >=1901 && jahr <= 2099)				// EVA Schleife
    		{
    			start = (jahr+(jahr -1)/4+5)%7;
    
    		}
    		else
    		{
    			cout << " Bitte zwischen 1901 und 2099 eingeben " << endl;
    		}
    
    		cout << " monat ";
    		cin >> monat;
    		switch(monat)
    		{	
    		case 1: cout << "Januar" << endl; 
    			anzahl = 31;
    			break;
    		case 2: cout << "Februar" << endl; 
    			if(jahr%4 == 0)
    			{
    				anzahl = 29;
    			}
    			else
    			{
    				anzahl = 28;
    			}
    			break;
    		case 3: cout << "Maerz" << endl; 
    			anzahl = 31;
    			break;
    		case 4: cout << "April"<< endl;  
    			anzahl = 30;
    			break;
    		case 5: cout << "Mai"<< endl; 
    			anzahl = 31;
    			break;
    		case 6: cout << "Juni"<< endl;  
    			anzahl = 30;
    			break;
    		case 7: cout << "July"<< endl; 
    			anzahl = 31;
    			break;
    		case 8: cout << "August"<< endl; 
    			anzahl = 31;
    			break;
    		case 9: cout << "September"<< endl;  
    			anzahl = 30;
    			break;
    		case 10: cout << "Oktober"<< endl;  
    			anzahl = 31;
    			break;
    		case 11: cout << "November"<< endl;  
    			anzahl = 30;
    			break;
    		case 12: cout << "Dezember"<< endl;  
    			anzahl = 31 ;
    			break;
    		}
    
    		tag = 0;
    		cout << "Mo  Di  Mi  Do  Fr  Sa  So" << endl;
    		cout << "---------------------------" << endl;
    
    		while(anzahl != 0)
    		{
    			tag = tag +1;
    			anzahl = anzahl -1;
    
    			if(tag == 0)
    			{
    				y = ( start * 4 ) + 1;
    				cout << setw(4) << tag << endl;
    			}
    			else
    			{
    				cout << setw(4) << tag << endl;
    			}
    
    			start = (start + anzahl) % 7;
    
    		}
    
    		do
    		{									// Abfrageschleife die nur j, n akzeptiert
    			cout << " Programm wiederholen? (j/n)   \n" ;
    			cin >> janein;
    		}	
    		while (( janein != 'j') && (janein != 'n'));
    
    	}
    	while (janein =='j');
    
    }
    

    hab es soweit hinbekommen dass er mir die tage untereinander ausgibt und würde komplette jahr haben ohne monat abfrage kann mir einer weiter helfen?
    THXX 👍


  • Mod

    c++dummy schrieb:

    hab es soweit hinbekommen dass er mir die tage untereinander ausgibt und würde komplette jahr haben ohne monat abfrage kann mir einer weiter helfen?
    THXX 👍

    So?

    #include <iostream>
    #include <math.h>
    #include <iomanip>
    
    using namespace std;
    char janein;
    int wiederholung;
    
    int main()
    {
    
        do
        {
    
            int jahr,monat,januar,start,anzahl,tag,y;
    
            cout << "Geben Sie bitte das Jahr ein : ";
            cin >> jahr;
    
            if (jahr >=1901 && jahr <= 2099)                // EVA Schleife
            {
                start = (jahr+(jahr -1)/4+5)%7;
    
            }
            else
            {
                cout << " Bitte zwischen 1901 und 2099 eingeben " << endl;
            }
    
    	for (monat=1; monat<=12; ++monat){
    	  switch(monat)
    	    {   
    	    case 1: cout << "Januar" << endl;
    	      anzahl = 31;
    	      break;
    	    case 2: cout << "Februar" << endl;
    	      if(jahr%4 == 0)
    		{
    		  anzahl = 29;
    		}
    	      else
    		{
    		  anzahl = 28;
    		}
    	      break;
    	    case 3: cout << "Maerz" << endl;
    	      anzahl = 31;
    	      break;
    	    case 4: cout << "April"<< endl;  
    	      anzahl = 30;
    	      break;
    	    case 5: cout << "Mai"<< endl;
    	      anzahl = 31;
    	      break;
    	    case 6: cout << "Juni"<< endl;  
    	      anzahl = 30;
    	      break;
    	    case 7: cout << "July"<< endl;
    	      anzahl = 31;
    	      break;
    	    case 8: cout << "August"<< endl;
    	      anzahl = 31;
    	      break;
    	    case 9: cout << "September"<< endl;  
    	      anzahl = 30;
    	      break;
    	    case 10: cout << "Oktober"<< endl;  
    	      anzahl = 31;
    	      break;
    	    case 11: cout << "November"<< endl;  
    	      anzahl = 30;
    	      break;
    	    case 12: cout << "Dezember"<< endl;  
                anzahl = 31 ;
                break;
    	    }
    
    	  tag = 0;
    	  cout << "Mo  Di  Mi  Do  Fr  Sa  So" << endl;
    	  cout << "---------------------------" << endl;
    
            while(anzahl != 0)
    	  {
                tag = tag +1;
                anzahl = anzahl -1;
    
                if(tag == 0)
    	      {
                    y = ( start * 4 ) + 1;
                    cout << setw(4) << tag << endl;
                }
                else
    	      {
                    cout << setw(4) << tag << endl;
    	      }
    
                start = (start + anzahl) % 7;
    
    	  }
    
    	}
    
            do
            {                                    // Abfrageschleife die nur j, n akzeptiert
    	  cout << " Programm wiederholen? (j/n)   \n" ;
    	  cin >> janein;
            }   
            while (( janein != 'j') && (janein != 'n'));
    
        }
        while (janein =='j');
    
    }
    

    Irgendwie weiß ich aber nicht, wo du mit dem Programm hin willst. Außer der (falschen) Erkennung von Schaltjahren hat das Programm keinerlei Funktion.

    Noch ein paar eher technische Programmiertipps:
    - Der Header mit den Mathefunktionen heißt in C++ <cmath>. <math.h> ist aus Kompatibilitätsgründen noch vorhanden, aber "depracted". Im übrigen sehe ich keinerlei Funktion daraus, die von dir benutzt wird.
    - Globale Variablen sollte man eher vermeiden. In deinem Fall wirken globale Variablen besonders bizarr, da du nur eine einzige Funktion hast.
    - Variablen darf und sollte man dort deklarieren, wo sie das erste mal gebraucht werden. Das ist übersichtlicher und du würdest zum Beispiel viel leichter sehen, dass "januar" überhaupt nicht benutzt wird.
    - übrigens ist entgegen anderslautender Gerüchte nicht jedes vierte Jahr ein Schaltjahr
    - Man muss eine Zeile die mit "cout" anfängt nicht unbedingt mit "endl" beenden, welches einen Zeilenumbruch verursacht. Ich vermute doch mal, dass du eher sowas wie

    Januar
    Mo  Di  Mi  Do  Fr  Sa  So
    ---------------------------
     1   2   3   4   5   6   7  
     8   9  10  11  12  13  14  
    15  16  17  18  19  20  21  
    22  23  24  25  26  27  28  
    29  30  31
    

    haben willst und nicht, wie es jetzt ist:

    Januar
    Mo  Di  Mi  Do  Fr  Sa  So
    ---------------------------
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
    

    Wenn du dir dann noch überlegst, wie du am richtigen Wochentag startest und am Sonntag eine neue Zeile anfängst, hast du ein sinnvolles Programm geschaffen.
    - Wenn deine Variablennamen sprechender wären, könnte ich dir sogar wahrscheinlich bei der oben beschriebenen Funktionalität helfen. Aber ich habe keinerlei Ahnung, was 'start' und 'y' sein sollen. Sie speilen bei dir anscheinend eine sehr wichtige Rolle, machen dabei aber nicht das was du anscheinend willst. Aber ich habe keine Ahnung, was sie überhaupt machen sollen.



  • also sry 😃 erstmal

    start ist dafür da dass ich den 1. wochtentag ausrechne 0= montag 1 = dienstag und mit y habe ich versucht die zeilen vorzurücken..

    #include <iostream> 
    #include <math.h> 
    #include <iomanip> 
    
    using namespace std; 
    char janein; 
    int wiederholung; 
    
    int main() 
    { 
    
    	int jahr,monat,januar,start,anzahl,tag,z,y,x; 
    
    	do 
    	{ 
    
    		cout << "Geben Sie bitte das Jahr ein : "; 
    		cin >> jahr; 
    
    			monat=0;
    
    		while(monat < 12)
    		{
    
    			if (monat==0)                // EVA Schleife 
    			{ 
    				start = (jahr+(jahr -1)/4+5)%7; 
    				switch(start)
    				{
    				case 0: start = 0; break;
    				case 1: start = 1; break;
    				case 2: start = 2; break;
    				case 3: start = 3; break;
    				case 4: start = 4; break;
    				case 5: start = 5; break;
    				case 6: start = 6; break;
    				}
    
    			} 
    			else 
    			{ 
    				if(monat>0)
    				{
    					x=monat;
    					while(x>0)
    					{
    						start = start + z;
    						start = start % 7;
    						x = x-1;
    					}
    				}
    			} 
    
    				monat++;
    
    			switch(monat) 
    			{    
    			case 1: cout << "Januar " << jahr << " " << endl; 
    				anzahl = 31; 
    				cout << " " << endl;;
    				break; 
    			case 2: cout << "Februar " << jahr << " " << endl; 
    				if(jahr%4 == 0) 
    				{ 
    					anzahl = 29; 
    					cout << " " << endl;
    				} 
    				else 
    				{ 
    					anzahl = 28; 
    					cout << " " << endl;
    				} 
    				break; 
    			case 3: cout << "Maerz " << jahr << " " << endl; 
    				anzahl = 31;
    				cout << " " << endl;
    				break; 
    			case 4: cout << "April " << jahr << " " << endl;  
    				anzahl = 30; 
    				cout << " " << endl;
    				break; 
    			case 5: cout << "Mai " << jahr << " " << endl; 
    				anzahl = 31; 
    				cout << " " << endl;
    				break; 
    			case 6: cout << "Juni " << jahr << " " << endl;    
    				anzahl = 30; 
    				cout << " " << endl;
    				break; 
    			case 7: cout << "July " << jahr << " " << endl; 
    				anzahl = 31; 
    				cout << " " << endl;
    				break; 
    			case 8: cout << "August " << jahr << " " << endl; 
    				anzahl = 31; 
    				cout << " " << endl;
    				break; 
    			case 9: cout << "September " << jahr << " " << endl; ;  
    				anzahl = 30; 
    				cout << " " << endl;
    				break; 
    			case 10: cout << "Oktober " << jahr << " " << endl;   
    				anzahl = 31; 
    				cout << " " << endl;
    				break; 
    			case 11: cout << "November " << jahr << " " << endl;  
    				anzahl = 30; 
    				cout << " " << endl;
    				break; 
    			case 12: cout << "Dezember " << jahr << " " << endl;   
    				anzahl = 31 ; 
    				cout << " " << endl;
    				break; 
    			} 
    
    			tag = 0;
    			z=anzahl;
    
    			cout << "  Mo  Di  Mi  Do  Fr  Sa  So" << endl; 
    			cout << "  --------------------------" << endl; 
    
    			int zaehler = 0; //nochn zähler
    			while(anzahl != 0) 
    			{ 
    				tag++; 
    				anzahl = anzahl -1; 
    				zaehler++;
    
    				if(tag == 1) 
    				{ 
    					y = ( start * 5 )+1;
    
    						cout << setw(y) << tag;
    
    				} 
    				else 
    				{ 
    
    						cout << setw(4) << tag;
    
    				} 
    
    				if (start == ((start + anzahl) % 7))
    				{
    					cout << endl;
    				}
    
    			} 
    
    		}
    
    		do 
    		{                                    // Abfrageschleife die nur j, n akzeptiert 
    			cout << " Programm wiederholen? (j/n)   \n" ; 
    			cin >> janein; 
    		}    
    		while (( janein != 'j') && (janein != 'n')); 
    
    	} 
    	while (janein =='j'); 
    
    }
    


  • Crossposting wird hier nicht so gern gesehn ( http://www.c-plusplus.net/forum/viewtopic-var-t-is-255037.html )


Anmelden zum Antworten