Monatskalender in C



  • Schreibe ein Programm, das einen Monatskalender der folgenden Form ausgibt:
    Mo 7 14 21 28
    Di 1 8 15 22 29
    Mi 2 9 16 23 30
    Do 3 10 17 24
    Fr 4 11 18 25
    Sa 5 12 19 26
    So 6 13 20 27

    Eingabe: Wochentag, auf den der Erste fällt, Taganzahl des Monats
    Ausgabe: Monatskalender

    So weit bin ich gerade:

    #include <stdio.h>
    #include <conio.h>
    
    void ausgabe (int tag, int anzahl);
    
    void main(){
        int tag, anzahl,wdh;
    
        do{ system("cls");
    
            printf("Geben sie den ersten Tag des Monats ein (Mo=1,Di=2,...So=7): ");
            scanf("%d",&tag);
            fflush(stdin);
    
            while(tag<1 || tag>7){
                printf("\nGeben sie einen gueltigen Tag ein: ");
                scanf("%d",&tag);
                fflush(stdin);
            }
    
            printf("\nGeben sie die Anzahl des Monats ein: ");
            scanf("%d",&anzahl);
            fflush(stdin);
    
            while(anzahl<28 || anzahl>31){
                printf("\nGeben sie eine gueltige Tagesanzahl ein: ");
                scanf("%d",&anzahl);
                fflush(stdin);
            }
    
            ausgabe (tag,anzahl);
    
            printf("\nWollen sie das Programm Wiederholen? Druecken sie 1 oder 0");
            wdh=getch();
    
        }while(wdh=='1');
    }
    
    void ausgabe (int tag, int anzahl){
        int i, tag2, n=2-tag;
    
        for(i=0; i<7; i++){
            if(n>0)
                printf("%d",n);
            else
                printf(" ");
    
            tag2=n+7;
    
            while(tag2<=anzahl){
                if(tag2<10)
                    printf(" ");
    
                    printf(" %d",tag2);
                    tag2+=7;
            }
            printf("\n");
            n++;
        }
    }
    

    Doch jetzt hänge ich bei der Ausgabe von den Wochentagen vor dem eigentlichen Kalender 😕

    Habt ihr eine Idee wie ich die Wochentage ausgeben kann, ohne dass sich der Kalender verschiebt?



  • lel456 schrieb:

    Habt ihr eine Idee wie ich die Wochentage ausgeben kann, ohne dass sich der Kalender verschiebt?

    /* ... */
    
    void ausgabe (int tag, int anzahl){
    	int i, tag2, n=2-tag;
    	char const * tagesnamen[] = { "Mo", "Di", "Mi", "Do", "Fr", "Sa", "So" };
    
    	for(i=0; i<7; i++){
    		printf( "%s ", tagesnamen[ i ] );
    
    		/* ... */
    

    Sonst:
    Main muss laut Standard einen int zurückgeben. Eine leere Parameterliste bei main() ?? Ernsthaft?
    <conio.h> und getch() ist kein Standard-C.
    system() ist so ziemlich immer die mieseste Art irgendwas zu machen. Und wenn schon ... `<stdlib.h> fehlt dafür.

    [c]fflush()ist für Inputstreams wiestdinundefiniert. Darf dir auch eine Pizza bestellen oder den Rechner abfackeln. Die Fehlerbehandlung bei der Eingabe geht eleganter. Vielleicht fallen dir bessere Variablennamen alstag,tag2,nundiein? Diewhile()inausgabe()schreit förmlich nachfor(). Das Inkrement vonnam Ende derfor()` will dringend in den Schleifenkopf.



  • Man könnte ein Array mit 7 Zeilen und 6 Spalten anlegen und zunächst spaltenweise mit den Tageszahlen befüllen und dabei in der dem Wochentag entsprechenden Zeile in der ersten Spalte aufsetzen sowie nicht benötigte Elemante am Anfang und Ende auf 0 setzen. Anschliessend erfolgt die zeilenweise Ausgabe mit dem Namen des Wochentags und den jeweiligen Werten der 6 Spalten, wobei statt der 0 einfach Leerzeichen ausgegeben werden.



  • Danke, hat alles super funktioniert, aber könntest du mir noch sagen was der * vor tagesnamen genau bewirkt?

    Zum anderen:
    Bis jetzt schreiben wir immer main(), da wir noch nichts anderes gelernt haben. Ebenso wie <conio.h> und getch();
    Zu den Variablennamen werde ich mir noch Gedanken machen und das restliche habe ich schon verändert.

    Danke für die schnelle Hilfe 😉



  • Swordfish schrieb:

    Eine leere Parameterliste bei main() ?? Ernsthaft?

    Warum nicht? Willste profilacktisch Parameter annehmen und sie nicht verwenden oder willste profilacktisch dafür sorgen, dass du die main selber nicht mit falschen Argumenten aufrufen kannst?



  • lel456 schrieb:

    ..., aber könntest du mir noch sagen was der * vor tagesnamen genau bewirkt?

    tagesnamen ist ein Array von Pointern auf char

    Du könntest auch

    char tagesnamen[][3] = { "Mo", "Di", "Mi", "Do", "Fr", "Sa", "So" };
    

    machen.

    Das ist nicht dasselbe, verhält sich aber für dich gleich.
    (Auch bei der Ausgabe brauchst du nur einen Index angeben)



  • volkard schrieb:

    Swordfish schrieb:

    Eine leere Parameterliste bei main() ?? Ernsthaft?

    Warum nicht?

    Warum schon? . o O (ähm ... wir sind im C-Board ... leere Parameterliste ... *hint, *hint )

    volkard schrieb:

    Willste profilacktisch Parameter annehmen und sie nicht verwenden oder willste profilacktisch dafür sorgen, dass du die main selber nicht mit falschen Argumenten aufrufen kannst?

    Wie bitte?


  • Mod

    Swordfish schrieb:

    volkard schrieb:

    Swordfish schrieb:

    Eine leere Parameterliste bei main() ?? Ernsthaft?

    Warum nicht?

    Warum schon? . o O (ähm ... wir sind im C-Board ... leere Parameterliste ... *hint, *hint )

    Ich denke, volkard weiß wie C funktioniert. Du verstehst bloß seinen Hinweis nicht.



  • SeppJ schrieb:

    Du verstehst bloß seinen Hinweis nicht.

    Ja, dacht ich mir:

    Swordfish schrieb:

    Wie bitte?

    Meinte er: "Halt doch bitte endlich einfach mal die Klappe!"?


  • Mod

    Swordfish schrieb:

    Meinte er: "Halt doch bitte endlich einfach mal die Klappe!"?

    Vielleicht auch. Oder zumindest vorher etwas länger nachdenken, dann kannst du gerne so viel reden, wie du willst 🙂 .



  • SeppJ schrieb:

    Swordfish schrieb:

    Meinte er: "Halt doch bitte endlich einfach mal die Klappe!"?

    Vielleicht auch. [...]

    Gut. Offenbar teilst du die Meinung auch. Werd' die Klappe halten.


  • Mod

    Swordfish schrieb:

    SeppJ schrieb:

    Swordfish schrieb:

    Meinte er: "Halt doch bitte endlich einfach mal die Klappe!"?

    Vielleicht auch. [...]

    Gut. Offenbar teilst du die Meinung auch. Werd' die Klappe halten.

    Mit dem "auch" meinte ich was volkard vielleicht noch neben der Primäraussage seines Beitrags sagen wollte.

    Wobei ich aber durchaus besorgt feststellen muss, dass du die letzten 1-2 Tage ziemlich viele weniger gute Beiträge verfasst hast.



  • Da ich noch nie wirklich gute Beiträge verfasst habe:

    Swordfish schrieb:

    Werd' die Klappe halten.

    // fühl Dich natürlich völlig frei besagte Kacke zu löschen.


Anmelden zum Antworten