auszugebenden text an funktion übergeben?!



  • Hallo zusammen

    folgendes Problem; ich bin gerade dabei ein Kalenderdatei zu schreiben. Nun hab ich folgende Funktion, die mir einfach zu allen Tagen im Jahr den dazugehörigen Wochentag ausrechnet.

    void day_of_year (int year, int number)
    {
    	int decade, century, var0, var1, var2, weekday, w;
    	int number_of_days = number;
    
    	for (int m = 1; m < 13; m++)
    	{				
    		switch (m){
    		case 1: //Januar
    			{
    				int monat = 11;
    				printf("\n\t.%dJanuar\t.%d\n", monat);
    				int year_n=year-1;
    				int decade_n=year_n%100;
    				int century_n=year_n/100;
    
    				for (int day = 1; day < 32; day++) {
    					var0 = ((2.6 * monat) - 0.2);
    					var1 = (decade_n / 4);
    					var2 = (century_n / 4);
    					w = (day + var0 + decade_n + var1 + var2 - (2 * century_n));
    					if (w < 0) weekday = (w % 7) + 7;
    					else weekday = w % 7;
    					//return weekday;
    					switch (weekday)
    					{
    					case 0: printf("<%d>\tSonntag\t\t.%d\n", day, weekday); break;
    					case 1: printf("<%d>\tMontag\t\t.%d\n", day, weekday); break;
    					case 2: printf("<%d>\tDienstag\t.%d\n", day, weekday); break;
    					case 3: printf("<%d>\tMittwoch\t.%d\n", day, weekday); break;
    					case 4: printf("<%d>\tDonnerstag\t.%d\n", day, weekday); break;
    					case 5: printf("<%d>\tFreitag\t\t.%d\n", day, weekday); break;
    					case 6: printf("<%d>\tSamstag\t\t.%d\n", day, weekday); break;
    						//default: printf("Dieser Tag muss noch erfunden werden!\n"); break;
    					}
    				}
    				break;
    			}
    
    		case 2: //Februar
    			{
    				int monat = 12;
    				printf("\n\t.%dFebruar\t.%d\n", monat);
    				int year_n=year-1;
    				int w;
    				int decade_n=year_n%100;
    				int century_n=year_n/100;
    
    				if (number_of_days == 366){
    					for (int day = 1; day < 30; day++) {
    						var0 = ((2.6 * monat) - 0.2);
    						var1 = (decade_n / 4);
    						var2 = (century_n / 4);
    						w = (day + var0 + decade_n + var1 + var2 - (2 * century_n));
    						printf("\ty4 = %d \n", w);
    						if (w < 0) weekday = (w % 7) + 7;
    						else weekday = w % 7;
    						//return weekday;
    						switch (weekday) 
    						{
    						case 0: printf("<%d>\tSonntag\t\t.%d\n", day, weekday); break;
    						case 1: printf("<%d>\tMontag\t\t.%d\n", day, weekday); break;
    						case 2: printf("<%d>\tDienstag\t.%d\n", day, weekday); break;
    						case 3: printf("<%d>\tMittwoch\t.%d\n", day, weekday); break;
    						case 4: printf("<%d>\tDonnerstag\t.%d\n", day, weekday); break;
    						case 5: printf("<%d>\tFreitag\t\t.%d\n", day, weekday); break;
    						case 6: printf("<%d>\tSamstag\t\t.%d\n", day, weekday); break;
    							//default: printf("Dieser Tag muss noch erfunden werden!\n"); break;
    						}
    					}
    				}
    				else {
    					for (int day = 1; day < 29; day++) {
    						var0 = ((2.6 * monat) - 0.2);
    						var1 = (decade_n / 4);
    						var2 = (century_n / 4);
    						w = (day + var0 + decade_n + var1 + var2 - (2 * century_n));
    						if (w < 0) weekday = (w % 7) + 7;
    						else weekday = w % 7;
    						//return weekday;
    						switch (weekday)
    						{
    						case 0: printf("<%d>\tSonntag\t\t.%d\n", day, weekday); break;
    						case 1: printf("<%d>\tMontag\t\t.%d\n", day, weekday); break;
    						case 2: printf("<%d>\tDienstag\t.%d\n", day, weekday); break;
    						case 3: printf("<%d>\tMittwoch\t.%d\n", day, weekday); break;
    						case 4: printf("<%d>\tDonnerstag\t.%d\n", day, weekday); break;
    						case 5: printf("<%d>\tFreitag\t\t.%d\n", day, weekday); break;
    						case 6: printf("<%d>\tSamstag\t\t.%d\n", day, weekday); break;
    							//default: printf("Dieser Tag muss noch erfunden werden!\n"); break;
    						}
    					}
    					break;
    				}
    			}
    		case 3: //Maerz
    			{
    				int monat = 1;
    				printf("\nMaerz\t.%d\n", monat);
    				for (int day = 1; day < 32; day++) {
    					weekday = day_of_week(day, monat, year);
    					//return weekday;
    					switch (weekday)
    					{
    					case 0: printf("<%d>\tSonntag\t\t.%d\n", day, weekday); break;
    					case 1: printf("<%d>\tMontag\t\t.%d\n", day, weekday); break;
    					case 2: printf("<%d>\tDienstag\t.%d\n", day, weekday); break;
    					case 3: printf("<%d>\tMittwoch\t.%d\n", day, weekday); break;
    					case 4: printf("<%d>\tDonnerstag\t.%d\n", day, weekday); break;
    					case 5: printf("<%d>\tFreitag\t\t.%d\n", day, weekday); break;
    					case 6: printf("<%d>\tSamstag\t\t.%d\n", day, weekday); break;
    						//default: printf("Dieser Tag muss noch erfunden werden!\n"); break;
    					}
    				}
    				break;
    			}
    
    		case 4: //April
    			{
    				int monat = 2;
    				printf("\nApril\t.%d\n", monat);
    				for (int day = 1; day < 31; day++) {
    					weekday = day_of_week(day, monat, year);
    					//return weekday;
    					switch (weekday)
    					{
    					case 0: printf("<%d>\tSonntag\t\t.%d\n", day, weekday); break;
    					case 1: printf("<%d>\tMontag\t\t.%d\n", day, weekday); break;
    					case 2: printf("<%d>\tDienstag\t.%d\n", day, weekday); break;
    					case 3: printf("<%d>\tMittwoch\t.%d\n", day, weekday); break;
    					case 4: printf("<%d>\tDonnerstag\t.%d\n", day, weekday); break;
    					case 5: printf("<%d>\tFreitag\t\t.%d\n", day, weekday); break;
    					case 6: printf("<%d>\tSamstag\t\t.%d\n", day, weekday); break;
    						//default: printf("Dieser Tag muss noch erfunden werden!\n"); break;
    					}
    				}
    				break;
    			}
    
    		case 5: // Mai
    			{
    				int monat = 3;
    				printf("\nMai\t.%d\n", monat);
    				for (int day = 1; day < 32; day++) {
    					weekday = day_of_week(day, monat, year);
    					//return weekday;
    					switch (weekday)
    					{
    					case 0: printf("<%d>\tSonntag\t\t.%d\n", day, weekday); break;
    					case 1: printf("<%d>\tMontag\t\t.%d\n", day, weekday); break;
    					case 2: printf("<%d>\tDienstag\t.%d\n", day, weekday); break;
    					case 3: printf("<%d>\tMittwoch\t.%d\n", day, weekday); break;
    					case 4: printf("<%d>\tDonnerstag\t.%d\n", day, weekday); break;
    					case 5: printf("<%d>\tFreitag\t\t.%d\n", day, weekday); break;
    					case 6: printf("<%d>\tSamstag\t\t.%d\n", day, weekday); break;
    						//default: printf("Dieser Tag muss noch erfunden werden!\n"); break;
    					}
    				}
    				break;
    			}
    
    		case 6: //Juni
    			{
    				int monat = 4;
    				printf("\nJuni\t.%d\n", monat);
    				for (int day = 1; day < 31; day++) {
    					weekday = day_of_week(day, monat, year);
    					//return weekday;
    					switch (weekday)
    					{
    					case 0: printf("<%d>\tSonntag\t\t.%d\n", day, weekday); break;
    					case 1: printf("<%d>\tMontag\t\t.%d\n", day, weekday); break;
    					case 2: printf("<%d>\tDienstag\t.%d\n", day, weekday); break;
    					case 3: printf("<%d>\tMittwoch\t.%d\n", day, weekday); break;
    					case 4: printf("<%d>\tDonnerstag\t.%d\n", day, weekday); break;
    					case 5: printf("<%d>\tFreitag\t\t.%d\n", day, weekday); break;
    					case 6: printf("<%d>\tSamstag\t\t.%d\n", day, weekday); break;
    						//default: printf("Dieser Tag muss noch erfunden werden!\n"); break;
    					}
    				}
    				break;
    			}
    
    		case 7: //Juli
    			{
    				int monat = 5;
    				printf("\nJuli\t.%d\n", monat);
    				for (int day = 1; day < 32; day++) {
    					weekday = day_of_week(day, monat, year);
    					//return weekday;
    					switch (weekday)
    					{
    					case 0: printf("<%d>\tSonntag\t\t.%d\n", day, weekday); break;
    					case 1: printf("<%d>\tMontag\t\t.%d\n", day, weekday); break;
    					case 2: printf("<%d>\tDienstag\t.%d\n", day, weekday); break;
    					case 3: printf("<%d>\tMittwoch\t.%d\n", day, weekday); break;
    					case 4: printf("<%d>\tDonnerstag\t.%d\n", day, weekday); break;
    					case 5: printf("<%d>\tFreitag\t\t.%d\n", day, weekday); break;
    					case 6: printf("<%d>\tSamstag\t\t.%d\n", day, weekday); break;
    						//default: printf("Dieser Tag muss noch erfunden werden!\n"); break;
    					}
    				}
    				break;
    			}
    
    		case 8: //August
    			{
    				int monat = 6;
    				printf("\nAugust\t.%d\n", monat);
    				for (int day = 1; day < 32; day++) {
    					weekday = day_of_week(day, monat, year);
    					//return weekday;
    					switch (weekday)
    					{
    					case 0: printf("<%d>\tSonntag\t\t.%d\n", day, weekday); break;
    					case 1: printf("<%d>\tMontag\t\t.%d\n", day, weekday); break;
    					case 2: printf("<%d>\tDienstag\t.%d\n", day, weekday); break;
    					case 3: printf("<%d>\tMittwoch\t.%d\n", day, weekday); break;
    					case 4: printf("<%d>\tDonnerstag\t.%d\n", day, weekday); break;
    					case 5: printf("<%d>\tFreitag\t\t.%d\n", day, weekday); break;
    					case 6: printf("<%d>\tSamstag\t\t.%d\n", day, weekday); break;
    						//default: printf("Dieser Tag muss noch erfunden werden!\n"); break;
    					}
    				}
    				break;
    			}
    
    		case 9: // September
    			{
    				int monat = 7;
    				printf("\nSeptember\t.%d\n", monat);
    				for (int day = 1; day < 31; day++) {
    					weekday = day_of_week(day, monat, year);
    					//return weekday;
    					switch (weekday)
    					{
    					case 0: printf("<%d>\tSonntag\t\t.%d\n", day, weekday); break;
    					case 1: printf("<%d>\tMontag\t\t.%d\n", day, weekday); break;
    					case 2: printf("<%d>\tDienstag\t.%d\n", day, weekday); break;
    					case 3: printf("<%d>\tMittwoch\t.%d\n", day, weekday); break;
    					case 4: printf("<%d>\tDonnerstag\t.%d\n", day, weekday); break;
    					case 5: printf("<%d>\tFreitag\t\t.%d\n", day, weekday); break;
    					case 6: printf("<%d>\tSamstag\t\t.%d\n", day, weekday); break;
    						//default: printf("Dieser Tag muss noch erfunden werden!\n"); break;
    					}
    				}
    				break;
    			}
    
    		case 10: //Oktober
    			{
    				int monat = 8;
    				printf("\nOktober\t.%d\n", monat);
    				for (int day = 1; day < 32; day++) {
    					weekday = day_of_week(day, monat, year);
    					//return weekday;
    					switch (weekday)
    					{
    					case 0: printf("<%d>\tSonntag\t\t.%d\n", day, weekday); break;
    					case 1: printf("<%d>\tMontag\t\t.%d\n", day, weekday); break;
    					case 2: printf("<%d>\tDienstag\t.%d\n", day, weekday); break;
    					case 3: printf("<%d>\tMittwoch\t.%d\n", day, weekday); break;
    					case 4: printf("<%d>\tDonnerstag\t.%d\n", day, weekday); break;
    					case 5: printf("<%d>\tFreitag\t\t.%d\n", day, weekday); break;
    					case 6: printf("<%d>\tSamstag\t\t.%d\n", day, weekday); break;
    						//default: printf("Dieser Tag muss noch erfunden werden!\n"); break;
    					}
    				}
    				break;
    			}
    
    		case 11: //November
    			{
    				int monat = 9;
    				printf("\nNovember\t.%d\n", monat);
    				for (int day = 1; day < 31; day++) {
    					weekday = day_of_week(day, monat, year);
    					//return weekday;
    					switch (weekday)
    					{
    					case 0: printf("<%d>\tSonntag\t\t.%d\n", day, weekday); break;
    					case 1: printf("<%d>\tMontag\t\t.%d\n", day, weekday); break;
    					case 2: printf("<%d>\tDienstag\t.%d\n", day, weekday); break;
    					case 3: printf("<%d>\tMittwoch\t.%d\n", day, weekday); break;
    					case 4: printf("<%d>\tDonnerstag\t.%d\n", day, weekday); break;
    					case 5: printf("<%d>\tFreitag\t\t.%d\n", day, weekday); break;
    					case 6: printf("<%d>\tSamstag\t\t.%d\n", day, weekday); break;
    						//default: printf("Dieser Tag muss noch erfunden werden!\n"); break;
    					}
    				}
    				break;
    			}
    
    		case 12: //Dezember
    			{
    				int monat = 10;
    				printf("\nDezember\t.%d\n", monat);
    				for (int day = 1; day < 32; day++) {
    					weekday = day_of_week(day, monat, year);
    					//return weekday;
    					switch (weekday)
    					{
    					case 0: printf("<%d>\tSonntag\t\t.%d\n", day, weekday); break;
    					case 1: printf("<%d>\tMontag\t\t.%d\n", day, weekday); break;
    					case 2: printf("<%d>\tDienstag\t.%d\n", day, weekday); break;
    					case 3: printf("<%d>\tMittwoch\t.%d\n", day, weekday); break;
    					case 4: printf("<%d>\tDonnerstag\t.%d\n", day, weekday); break;
    					case 5: printf("<%d>\tFreitag\t\t.%d\n", day, weekday); break;
    					case 6: printf("<%d>\tSamstag\t\t.%d\n", day, weekday); break;
    						//default: printf("Dieser Tag muss noch erfunden werden!\n"); break;
    					}
    				}
    				break;
    			}
    		}
    	}
    }
    

    die Ausgabe ist noch nicht die eleganteste, dass sei aber erstmal dahingestellt 🕶
    nun würde ich nur gern die switch case abfrage in eine externe Funktion auslagern.

    switch (weekday)
    					{
    					case 0: printf("<%d>\tSonntag\t\t.%d\n", day, weekday); break;
    					case 1: printf("<%d>\tMontag\t\t.%d\n", day, weekday); break;
    					case 2: printf("<%d>\tDienstag\t.%d\n", day, weekday); break;
    					case 3: printf("<%d>\tMittwoch\t.%d\n", day, weekday); break;
    					case 4: printf("<%d>\tDonnerstag\t.%d\n", day, weekday); break;
    					case 5: printf("<%d>\tFreitag\t\t.%d\n", day, weekday); break;
    					case 6: printf("<%d>\tSamstag\t\t.%d\n", day, weekday); break;
    						//default: printf("Dieser Tag muss noch erfunden werden!\n"); break;
    					}
    

    ist es irgendwie möglich den inhalt der printf anweisung irgendwie zu übergeben oder muss ich einen anderen weg gehen? ich habe gerade überhaupt keine idee...

    vielen dank schonmal

    gruss micha



  • micha0815 schrieb:

    nun würde ich nur gern die switch case abfrage in eine externe Funktion auslagern.

    switch (weekday)
    					{
    					case 0: printf("<%d>\tSonntag\t\t.%d\n", day, weekday); break;
    					case 1: printf("<%d>\tMontag\t\t.%d\n", day, weekday); break;
    					case 2: printf("<%d>\tDienstag\t.%d\n", day, weekday); break;
    					case 3: printf("<%d>\tMittwoch\t.%d\n", day, weekday); break;
    					case 4: printf("<%d>\tDonnerstag\t.%d\n", day, weekday); break;
    					case 5: printf("<%d>\tFreitag\t\t.%d\n", day, weekday); break;
    					case 6: printf("<%d>\tSamstag\t\t.%d\n", day, weekday); break;
    						//default: printf("Dieser Tag muss noch erfunden werden!\n"); break;
    					}
    

    ist es irgendwie möglich den inhalt der printf anweisung irgendwie zu übergeben oder muss ich einen anderen weg gehen? ich habe gerade überhaupt keine idee...

    void print_weekday(int weekday, int day) {
      switch (weekday)
      {
        case 0: printf("<%d>\tSonntag\t\t.%d\n", day, weekday); break;
        case 1: printf("<%d>\tMontag\t\t.%d\n", day, weekday); break;
        case 2: printf("<%d>\tDienstag\t.%d\n", day, weekday); break;
        case 3: printf("<%d>\tMittwoch\t.%d\n", day, weekday); break;
        case 4: printf("<%d>\tDonnerstag\t.%d\n", day, weekday); break;
        case 5: printf("<%d>\tFreitag\t\t.%d\n", day, weekday); break;
        case 6: printf("<%d>\tSamstag\t\t.%d\n", day, weekday); break;
        //default: printf("Dieser Tag muss noch erfunden werden!\n"); break;
      }
    }					}
    

    Ich meine, dass du darauf auch selbst hättest kommen können.



  • ok, war zu einfach ... 🙄

    ich steck halt, was C betrifft, noch ziemlich in den Kinderschuhen und hab da an vielen Stellen noch so bisschen meine Schwierigkeiten.

    Vielen Dank nochmal



  • micha0815 schrieb:

    ok, war zu einfach ... 🙄

    ich steck halt, was C betrifft, noch ziemlich in den Kinderschuhen und hab da an vielen Stellen noch so bisschen meine Schwierigkeiten.

    Vielen Dank nochmal

    Kleiner Tipp für deinen weiteren Lernverlauf:

    Schau dir mal Stringtabellen an, damit fallen deine Switch-Konstrukte weg.


  • Mod

    Hat denn hier niemand einen Kommentar zum for-switch-Antipattern übrig? Oder Copy&Paste Programmierung? Aussagslosen Bezeichnern (vor0, var1, var2)? Zweifelhaften Rechnungen ((2.6 * monat) - 0.2)? Technische Fehler beim printf? Unbenutzte Variablen?
    Das sind schwere, grundlegende Probleme mit dem Code. Da ist eine Nachschlagtabelle für Wochentage doch nur eine klitzekleine Schönheitskorrektur.

    Abgesehen davon wäre das mit der Standardbibiothek quasi ein Dreizeiler. Selbst ohne Standardbibliothek schlägt man so etwas doch in Wikipedia nach und bekommt ebenfalls eine kurze, knappe Lösung:
    http://en.wikipedia.org/wiki/Julian_day#Calculation



  • SeppJ schrieb:

    Das sind schwere, grundlegende Probleme mit dem Code.

    Immerhin hat der OP gesehen, dass der Code nicht so schön ist, wie er sein sollte, und ist selbst auf einen Ansatz zur Verbesserung gekommen, den er nur nicht umsetzen konnte. Das Problembewusstsein ist da, und ein Weg zur Verbesserung damit auch.

    (BTW ich hab das for-switch-Pattern in dem ganzen Wust tatsächlich nicht gesehen 😉 )


  • Mod

    Bashar schrieb:

    (BTW ich hab das for-switch-Pattern in dem ganzen Wust tatsächlich nicht gesehen 😉 )

    Mittlerweile ist bei mir schon die Standardreaktion, wenn ich ein switch sehe, nach dem for zu suchen. Wer benutzt denn schon sonst noch switch? 😃 Die Welt ist krank.

    Aber Problembewusstsein ist vorhanden, da hast du Recht, das ist gut. Ich bastel mal flott ein paar konkrete Verbesserungen.


  • Mod

    Hier Demo 1, wie man zu einem Datum den Wochentag erhalten kann. Die Formel ist kompliziert, aber kann nachgeschlagen werden. Es ist jedenfalls sehr viel einfacher, als das von Hand zu programmieren. Zum Programmieren gehört eben auch Recherche, wie man am besten vorgeht, anstatt einfach blind los zu legen. Besonders bei Problemen, die sicherlich schon Millionenfach von anderen Leuten gelöst wurden. Die Demo zeigt auch Trennung von Zuständigkeiten: Die Datumsfunktion macht wirklich nichts anderes, als den Wochentag zu berechnen. Die Ausgabefunktion macht nichts anderes als Ausgeben. Wenn der Wochentag jemals in einem anderen Kontext gebraucht wird (was ziemlich gut vorstellbar ist), dann kann man sie dadurch unverändert erneut benutzen.
    Der Code demonstriert auch die von Nirvash vorgeschlagene Tabelle für die Wochentage, anstatt umstandliche switches zu nutzen.

    #include <stdio.h>
    
    const char* const weekdays[] = {"Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"};
    
    int get_day_of_the_week(int year, int month, int day)
    {
      return (day  // Siehe Wikipedia für Formel
              + ((153 * (month + 12 * ((14 - month) / 12) - 3) + 2) / 5) 
              + (365 * (year + 4800 - ((14 - month) / 12)))              
              + ((year + 4800 - ((14 - month) / 12)) / 4)                
              - ((year + 4800 - ((14 - month) / 12)) / 100)              
              + ((year + 4800 - ((14 - month) / 12)) / 400)              
              - 32045                                                    
              ) % 7;
    }
    
    void date_query(int year, int month, int day)
    {
      printf("%d-%d-%d ist ein %s\n", year, month, day, weekdays[get_day_of_the_week(year, month, day)]);
    }
    
    int main()
    {
      date_query(2013,8,22);
      date_query(2013,1,1);
      date_query(2013,12,31);
      date_query(1629,5,22);
    }
    

    Der zweite Democode entspricht der Kalenderdruckfunktion. Wieder ist ausgelagert, was noch irgendwo anders benutzbar sein könnte und mit dem Kalenderdruck nicht direkt zu tun hat. Demonstriert wird auch richtiger Umgang mit Kontrollsturkturen ohne for-switch, wie es ohnehin selbstverständlich sein sollte. Wieder ersetzen 5 Minuten Recherche 300 Zeilen unnötigen Code, da man leicht bessere Formeln findet, als man sich selber aus dem Stand ausdenken kann.

    #include <stdio.h>
    
    const char* const weekdays[] = {"Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"};
    
    int first_day_of_the_year(int year)
    {
      // Formel wieder von Wikipedia
      return ((year-1) +  (year-1) / 4 - (year - 1) / 100 + (year - 1) / 400) % 7;
    }
    
    int is_leap_year(int year)
    {
      // Sollte bekannt sein, ansonsten: Wikipedia!
      return ( !(year % 4) && (year % 100 || !(year % 400)));
    }
    
    void print_calendar(int year)
    {
      int days_in_month[] = {31, is_leap_year(year) ? 29:28, 31, 30, 31, 30, 31, 31, 30, 31, 30 ,31};
      int current_day_of_the_week =  first_day_of_the_year(year);
      int month, day;
    
      for (month = 0; month < 12; ++month)
        for(day = 0; day < days_in_month[month]; ++day)
          {
            printf("%d-%d-%d ist ein %s\n", year, month+1, day+1, weekdays[current_day_of_the_week]);
            current_day_of_the_week = (current_day_of_the_week + 1) % 7;
          }
    }
    
    int main()
    {
      print_calendar(2013);
    }
    

Anmelden zum Antworten