Wie kann ich die Funktionen meiner Lagerverwaltung in Java erneut anzeigen lassen?
Hey zusammen!
Ich mache aktuell einen Kurs zur Programmiererin in Java und stehe noch am Anfang.
Aufgabe war es, eine Lagerverwaltung mit maximal 75 Kisten, einigen Funktionen und einem mehrdimensionalen Array zu erstellen.
Mittlerweile habe ich etwas zusammengebracht, jedoch scheitert es nun nur noch an einem Punkt:
Wenn ich das Programm starte kann ich eine Funktion auswählen und die Daten einer Kiste z.B. eingegeben. Jedoch startet dann immer wieder die gleiche Funktion und nicht erneut die Abfrage, welche Funktion gewählt werden soll. Wie kann ich einstellen, dass nach jeder Eingabe erneut nach der Funktion gefragt wird?
Ich hoffe es ist verständlich erklärt. Leider kann ich den kompletten Quelltext nicht rein kopieren. Es wird mir als zu lang angezeigt. Daher nur der Part mit der Funktionsauswahl. Vielleicht reicht das ja schon.
public static void main(String[] args) {
// Die Vereinbarung des Arrays
int [][] lagerverwaltung = new int[75][4];
// Auswahl der Funktion
String funktionEinlesen;
char funktion;
System.out.println("Folgende Funktionen stehen Ihnen zur Auswahl: \n");
System.out.println("A \t Eingabe einer neuen Kiste");
System.out.println("B \t Löschen einer Kiste");
System.out.println("C \t Ändern einer Kiste");
System.out.println("D \t Daten einer Kiste anzeigen");
System.out.println("E \t Daten aller Kisten anzeigen");
funktionEinlesen = JOptionPane.showInputDialog("Wählen Sie eine Funktion");
funktion = funktionEinlesen.charAt(0);
// Auswahl auswerten
switch(funktion) {
case 'a':
case 'A':
System.out.println("\nSie haben \"Eingabe einer neuen Kiste\" gewählt");
eingabe(lagerverwaltung);
break;
case 'b':
case 'B':
System.out.println("\nSie haben \"Löschen einer Kiste\" gewählt");
löschen(lagerverwaltung);
break;
case 'c':
case 'C':
System.out.println("\nSie haben \"Ändern einer Kiste\" gewählt");
ändern(lagerverwaltung);
break;
case 'd':
case 'D':
System.out.println("\nSie haben \"Daten einer Kiste anzeigen\" gewählt");
anzeigen(lagerverwaltung);
break;
}
System.exit(0);
}
}
2 Antworten
Wenn du den Ablauf in eine Schleife packst:
do {
char funktion;
System.out.println("Folgende Funktionen stehen Ihnen zur
Auswahl: \n");
// ...
switch(funktion) {
case 'a':
/* ... */
case 'Q':
return;
}
}
while (true);
wird das Programm immer wieder wiederholt (so lange der Ausdruck im Schleifenfuß wahr ist, was im obigen Snippet immer der Fall wäre).
Um dennoch eine reguläre Möglichkeit zu haben, das Programm wieder zu beenden, könntest du einen case ergänzen (im obigen Snippet wäre das die Eingabe von Q), bei dem das Programm via return aus main herausspringt (alternativ wäre auch der Aufruf von System.exit möglich).
PS.: Ich würde dir empfehlen, wo möglich Deklaration und Definition immer zusammenzuziehen.
char funktion = funktionEinlesen.charAt(0);
So sparst du Zeilen ein, machst dein Programm kürzer / übersichtlicher und gehst auch eher sicher, eine Variable erst dann zu deklarieren, wann es frühestens notwendig ist.
//Eingabe einer neuen Kiste
static void eingabe (int[][]Eingabe) {
int nummer;
int breite, länge, höhe;
// Kistennummer eingeben mit Überprüfung auf Gültigkeit
do {
nummer=Integer.parseInt(JOptionPane.showInputDialog("Geben Sie eine Kistennummer zwischen 1-75 an"));
//wenn die Nummer gültig ist und noch nicht verwendet wurde, werden die Daten eingegeben
if (nummer>0 && nummer<=Eingabe.length)
if(Eingabe[nummer-1][0]==0) {
//Nummer zuweisen
Eingabe[nummer-1][0]=nummer;
//Werte einlesen
breite=Integer.parseInt(JOptionPane.showInputDialog("Breite der Kiste"));
Eingabe[nummer-1][1]=breite;
länge=Integer.parseInt(JOptionPane.showInputDialog("Länge der Kiste"));
Eingabe[nummer-1][2]=länge;
höhe=Integer.parseInt(JOptionPane.showInputDialog("Höhe der Kiste"));
Eingabe[nummer-1][3]=höhe;
System.out.println("Die Kiste " + nummer + " hat nun die Werte: " + breite + " Breite, " + länge + " Länge, " + höhe + " Höhe." );
}else {
System.out.println("Kiste ist bereits in Verwendung");
System.out.println("Kiste ungültig");
}
}while(nummer>=0 || nummer>Eingabe.length);
}
Vielen Dank! Ich hab es nun geschafft und ich kann jedes Mal eine Funktion aufrufen und habe noch "Programm beenden" hinzugefügt. Nachdem ich nun meine anderen Funktionen überhaupt erstmal testen konnte, habe ich festgestellt das 2 davon nicht funktionieren. Zum einen das Löschen einer vorhandenen Kiste und zum anderen das Anzeigen aller Daten eingegebener Kisten. Daran arbeite ich gerade. Ich habe nun versucht diese Daten mit Hilfe eine verschachtelten for Schleife ausgeben zu lassen. Das funktioniert auch jedoch zeigt er mir nicht nur vorhandene Daten an sondern der kompletten Größe des Arrays - nur mit dem Wert null - so erhalte ich dann letztendlich auch eine Fehlermeldung. Wie zeigt er mir hier nur eingegebene Daten an? Ich komm nicht drauf...
// Anzeigen aller Daten von allen Kisten
static void liste (int[][]Liste) {
for (int indexAussen=0;indexAussen<=Liste.length;indexAussen++) {
for (int indexInnen=0;indexInnen<Liste[indexAussen].length;indexInnen++)
System.out.print(Liste[indexAussen][indexInnen]);
}
}
Das dürfte nicht funktionieren, da dein Index (indexAussen) bis genau zur Länge des Arrays zählt und somit außerhalb des Index-Rahmens gerät.
indexAussen <= Liste.length
Vereinfachtes Beispiel zur Erklärung:
[ 1, 2, 3 ]
Die Arraylänge ist 3, aber da ein Arrayindex in Java stets bei 0 startet, gibt es nur die Indizes 0, 1 und 2. Ein Aufruf eines dritten Index lässt sich nicht verarbeiten.
Wenn du zusätzlich Elemente mit dem Wert null im Array hast, musst du diese überspringen.
static void gibKistenAus(int[][] kisten) {
for (int kistenIndex = 0; kistenIndex < kisten.length; ++kistenIndex) {
if (kisten[kistenIndex] == null) {
continue;
}
for (int detailsIndex = 0; detailsIndex < kisten[kistenIndex].length; ++detailsIndex) {
System.out.print(kisten[kistenIndex][detailsIndex]);
}
}
}
Für den null-Filter reicht ein einfaches if. Entweder man überspringt den restlichen Code des aktuellen Iterationsschritt mit continue oder alternativ könntest du auch die Prüfung negieren und im if-Rumpf die innere Schleife stationieren.
Beachte zudem, dass ich die Bezeichner anders benannt habe. Sie sollten nun etwas deutlicher wiedergeben, was sie tun / wofür sie stehen. Der Kommentar über der Methode sollte damit dann auch hinfällig werden.
Des Weiteren helfen auch mehr Leerzeichen dabei, den Code lesbarer zu gestalten.
Das Programm macht genau, was du dem Programm befiehlst - nicht mehr und nicht weniger. Du sagst dem Programm nie, dass es das ganze wiederholten soll, also tut es das auch nicht.
Die Lösung wäre ein Schleife - for oder while und zwar wie folgt:
while (true) {
System.out.println("Folgende Funktionen stehen Ihnen zur Auswahl: \n");
System.out.println("A \t Eingabe einer neuen Kiste");
System.out.println("B \t Löschen einer Kiste");
System.out.println("C \t Ändern einer Kiste");
System.out.println("D \t Daten einer Kiste anzeigen");
System.out.println("E \t Daten aller Kisten anzeigen");
funktionEinlesen=JOptionPane.showInputDialog("Wählen Sie eine Funktion");
funktion = funktionEinlesen.charAt(0);
// und so weiter und so fort bis zum switch statement (inklusive)
// das System.exit(0) darf natürlich nicht in der
// Schleife sein und ist eigentlich sowieso unnötig
}
Wenn du extra fancy sein willst fügst du eine exit funktion hinzu (zum Beispiel "Q"), bei der dann im switch-case das Programm beendet wird.
Danke für die schnelle Hilfe! Ich hab das nun so gemacht, jedoch macht er immer weiter mit der Funktion die ausgewählt wurde. Bedeutet wenn ich "A" ausgewählt habe, dann gebe ich die Kistennummer, Länge,Breite,Höhe ein und dann beginnt er wieder dass ich eine Kistennummer eingeben soll anstatt dass ich wieder die Funktion auswählen kann.