# Zurückspringen in Java?



## Das Vi (15. Apr 2009)

Zugegeben der Titel ist nicht perfekt formuliert, aber mir fällt nichts ein, wie ich es besser zusammenfassen könnte ^^
Meine Frage:

gibt es eine Möglichkeit, wenn eine bestimmte Bedingung erfüllt ist, das Programm dazu zu bringen, dass es zu einem bestimmten Punkt zurückspring und von da an weitermacht?

Konkret ist das bei mir so:


```
public static void main(String[] args) {        
        for (int i = 0; i < nummern.length; i++)
        {
            nummern[i] = String.format("%0" + stellen + "d", i);            
        }
        
        String kunde = null;
        int anzahl = 0;
        ReservationSystem r = new ReservationSystem(kunde, anzahl);

        while (true) {
            String cmd = null;
            while (cmd == null) {
                System.out.println("Bitte Befehl eingeben: ");
                System.out.println("1. dump");
                System.out.println("2. reserve");
                try {
                    cmd = getNextLine();
                } catch (IOException e) {
                    // ignore
                }
                if (!"dump".equals(cmd.trim().toLowerCase()) &&
                        !"reserve".equals(cmd.trim().toLowerCase())) {
                    System.out.println("Befehl ungültig!");
                }
            }
            
            
            if ("dump".equals(cmd.trim().toLowerCase())) {
                r.dump();
            }
            else if ("reserve".equals(cmd.trim().toLowerCase())) {
                System.out.print("Bitte Namen eingeben: ");
                try {
                    kunde = getNextLine();
                    r.setKunde(kunde);
                } catch (IOException e) {
                    break;
                }
                System.out.print("Wieviele Nummern möchten Sie reservieren? ");
                    try {
                        anzahl = Integer.parseInt(getNextLine());    
                    } catch (IOException e) {
                        break;
                    }
                    r.setAnzahl(anzahl);
                    r.reserve();
                    
                    System.out.println("Mehr ?");
                    String ans;
                    try {
                        ans = getNextLine();
                    } catch (IOException e) {
                        break;
                    }
                    

                    if ("yes".equals(ans.trim().toLowerCase()) || 
                        "ja".equals(ans.trim().toLowerCase()) ||
                        "y".equals(ans.trim().toLowerCase())) {
                        System.out.println("Ok. Lets fetz.");
                        
                    }
                    else if ("no".equals(ans.trim().toLowerCase()) ||
                            "nein".equals(ans.trim().toLowerCase()) ||
                            "n".equals(ans.trim().toLowerCase()))
                    {
                        System.out.println("Vielen Dank für Ihre Bestellungen!");                
                        break;
                    }
            }
            

            
        }    
    }
```

Ist jetzt nur die main methode, aber mehr zählt momentan auch nicht.

ich möchte erreichen, dass das Programm bei der "mehr"-abfrage, je nachdem ob man ja oder nein eingibt, zu dem Punkt zurückspringt, wo man Namen und gewünschte Anzahl eingeben soll.
Gibt es da eine (möglichst unkomplizierte) Möglichkeit?
Danke im Vorraus!


----------



## The_S (15. Apr 2009)

Sowas nennt man goto und ist so ziemlich das schlimmste, was du machen kannst (und gibt es in Java nicht, ausgenommen der Sprung-Labels in Schleifen). Überleg dir lieber eine richtige Struktur in Kombination aus Klassen, Methoden, Schleifen und Abfragen.


----------



## hdi (15. Apr 2009)

Für sowas nimmt man eine do-while-Schleife:



```
boolean mehr;
do{
    // mindestens einmal
    // blablalba
    mehr = userWantsMore();
}
while(mehr); // solange mehr == true, wird zu do zurückgesprungen
```

Ansonsten gibt es auch noch Sprungmarken, aber da sollte man die Finger von lassen.


----------



## icarus2 (15. Apr 2009)

Das "Zurükspringen" nennt man Back-Tracking.

So wie ich das gesehen habe, liest du die Zeilen in einer while-schleife ein. Mit dem Schlüsselwort continue, wird die Schleife abgebrochen und wieder von vorne angefangen. Es ist ähnlich wie break, nur dass bei continue die Schleife einfach wieder von vorne anfängt.


```
while(true) {
....
....

if(//Wenn etwas neues eingelesen werden soll) {
continue; //Das Programm springt an den Anfang der while-Schleife
}
else {
break; //Die Schleife wird abgebrochen
}
```

PS: Es gibt irgend eine Art etwas mit go to Line oder sowas. Aber so wie ich gehört habe nutzt man dies heute nicht mehr.

Hoffe das oben hilft dir weiter.

*Edit:

@hdi: Würde meins auch funktionieren?


----------



## Das Vi (15. Apr 2009)

Mit anderen Worten, ich soll alles übern Haufen werfen und neu machen?
Prinzipiell hätte ich damit kein Problem, allerdings habe ich, wie du ja weißt, nicht mehr sonderlich viel zeit...Könnte man das irgendwie geschickt mit ner boolean machen, die bei ja erfüllt wird und der andere Kram mit ner while - schleife eingeklammert wird und nur läuft, wenn die boolean true ist? (ich hab das schon probiert, aber es hat nicht hingehaun).


----------



## maki (15. Apr 2009)

Es sollte reichen wenn das Programm zumindest einigermassen strukturiert ist, muss nichtmal richtiges OO sein, sauberes Prozedurales Design reicht dafür schon, aber wenn alles in einer Methode (main) steht, wird das nix ausser sehr unübersichtlich.

Alles über den Haufen werfen?
Naja, muss nicht sein, einfach Methoden extraheiren reicht für den Anfang und kann viel helfen.


----------



## Das Vi (15. Apr 2009)

Ok habe es jetzt extrahiert 


```
public void haupt() {
        String kunde = null;
        int anzahl = 0;


        while (true) {
            String cmd = null;
            while (cmd == null) {
                System.out.println("Bitte Befehl eingeben: ");
                System.out.println("1. dump");
                System.out.println("2. reserve");
                try {
                    cmd = getNextLine();
                } catch (IOException e) {
                    // ignore
                }
                if (!"dump".equals(cmd.trim().toLowerCase()) &&
                        !"reserve".equals(cmd.trim().toLowerCase())) {
                    System.out.println("Befehl ungültig!");
                }
            }
            
            
            if ("dump".equals(cmd.trim().toLowerCase())) {
                dump();
            }
            else if ("reserve".equals(cmd.trim().toLowerCase())) {
                System.out.print("Bitte Namen eingeben: ");
                try {
                    kunde = getNextLine();
                    setKunde(kunde);
                } catch (IOException e) {
                    break;
                }
                System.out.print("Wieviele Nummern möchten Sie reservieren? ");
                    try {
                        anzahl = Integer.parseInt(getNextLine());    
                    } catch (IOException e) {
                        break;
                    }
                    setAnzahl(anzahl);
                    reserve();
                    
                    System.out.println("Mehr ?");
                    String ans;
                    try {
                        ans = getNextLine();
                    } catch (IOException e) {
                        break;
                    }
                    

                    if ("yes".equals(ans.trim().toLowerCase()) || 
                        "ja".equals(ans.trim().toLowerCase()) ||
                        "y".equals(ans.trim().toLowerCase())) {
                        System.out.println("Ok. Lets fetz.");
                        
                    }
                    else if ("no".equals(ans.trim().toLowerCase()) ||
                            "nein".equals(ans.trim().toLowerCase()) ||
                            "n".equals(ans.trim().toLowerCase()))
                    {
                        System.out.println("Vielen Dank für Ihre Bestellungen!");                
                        break;
                    }
            }
            

            
        }    
    }
    
    public static void main(String[] args) {
        ReservationSystem r = new ReservationSystem(kunde, anzahl);
        for (int i = 0; i < nummern.length; i++)
        {
            nummern[i] = String.format("%0" + stellen + "d", i);            
        }
        r.haupt();    
    }
```
ist das so besser? ^^

EDIT SAGT: Problem gelöst, ich habs geändert und die mehr - abfrage hat jetzt einen anderen zweck^^


EDIT SAGT NOCH VIEL MEHR:
neues Problem...
scheinbar ist irgendwo in der reserve-methode was nicht i.o. jedenfalls prüft die scheinbar nicht, ob die nummer an der stelle i schon reserviert ist. ich find leider nicht raus, woran das liegt...
reserve sieht so aus:

```
void reserve() {
        if ( anzahl > (nummern.length/10))
        {
            JOptionPane.showMessageDialog(null, "So viele Nummern stehen nicht zur Verfügung.");
        }
        else
        {
        while ( frei < anzahl )
        { 
        if ( anzahl < 10 )
        {
            for ( int i = 0; i < nummern.length; i++)
            {
                if ( reserviert[i] == true )
                {
                    frei = 0;
                    start = i + 1;
                }
                else
                {
                    frei++;
                }
                
            }
        }
        else
            if ( anzahl >= 10 )
            {
                for ( int i = 0; i < nummern.length; i += 10 )
                {
                    if ( reserviert[i] == true )
                    {
                        frei = 0;
                        i++;
                        start = i + 10;
                    }
                    else
                    {
                        frei++;
                    }
                }
            }
        }

        {
            if ( anzahl < 10 )
            {
                for ( int i = start; i < anzahl; i++)
                {
                    reserviert[i] = true;
                    kunden[i] = kunde;
                }
            }
            else
            {
                for ( int i = start; i < anzahl*10; i += 10 )
                {
                    reserviert[i] = true;
                    kunden[i] = kunde;
                }
            }
                
        }
    }
    }
```


----------



## hdi (15. Apr 2009)

```
while (true) {
            String cmd = null;
            while (cmd == null) {
                System.out.println("Bitte Befehl eingeben: ");
                System.out.println("1. dump");
                System.out.println("2. reserve");
                try {
                    cmd = getNextLine();
                } catch (IOException e) {
                    // ignore
                }
                if (!"dump".equals(cmd.trim().toLowerCase()) &&
                        !"reserve".equals(cmd.trim().toLowerCase())) {
                    System.out.println("Befehl ungültig!");
                    [B][COLOR="Magenta"]cmd = null;[/COLOR][/B]
                }
            }
            
            
            if ("dump".equals(cmd.trim().toLowerCase())) {
                dump();
            }
            else if ("reserve".equals(cmd.trim().toLowerCase())) {

[COLOR="Magenta"][B]            boolean more;
            do{[/B][/COLOR]

                System.out.print("Bitte Namen eingeben: ");
                try {
                    kunde = getNextLine();
                    setKunde(kunde);
                } catch (IOException e) {
                    break;
                }
                System.out.print("Wieviele Nummern möchten Sie reservieren? ");
                    try {
                        anzahl = Integer.parseInt(getNextLine());    
                    } catch (IOException e) {
                        break;
                    }
                    setAnzahl(anzahl);
                    reserve();
                    
                    System.out.println("Mehr ?");
                    String ans;
                    try {
                        ans = getNextLine();
                    } catch (IOException e) {
                        break;
                    }
                    

                    if ("yes".equals(ans.trim().toLowerCase()) || 
                        "ja".equals(ans.trim().toLowerCase()) ||
                        "y".equals(ans.trim().toLowerCase())) {
                        System.out.println("Ok. Lets fetz.");
                        [B][COLOR="Magenta"]more = true;[/COLOR][/B]
                        
                    }
                    else if ("no".equals(ans.trim().toLowerCase()) ||
                            "nein".equals(ans.trim().toLowerCase()) ||
                            "n".equals(ans.trim().toLowerCase()))
                    {
                        System.out.println("Vielen Dank für Ihre Bestellungen!");                
                       [B][COLOR="Magenta"] more = false;[/COLOR][/B]
                    }
            [B][COLOR="Magenta"]}[/COLOR][/B]
           [B][COLOR="Magenta"]while(more);[/COLOR][/B]
}
```

Kann sein dass du da noch bisschen aufräumen musst, ich bin mit der Foramtierung und den Klammern etwas durcheinander gekommen. Aber ich denke dir ist jetzt klar was ich meine oder?


----------



## Das Vi (15. Apr 2009)

hey ich versteh das sogar problemlos  nja wie gesagt problem gelöst, nächstes problem steht in dem post über dir -.-'


----------



## maki (15. Apr 2009)

> ist das so besser


Ein bisschen.

Kann dir nicht viel helfen, denn bei den ganzen Schleifen und if/else-Blöcken blicke ich nicht mehr durch, glaube das haben wir gemeinsam 

Würde dir empfehlen das Ding weiter aufzubrechen in noch mehr Methoden, wichtig wären vor allem sprechende Namen für die Methoden, so dass man den Code nicht im Detail studieren muss um zu erfahren was ungefähr passiert.


----------



## hdi (15. Apr 2009)

Da deine Variablen alle global in der Klasse definiert sind kann mit der reserve() Methode kein Mensch was anfangen. Wir können ja nicht raten welche Werte die Variablen haben. Aber hier wäre ein guter Punkt etwas mehr OO reinzubringen. Die Methode zieht sich aus allen Ecken des Codes irgendwelche Variablen, und es nicht einsehbar welchen Wert sie haben, weil du nicht sagen kannst wie oft die schon manipuliert worden sind.


----------



## Das Vi (15. Apr 2009)

Ok ich hab nicht dran gedacht...

Nochmal genaue Problembeschreibung:
Reserve an sich funktioniert, blos werden für mehrere Personen Nummern reserviert, achtet er nicht auf die bereits reservierten Nummern, sondern reserviert sie einfach neu auf den anderen Namen.

Variablen (Mit Kommentaren, was sie machen) hier:


```
static int stellen = 2; // Legt fest, wieviele Stellen die Nummern haben sollen
    static String[] nummern = new String[(new Double(Math.pow(10, stellen))).intValue()];
    boolean[] reserviert = new boolean[nummern.length];
    String[] kunden = new String[nummern.length];
    static String kunde; // Name des Kunden
    static int anzahl; // Legt fest, wieviele Nummern der Kunde reservieren möchte
    int frei = 0; // Solange dieser Wert kleiner als anzahl ist, wird nicht reserviert (um sicherzustellen, dass genug zusammenhängende Nummern frei sind)
    int start = 0; // Legt den Punkt fest, ab dem die Nummern reserviert werden
    static boolean running = true;
    static BufferedReader buffy = new BufferedReader(new InputStreamReader(System.in));
```
reserve-methode mit Kommentaren hier:

```
void reserve() {
        if ( anzahl > (nummern.length/10)) // Prüft, ob die gewünschte Anzahl nicht zu groß ist
        {
            JOptionPane.showMessageDialog(null, "So viele Nummern stehen nicht zur Verfügung.");
        }
        else
        {
        while ( frei < anzahl )  
        { 
        if ( anzahl < 10 ) // Wenn anzahl < 10 soll immer die letzte Stelle der Nummer fortlaufend sein
        {
            for ( int i = 0; i < nummern.length; i++)
            {
                if ( reserviert[i] == true ) // Wenn die Nummer reserviert ist, muss von min. i+1 angefangen werden
                {
                    frei = 0;
                    start = i + 1;
                }
                else
                {
                    frei++;
                }
                
            }
        }
        else
            if ( anzahl >= 10 ) // Wenn anzahl >= 10 soll immer die vorletzte Stelle der Nummer fortlaufend sein
            {
                for ( int i = 0; i < nummern.length; i += 10 )
                {
                    if ( reserviert[i] == true ) // S.o.
                    {
                        frei = 0;
                        i++;
                        start = i + 10;
                    }
                    else
                    {
                        frei++;
                    }
                }
            }
        }

        {
            if ( anzahl < 10 ) // Startet, wenn frei = anzahl 
            {
                for ( int i = start; i < anzahl; i++) // S.o.
                {
                    reserviert[i] = true; // Nummer wird reserviert
                    kunden[i] = kunde; // Dazugehöriger Kunde wird eingetragen
                }
            }
            else
            {
                for ( int i = start; i < anzahl*10; i += 10 ) // S.o.
                {
                    reserviert[i] = true;
                    kunden[i] = kunde;
                }
            }
                
        }
    }
    }
```

Erschliesst es sich euch jetzt ?^^
(ich will übrigens nicht meine herangehensweise ändern, ich will einfach nur, dass es das tut, was ich will, also bitte nicht sagen, ich soll mehr OO reinbringen oder so, das hilft mir wirklich nicht weiter. In diesem Fall muss ich nur wissen, was mit meiner reserve-methode nicht stimmt, warum die Prüfung nicht funktioniert)


----------



## hdi (15. Apr 2009)

> ich will übrigens nicht meine herangehensweise ändern, ich will einfach nur, dass es das tut, was ich will



Das ist ein Widerspruch.
So wie du es jetzt gecodest hast macht das ganze keinen Sinn. Was ist denn, wenn zwei Kunden etwas reservieren? Kannst du mir danach sagen, welcher Kunde was reserviert hat? Ne, denn du hast nur ein reserved-array. Du kannst mir nicht mal sagen, was der letzte Kunde reserviert hat.
Also das tun, "was du willst", wird dieses Programm niemals solange du nicht mit OO anfängst. (Es sei denn du fängst an es noch grottiger zu machen und 324 globale Variablen anzulegen) Du brauchst nun mal mehrere Instanzen für Reservierungen auf mehreren Kunden. Das ganze kann man so einfach in die Tonne treten.

Fang an, das objektorientert anzugehen (oder lass es gleich). Du brauchst eine Klasse Kunden, die sich eine Liste reservierter Artikel speichert, sowie eine globale Klasse, die alle Kunden hält und Reservierungen managen kann.


----------



## Das Vi (15. Apr 2009)

> Was ist denn, wenn zwei Kunden etwas reservieren? Kannst du mir danach sagen, welcher Kunde was reserviert hat? Ne, denn du hast nur ein reserved-array.


Doch kann ich ^^ dafür ist das Kunden array, welches genauso groß ist wie das nummern array, bei dump wird dann das nummern array, das reserved array und das kundenarray ausgegeben (nebeneinander) sodass man weiß, welche nummer von welchem kunden reserviert wurde.



> Du kannst mir nicht mal sagen, was der letzte Kunde reserviert hat.


Das tut auch nicht not ^^

Der Grund, warum ich meine Herangehensweise nicht ändern will/kann, ist, dass ich einfach nicht genug Zeit zur Verfügung habe, um nochmal von vorne zu beginnen. Das mit der Kundenklasse und so kann ich ja immer noch machen, wenn das Programm erstmal grob läuft. Das wäre ja nur eine nette Erweiterung, aber ist nicht zwingend nötig, doch bevor ich nicht das, was zwingend nötig ist, zum Laufen kriege, kann ich mich nicht um die weniger wichtigen Sachen kümmern.


----------



## hdi (15. Apr 2009)

...aber der Punkt ist, dass es viel leichter und schneller geht das OO zu lösen, als jetzt irgendwie versuchen zu wollen dass ganze in diesem Stil mit Ach und Krach geradezubiegen.

Wieviel Zeit hast du denn noch? 12 Minuten? 3 Stunden? 1 Tag? Ist das Programm eigentlich so schon "fertig", oder kommen da noch weitere Features hinzu?


----------



## The_S (15. Apr 2009)

hdi hat gesagt.:


> ...aber der Punkt ist, dass es viel leichter und schneller geht das OO zu lösen, als jetzt irgendwie versuchen zu wollen dass ganze in diesem Stil mit Ach und Krach geradezubiegen.



Glaub ich nicht, wenn man gerade erst 4 Tage (Java) programmiert. OO-Denken ist imho ein langwieriger Prozess, der sich beim Programmieren nach und nach "entwickelt". Das kann man nicht einfach von jetzt auf gleich erlernen und/oder anwenden. Gut Code will weile haben  .

Und so viel ist es ja jetzt auch nicht mehr. Es sei denn da kommen noch mehr Features hinzu!?


----------



## Das Vi (15. Apr 2009)

Das Programm ist im Grunde genommen fast fertig.
Was gefordert war:

Eine dump methode, die ausgibt, welche Nummern von welchem Kunden reserviert sind

Eine reserve methode über die man für einen Kunden x Nummern reservieren kann

Eine unreserve methode über die man reservierte Nummern wieder freigeben kann

Was bisher funktioniert:

dump methode

reserve insoweit, dass man schonmal reservieren kann - die methode ist strohdoof, sie schaut nicht, dass kein großer zusammenhängender nummernblock zerrissen wird, sondern vergibt die nummern einfach nach dem schema 0000-0001-0002 bzw. 0010-0020-0030 (letzteres bei mehr als 9 nummern die auf einmal bestellt werden)
bei der reserve methode ist momentan das problem, dass einfach die prüfung scheinbar nicht funktioniert, ich weiß nur nicht, woran es liegt

unreserve methode kommt noch, die ist ja auch nicht so schwer zu implementieren.

Zeit habe ich noch bis Freitag, bloß ich hab am Samstag angefangen, mich mit Java zu beschäftigen (warum ich das erst so spät gemacht hab tut ja nichts zur sache) und bis ich mich jetzt noch mit OO und sonstwas auseinandergesetzt habe und das neu aufgesetzt habe ist Freitag schon längst vergangen ^^

Das, was ich jetzt zustande brachte habe ich übrigens teilweise zusammen mit den Mitarbeitern hier erarbeitet und die haben auch nicht rumgenörgelt, dass das zu Wirr ist - Es zählt schließlich nur, dass es irgendwie funktioniert und nicht, dass es schön aussieht.

EDIT SAGT: Danke The_S

EDIT 2 SAGT: @The_S ich hab vor vier Tagen mit Java angefangen, nicht mit dem Programmieren an sich  In Pascal hätte ich das geforderte Programm vermutlich innerhalb von 3 Stunden Problemlos aufsetzen können, bloß Java ist ziemlich anders als Pascal (wie ich finde)


----------



## byte (15. Apr 2009)

icarus2 hat gesagt.:


> Das "Zurükspringen" nennt man Back-Tracking.



Backtracking ist was anderes.


----------



## The_S (15. Apr 2009)

Das Vi hat gesagt.:


> Das, was ich jetzt zustande brachte habe ich übrigens teilweise zusammen mit den Mitarbeitern hier erarbeitet



Äh, Einspruch. Hier gibt es keine "Mitarbeiter". Jeder der dir hilft, tut das völlig freiwillig, unendgeltlich und in seiner Freizeit (bzw. hofft, dass der AG ihn nicht erwischt  ).



Das Vi hat gesagt.:


> und die haben auch nicht rumgenörgelt, dass das zu Wirr ist



Ehrlich gesagt, habe ich mir deinen Code noch nie richtig angeguckt (evtl. mal überflogen), sondern dir nur allgemeine Tipps gegeben. Um da noch mal richtig durchzusteigen braucht es wirklich Zeit (die ich mometan nicht habe, was aber nötige wäre, um dir weiter zu helfen), eben weil das schon ein wenig wirr ist.



Das Vi hat gesagt.:


> Es zählt schließlich nur, dass es irgendwie funktioniert und nicht, dass es schön aussieht.



Für wen programmierst du das? Wenn du das beruflich machst, dann zählt keineswegs nur die "Funktion". Sollte das nur ein Schulprojekt sein und du willst Java danach nie wieder anrühren, OK. Aber wenn du halbwegs ernsthaft programmieren willst, zählt die Struktur sehr wohl. Alle Gründe aufzuzählen wäre jetzt zu viel, aber ich schmeiß mal ein paar Stichworte in den Raum: Fehleranfälligkeit, Wartbarkeit, Verständlichkeit.



Das Vi hat gesagt.:


> EDIT SAGT: Danke The_S



Bitte, mein Einstieg in die Progarmmierung (Java war meine erste Sprache) war auch recht chaotisch  . Von daher weiß ich, wovon ich rede (zumindest in diesem Fall mal ausnahmsweise).



Das Vi hat gesagt.:


> EDIT 2 SAGT: @The_S ich hab vor vier Tagen mit Java angefangen, nicht mit dem Programmieren an sich  In Pascal hätte ich das geforderte Programm vermutlich innerhalb von 3 Stunden Problemlos aufsetzen können, bloß Java ist ziemlich anders als Pascal (wie ich finde)



Hab jetzt noch nix in Pascal gemacht, aber wenn einmal der Groschen beim Programmieren gefallen ist, sollte es an der Logik nicht mehr scheitern. Andere Sprachen haben lediglich eine andere Syntax. Und wenn du nicht gerade ein neues Konzept mit lernst (z. B. OOP, die du hier aber ohnehin unter den Tisch kehrst), sollte ein Umstieg bzw. eine Eingewöhnung bei einem solch einfachen Programm nicht so übermäßig anspruchsvoll sein.



Das Vi hat gesagt.:


> In Pascal hätte ich das geforderte Programm vermutlich innerhalb von 3 Stunden Problemlos aufsetzen können



Ich werfe jetzt einfach mal in den Raum, dass jeder, der dir bis jetzt hier geholfen hat, die gewünschten Funktionalitäten sauber strukturiert und mit OOP in max 30 Minuten programmieren kann  .


----------



## Das Vi (15. Apr 2009)

> Äh, Einspruch. Hier gibt es keine "Mitarbeiter". Jeder der dir hilft, tut das völlig freiwillig, unendgeltlich und in seiner Freizeit (bzw. hofft, dass der AG ihn nicht erwischt ;-) ).


Mit Mitarbeitern meinte ich die Leute hier in der Firma an meinem Schreibtisch xD



> Für wen programmierst du das? Wenn du das beruflich machst, dann zählt keineswegs nur die "Funktion". Sollte das nur ein Schulprojekt sein und du willst Java danach nie wieder anrühren, OK. Aber wenn du halbwegs ernsthaft programmieren willst, zählt die Struktur sehr wohl. Alle Gründe aufzuzählen wäre jetzt zu viel, aber ich schmeiß mal ein paar Stichworte in den Raum: Fehleranfälligkeit, Wartbarkeit, Verständlichkeit.


Das Programm ist für ein Praktikum weil ich hier meine Ausbildung zum Fachinformatiker im Bereich Anwendungsentwicklung machen will.
Um es richtig zu lernen mach ich ja dann die Ausbildung ^^


> Ich werfe jetzt einfach mal in den Raum, dass jeder, der dir bis jetzt hier geholfen hat, die gewünschten Funktionalitäten sauber strukturiert und mit OOP in max 30 Minuten programmieren kann ;-) .


Ja kann gut sein, ich bin ja auch noch Schüler und hab meine Programmierkenntnisse entweder aus dem (nicht allzu guten) Informatik Unterricht oder aus Büchern


----------



## The_S (15. Apr 2009)

Aso, dann hatte ich das falsch verstanden.

Mein Tipp: Programmiers doch mal in Pacal. Evtl. tust du dir dann leichter, die Funktionen nur in Java nachzubilden.


----------



## Das Vi (15. Apr 2009)

Nunja der Arbeitgeber arbeitet halt nur mit Java und mir wurde gesagt ich soll es in Java schreiben und ich glaube nicht, dass es mir helfen würde, das erst in Pascal unter Delphi mit GUI und so zu schreiben und das ganze dann auf Java unter Eclipse mit Console-Interface zu übersetzen


----------



## The_S (15. Apr 2009)

Du musst doch keine GUI machen. Du sollst dir nur die Strukturen und Funktionen von dort abgucken. Ich weiß ehrlich gesagt nicht, ob sich hier noch mal jemand aufraffen kann, deinen Code zu überarbeiten oder durchzugucken.


----------



## Das Vi (15. Apr 2009)

Naja so kompliziert ist der code garnicht (außerdem ist er ja auch kommentiert, sodass man es eigl recht leicht versteht)
sieht verdammt wirr aus, ist aber an sich nicht viel mehr als ein paar if abfragen in einer while schleife


----------



## maki (15. Apr 2009)

Standardsatz: Schlecht geschriebenen Code zu kommentieren ist Zeitverschwendung, guter Code braucht keine Kommentare 

Das war es was ich meinte mit mehr Methoden die sprechende Namen haben, selbiges gilt übrigens für Variablen.

Nur anhand diese geposteten Fragments wird keiner in der Lage sein da Ordnung reinzubringen, aber selbst wenn du den kompletten Code reinstellst ist es keine Garantie dass sich jemand deiner annimmt, ist nämlich verdammt schwer zu lesen.


----------



## Das Vi (15. Apr 2009)

Ordnung soll auch garnicht reingebracht werden ^^
Ich bräuchte nur jemanden, der ein wenig mehr Java erfahrung hat und mir evtl sagen kann, warum die Prüfung in der reserve() methode nicht das tut, was sie tun soll.
(Soll nicht irgendwie befehlsmäßig klingen, es ist nur eine bitte  )


----------



## hdi (15. Apr 2009)

Also natürlich kann man nicht erwarten dass jetzt eine 4-Tage-Java-Jungfrau die krassesten Design-Pattern verschachtelt. Aber.. so ist das hier auch nicht. In diesem Bsp heisst OO lediglich Kapselung, und das würde es ihm extrem erleichtern.

Also Vi, hier mal ein Grundgerüst. Die Klassen Kunde und KundenArchiv sind fertig, nur in die main-Methode musste halt jetzt wieder anpassen. Aber das kriegste wohl hin. Jetzt sind diese ganzen Reservierungsdaten gekapselt und du kannst dich in der main() lediglich darum kümmern den Programmablauf zu steuern, aber da steckt jetzt kaum was an Logik drin.


```
public class Kunde{
private String name;
private List<Integer> reservations;

public Kunde(String name){
   this.name = name;
   reservations = new ArrayList<Integer>();
}

public String getName(){
   return name;
}

public void addReservation(int nr){
   reservations.add(nr);
}

public List<Integer> getReservations(){
   return reservations;
}
}
```


```
public class KundenArchiv{

   private List<Kunde> kunden;

   public KundenArchiv(){
        kunden = new ArrayList<Kunde>();
   }
 
   public void addKunde(Kunde k){
        kunden.add(k);
   }

   public boolean isReserved(int nr){ 
        for(Kunde k : kunden){ 
           for(int i : k.getReservations()){
                if( i == nr ){ 
                   return true;
                }
            }
         }
         return false;
     }

     @Override
     public String toString(){
          StringBuilder sb = new StringBuilder();
          sb.append("--- Kunden-Archiv ---\n");
          for(Kunde k : kunden){ 
              sb.append(k.getName()+ " hat folgende Nummern reserviert:\n");
              for(int i : k.getReservations()){
                 sb.append("\t"+i+"\n");
              }
          }
          return sb.toString();
      }
}
```


```
public class ReservationProcess {

	public static void main(String[] args) {

		KundenArchiv archiv = new KundenArchiv();

		while (true) {
			// Hier geht dein ganzes Einlese-Zeugs los -> cmd einlesen

			boolean cmdWasDumped = true;
			if (cmdWasDumped) {
				System.out.println(archiv);
			}

			boolean cmdWasReserve = false;
			if (cmdWasReserve) {
				boolean more = false;
				do {
					String eingelesenerName = ""; // getNextLine()
					Kunde k = new Kunde(eingelesenerName);
					archiv.addKunde(k);

					// Nummer einlesen
					int eingeleseneNummer = 123; // getNextLine()
					if (!archiv.isReserved(eingeleseneNummer)) {
						k.addReservation(eingeleseneNummer);
						System.out.println("Reservierung getätigt.");
					} else {
						System.out.println("Nummer schon vergeben.");
					}

					// nochmal-Abfrage hierhin, dann auswerten und die Antwort
					// an
					// more zuweisen.
				} while (more);
			}
		}
	}
}
```

Das ist jetzt nur so hingerotzt, aber es soll dir die Idee von OO zeigen. zB wird hier nicht überprüft ob es einen Kunden schon gibt usw. Und es gibt auch kein Limit für Kunden oder Nummern. Es geht einfach nur darum: Du solltest mehrere Klassen erstellen, die sich selbst organisieren.


----------



## Das Vi (15. Apr 2009)

ich warte mal nochmal ab, ob sich noch irgendwas ergibt (bin noch in nem chat oder ich frag nochmal die kollegen hier) aber wenn das nichts wird, dann werde ich es mit den klassen und so machen. ist mir nur einfach zu kompliziert, weil ich dann alles umstrukturieren müsste und das wahrsch. noch mehr aufwand wäre, als das andere (zumindest für mich)
Hilft mir aber auf jeden Fall weiter, weil ich so evtl mal ein bisschen mehr von Klassen und Objekten und so in Java verstehen werde.
Vielen Dank dafür


----------



## Antoras (15. Apr 2009)

Da Java eine objektorientierte-Programmiersprache ist bezweifle ich, dass du hier viele Leute finden wirst, die sich deinem Code annehmen werden.

Ich hab den mal durchgelesen und den Sinn von den meisten der Anfragen da drin nicht verstanden. Aber zu deinem Problem:

```
if ( anzahl < 10 ) // Startet, wenn frei = anzahl 
            {
                for ( int i = start; i < anzahl; i++) // S.o.
                {
                    reserviert[i] = true; // Nummer wird reserviert
                    kunden[i] = kunde; // Dazugehöriger Kunde wird eingetragen
                }
            }
```
Wie soll das funktionieren? So wie ich das sehe, machst du hier bei einer mehrfach-Reservierung nichts anderes, als sowohl das Kunden- als auch das reserviert-Array hochzuzählen und zu ÜBERSCHREIBEN. i fängt ja immer bei start an...
Ich würde dir hier lieber ein zweidimensionales-Array empfehlen und alle neuen Kunden einer Reservierung zuweisen.


----------



## hdi (15. Apr 2009)

So, das Programm ist jetzt voll ausführbar und funktioniert. Noch immer gilt aber: Man kann unendlich viele Kunden erstellen, und unendlich viele Nummern reservieren. Allerdings solltest du das wirklich hinkriegen können. Wenn nicht, frag nach. 
Kuck dir den Code in Ruhe, Zeile für Zeile, an. Wenn du etwas nicht verstehst, sag Bescheid. Du sollst ja auch was lernen und nicht nur copy&pasten.


```
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class ReservationProcess {

	private static KundenArchiv archiv;
	private static BufferedReader reader;

	public static void main(String[] args) {

		// initialize program
		archiv = new KundenArchiv();
		reader = new BufferedReader(new InputStreamReader(System.in));

		// start
		while (true) {
			System.out.println("Bitte Befehlsnummer eingeben:");
			System.out.println("1 - Dump");
			System.out.println("2 - Reserve");
			System.out.println("3 - Exit Program");

			int cmd = 0;
			boolean inputOkay = true;
			try {
				cmd = Integer.parseInt(reader.readLine());
			} catch (NumberFormatException e) {
				inputOkay = false;
			} catch (IOException e) {
				inputOkay = false;
			}
			if (!inputOkay) {
				System.out.println("Ungültiger Befehl.");
			} else {
				switch (cmd) {
				case 1:
					dump();
					break;
				case 2:
					reserve();
					break;
				case 3:
					exit();
					break;
				}
			}
		}
	}

	private static void dump() {
		System.out.println(archiv);
	}

	private static void reserve() {
		boolean more = false;
		do {
			System.out.print("Bitte Kunden-Namen eingeben: ");
			String name;
			try {
				name = reader.readLine();
			} catch (IOException e) {
				System.out.println("Es ist ein Fehler aufgetreten.");
				return;
			}

			Kunde k = new Kunde(name);
			if (!archiv.hasKunde(k)) {
				k = new Kunde(name);
				archiv.addKunde(k);
			} else {
				k = archiv.getKunde(name);
			}

			System.out.println("Wieviele Artikel möchten Sie reservieren?");
			try {
				int amount = Integer.parseInt(reader.readLine());
				for (int i = 0; i < amount; i++) {
					System.out.print("Bitte " + (i + 1)
							+ ".te Reservierung eingeben: ");
					int nr = Integer.parseInt(reader.readLine());
					if (archiv.isReserved(nr)) {
						System.out
								.println("Diese Nummer wurde bereits reserviert.");
						return;
					} else {
						k.addReservation(nr);
						System.out.println("Reservierung getätigt.");
					}
				}

			} catch (NumberFormatException e) {
				System.out.println("Es ist ein Fehler aufgetreten.");
				return;
			} catch (IOException e) {
				System.out.println("Es ist ein Fehler aufgetreten.");
				return;
			}

			System.out
					.println("Wollen Sie noch eine weitere Reservierung tätigen? (Bitte true oder false eingeben)");
			try {
				more = Boolean.parseBoolean(reader.readLine());
			} catch (IOException e) {
				System.out.println("Es ist ein Fehler aufgetreten.");
				return;
			}
		} while (more);
	}

	private static void exit() {
		System.out.println("Auf Wiedersehen.");
		System.exit(0);
	}
}
```


```
import java.util.ArrayList;
import java.util.List;

public class KundenArchiv {

	private List<Kunde> kunden;

	public KundenArchiv() {
		kunden = new ArrayList<Kunde>();
	}

	public void addKunde(Kunde k) {
		kunden.add(k);
	}

	public boolean hasKunde(Kunde k) {
		return kunden.contains(k);
	}

	public Kunde getKunde(String name) {
		for (Kunde k : kunden) {
			if (k.getName().equalsIgnoreCase(name)) {
				return k;
			}
		}
		return null;
	}

	public boolean isReserved(int nr) {
		for (Kunde k : kunden) {
			for (int i : k.getReservations()) {
				if (i == nr) {
					return true;
				}
			}
		}
		return false;
	}

	@Override
	public String toString() {
		StringBuilder sb = new StringBuilder();
		sb.append("--- Kunden-Archiv ---\n");
		for (Kunde k : kunden) {
			sb.append(k.getName() + " hat folgende Nummern reserviert:\n");
			for (int i : k.getReservations()) {
				sb.append("\t" + i + "\n");
			}
		}
		return sb.toString();
	}
}
```


```
import java.util.ArrayList;
import java.util.List;

public class Kunde {
	private String name;
	private List<Integer> reservations;

	public Kunde(String name) {
		this.name = name;
		reservations = new ArrayList<Integer>();
	}

	public String getName() {
		return name;
	}

	public void addReservation(int nr) {
		reservations.add(nr);
	}

	public List<Integer> getReservations() {
		return reservations;
	}

	@Override
	public boolean equals(Object other) {
		if (!(other instanceof Kunde))
			return false;
		return ((Kunde) other).name.equalsIgnoreCase(this.name);
	}
}
```


----------



## Das Vi (15. Apr 2009)

sry aber das Programm per Copy&Paste einzufügen und zu sagen, es sei meins kann ich echt nicht machen
Wenn das rauskommen würde, könnt ich die Ausbildungsstelle vergessen...
EDIT SAGT: werd ich jetzt nicht durchlesen, weil keine zeit und so, aber ich mach es 100%, weil ich glaube, dass ich da viel von lernen kann ^^
Danke, dass du dir die Mühe gemacht hast, ich weiß es auf jeden Fall zu schätzen


----------



## maki (15. Apr 2009)

Das Vi hat gesagt.:


> sry aber das Programm per Copy&Paste einzufügen und zu sagen, es sei meins kann ich echt nicht machen
> Wenn das rauskommen würde, könnt ich die Ausbildungsstelle vergessen...


Verständlich, aber sich hinzustellen und zu sagen "löst mein Problem, aber ich strukturiere mein Prog nicht damit es leserlich/verständlich wird" ist auch nicht viel besser 

Vielleciht hilft dir Antoras Post.


----------



## Matt (15. Apr 2009)

hmm ^^ wasn das fürn Projekt genau? also ich seh noch net das eigl. was dein Prog machen soll. Nunja und Pascal hin oder her  Programmieren ist Programmieren xD das einzige was einen zu schaffen machen kann ist Syntax aber dafür gibts ja INET 


Achja und die Aussage jezz mal projekt machen und rest in Ausbildung lernen find ich doch recht schade ^^ und was Java angeht - me hatte vor java immer das prob das firmen die Coder suchten immer Java vorausgesetzt haben - kA wieso xD nun ja und wenn man es erstmal aktiv macht erkennt man doch wie fein es ist...

achja zu deinem Programm da xD wie gesagt die eig. methoden kannt ich ja net weil di ehier nie gepostet wurden. Aber ich hab dir mal innerhalb von knapp 12min mal den Code runtergeballert ^^ schön fein in OO mit zwei Klassen einmal Service und einmal Kunde. Und eine vollgeballert main klasse xD mit einer feinen  Menüstruktur für die Konsole xD - wenn man das erst mal xmal gemacht hat geht das wie von allein

hier mal direkt zum angucken die drei klassen:

*kunde.java*

```
public class kunde extends service {
    private int kundennummer;
    
    kunde(){
    }
    
    kunde(int nummer){
        kundennummer = nummer;
    }
    
    public int getKundennummer(){
        return kundennummer;
    }
}
```

*Die service.java*

```
public class service {
    private int anzahl;
    
    service(){
        anzahl = 0;
    }
    
    public void setAnzahl(int neueanzahl){
        anzahl = neueanzahl;
    }
    
    public int getAnzahl(){
        return anzahl;
    }
}
```

*und natürlich die Main klasse die alles ausführt ^^ (vorsicht dein Code von ganz oben ist noch drin, aber auskommentiert)*

cmain.java


```
import java.io.*;
import java.util.*;


public class cmain {

    public static void howmany(){
        System.out.println("Wieviele Produkte wollen sie resrvieren lassen?");
    }
    
    public static void showall(List<kunde> KundenListe){
        for(int i = 0; i < KundenListe.size();i++){
            kunde costumer = KundenListe.get(i);
            System.out.println("KundenNr: "+costumer.getKundennummer()+" - Anzahl: "+costumer.getAnzahl());
            System.out.println("--------------------------------------");
        }
    }
    
    public static void showone(kunde costumer){
        System.out.println("KundenNr: "+costumer.getKundennummer()+" - Anzahl: "+costumer.getAnzahl());
        System.out.println("--------------------------------------");
    }
    
    public static void showmenu(){
        System.out.println();
        System.out.println();
        System.out.println();
        System.out.println("-----Kunden Service--------");
        System.out.println("---------------------------");
        System.out.println("-------Befehlsliste--------");
        System.out.println("Neuer Kunde ----------- new");
        System.out.println("Neue Reservierung - reserve <KundenNr>");
        System.out.println("Reservierung auf Aktuellen Kunden - reserve");
        System.out.println("Ausgabe ----- show <KundenNr>");
        System.out.println("Alle Daten zeigen ---- show");
        System.out.println("Beenden -------------- exit");
    }
    
    public static String getCmdIn() throws IOException{
        System.out.println("--------------------------------");
        System.out.println("Eingabe mit Return abschliessen!");
        System.out.print("Eingabe: ");
        BufferedReader reader = new BufferedReader(new InputStreamReader( System.in ));
        return reader.readLine();
    }
    
    /**
     * @param args
     * @throws IOException 
     * 
     */
    public static void main(String[] args) throws IOException {        
       
        String command = "";
        int nummer = 1;
        List<kunde> KundenListe = new ArrayList<kunde>();
        
        while(!command.equals("exit")){
            try{
                
            
                showmenu();
                command = getCmdIn();
                if(command.length()<3){
                    command = "                     ";
                }
                else if(command.equals("new")){
                    kunde costumer = new kunde(nummer); //Neue Instanz anlegen
                    KundenListe.add(costumer); //Instanz in List aufnehmen
                    System.out.println("Kunde mit KundenNr "+nummer+" wurde angelegt!");
                    System.out.println("---------------------------------------------");
                    nummer++;
                }
                else if(command.substring(0,4).equals("show")){
                    if(command.length() > 5){
                        showone(KundenListe.get(Integer.parseInt(command.substring(5))-1)); //Zeige den einen Kunden
                        
                    } else {
                        showall(KundenListe); //Zeige alle Kunden
                    }
                }
                else if(command.substring(0,7).equals("reserve")){
                    if(command.length() > 8){
                        int tempNr = Integer.parseInt(command.substring(8)); 
                        if(tempNr <= nummer){
                            //Reserviere ein Produkt für Kunden der auf Kundennummer zutrifft, sofern KundenNr existiert
                            howmany();
                            String anzahl = getCmdIn();
                            kunde costumer = KundenListe.get(tempNr-1);
                            costumer.setAnzahl(Integer.parseInt(anzahl));
                            System.out.println("Für die KundenNr: "+costumer.getKundennummer()+" wurden "+costumer.getAnzahl()+" Produkte reserviert");
                        }
                        else{
                            System.out.println("---------------------------------------");
                            System.out.println("FEHLER: KundenNr existiert nicht!");
                            System.out.println("---------------------------------------");
                        }
                        
                    } else {
                        //Reserviere ein Produkt für Aktuellen Kunden
                        howmany();
                        String anzahl = getCmdIn();
                        kunde costumer = KundenListe.get(nummer-2);
                        costumer.setAnzahl(Integer.parseInt(anzahl));
                        System.out.println("Für die KundenNr: "+costumer.getKundennummer()+" wurden "+costumer.getAnzahl()+" Produkte reserviert");
                    }
                }
            }catch(Exception ex){
                System.out.println(ex.getMessage());
            }
        }
        
        
        
        /*
        for (int i = 0; i < nummern.length; i++)
        {
            nummern[i] = String.format("%0" + stellen + "d", i);            
        }
        
        String kunde = null;
        int anzahl = 0;
        ReservationSystem r = new ReservationSystem(kunde, anzahl);
 
        while (true) {
            String cmd = null;
            while (cmd == null) {
                System.out.println("Bitte Befehl eingeben: ");
                System.out.println("1. dump");
                System.out.println("2. reserve");
                try {
                    cmd = getNextLine();
                } catch (IOException e) {
                    // ignore
                }
                if (!"dump".equals(cmd.trim().toLowerCase()) &&
                        !"reserve".equals(cmd.trim().toLowerCase())) {
                    System.out.println("Befehl ungültig!");
                }
            }
            
            
            if ("dump".equals(cmd.trim().toLowerCase())) {
                r.dump();
            }
            else if ("reserve".equals(cmd.trim().toLowerCase())) {
                System.out.print("Bitte Namen eingeben: ");
                try {
                    kunde = getNextLine();
                    r.setKunde(kunde);
                } catch (IOException e) {
                    break;
                }
                System.out.print("Wieviele Nummern möchten Sie reservieren? ");
                    try {
                        anzahl = Integer.parseInt(getNextLine());    
                    } catch (IOException e) {
                        break;
                    }
                    r.setAnzahl(anzahl);
                    r.reserve();
                    
                    System.out.println("Mehr ?");
                    String ans;
                    try {
                        ans = getNextLine();
                    } catch (IOException e) {
                        break;
                    }
                    
 
                    if ("yes".equals(ans.trim().toLowerCase()) || 
                        "ja".equals(ans.trim().toLowerCase()) ||
                        "y".equals(ans.trim().toLowerCase())) {
                        System.out.println("Ok. Lets fetz.");
                        
                    }
                    else if ("no".equals(ans.trim().toLowerCase()) ||
                            "nein".equals(ans.trim().toLowerCase()) ||
                            "n".equals(ans.trim().toLowerCase()))
                    {
                        System.out.println("Vielen Dank für Ihre Bestellungen!");                
                        break;
                    }
            }
            
 
            
        }    */
    }

}
```

Hab dir auch mal alles eingepackt und in mein Trash vereichnis gepackt  ist ja Trash xD
Hier der Link zum downloaden: mrwn.de/trash/codes/Kundenservice.rar

Alle weiteren Methoden die du ja hast kannst ja implementieren - hoffe das dir das implementieren nicht zu schwer wird xD


Achja bisher kann die Klasse 2^31 Objekte zur laufzeit erzeugen kA glaub sind irgendwas mit 2milliarden kunden ^^ und du hast auch so einige befehle wie "reserve" um eine anzahl an produkten dem kunden zu zu ordnen und den Befehl "show" um alle bisherigen Kunden anzuzeigen usw....natürlich sind alle kunden nur solang gespeichert wie das programm läuft ^^ da hilft es vllt entweder diese in datenbanken zu schreiben oder Dateien ^^

bla bla wenn du noch mehr ideen oder infos brauchst meld dich ruhig ^^ hab heute nen freien tag und wollte ma schauen was ich im forum machen kann 

Matt


----------



## hdi (15. Apr 2009)

@Matt

Wir haben ihm vorher gesagt dass man Klassen-Namen gross schreibt und du zeigst es ihm jetzt wieder falsch


----------



## Matt (15. Apr 2009)

hdi hat gesagt.:


> @Matt
> 
> Wir haben ihm vorher gesagt dass man Klassen-Namen gross schreibt und du zeigst es ihm jetzt wieder falsch



ach damn ^^ naja war halt so geschrieben nur xD da hab ich einfach net aufgepasst und das mit den unendlich nummern ist ja auch net drin also kann man es verwerfen und demnoch hast du ja schon das selbe mit erweiterung xD also verwirf meins einfach xD

und naja  trotzdem - der Herr sollte (auch wenn es wenig ist) sich die zeit nehmen die er hat....sonst steht er am ende mit nix da


----------



## Das Vi (15. Apr 2009)

Leute vielen Dank für eure Hilfe, ich hab das Programm jetzt auf jeden Fall erstmal zum Laufen gebracht (unter Zuhilfenahme eines Mitarbeiters und eines Java-Chats)
Problem ist soweit gelöst, es war lediglich ein kleiner semantikfehler mit großen auswirkungen.
Fred kann geschlossen werden denk ich, da Problem ja gelöst 
nochmal DANKESCHÖN!!!


----------

