[C] Berechnen, wieviele Tage in einem best. Jahr verstrichen sind

eine case Anweisung sollte Dir die Tage des Monats ermitteln können.

zum Beispiel in der Richtung:


Tage bisher = 0
for (monat 1 bis aktueller Monat-1) //Pseudocode - will ja nicht alles coden hier

switch (monat)

case 1,3,5,6,8,10,12: Tage bisher = Tage bisher + 31 //die Monate mit 31 Tagen
case .....

und so weiter .. so addierst Du alle aktuell abgelaufenen Tage und Monate

am Ende nach der For Schleife addierst Du noch den Tag des Monats und hast die abgelaufenen Tage


Zum Modulo: Es gibt da auch einen anderen kleinen Trick:

eine INT Zahl durch eine andere INT Zahl ist bei INT (Ganzzahl)-Werten immer ein ganzzahliges Ergebnis:

so ergibt
12/11 = 0
12/12 = 1
12 / 13 = 1

ergo:

int a =3
int b = 2
int c= a/b //in diesem Fall 1

int rest = a-b*c //
da a=3 und b=2 und c=1 haben wir also Rest=3-2*1 = 1

Grüße
DanGermany
 
Dangermany schrieb:
eine case Anweisung sollte Dir die Tage des Monats ermitteln können.

Das kann schon sein, aber unser Lehrer meinte, wir sollten nur IF-Anweisungen benutzen. :rolleyes:
Ob wir das mit dem Array machen dürfen, bin ich mir auch nicht so sicher.

mfg beten
 
eine case ist ja vergleichbar

if ((aktueller Monat=1) or (aktueller Monat = 3) or (.... ))
bisherigeTage=bisherige Tage+31
if (aktueller Monat = 2) and (Schaltjahr = False)
....

geht also genauso :-)

Grüße
DanGermany
 
Also noch mal ganz kurz damit ich sicher gehen kann, das ich es richtig mache! :D

Zum Schaltjahr:
Wenn das Jahr durch 4 und durch 100 NICHT teilbar ist: Ist es EIN Schaltjahr
Wenn es nur duch 4 teilbar ist und durch 100 auch: Ist es KEIN Schaltjahr
Ist es durch 4 NICHT teilbar aber durch 400: Ist es EIN Schaltjahr
Ist es durch 4 NICHT teilbar und durch 400 auch NICHT: Ist es wieder KEIN Schaltjahr!

Stimmt das so wie ich es beschrieben habe?

sry das ich so dumm frage aber manchmal bin ich ein bisschen schwer von begriff! :D Aber das ist ja das wichtigeste von dem Programm! :)
Danke noch mal!
 
moin

Ich meld mich erst jetzt, weil wir heute erst wieder Programmieren hatten.

Falls es noch jemanden interessiert, hab ich nämlich jetzt ne Lösung für mein Problem.

Code:
[COLOR=Blue]#include[/COLOR] <stdio.h>


[COLOR=Blue]int[/COLOR] iTag, iMonat, iJahr, iSchaltjahr;
[COLOR=Blue]int[/COLOR] iTagErg = 0;


int main()
{
  [COLOR=DarkGreen]//Abfrage des Jahres[/COLOR]
  printf("Geben Sie ein Jahr ein: ");
  scanf("%d", &iJahr);
  
  [COLOR=DarkGreen]//Abfrage des Monats [/COLOR]
  printf("Geben Sie einen Monat ein: ");
  scanf("%d", &iMonat);
   
  [COLOR=DarkGreen]//Abfrage des Tages[/COLOR]
  printf("Geben Sie einen Tag ein: ");
  scanf("%d", &iTag);


  [COLOR=DarkGreen]/*
  Ueberpruefung, ob das eingegebene Jahr
  ein Schaltjahr ist
  */[/COLOR]
  if(iJahr%4==0)
  {
    if(iJahr % 100 == 0)
    {
      if(iJahr % 400 == 0)
      {
        iSchaltjahr = 1;
      }
      else
      {
        iSchaltjahr = 0;
      }
    }
    else
    {
      iSchaltjahr = 1;
    }
  }
  else
  {
    iSchaltjahr = 0;
  }
  
    

  [COLOR=DarkGreen]//Berechnung der Tage[/COLOR]
  if(1 <= iMonat - 1)
  {
    iTagErg = iTagErg + 31;
    if(2 <= iMonat - 1)
   	{
      iTagErg = iTagErg + 28 + iSchaltjahr;
      if(3 <= iMonat - 1)
      {
		iTagErg = iTagErg + 31;
 	    if(4 <= iMonat - 1)
 	    {
          iTagErg = iTagErg + 30;
     	  if(5 <= iMonat - 1)
          {
            iTagErg = iTagErg + 31;
           	if(6 <= iMonat - 1)
           	{
           	  iTagErg = iTagErg + 30;
           	  if(7 <= iMonat - 1)
           	  {
                iTagErg = iTagErg + 31;
                if(8 <= iMonat - 1)
                {
                  iTagErg = iTagErg + 31;
                  if(9 <= iMonat - 1)
                  {
                    iTagErg = iTagErg + 30;
                    if(10 <= iMonat - 1)
                    {
                      iTagErg = iTagErg + 31;
                      if(11 <= iMonat - 1)
                      {
                        iTagErg = iTagErg + 30;
                        if(12 == iMonat)
                        {
                          iTagErg = iTagErg + iTag;
                        }
                      }
                      else
                      {
                        iTagErg = iTagErg + iTag;
                      }

                    }
                    else
                    {
                      iTagErg = iTagErg + iTag;
                    }
                  }
                  else
                  {
                    iTagErg = iTagErg + iTag;
                  }
                }
                else
                {
                  iTagErg = iTagErg + iTag;
                }
              }
              else
              {
                iTagErg = iTagErg + iTag;
              }
            }
            else
            {
              iTagErg = iTagErg + iTag;
            }
          }
          else
          {
            iTagErg = iTagErg + iTag;
          }
        }
        else
        {
          iTagErg = iTagErg + iTag;
        }
      }
      else
      {
        iTagErg = iTagErg + iTag;
      }
    }
    else
  	{
  	  iTagErg = iTagErg + iTag;
    }
  }
  else
  {
    iTagErg = iTag;
  }


  [COLOR=DarkGreen]//Ausgabe des Ergebnisses[/COLOR]
  printf("Tage: %d", iTagErg);                    
  
  fflush(stdin);
  getchar();
}

Viel Spaß damit :D

mfg beten
 
Hm das ist auch eine möglichkeit!
Ich hatte daran auch nicht mehr viel weiterprogrammiert, aber da du das ja jetzt gepostet hast, habe ich mich eben noch mal kurz dran gesetzt! :)

Du fragst ja ziehmlich viel mit if-abfragen ab. Das kannst du einfacher lösen in dem du ein array benutzt, wie es Bacchisio schon vorgeschlagen hat! Denn dann musst du nicht die ganze zeit die tage der Monate dazu zählen. :)

Hier mal mein code, er ist jetzt noch nicht perfekt denn meine abfrage mit dem "durch" 100 und dann "durch" 400, ist ja ein bisschen überflüssig aber das ist jetzt mal 2. rangig! :D

Code:
 int monat[14] = {0,0,31,59,90,120,151,181,212,243,273,304,334,365};
        int tag, monatrech, jahr, ergebnis;

        cout << "Geben sie den Tag ein:" << endl;
        cin >> tag;
        cout << "Geben sie jetzt bitte den Monat ein:" << endl;
        cin >> monatrech;
        cout << "Geben sie jetzt das Jahr ein:" << endl;
        cin >> jahr;

        if (jahr % 4 == 0)
        {
                if (jahr % 100 != 0)
                {
                        cout << "Es ist EIN Schaltjahr!" << endl;
                        ergebnis = monat[monatrech] + tag +1;
                }
                else
                {
                        cout << "Es ist KEIN Schaltjahr!" << endl;
                        ergebnis = monat[monatrech] + tag;
                }
        }
        else
        {
                if (jahr % 400 == 0)
                {
                        cout << "Es ist EIN Schaltjahr!" << endl;
                        ergebnis = monat[monatrech] + tag +1;
                }
                cout << "Es ist Kein Schaltjahr!" << endl;
                ergebnis = monat[monatrech] + tag;
        }
        cout << "es sind: " << ergebnis << " Tag verganngen";
getch();

}

Monatrech ist einfach die anzahl der monate und das setzte ich dann in das array ein, damit er weiß wieviel tage schon verstrichen sind.

Dann werden einfach immer nur noch die Tage die der benutzter eingegeben hat dazugezählt und gegebenfals noch der eine Tag.

Ich hoffe mein code ist verständlich und auch wenigstens ein bisschen richtig und schneller?! :)


OH PS: Bevor ich es vergesse ich habe das mit C++ geschrieben, da ich c++ im moment lerne, aber es müsste ja ungefähr gleich sind, ausserdem geht es ja mehr um die struktur des Programmes!
 
Jo
Danke -Tob-.

Ich weis nich ob wir das mit nem Array lösen dürfen, werd meinen Lehrer aber bei der nächsten Gelegenheit fragen.

Ich probiere das Morgen mal aus.

Trotzdem danke.

mfg beten
 
@-Tob-:

Da ist aber noch ein Fehler drin ;)
Code:
if (jahr % 400 == 0)
tritt niemals ein, da in diesem Fall auf jeden Fall der Pfad
Code:
if (jahr % 4 == 0)
durchlaufen wird. Außerdem fehlt beim ... % 400 noch ein else, oder? :)
 
Zuletzt bearbeitet:
Außerdem bedenkst du nicht dass der Tag erst ab März gezählt werden muß ;)

Code:
#include <iostream>
using namespace std;

int monat[12] = {0,31,59,90,120,151,181,212,243,273,304,334};
        int tag, monatrech, jahr, ergebnis,schaltjahr=0;

int main() {	
        cout << "Geben sie den Tag ein:" << endl;
        cin >> tag;
        cout << "Geben sie jetzt bitte den Monat ein:" << endl;
        cin >> monatrech;
        cout << "Geben sie jetzt das Jahr ein:" << endl;
        cin >> jahr;

	if (((jahr % 4 == 0) && (jahr % 100 != 0) || (jahr % 400 == 0)) && (monatrech > 2)) schaltjahr++;
	
	ergebnis=monat[monatrech-1]+tag+schaltjahr;
	
	cout << "Es sind: " << ergebnis << " Tage vergangen."<< '\n';
	if (schaltjahr) {cout << "Das angegebene Jahr ist ein Schaltjahr!";} 
	   else {cout << "Das angegebene Jahr ist kein Schaltjahr!"<<'\n';};
	   
	   }

Das Array muß nur 12 Elemente haben, außerdem solltest du eine Variable schaltjahr einführen die initialisiert wird und dann gegebenenfalls in der if abfrage geändert wird.
Somit wird sie nur geändert wenn es ein schaltjahr ist und du sie mit 0 initialisierst, oder umgekehrt, d.h deine Abfrage halbiert sich.

Das Ergebnis sollte auch nur einnmal nach der Abfrage berechnet werden, spart auch Schreibarbeit.

@beten

Die beste, weil allgemeine Lösung (mein Vorschlag ist ein Spezialfall für wenige Elemente), ist die Lösung von Dangermany, d.h. soweit es geht zusammenfassen und hochrechnen.
 
Zuletzt bearbeitet:
@ Bacchisio
Ja mir ist das gestern dann auch noch auf gefallen das mein 13 array eigendlich überflüssig ist! :) Mit dem if das ist ein guter tipp, denn ich mach dich rechnung einfach zu oft. Ich bin irgendwie nicht drauf gekommen einfach eine Variable Schaltjahr zu benutzten.

Die lösung von Dangermany hab ich noch nicht ganz verstanden. Ich habe es mir eben noch mal durchgelesen um zu gucken wie er das meint, aber irgendwie steige ich da noch nicht 100% durch.

Und noch eine frage: Was bringt (monatrech > 2) in deiner if-Abfrage? Das verstehe ich auch noch nicht ganz! :) Aber ich lerne ja gerne dazu.


@ 7H3 N4C3R
Code:
if (jahr % 4 == 0)
Läuft doch nur dann durch wenn jahr glatt durch 4 teilbar ist. An sonsten läuft das
Code:
if (jahr % 400 == 0)
durch! Oder was meinst du?


edit:
@Raechaer
Ach so stimmt, jetzt ist es mir auch klar! :) Danke.
 
Zuletzt bearbeitet:
-Tob- schrieb:
Und noch eine frage: Was bringt (monatrech > 2) in deiner if-Abfrage? Das verstehe ich auch noch nicht ganz! :) Aber ich lerne ja gerne dazu.
Der (zusätzliche) Schalttag in einem Schaltjahr muss erst ab März mitgezählt werden, und genau das überprüft (montrech > 2).
 
Die lösung von Dangermany hab ich noch nicht ganz verstanden. Ich habe es mir eben noch mal durchgelesen um zu gucken wie er das meint, aber irgendwie steige ich da noch nicht 100% durch.

or steht ja für oder, er fasst also die Monaten zusammen: es gibt ja welche mit 30, 31 und einer mit 28 bzw. 29. In der Schleife hat er dadurch den genauen Wert für jeden Monat, so wie wir es gemacht haben nur "dynamisch"

Zu was 7H3 N4C3R meint:

schau dir mal 2400 an : ist es ein Schaltjahr? Ja! was sagt deine Abfrage? Nein! Es ist ein toter Zweig

Code:
  if (jahr % 4 == 0)
        {
                if (jahr % 100 != 0)
                {
                        cout << "Es ist EIN Schaltjahr!" << endl;
                        ergebnis = monat[monatrech] + tag +1;
                }
                else
                {
                    if (jahr % 400 == 0)
                {
                        cout << "Es ist EIN Schaltjahr!" << endl;
                        ergebnis = monat[monatrech] + tag +1;
                } else {
                        cout << "Es ist KEIN Schaltjahr!" << endl;
                        ergebnis = monat[monatrech] + tag;
                }
        }
 
Zuletzt bearbeitet:
Zurück
Oben