# Eine Art Kalender nur mit Kontrollstrukturen programmieren



## Micha93 (1. Nov 2014)

Hi,

ich bin neu hier und hoffe, dass ich schon einmal hier im richtigen Forum poste. Ansonsten bitte ich einen Admin oder Mod den Beitrag zu verschieben.

Dies ist meine Aufgabenstellung:


> Wählen Sie die passenden Kontrollstrukturen und wenden Sie sie zur Lösung der folgenden Aufgabenstellungen an:
> - Untersuchen Sie, ob ein Datum formal richtig ist (z.B. muss der Wert des Monats zwischen 1 und 12 liegen). Verwenden Sie hierzu auch die Berechnung der maximalen Tage im Monat aus Aufgabe 2.2. Achtung Schaltjahr!
> - Bestimmen Sie für ein gegebenes Datum das Datum des nachfolgenden bzw. vorherigen Tages.
> - Bei gegebenem Anfangsdatum und Anzahl der folgenden Tage sollen Sie das resultierende Datum nun automatisch berechnen. Verwenden Sie dabei die zuvor erstellte Berechnung des nachfolgenden Tags. Beispiel: 13.3.2012 + 3 Tage = 16.3.2012



Nun ist es so, dass ich hierbei nur die Kontrollstrukturen verwenden darf. Was da Programm deutlich komplizierter macht.

Ich poste erst einmal mein Programm aus Aufgabe 2.2: (Hier durfte ich nur tenäre Operatoren verwenden)

```
import java.io.*;

public class Datum2EVA {

	@SuppressWarnings("deprecation")
	public static void main(String[] args) {
		int maxTag, monat, jahr;							//Deklaration der Variablen maxTag, monat, jahr
		maxTag = 30;										//Variable maxTag erhält den Wert 30
		monat = 0;											//monat wird auf 0 gesetzt
		jahr = 0;											//jahr wird auf 0 gesetzt
		
		DataInputStream  monat2  = new DataInputStream(System.in);	//Eingabe in monat2 speichern
		System.out.print("Monat:");									//Aufforderung einen Monatszahl einzugeben
		try 
		{
			monat = Integer.parseInt(monat2.readLine());			//monat2 in variable monat speichern
		} catch (Exception e){}
		
		DataInputStream  jahr2  = new DataInputStream(System.in);	//Eingabe in jahr2 speichern
		System.out.print("Jahr:");									//Aufforderung eine Jahreszahl einzugeben
		try
		{
			jahr = Integer.parseInt(jahr2.readLine());				//jahr in variable jahr speichern
		} catch (Exception e){}

		int maxmonat = 13;		//"Obergrenze" Monat
		int minmonat = 0;		//"Untergrenze" Monat
		System.out.print("Der Monat " + (((monat>minmonat)&&(monat<maxmonat))? monat : "Bitte gebe nur einen Monat zwischen 1 - 12 ein"));
		//Abgleich ob Monat im Bereich der Zahlen 1 - 12 liegt, Ausgabe Der Monat und des eingegeben Monats.
		
		
		/*januar(1), märz(3), mai(5), juli(7), august(8), oktober(10), dezember(12) -> maxTag+1
		* februar(2) -> maxTag-2
		* februar(2) schaltjahr -> maxtag-1
		*april(4), juni(6), september(9), november(11) -> maxTag;
		*/
		int maxTag2;
		maxTag2 =((monat==1)||(monat==3)||(monat==5)||(monat==7)||(monat==8)||(monat==10)||(monat==12) )? (maxTag+1):maxTag;
		//maxTag2 speichert im Fall maxTag+1 für die Monate mit 31 Tagen oder behält die variable maxTag mit 30 Tagen
		
		int maxTag3;
		maxTag3 = ((jahr%4 == 0 && (jahr%100 != 0 || jahr%400 == 0)) ? (maxTag2-1):(maxTag2-2));
		//maxTag3 speichert die Variable des Monats Februar. maxTag2 wird im Falle eines Schaltjahres um 1 erniedrigt, im Falle keines Schaltjahres um 2 erniedrigt.
		
		System.out.print(" im Jahr " + jahr + " hat "); //Ausgabe im Jahr und das eingegebene Jahre hat
		System.out.print(((monat==2))? (maxTag3 + " Tage."):(maxTag2 + " Tage."));
		//Ausgabe des durch den eingegebenen Monats und Jahr berechnete Tage in diesem Monat und Jahr.
						
	}

}
```

Wenn ich das ganze jetzt umschreibe in if-Anweisungen habe ich folgendes Programm:

```
import java.io.DataInputStream;

public class DatumKontrollstruktur {

	@SuppressWarnings("deprecation")
	public static void main(String[] args) {
		int maxTag, monat, jahr;							
		maxTag = 30;										
		monat = 0;											
		jahr = 0;											
		
		DataInputStream  monat2  = new DataInputStream(System.in);	
		System.out.print("Monat:");									
		try 
		{
			monat = Integer.parseInt(monat2.readLine());			
		} catch (Exception e){}
		
		DataInputStream  jahr2  = new DataInputStream(System.in);	
		System.out.print("Jahr:");									
		try
		{
			jahr = Integer.parseInt(jahr2.readLine());				
		} catch (Exception e){}

		if (monat>0 && monat<13)
		{
			System.out.print("Der Monat " + monat);		
		}		
		else
		{
			System.out.print("Bitte gebe nur einen Monat zwischen 1 - 12 ein");
		}
		
		int maxTag2;
		if ((monat==1)||(monat==3)||(monat==5)||(monat==7)||(monat==8)||(monat==10)||(monat==12))
		{
			maxTag2 = maxTag+1;
		}
		else
		{
			maxTag2 = maxTag;
		}
				
		int maxTag3;
		if (jahr%4 == 0 && (jahr%100 != 0 || jahr%400 == 0))
		{
			maxTag3 = maxTag2-1;
		}
		else
		{
			maxTag3 = maxTag2-2;
		}
		
		System.out.print(" im Jahr " + jahr + " hat ");
		
		if (monat==2)
		{
			System.out.print(maxTag3 + " Tage.");
		}
		else
		{
			System.out.print(maxTag2 + " Tage.");
		}
						
	}

}
```

Ich denke garantiert zu kompliziert und habe das Programm auch zu kompliziert gemacht.
Den 1. Teil meiner Aufgabe krieg ich ja noch einigermaßen hin. Ich bin jedoch nur nicht zufrieden mit dem Endergebnis.
Wie krieg ich hin, dass wenn es eine falsche Eingabe ist, das er nur ausgibt, dass die Eingabe falsch ist und alles danach abbricht?
Dann krieg ich im 1. Teil zwar hin, dass er erkennt, dass der Februar im Jahr 2 nur 28 Tage hat (d.H. wenn ich 29 eingebe hat er eine Fehlermeldung). Im Jahr 4 (Schaltjahr) erkennt er, dass der Februar 29 Tage hat. Rechne ich jedoch in der Aufgabe den folgenden Tag aus, so klappt dass bis auf den Februar. Dort unterscheidet er nicht einmal zwischen 28 und 29 Tage, sondern dort erkennt er nur die Unterscheidung zwischen 30 und 31 Tagen. Keine Ahnung was ich falsch mache.
Ich verklompiziere mich quasi in meinem eigenen Programm. Die Lösung müsste meiner Meinung nach viel leichter sein. Ich komm nur nicht drauf.

Hier mein zu kompliziertes Programm: (PS ich hab eine Ausgabe mehr drinnen nur als Kontrolle)

```
import java.io.DataInputStream;


public class DatumKontrollstruktur5 {

	@SuppressWarnings("deprecation")
	public static void main(String[] args)
	{
		int minTag, maxTag, maxTag2, maxTag3, tag, monat, jahr;							
		minTag = 0;
		maxTag = 30;										
		tag = monat = jahr = maxTag2 = 0;	
		
		DataInputStream  tag2  = new DataInputStream(System.in);	
		System.out.print("Tag:");									
		try 
		{
			tag = Integer.parseInt(tag2.readLine());			
		} catch (Exception e){}	
		
		DataInputStream  monat2  = new DataInputStream(System.in);	
		System.out.print("Monat:");									
		try 
		{
			monat = Integer.parseInt(monat2.readLine());			
		} catch (Exception e){}
		
		DataInputStream  jahr2  = new DataInputStream(System.in);	
		System.out.print("Jahr:");									
		try
		{
			jahr = Integer.parseInt(jahr2.readLine());				
		} catch (Exception e){}
		
		if ((monat==1)||(monat==3)||(monat==5)||(monat==7)||(monat==8)||(monat==10)||(monat==12))
		{
			maxTag2 = maxTag+1;
		}
		else
		{
			maxTag2 = maxTag;
		}
				
		if (jahr%4 == 0 && (jahr%100 != 0 || jahr%400 == 0))
		{
			maxTag3 = maxTag2-1;
		}
		else
		{
			maxTag3 = maxTag2-2;
		}
		
		if (monat>0 && monat<13)
		{
			System.out.print("Der Monat " + monat);		
		}		
		else
		{
			System.out.print("Bitte gebe nur einen Monat zwischen 1 - 12 ein.");
		}
		
		System.out.print(" im Jahr " + jahr + " hat ");
		
		if (tag>minTag && tag<=maxTag2 )
		{
			if (monat==2)
			{
				if(maxTag3>=tag)
				{	
				System.out.print(maxTag3 + " Tage.");
				System.out.print("\n" + tag + "." + monat + "." + jahr);
				}
				else
				{
					System.out.print("Falsche Eingabe. Der Februar im Jahr " + jahr + " hat nur " + maxTag3 + " Tage.");
				}
			}
			else
			{
				System.out.print(maxTag2 + " Tage.");
				System.out.print("\n" + tag + "." + monat + "." + jahr);
			}
		}
		else
		{
			if (monat==2)
			{
				System.out.print("Bitte gebe nur einen Tag zwischen 1 - " + maxTag3 + " ein.");
			}
			else
			{
				System.out.print("Bitte gebe nur einen Tag zwischen 1 - " + maxTag2 + " ein.");
			}
			
		}
		
		
		//Ausgaben in if Anweisungen //an dieser Stelle löschbar, dient nur als Kontrolle.
		if (monat==2)
		{
			System.out.print("\n" + tag + "." + monat + "." + jahr);
		}
		else
		{
			System.out.print("\n" + tag + "." + monat + "." + jahr);
		}
		
		//limit Tage
		//if tag = 0: monat-1 				if monat = 0: jahr - 1
		//if tag = 32/31/30/29: monat+1		if monat =13: jahr + 1
		
		int tagvor;
		int tagzurueck;
		
		tagvor = tag+1;
		tagzurueck = tag-1;
		
		if (maxTag2<tagvor)
		{
			if (tag>=maxTag2)
			{
				tag = 1;
				monat = monat+1;
				System.out.print("\n" + tag + "." + monat + "." + jahr);//Überschlag
			}
			if (tag>=maxTag3)
			{	
				tag = 1;
				monat = monat+1;
				System.out.print("\nHaben sie vielleicht folgendes Datum gemeint?\n" + tag + "." + monat + "." + jahr);//bei zu Hoher Eingabe
			}
		}
		else
		{
			if (tag==28 != (jahr%4 == 0 && (jahr%100 != 0 || jahr%400 == 0)))
			{	
				tag = 1;
				monat = monat+1;
				System.out.print("\n" + tag + "." + monat + "." + jahr);
			}
			else
			{
				tag = 29;
				System.out.print("\n" + tag + "." + monat + "." + jahr);
			}
			if (tag==29 && (jahr%4 == 0 && (jahr%100 != 0 || jahr%400 == 0)))
			{	
				tag = 1;
				monat = monat+1;
				System.out.print("\n" + tag + "." + monat + "." + jahr);
			}
			else
			{
				System.out.print("\nFalsche Eingabe!");	
			}
		}
	}
}
```

Wäre nett, wenn mir jemand eine Lösung, evtl. auch nur in Form eines Struktogramms liefern könnte. Ich will das nämmlich schon selber programmieren ich plag mich nur schon viel zu lange damit und komm kein bisschen weiter.

Achso, der switch-case wäre auch erlaubt, falls es für den ein oder anderen eine Alternative ist.

Liebe Grüße
Micha93

//Edit: Ah, mir ist eingefallen, dass man sogar Schleifen verwenden kann.


----------



## Micha93 (2. Nov 2014)

Ich find ehrlich gesagt die bearbeiten Funktion nicht. Aber ich hab mein Programm mal geändert.
Jetzt habe ich nur ein Problem. Und zwar wird bei mir jetzt alles richtig ausgegeben, außer ich gebe mein nTage ein.

Also ich hab da so meine Probleme mit dem Monat und so.

[Java]

public class erste
{

	public static void main(String[] args)
	{
		int Monat;
		int Jahr;
		int Tag;
		int nTag;

		String tag = javax.swing.JOptionPane.showInputDialog( "Tag?" );
		Tag = Integer.parseInt(tag);

		String monat = javax.swing.JOptionPane.showInputDialog( "Monat?" );
		Monat = Integer.parseInt(monat);

		String jahr = javax.swing.JOptionPane.showInputDialog( "Jahr?" );
		Jahr = Integer.parseInt(jahr);

		int maxtag = 0;
		int tag1 = 0;
		int tagzurueck = 0;
		int tagvor = 0;
		int monatneu = 0;

		//Monatsprüfung

		if (Monat==1 || Monat==3 || Monat==5 || Monat==7 || Monat==8 || Monat==10 || Monat==12)
		{
			maxtag = 31;
		}
		else if (Monat==4 || Monat==6 || Monat==9 || Monat==11)
		{
			maxtag = 30;
		}
		else if (Monat==2)
		{
			if ((Jahr%4==0 && Jahr%100!=0) || Jahr%400==0)
			{
				maxtag = 29;
			}
			else
			{
				maxtag = 28;
			}
		}
		else
		{
			maxtag = 0;
		}

		//maxtagsprüfung

		if (maxtag == 31)
		{
			if (Tag>0 && Tag<32)
				tag1 = 1;
		}
		else if (maxtag == 30)
		{
			if (Tag>0 && Tag<31)
				tag1 = 1;
		}
		else if (maxtag == 29)
		{
			if (Tag>0 && Tag<30)
				tag1 = 1;
		}
		else if (maxtag == 28)
		{
			if (Tag>0 && Tag<29)
				tag1 = 1;
		}

		//Tag vorher und nachher

		if (Tag>1 && Tag<maxtag)
		{
			tagzurueck = Tag-1;
			tagvor = Tag+1;
		}
		else if (Tag == 1)
		{
			monatneu = Monat-1;
			if (monatneu==1 || monatneu==3 || monatneu==5 || monatneu==7 || monatneu==8 || monatneu==10 || monatneu==12)
				tagzurueck = 31;
			else if (monatneu==4 || monatneu==6 || monatneu==9 || monatneu==11)
				tagzurueck = 30;
			else if (monatneu==2)
			{
				if ((Jahr%4==0 && Jahr%100!=0) || Jahr%400==0)
					tagzurueck = 29;
				else
					tagzurueck = 28;
			}
			else if (monatneu==0)
				tagzurueck = 31;
			tagvor = Tag+1;
		}
		else if (Tag == maxtag)
		{
			monatneu = Monat+1;
			if (monatneu==1 || monatneu==3 || monatneu==5 || monatneu==7 || monatneu==8 || monatneu==10 || monatneu==12)
				tagvor = 1;
			else if (monatneu==4 || monatneu==6 || monatneu==9 || monatneu==11)
				tagvor = 1;
			else if (monatneu==2)
			{
				if ((Jahr%4==0 && Jahr%100!=0) || Jahr%400==0)
					tagvor = 1;
				else
					tagvor = 1;
			}
			else if (monatneu==13)
				tagvor = 1;
		}
		//Ausgabe

		if (maxtag>0 == Monat>0 && Monat<13)
			System.out.println("Das Datum ist der "+Tag+"."+Monat+"."+Jahr+". Der Monat hat " + maxtag + " Tage!");
		else
			System.out.println("Der maxtag" + Tag + " existiert nicht! \n\n Der Monat " +Monat+ " existiert nicht! \n\n Das Datum existiert nicht!");
		if (tag1 == 1)
		{	
			if (tagvor==1)
			{
				tagzurueck=maxtag-1;
				System.out.println("Der vorherige Tag ist der " + tagzurueck + "." + Monat + "." + Jahr+".");
				Monat=Monat+1;
				if (Monat==13)
				{
					Monat=1;
					Jahr=Jahr+1;
				}
				System.out.print("Der nachfolgende Tag ist der " + tagvor + "." + Monat + "." + Jahr+".");
			}
			else
			{
				int monatneu2;
				int jahrneu2;
				monatneu2=Monat;
				Monat=Monat-1;
				jahrneu2=Jahr;
				if (Monat==0)
				{
					Monat=12;
					Jahr=Jahr-1;
				}
				if (tagzurueck!=maxtag)
				{
					Monat=monatneu2;
					Jahr=jahrneu2;
				}
				System.out.println("Der vorherige Tag ist der " + tagzurueck + "." + Monat + "." + Jahr+".");
				Monat=Monat+1;
				if (Monat==13)
				{
					Monat=1;
					Jahr=Jahr+1;
				}
				if (Monat==13)
				{
					Monat=Monat-1;
				}
				if (tagvor!=maxtag)
				{
					Monat=monatneu2;
					Jahr=jahrneu2;
				}
				System.out.println("Der nachfolgende Tag ist der " + tagvor + "." + Monat + "." + Jahr+".");	
			}

		}
		else
			System.out.println("Die Eingabe der Tage ist fehlerhaft!");

		String tag2 = javax.swing.JOptionPane.showInputDialog( "Gib eine Anzahl an folge Tage ein:" );
		nTag = Integer.parseInt(tag2);
		System.out.println("Die Anzahl der folgenden Tage beträgt "+ nTag + ".");

		int ntagevor;
		int differenzntage;
		if (nTag>0)
		{
			ntagevor=Tag+nTag;
			if (ntagevor>maxtag)
			{
				differenzntage=ntagevor-maxtag;
				ntagevor=differenzntage;
				Monat=Monat+1;
				if (Monat==13)
				{
					Monat=1;
					Jahr=Jahr+1;
				}
				if (Monat!=13)
				{
					Monat=Monat;
				}
				if (Monat==0)
				{
					Monat=1;
				}
			}	
			System.out.print("Das resultierende Datum ist der " + ntagevor + "." + Monat + "." + Jahr+".");
		}
		else
		{
			System.out.println("Die Anzahl der folgenden Tage muss größer als 0 sein.");
		}
	}
}[/Java]

Beispiel:
Das Datum ist der 31.1.1. Der Monat hat 31 Tage!
Der vorherige Tag ist der 30.1.1.
Der nachfolgende Tag ist der 1.2.1. Die Anzahl der folgenden Tage beträgt 1.
Das resultierende Datum ist der 1.3.1.

Hier müsste auch 1.2.1 stehen. Da der Nachfolgende Tag zufälligerweise auch 1 ist. Mein Problem ist, dass auch wenn ich jetzt 10 der so eingebe dann 9.3.1 statt 9.2.1 rauskommt..

Ich teste da viel zu ungeschickte Sachen grad hin und her.
Hoffe jemand kann helfen.

Eine andere falsche Ausgabe ist:
Das Datum ist der 30.1.1. Der Monat hat 31 Tage!
Der vorherige Tag ist der 29.1.1.
Der nachfolgende Tag ist der 31.2.1.
Die Anzahl der folgenden Tage beträgt 1.
Das resultierende Datum ist der 31.2.1.

hier muss 31.1.1 rauskommen.

Gebe ich z.B. den 1.1.1 ein und als nTage 30 stimmt das ergebnis. Da kommt dann 2.1.1 raus.


----------

