Wie kann ich die Funktionen meiner Lagerverwaltung in Java erneut anzeigen lassen?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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.

mel0509 
Fragesteller
 30.06.2021, 16:15

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.

0
regex9  30.06.2021, 16:23
@mel0509

Du hast wohl eine Wiederholung in der Methode eingabe eingebaut?

0
mel0509 
Fragesteller
 30.06.2021, 16:26
@regex9
//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);
	
	}
0
regex9  30.06.2021, 16:32
@mel0509

Ja, aufgrund der Schleife dort, wird so lange eine Eingabe gefordert, bis nummer kleiner als 0 ist. Sicherlich sollte der zweite Vergleich im Schleifenfuß eigentlich andersherum (kleiner als) sein.

1
mel0509 
Fragesteller
 30.06.2021, 20:00
@regex9

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...

0
mel0509 
Fragesteller
 30.06.2021, 20:01
@mel0509
// 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]);
	}
	}
0
regex9  30.06.2021, 20:15
@mel0509

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.

0

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.

Woher ich das weiß:Hobby