Mehrdimensionale Arrays

Diskutiere Mehrdimensionale Arrays im Java Basics - Anfänger-Themen Bereich.
F

Fynn

Hallo ich bin totaler Jüngling in Java und habe heute mit mehrdimensionalen Arrays begonnen ich habe die Aufgabe ein Reservierungsprogramm zu schreiben, die lautet:



1. The cinema hall consists of 3 blocks (A, B, C).
2. Each block consists of 4 rows with 10 seats each.
3. People can choose a block, specify the row and then several Reserve seats in this row.
4. The reservation is only successful if the places are not already taken and the Places also exist (formerly Block A row 2 places 2 - 5 exist; Block A row 4 Places 8-11 do not exist; Block D does not exist, etc.).
5. If the reservation was successful, this should be communicated to the software become.


Kann mir jemand tipps geben und Ansätze wie ich mich an so eine Aufgabe hingeben kann? Um selber auf die Lösung zu kommen? Das Problem ist manchmal das ich wirklich gar keine Ahnung habe wo ich jetzt anfangen soll, wie das ganze überhaupt auschauen soll. Danke für jeden Tipp und Hinweis an Vorangehenweisen!
 
H

httpdigest

Naja, es gibt drei Dimensionen:
1. Blöcke
2. Reihen
3. Sitze
Es gibt also insgesamt: `3 Blöcke` x `4 Reihen` x `10 Sitze` Plätze im Kinosaal.
Zusätzlich dazu besteht ein Platz eigentlich nur aus der booleschen Information "reserviert oder nicht reserviert".
Also könnte man das Ganze mit einem dreidimensionalen boolean-Array lösen.
 
T

Tobias-nrw

Das ist auch nicht ganz trivial
Java:
class Kino {
	int ticketnr = 1;
	int[][][] blocks = new int[3][4][10];

	boolean reserveSeats(int n, int block) {
		int mid = 4 - (n / 2);
		for (int i = 0; mid - i >= 0 || mid + i < 10; i++) {
			if (mid - i >= 0 && reserveSeats(n, block, mid - i)) {
				return true;
			}
			if (mid + i < 10 && reserveSeats(n, block, mid + i)) {
				return true;
			}
		}
		return false;
	}

	boolean reserveSeats(int n, int block, int mid) {
		a: for (int i = 0; i < 4; i++) {
			for (int j = 0; j < n; j++) {
				if (mid + j == 10 || blocks[block][i][mid + j] != 0) {
					continue a;
				}
			}
			for (int j = 0; j < n; j++) {
				blocks[block][i][mid + j] = ticketnr;
				ticketnr++;
			}
			return true;
		}
		return false;
	}

	@Override
	public String toString() {
		String s = "";
		for (int i = 0; i < blocks.length; i++) {
			for (int j = 0; j < blocks[i].length; j++) {
				for (int j2 = 0; j2 < blocks[i][j].length; j2++) {
					s += String.format("%02d ", blocks[i][j][j2]);
				}
				s += "\n";
			}
			s += "\n";
		}
		return s;
	}
}
Code:
		Kino kino = new Kino();
		kino.reserveSeats(1, 0);
		kino.reserveSeats(1, 1);
		kino.reserveSeats(1, 2);
		while (kino.reserveSeats(1, 1));
		System.out.println(kino);
Code:
00 00 00 00 01 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 

31 23 15 07 02 11 19 27 35 39 
32 24 16 08 04 12 20 28 36 40 
33 25 17 09 05 13 21 29 37 41 
34 26 18 10 06 14 22 30 38 42 

00 00 00 00 03 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00
/e Typische Sitzverteilung, ein teurer Platz, ein Platz vorn und viele in der Mitte.
 
F

Fynn

boolean reserveSeats(int n, int block, int mid) { a: for (int i = 0; i < 4; i++) { for (int j = 0; j < n; j++) { if (mid + j == 10 || blocks[block][mid + j] != 0) { continue a; } }
ich verstehe nicht ganz was die variable a: macht das hab ich bis jetzt gar nicht gesehen in Java. Was macht das genau und was ist das für eine Schreibmethode?
 
J

JustNobody

Das a ist keine Variable sondern ein Label. Damit bezieht sich das continue auf die äußere Schleife und nicht auf die innere.

Man sollte es evtl. kennen, aber schau es Dir nicht erst im Detail an. Das ist eine absolute Unart und ich habe bisher auch nur eine einzige Person gesehen, die das scheinbar gut findet.
 
F

Fynn

Das a ist keine Variable sondern ein Label. Damit bezieht sich das continue auf die äußere Schleife und nicht auf die innere.

Man sollte es evtl. kennen, aber schau es Dir nicht erst im Detail an. Das ist eine absolute Unart und ich habe bisher auch nur eine einzige Person gesehen, die das scheinbar gut findet.
Okay danke!
 
T

Tobias-nrw

Ja, ich wollte nicht auch noch eine 3. Methode aufstellen.

@temi Diese Aufgabe ist nicht ganz trivial. Wenn er sie nicht versteht, ist über eine leichtere nachzudenken. Nur weil ich das kann heißt das nicht dass auch andere das können.

Dennoch ist Deine Nachfrage natürlich alles andere als schön. Ggf mal den Ton überdenken.
 
H

httpdigest

Diese Aufgabe ist nicht ganz trivial.
Das hängt meiner Meinung nach davon ab, wie man diesen (grammatikalisch nicht korrekten) Satz:
3. People can choose a block, specify the row and then several Reserve seats in this row.
interpretiert.
Meiner Meinung nach ist die zu implementierende Schnittstelle lediglich:
Java:
public boolean reserve(int block, int row, int fromSeat, int toSeat) {...}
 
T

temi

1. The cinema hall consists of 3 blocks (A, B, C).
2. Each block consists of 4 rows with 10 seats each.
3. People can choose a block, specify the row and then several Reserve seats in this row.
4. The reservation is only successful if the places are not already taken and the Places also exist (formerly Block A row 2 places 2 - 5 exist; Block A row 4 Places 8-11 do not exist; Block D does not exist, etc.).
5. If the reservation was successful, this should be communicated to the software become.


Kann mir jemand tipps geben und Ansätze wie ich mich an so eine Aufgabe hingeben kann?
Die ersten beiden Punkte beschreiben die Größe des erforderlichen Arrays. 3 x 4 x 10. Ich würde der Einfachheit halber erst mal ein boolean-Array nehmen (false = Sitz ist frei, true = Sitz ist belegt).

Der dritte Punkt beschreibt im Prinzip die Methodenparameter: block, row, fromSeat, toSeat => reserve(int block, int row, int fromSeat, int toSeat).

Der vierte Punkt sagt aus, dass der Wert für block im Bereich von 1 - 3 sein darf, row im Bereich 1 - 4, fromSeat und toSeat im Bereich von 1 - 10.

Der fünfte Punkt sagt, dass die Methode den Erfolg zurückgeben soll, also boolean reserve(...)

Damit kannst du jetzt eine Klasse schreiben mit dem Array als Instanzvariable und der Methode.

In der Methode würde ich als erstes die Gültigkeit der Parameter prüfen. Damit es übersichtlicher wird evtl. aufgeteilt:

- Wenn block kleiner als 1 oder größer als 3, dann beende die Methode mit false.
- Wenn reihe kleiner als 1 oder größer als 4, dann beende die Methode mit false.
- usw.

Als nächstes musst du prüfen, ob die gewünschten Sitze in block/reihe noch frei sind. Dazu musst du in einer Schleife die Sitze im entsprechenden block/reihe durchgehen. Sobald einer belegt ist, kannst du die Methode mit false verlassen.

Wenn du bis hier gekommen bist, dann sind alle Parameter gültig und die gewünschten Sitze sind frei. Du brauchst jetzt noch eine Schleife über die gewünschten Sitze, um sie im Array auf "true" zu setzen (= belegt).

Danach kannst du die Methode mit "true" verlassen, die Reservierung ist erfolgt.
 
Zuletzt bearbeitet:
T

Tobias-nrw

Ok, dann nimmt mein Code eine "Platzierung" vor die eigentlich nicht gefordert war.
Dann entschuldigt bitte & der @Fynn kann die von euch aufgezeigte Methode einfach "umsetzen". :)
 
F

Fynn

Die ersten beiden Punkte beschreiben die Größe des erforderlichen Arrays. 3 x 4 x 10. Ich würde der Einfachheit halber erst mal ein boolean-Array nehmen (false = Sitz ist frei, true = Sitz ist belegt).

Der dritte Punkt beschreibt im Prinzip die Methodenparameter: block, row, fromSeat, toSeat => reserve(int block, int row, int fromSeat, int toSeat).

Der vierte Punkt sagt aus, dass der Wert für block im Bereich von 1 - 3 sein darf, row im Bereich 1 - 4, fromSeat und toSeat im Bereich von 1 - 10.

Der fünfte Punkt sagt, dass die Methode den Erfolg zurückgeben soll, also boolean reserve(...)

Damit kannst du jetzt eine Klasse schreiben mit dem Array als Instanzvariable und der Methode.

In der Methode würde ich als erstes die Gültigkeit der Parameter prüfen. Damit es übersichtlicher wird evtl. aufgeteilt:

- Wenn block kleiner als 1 oder größer als 3, dann beende die Methode mit false.
- Wenn reihe kleiner als 1 oder größer als 4, dann beende die Methode mit false.
- usw.

Als nächstes musst du prüfen, ob die gewünschten Sitze in block/reihe noch frei sind. Dazu musst du in einer Schleife die Sitze im entsprechenden block/reihe durchgehen. Sobald einer belegt ist, kannst du die Methode mit false verlassen.

Wenn du bis hier gekommen bist, dann sind alle Parameter gültig und die gewünschten Sitze sind frei. Du brauchst jetzt noch eine Schleife über die gewünschten Sitze, um sie im Array auf "true" zu setzen (= belegt).

Danach kannst du die Methode mit "true" verlassen, die Reservierung ist erfolgt.
Danke für Anleitung!
 
Thema: 

Mehrdimensionale Arrays

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben