Kalender

Panda9296

Bekanntes Mitglied
Hi Leute ich weiß nicht ob dieses Thema noch zu den Basics gehört...Denke eher es ist eine Grenze.

Es geht um eine Schulaufgabe die an sich schon eine Kopfnuss ist(sagt zumindest der Lehrer) ich aber ein wenig mehr kann und mich dementsprechend der Ehrgeiz gepackt hat diese Aufgabe besser zu lösen als es die Aufgabenstellung her gibt:

Aufgabe:

Schreibe ein Programm, das für einen Monat den Kalender ausgibt. ( So ich erweitere: ich möchte den Monat durch eine Eingabe abfragen.. je nach dem ob es Januar ist Februar März und so weiter möchte ich den jeweiligen Monat auf die Konsole bringen: Achtung es soll ANCI 2 sein....)

So ich denke ich brauch erstmal eine Klasse in der ich hierfür den Monat abfrage, bevor ich zur eigentlichen Klasse komme. Bevor ich den Code hier poste möchte ich erstmal mein Plan erleutern (hoffe dieser ist nicht total für die Tonne): Mein Gedanke ist also eine Klasse, die vorerst ein Array von String anlegt, in dem ich alle 12 Monate in einem String hinterlege. Diesen möchte ich abfragen... ichmöchte gerne BufferedReader an der Stelle ausweichen, da ich exceptions noch nicht behersche und ich weiß, dass ich Strings auch mit dem Scanner abfragen kann.

So ich wollte den String durch eine For schleife( die die länge des arrays abfragt)mit der Eingabe vergleichen, und jeweils den übereinstimmenden String übergeben...(gut wenn ich das so schreibe brauche ich eigentlich keine eigene Klasse aber ich denke, dass wenn man diese vll später ergänzen möchte, es nicht so schlecht ist, wenn es in einer seperaten Klasse steht( sie erbt noch nix)

Code:
import java.io.IOException;
import java.util.Scanner;

public class Monatsermittlung
{
    String []monat = {"Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"};
    Scanner sc = new Scanner(System.in);
    
    
    
protected String monatsermittlung()
{
    String eingabe;
    boolean auswahl;
    if(eingabe=sc.next() )
    {
        for(int i= 0;i<monat.length;i++)
        {
            
              if(eingabe.equals("Januar"))
              {
                  return monat[0];
              }
              if(eingabe.equals("Februar"))
              {
                  
                      return monat[1];
                  
              }
              if(eingabe.equals("März"))
                      {
                        return monat[2];
                      }
              if(eingabe.equals("April"))
              {
                return monat[3];
              }
              if(eingabe.equals("Mai"))
              {
                return monat[4];
              }
              if(eingabe.equals("Juni"))
              {
                  return monat[5];
              }
              if(eingabe.equals("Juli"))
              {
                  return monat[6];
              }
              if(eingabe.equals("August"))
              {
                  return monat[7];
              }
              if(eingabe.equals("September"))
              {
                  return monat[8];
              }
              if(eingabe.equals("Oktober"))
              {
                  return monat [9];
              }
              if(eingabe.equals("November"))
              {
                  return monat[10];
              }
              if(eingabe.equals("Dezember"))
              {
                  return monat[11];
              }
        }
    }
    else
    {
        System.err.println("Fehler");
    }
}
    
}

Ich möchte hier unbedingt nur das eine Objektarray erzeugen. Ich werfe die Strings also in head und ich möchte diese später in der main fischen anhand des Monats die dazugehörigen Tage setzten und dann in die eigentliche Aufgabe übergehen die mich nochmal hart durchnimmt. Egal ich habe hier ein dickes Problem erkannt.... ich wiederhole mich im code. Was bringt mir das, wenn ich ein Objekt erzeuge... dieses aber 12 mal abfrage... muss doch in einer for schleife möglich sein

muss diese geschachtelt sein? wie baue ich die auf... und das Zweite und kritischere Problem ist... er will meinen Scanner nullen in der Methode ich glaub ich brauch trotzdem eine exception.
 
K

kneitzel

Gast
Du hast doch schon die Schleife um durch das Array monat zu gehen. Also musst Du doch nur prüfen:
Code:
        for(int i= 0;i<monat.length;i++) {
              if(eingabe.equals(monat[0])) {
                  return monat[0];
              }
        }

Und was hast Du Dir hier gedacht? if(eingabe=sc.next())

Sollte es sowas wie if ((eingabe=sc.next()) != null) aber das macht beim Scanner keinen Sinn ....

Daher gehört da kein if hin aus meiner Sicht.
 

Panda9296

Bekanntes Mitglied
ja dachte ich auch.... Deswegen bin ich total durcheinander :D

also ich hatte eigentlich diesen Code

Code:
import java.util.Scanner;

public class Monatsermittlung
{
    String []monat = {"Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"};
    Scanner sc = new Scanner(System.in);
   
   
   
protected String monatsermittlung()
{
    String eingabe= sc.next();
   

        for(int i= 0;i<monat.length;i++)
        {
            while(eingabe.equalsIgnoreCase(monat[i])) {
            return monat[i];
           }
        }// er meckert wegen der return aber ich will ja keine Alternative haben... er soll den Wert zurückgeben, wenns übereinstimmt
}
   
}
 
K

kneitzel

Gast
Also ich bin am überlegen, wie ich Dir weiterhelfen kann ....

Also da fallen wieder ein paar Dinge auf.

Deine while Schleife ist wieder interessant: So lange die Zimmertür auf ist: Mach die Tür zu!
(Das unter der Voraussetzung, dass es eine Aktivität ist, die als Ganzes sofort abgeschlossen ist. Also tuerSchliessen() schliesst sofort die Tür.
Da fällt Dir hoffentlich auf: Das macht doch so einen Sinn. Also ein while(..) { return ... } ist möglich, aber macht natürlich nichts anderes als ein if mit return.
Du sagt natürlich eher: Wenn die Zimmertür auf ist: mach die Tür zu.

Aber ok. Es würde funktionieren...

Bezüglich des return:
Es muss etwas zurück gegeben werden. Wenn ich als Nutzer "abc" eingebe: Was soll dann passieren?
Als Programmierer musst Du das klar vorgeben!

Es gibt viele Möglichkeiten:
- Du kannst einfach null zurück geben oder ein leerer String. Das kannst Du dann im weiteren Verlauf prüfen....
- Du kannst statt String ein Optional<String> zurück geben und dann ein Optional.empty zurück geben.
- Du kannst eine Exception werfen

Aber für einen Weg musst Du dich entscheiden....

Aber vom Design her macht das noch wenig Sinn. Aber dazu kann ich im Augenblick noch nicht viel sagen, da man vom Algorithmus her bisher wenig sieht...

Weitergehende Lösungsidee - evtl. zu komplex für Dich:
Was mir da so direkt durch den Kopf geht: Enum. Du hast Monate und das ist doch eine Aufzählung. Also warum nicht direkt als Aufzählung nutzen?

Und dann hättest Du eine typische parse Methode, die alle values durchgeht, und dann die toString() mit der Eingabe ohne gross/kleinschreibung zu beachten vergleicht und dann die entsprechende enum zurück gibt. Passt die Eingabe nicht, dann gibt es eine Exception.

Je nachdem, was Du sonst noch so brauchst kannst Du dann dann auch Funktionalitäten hinterlegen. So könnte die Enum noch eine Methode speichern, die eine Jahreszahl als Parameter bekommt und die Anzahl der Tage der Monats zurück gibt. Das kann dann bei den meisten Monaten konstant sein (halt 30 oder 31 wird per lambda gegeben) und im Februar ist da dann halt ein Check auf Schaltjahr mit drin.

==> Damit ginge es etwas mehr Richtung OO-Design. Man hantiert nicht mehr wild mit Arrays herum oder so ...

Und als einfache konkrete Anregung - die Du so umsetzen könntest:
Was Du da übrigens prüfst ist mehr oder weniger nur ein "Enthält das Array den gegebenen Wert?" Das könnte man also auch entsprechend universell schreiben. Dann kommt die Logik auf etwas wie:
- Nimm Eingabe entgegen
- Ist Eingabe gültig? --> Hier wird dann in der Methode geprüft, ob der Wert im Array enthalten ist.
--> Ja: Mach was Du machen willst
--> Nein: Fehlerausgabe, ggf. bei erstem Schritt weiter machen.

==>Du unterteilst das Problem so, dass Du
a) möglichst universelle, kleine Methoden hast. (Erkennst Du hier daran, dass Du unter dem Strich Funktionalität des Frameworksnach schreibst. Schau dir mal die Arrays Klasse an ....
b) Du Code bekommst, der gut lesbar ist, da du sprechende Methodennamen hast. Was macht eine Methode "isInputValid"? Kann man gut erahnen, oder?

Viele Grüße,

Konrad
 

Ähnliche Java Themen

Neue Themen


Oben