C Kalender programmieren, wie?

necoicould

Lieutenant
Registriert
Feb. 2009
Beiträge
537
Da bin ich wieder, ich soll folgendes Programmieren.
Man soll Tag Monat Jahr eingeben und es soll alle Tage addieren ausgeben.
Ich habe zu erst mal das ganze einfach mit nur Jeder Monat 30 gemacht und das hat auch geklappt. Nun wollte ich mal das in 31 und 30 trennen, damit das etwas realistischer und korrekter wird. Als Beispiel habe ich im unteren Code gesagt, wenn der Monat 1 eingetippt wird soll er für Monat 31 übernehmen. Wenn nicht dann 30 (ist unlogisch, ich weiß, aber nur als test halt) das macht er aber nicht, stattdesssen verreechnet er sich um ein Paar Zahlen.

Irgendwo ist ein Fehler hmmm?

Code:
#include <stdio.h>
int main()
{
  int tag = 0;
int monat = 0;
int jahr = 365;

int tagn = 0;
int monatn = 0;
int jahrn = 0;

int ges =0;

  printf("Tag eingeben: ");
  scanf("%d", &tag);

  printf("Monat eingeben: ");
  scanf("%d", &monat);

  printf("Jahr eingeben: ");
  scanf("%d", &jahr);

    tagn = tag *1;

if(monat=1){
    	monatn =  31;}
else {
	monatn=30;
}



    jahr = 365;

    ges = tagn + monatn + jahr;



  printf("Anzahl in Tagen: %d\n", ges);
}
 
Habe den fehler entdeckt bei IF müsse ein == hin anstatt ein =

Nun funktioniert das Programm so wie es funktionieren muss, natürlich ist das noch nicht zu Ende.
Code:
#include <stdio.h>
int main()
{
  int tag = 0;
int monat = 0;
int jahr = 365;

int tagn = 0;
int monatn = 0;
int jahrn = 0;

int ges =0;

  printf("Tag eingeben: ");
  scanf("%d", &tag);

  printf("Monat eingeben: ");
  scanf("%d", &monat);

  printf("Jahr eingeben: ");
  scanf("%d", &jahr);



if(monat==1){
    	monatn =  31;}
else {
	monatn=30;
}



    jahr = 365;

    ges = tag + monatn + jahr;



  printf("Anzahl in Tagen: %d\n", ges);
}
Ergänzung ()

jo, habs nun selbst entdeckt^^
 
Code:
if(monat=1)
Das ist immer wahr, weil es eine Zuweisung ist, kein Vergleich.
Was du meintest ist:
Code:
if(monat==1)
 
Der Fehler liegt in Zeile 25.
Code:
monat=1
Das weist monat stets den Wert 1 zu. Um auf den Wert 1 zu testen, musst du das durch Folgendes ersetzen:
Code:
monat == 1

EDIT: Da war schon jemand schneller ;-)
 
Wie kann ich folgendes nun schreiben da steht ja

Code:
if(monat==1){
    	monatn =  31;}
else {
	monatn=30;
}


Wie kann ich dem nun sagen, dass er für 1,3,5,7,9,11 die 30 übernehmen soll
und für 2,4,6,8,12 die 31


EDIT:

Code:
if(monat==1,3,5,7,9,11){
    	monatn =  31;}
else {
	monatn=30;
}

Er macht monatn immer zu 31. Auch wenn ich monat =2 eingebe übernimmt er da 31.
Darf ich überhaupt monat==1,3,5,... schreiben?
 
Zuletzt bearbeitet:
Code:
switch (monat)
{
   1:
   3:
   5:
   7:
   9:
   11: monatn = 30; break;
   default: monatn = 31; break;
}
 
Zwischenfrage:
Du solltest
- den Februar (Monat = 2) mit 28 Tagen angeben und jedes Schaltjahr natürlich mit 29

Monat = 30 Tage mit einer modul2 Abfrage. Ist der Rest 1, dann Monat = 30, ist der Rest 0 , dann Monat = 31 (ohne Unterscheidung beim Februar).

Beim Februar müsstest du erst schaun ob das Jahr durch 4 teilbar ist und dann entsprechend den Monat für 28 oder 29 Tage anpassen.
 
Code:
if(monat == 2)
{
if ( ( (jahr%4==0) && (jahr%100!=0) ) || (jahr%400==0) ) {
   monatn = 29 für schaltajahr
} else {
  monatn = 28 für kein schaltajahr
}

}
else{
if(monat%2 == 1)
{
monatn =  30;   für 1,3,5,7,9,11 
}
else if(monat%2 == 0)
{
monatn=31;   für 2,4,6,8,12 
}
}


Division mit Rest
Aber Februar hat weniger Tage (;
 
Zuletzt bearbeitet: (== vergessen)
Code:
if(monat==1 || monat==3 || monat==5 || monat==7 || monat==9 || monat==11){
    	monatn =  31;}
else {
	monatn=30;
}

Jo, habs nun so gemacht, nicht sehr elegant, aber funkzt.

Jopp, nun kommen die blöden Schaltjahre bzw. der Februar, und das Jahr das manchmal 365 Tage mal 366 Tage hat.
 
Code:
ges = 0

int temp_monat = jahr*12+monat    <--- jahre in monate umrechnen plus monate der eingabe addieren
jahr = 0;
for(int i =0 ; i<=temp_monat;i++) <-- für jeden Monat tag ausrechnen (geht bestimmt auch schneller)
{
               if(i!= 0 && i%12 == 0)   jede 12 monate wird das jahr erhöht
               {jahr = jahr +1 ;} 

	if(monat == 2)
	{
		if ( ( (jahr%4==0) && (jahr%100!=0) ) || (jahr%400==0) ) {
   		monatn += 29 für schaltajahr
		} else {
  		monatn += 28 für kein schaltajahr
		}

	}
	else{
		if(monat%2 == 1)
		{
		monatn +=  30;   für 1,3,5,7,9,11 
		}
		else if(monat%2 == 0)
		{
		monatn +=31;   für 2,4,6,8,12 
		}
	}
}

ges = monatn+tag;

Kannst ja mal testen, keine Garantie das es läuft, konnte es nicht testen.

Gruß,
Sbeisch
 
Zuletzt bearbeitet:
Du solltest dir auf jeden Fall angewöhnen deine Klammerung und Code-Schreibweise einheitlich zu gestalten. Es wird dir mal irgendwann helfen ;-)

if(monat==1,3,5,7,9,11){
monatn = 31;}
else {
monatn=30;
}

Und arbeite mit Einrückungen, somit wirst auch du später beim lesen schneller sehen zu welchem Rumpf es gehört.


Alles andere wurde dir hier schon mehrfach genannt und braucht keine Wiederholung.
 
deine monatseinteilung ist noch sachlich falsch. juli und august haben beide 31 tage. september nur 30
 
Zuletzt bearbeitet:
@Causaum ohh ja =( naja Danke für die Antworten, ich denk mal ich komm ab jetzt allein zu Recht.

Vielen Dank!
Ergänzung ()

Wie kann ich Strings vergleichen. Mit dem diesem Beispiel

Code:
#include <stdio.h>
int main()
{
char antwort ;

  printf("Liebst du mich?: ");
  scanf("%s", &antwort);

if (antwort="Ja")
  printf("Ich dich auch");
}
else {
printf("Ich frage so lange bist du Ja sagst");
}

Das ganze soll so lange ausgegeben werden bis die Person ja sagt.
Mir fehlt das Wissen Strings zu vergleichen
Ergänzung ()

So müsste das laufen. Ich belasse es dabei denke ich, man könnte eventuell auch Fehleranzeigen einbauen, wie z.B. dass das es nur Monate von 1-12 gibt ansonsten FEHLER. Aber so ists ok.

Code:
#include <stdio.h>
int main()
{
int monat = 0;
int jahr = 0;
int monatn=0;


  printf("Monat eingeben: ");
  scanf("%d", &monat);

  printf("Jahr eingeben: ");
  scanf("%d", &jahr);



if(monat==2){


if(((jahr%100!=0)  && (jahr%4==0)) || (jahr%400==0)){
	    	monatn=29; // Schaltjahr
}
else{
	monatn=28; // Kein Schaltjahr
}
}
else {
	if(monat%2==1 && monat!=7)
{
	monatn = 30;
}
else if(monat%2==0 || monat==7)
{
	monatn = 31;

}


}

  printf("Der Monat hat: %d Tage", monatn);
}
 
necoicould schrieb:
Wie kann ich Strings vergleichen. Mit dem diesem Beispiel

Code:
if (antwort="Ja")
  printf("Ich dich auch");
}
1. machst du hier wieder den gleichen Fehler wie schon zu Anfang und 2. ist die Klammernsetzung auch falsch.
Afaik kannst du in C++ auch == zum String-Vergleichen nehmen.
 
necoicould schrieb:
Mir fehlt das Wissen Strings zu vergleichen
strncmp()?

€:
Darlis schrieb:
Afaik kannst du in C++ auch == zum String-Vergleichen nehmen.
In Commodore Basic kann man es auf jeden Fall, aber hilft das dem Threadersteller weiter?
Eben.
 
Zuletzt bearbeitet:
strncmp gibts unter C++ ?
Cool zu wissen, kannte das bisher nur aus MATLAB (wobei MATLAB m.W.n auch auf C basiert)
 
Es geht hier doch um C, oder? Über C++ kann ich nichts sagen.
 
In C++ gibts bei strings eine compare Funktion.

Aber da wir in C sind müssen eben die strcmp-Funktionen herhalten.
 
Zurück
Oben