1. #1
    Cadet 1st Year
    Dabei seit
    Okt 2017
    Beiträge
    9

    [C] Verstrichene Tage im Jahr

    Hallo liebe Community,

    ich muss ein C-Programm schreiben, dass von einem Datum aus, angibt wieviele Tage im diesigen Jahr schon vergangen sind. (dh. bei 10:02:2017 sollte das Programm 41 Tage ausgeben)
    Ich soll dabei eine Switch mit Fall-Through verwenden!
    Ich habe schon ein Programm geschrieben, das allerdings nicht 100%ig funktioniert! Ich beiße mir schon seit mehreren Tagen die Zähne daran aus.
    Weiß wer wo der Fehler liegt?

    Danke im Voraus
    TheCompT



    #include <stdio.h>
    #include <stdlib.h>

    int main()
    {


    int jahr, monat, tag, check;
    do
    {
    fflush(stdin);
    printf("Geben Sie ein Datum (dd:mm:jjjj) ein: ");
    check = scanf("%2d:%2d:%4d", &tag, &monat, &jahr);
    if(check != 3)
    {
    printf("Fehler bei der Eingabe!\n");
    }
    }
    while(check != 3);

    //Fall-Through Switch
    switch(monat){

    case 12: tag += 31;
    case 11: tag += 30;
    case 10: tag += 31;
    case 9: tag += 30;
    case 8: tag += 31;
    case 7: tag += 31;
    case 6: tag += 30;
    case 5: tag += 31;
    case 4: tag += 30;
    case 3: tag += 31;
    case 2: if((jahr % 400 == 0) || (jahr % 4 == 0) && (jahr % 100 != 0)){
    tag += 29;
    }else{
    tag += 28;
    }

    case 1: tag += 0;


    }
    printf("Es sind %d Tage vergangen!", tag);

    return 0;
    }

  2. Anzeige
    Logge dich ein, um diese Anzeige nicht zu sehen.
  3. #2
    Rear Admiral
    Dabei seit
    Mai 2011
    Beiträge
    5.933

    [C] AW: Verstrichene Tage im Jahr

    Auf die Schnelle würde ich sagen, du musst deine zu addierenden Tage um einen Monat verschieben.
    Sprich
    Code:
    case 12: tag += 30;
    case 11: tag += 31;
    case 10: tag += 30;
    case 9: tag += 31;
    case 8: tag += 31;
    case 7: tag += 30;
    case 6: tag += 31;
    case 5: tag += 30;
    case 4: tag += 31;
    case 3: if((jahr % 400 == 0) || (jahr % 4 == 0) && (jahr % 100 != 0))
        {
        tag += 29;
        }
        else
        {
        tag += 28;
        }
    case 2: tag += 31;
    case 1: tag +=0 ;

  4. #3
    Fleet Admiral
    Dabei seit
    Dez 2008
    Ort
    127.0.0.1
    Beiträge
    13.787

    [C] AW: Verstrichene Tage im Jahr

    Die Logik ist ja:

    Summer der der Tage der vergangenen Monate plus tage.

    Bei Januar stimmst noch, bei Februar nicht mehr. Da kommen ja die 31 Tage des Januars hinzu, nicht die 28/29 des Februars.
    Geändert von Nilson (07.12.2017 um 22:43 Uhr)
    CPU: i7 4790k | MB: AsRock Z97 extreme 4 | Graka: GTX 780 @ 1150 MHz | PSU: BeQuiet E10-CM 500W
    Sound: Xonar Essence STX / M-Audio BX5 / beyerdynamic DT 880 | RAM: 16 GB Corsair Vengeance LP
    I/O: Asus PB278Q / SideWinder X4 / G500 / T.16000m / XBOX 360 Pad / TrackIR5 | Gehäuse: Fractal R4 Titanium Gray
    Kühlung: Wasser / Aquaero 5 LT / Mo-Ra 3 | SSD: Samsung EVO 1 TB | NAS: 3TB WD RED @ DS213+ | TV: LG OLEDB6D


    Alle Kommentare ohne Gewähr und auf eigene Gefahr

  5. #4
    Lieutenant
    Dabei seit
    Dez 2012
    Ort
    Irgendwo im schönen Österreich
    Beiträge
    552

    [C] AW: Verstrichene Tage im Jahr

    Das Problem ist diese Zeile:
    Code:
    case 1: tag += 0;
    Angenommen du hast ein Datum im Februar oder später. Du rechnest dann &tag Januar Tage, plus 28 oder 29 volle Februar Tage. Das verkürzt deinen Januar auf unter 31 Tage.

    Meine Lösung ist zwar nicht schön, sollte aber logisch korrekt sein.

    Code:
    switch(monat)
    {
    	case 12: tag +=((monat == 12) ? 0 : 31);
    	case 11: tag +=((monat == 11) ? 0 : 30);
    	case 10: tag +=((monat == 10) ? 0 : 31);
    	case 9: tag +=((monat == 9) ? 0 : 30);
    	case 8: tag +=((monat == 8) ? 0 : 31);
    	case 7: tag +=((monat == 7) ? 0 : 31);
    	case 6: tag +=((monat == 6) ? 0 : 30);
    	case 5: tag +=((monat == 5) ? 0 : 31);
    	case 4: tag +=((monat == 4) ? 0 : 30);
    	case 3: tag +=((monat == 3) ? 0 : 31);
    	case 2: 
    		if((jahr % 400 == 0) || (jahr % 4 == 0) && (jahr % 100 != 0))
    		{
    			tag +=((monat == 2) ? 0 : 29);
    		}
    		else
    		{
    			tag +=((monat == 2) ? 0 : 28);
    		}
    	case 1: tag +=((monat == 1) ? 0 : 31);
    }
    Falls du den ((bedingung) ? wert1 : wert2) operator nicht kennst, der gibt dir den ersten Wert aus, falls die Bedingung wahr ist, ansonsten den zweiten.
    Geändert von kiffmet (07.12.2017 um 23:20 Uhr)
    Core i5-4670K @4,5Ghz / 16GB DDR3 1600 CL8 / RX Vega 56 @ EKWB / Soundblaster Zx / Samsung SSD 840 250GB / Samsung SSD 840 Evo 500GB / 2x Crucial MX300 525GB Raid0 / Corsair Obsidian 750D / Custom Wakü 240 + 360 / AOC Agon AG241QX 1440p@144Hz 24'' Freesync / OS: Windows 10 Pro Arch Linux Gentoo

  6. #5
    Lt. Commander
    Dabei seit
    Mär 2005
    Beiträge
    1.228

    [C] AW: Verstrichene Tage im Jahr

    Ist das eine Schulaufgabe oder sowas? Wenn nein, so was programmiert doch heute keiner mehr von Hand selbst. Dafür gibt es

    Spoiler!
    Geändert von PHuV (08.12.2017 um 09:46 Uhr)

  7. #6
    Fleet Admiral
    Dabei seit
    Dez 2008
    Ort
    127.0.0.1
    Beiträge
    13.787

    [C] AW: Verstrichene Tage im Jahr

    Zitat Zitat von PHuV Beitrag anzeigen
    Ist das eine Schulaufgabe oder sowas?
    Zitat Zitat von TheCompT Beitrag anzeigen
    Ich soll dabei eine Switch mit Fall-Through verwenden!
    Klar ist das eine Schulaufgabe. Deswegen hab ich auch kein Code gepostet. Etwas soll der TE ja noch selbst machen.
    CPU: i7 4790k | MB: AsRock Z97 extreme 4 | Graka: GTX 780 @ 1150 MHz | PSU: BeQuiet E10-CM 500W
    Sound: Xonar Essence STX / M-Audio BX5 / beyerdynamic DT 880 | RAM: 16 GB Corsair Vengeance LP
    I/O: Asus PB278Q / SideWinder X4 / G500 / T.16000m / XBOX 360 Pad / TrackIR5 | Gehäuse: Fractal R4 Titanium Gray
    Kühlung: Wasser / Aquaero 5 LT / Mo-Ra 3 | SSD: Samsung EVO 1 TB | NAS: 3TB WD RED @ DS213+ | TV: LG OLEDB6D


    Alle Kommentare ohne Gewähr und auf eigene Gefahr

  8. #7
    Ensign
    Dabei seit
    Okt 2006
    Beiträge
    185

    [C] AW: Verstrichene Tage im Jahr

    Wenn du monat z.B. in _monat = monat - 1; zwischenspeicherst, wird dein switch einfacher.
    Zudem hilfst du dir selbst bei deiner Logik, wenn du die cases entsprechend der Monatsnamen kommentierst. Spare nie an den Comments!

    Edit:
    Vergangene Tage entsprechen tag - 1. Am 1.1. ist noch kein Tag des Jahres vergangen ...

    Du speicherst die Eingabe des Tages als tag. Es ist von Vorteil über- bzw. eingegebene Variablen nicht mehr zu verändern. Du solltest Tag als tag speichern, nach _tag = tag - 1 kopieren und fortan mit _tag arbeiten, da sich dessen Wert verändert und von der ursprünglichen Eingabe unterscheidet.

    So kannst du am Ende auch beide (tag und _tag)ausgeben: "Sie haben 2.2.2017 eingegeben. Seit Jahresbeginn sind/wären 32 Tage verstrichen."
    Geändert von floTTes (12.12.2017 um 06:19 Uhr)
    Zitat Zitat von mir (MS-Fanboy, Cygwin-/WSL-(Ab)User aber Linux-BASHer :) Beitrag anzeigen
    Es ist äußerst unfein von Microsoft, dass Daten versteckt übertragen werden und Abschalt- und Kontroll-Möglichkeiten fehlen!

  9. #8
    Cadet 1st Year
    Ersteller dieses Themas

    Dabei seit
    Okt 2017
    Beiträge
    9

    [C] AW: Verstrichene Tage im Jahr

    Danke für eure Tipps!
    Ich bin durch überlegen und probieren, doch noch auf eine relativ einfache Lösung gekommen!
    Ich verschiebe ganz einfach alle Monate um 1 nach hinten, und setze den Jänner auf 0!
    Falls jemand den Code braucht hier ist er:
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
    
        //3.27 Jahreszahl
    
        int jahr, monat, tag, check;
    
        //Eingabelogik und Überprüfung
        do
        {
            fflush(stdin);
            printf("Geben Sie ein Datum (dd:mm:jjjj) ein: ");
            check = scanf("%2d:%2d:%4d", &tag, &monat, &jahr);
            if((check != 3))
            {
                printf("Fehler bei der Eingabe!\n");
            }
        }
        while(check != 3);
    
        if(tag > 31){
            printf("Mehr als 31 Tage sind nicht moeglich");
            return 0;
        }else if(((tag > 29) && (monat == 2)) ||
                 ((tag == 29) && (monat == 2) && !((jahr % 400 == 0) ||
                  (jahr % 4 == 0) && (jahr % 100 != 0)))){
            printf("Der Monat hat nur 28 Tage!");
            return 0;
        }
    
        //Fall-Through Switch
        switch(monat)
        {
    
        case 12:
            tag += 30;
        case 11:
            tag += 31;
        case 10:
            tag += 30;
        case 9:
            tag += 31;
        case 8:
            tag += 31;
        case 7:
            tag += 30;
        case 6:
            tag += 31;
        case 5:
            tag += 30;
        case 4:
            tag += 31;
    
        case 3:
            if((jahr % 400 == 0) || (jahr % 4 == 0) && (jahr % 100 != 0))
            {
                tag += 29;
            }
            else
            {
                tag += 28;
            }
        case 2:
            tag += 31;
    
        case 1:
            tag += 0; break;
        default: printf("Kein gueltiges Monat!"); return 0;
    
    
        }
        printf("Es sind %d Tage vergangen!", tag);
    
        return 0;
    }

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  
Forum-Layout: Feste Breite / Flexible Breite