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:
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)
Wenn ich das ganze jetzt umschreibe in if-Anweisungen habe ich folgendes Programm:
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)
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.
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)
Java:
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:
Java:
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)
Java:
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.
Zuletzt bearbeitet: