C Verstrichene Tage im Jahr

Precide

Vice Admiral
Dabei seit
Mai 2011
Beiträge
6.200
#2
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 ;
 

Nilson

Fleet Admiral
Dabei seit
Dez. 2008
Beiträge
14.969
#3
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.
 
Zuletzt bearbeitet:
Dabei seit
Dez. 2012
Beiträge
606
#4
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.
 
Zuletzt bearbeitet:

PHuV

Lt. Commander
Dabei seit
März 2005
Beiträge
1.347
#5
Ist das eine Schulaufgabe oder sowas? Wenn nein, so was programmiert doch heute keiner mehr von Hand selbst. Dafür gibt es

seit C99 strftime. ;)

Bevor jetzt wieder die Besserwisser kommen, ja, strftime gabs auch schon früher, aber lange nicht so mächtig.
 
Zuletzt bearbeitet:

Nilson

Fleet Admiral
Dabei seit
Dez. 2008
Beiträge
14.969
#6
Dabei seit
Okt. 2006
Beiträge
226
#7
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."
 
Zuletzt bearbeitet:

HardwareDealz

Cadet 1st Year
Ersteller dieses Themas
Dabei seit
Okt. 2017
Beiträge
10
#8
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;
}
 
Top