Magischer Würfel. If funktion überlastet?
Hallo zusammen
Ich bin aktuell an der spannenden Aufgabe eines magischen Würfels dran und scheine auch so gut wie fertig damit zu sein.
Leider erhalte ich die Meldung, dass die if Funktion zu fehlen schein, was logischerweise nicht der Fall ist. Meine if Funktion beinhaltet lediglich viele kumulativ zu erfüllende Kriterien.
Aufgabe:
- Erstelle mit hilfe eines 2D-Arrays einen magischen Würfel.
- Definition magischer Würfel = Würfel mit 3 Zeilen und 3 Spalten. Jede Spalte, jede Zeile und beide Diagonalen müssen den selben Wert ergeben, wenn diese zusammengerechnet werden:
Frage:
Wo liegt hier genau das Problem? Gibt es bei der if Funktion ein Maximum an Vergleichsoperatoren oder ist das schon rechtens? Ansonsten scheint der compiler mit dem Code einverstanden zu sein und müsste nachher somit funktionieren.
Fehlermeldung Compiler:
Vor einem "else"-Statement erwartet das System immer ein "if"-Statement. Es kann sein, dass das "else"-Statement nicht auf der gleichen Ebene ist. Schreibe das 'if'-Statement oder rücke das 'else' auf die richtige Ebene.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int [][] quadrat = new int[3][3];
Scanner keyScan = new Scanner(System.in);
// Quadrat einlesen
System.out.println("Bitte 9 Zahlen eingeben und mit Enter abschliessen");
for (int i=0; i<3; i++) {
for (int j=0; j<3; j++) {
quadrat[i][j] = keyScan.nextInt();
}
}
int magischeZahl = 0;
// TODO: Quadrat prüfen und die Variablen magisch und magischeZahl auf den richtigen Wert setzen.
int Zeile1 = 0;
i = 0;
for (int j=0; j<3; j++) {
Zeile1 += quadrat[i][j];}
int Zeile2 = 0;
i = 1;
for (int j=0; j<3; j++) {
Zeile2 += quadrat[i][j];}
int Zeile3 = 0;
i = 2;
for (int j=0; j<3; j++) {
Zeile3 += quadrat[i][j];}
int Spalte1 = 0;
j = 0;
for (int i=0; i<3; i++) {
Spalte1 += quadrat[i][j];}
int Spalte2 = 0;
j = 1;
for (int i=0; i<3; i++) {
Spalte2 += quadrat[i][j];}
int Spalte3 = 0;
j = 2;
for (int i=0; i<3; i++) {
Spalte3 += quadrat[i][j];}
int Diagonaleuntennachoben = 0;
i = 2;
j = 0;
int count = 0;
if (count<3) {
Diagonaleuntennachoben += quadrat[i][j];
i--;
j++;}
int Diagonaleobennachunten = 0;
i = 0;
j = 0;
count = 0;
if (count<3) {
Diagonaleobennachunten += quadrat[i][j];
i++;
j++;}
int magischeZahl = Zeile1;
// Ausgabe des Ergebnisses
if (Zeile1 == Zeile2 && Zeile1 == Zeile3 && Zeile1 == Spalte 1 && Zeile1 == Spalte2 && Zeile1 == Spalte3 && Zeile1 == Diagonaleobennachunten && Zeile1 == Diagonaleuntennachoben) {
System.out.println("Magisch: "+magischeZahl);}
else {
System.out.println("Nicht magisch");}
keyScan.close();
}
}
Habe die Frage mit verbessertem Code und einem letzten kleinen Array Problem nochmals gestellt, da ich für eine Anpassung der Frage hier kaum mehr Zeichen zur Verfügung habe (Anzahl Zeichen pro Frage ist leider begrenzt).
Hier der Link:
https://www.gutefrage.net/frage/fehler-im-array-neue-frage-magischer-wuerfel
Leider erhalte ich die Meldung, dass die if Funktion zu fehlen schein
Was ist die genaue Meldung?
Hi danke für deine Rückmeldung. Konnte das Problem lösen und scheine nun kurz vor der Lösung zu sein, aber es ist ein array problem noch aufgetaucht (siehe überarb. Frage)
LG
Alex
3 Antworten
Das ist keine Fehlermeldung des Compilers, sondern eher ein Hinweis deiner Entwicklungsumgebung. Sobald du die 25 vorausgehenden Fehler behoben hast, wird der Hinweis von allein verschwinden.
Im Wesentlichen geht es um zwei Fehler:
- magischeZahl ist doppelt definiert.
- i und j sind nur innerhalb der for-Schleifen sichtbar. Du müsstest diese Variablen auch außerhalb definieren. Allerdings musst du sie anders benennen, weil sonst die Neudefinition in den nachfolgenden for-Schleifen nicht mehr erlaubt ist. (Das ist ein spezielles Java-Problem.)
Hat sich ja offenbar erledigt. Schön, dass es jetzt tut :-)
Syntaktisch sehe ich in der if-Anweisung auf dem ersten Blick keinen Fehler, außer das Blank bei "Spalte 1".
Du kannst ja mal nach und nach immer eine weitere Bedingung wegnehmen und schauen, ob es dann funktioniert.
Für die Summenberechnungen würde ich mir Funktionen schreiben, weil vieles Ähnliches öfter gemacht wird, zum Beispiel SumZeile(int Zeile)
Die Diagonalen könntest du kompakter so berechnen:
for(i=0;i<3;i++){
Diagonaleobennachunten += quadrat[i][i];
Diagonaleuntennachoben += quadrat[2-i][i];
}
Die Spalten- und Zeilensummierung könntest du auch nett kürzen, wenn du pro Zeile und Spalte ein Array verwenden würdest.
for(i=0;i<3;i++){
for(j=0;j<3;j++){
sumZeile[i] += quadrat[i][j];
sumSpalte[i] += quadrat[j][i];
}
// Dann noch die Diagonalen (siehe oben)
Diagonaleobennachunten += quadrat[i][i];
Diagonaleuntennachoben += quadrat[2-i][i];
}
Dann kannst du auch bei den Prüfungen durchiterieren:
magisch = true;
for(i=0;i<3;i++)
if(sumZeile[0] != sumZeile[i] || sumZeile[0] != sumSpalte[i])
magisch = false;
magisch = magisch && sumZeile[0] == Diagonaleobennachunten && sumZeile[0] == Diagonaleuntennachoben;
Noch besser wäre es, wenn du direkt nach der Berechnung einer Summe prüfen würdest, ob sie mit der ersten Summe übereinstimmt. Denn falls die Summen nicht übereinstimmen, kannst du die Berechnung mit break verlassen und direkt "nicht magisch" ausgeben.
Hallo
Danke für deine Rückmeldung. Ich habe die Fehler soweit alle beheben können; nur noch der Array Speicher macht mir zu schaffen, aber das Programm an sich funktioniert nun. Kann ich nochmals eine Rückmeldung von dir auf den neuen Fehler erhalten? Mir ist wichtig, dass ich nur Funktionen & Varianten verwende, welche ich bereits kenne also:
- int, String, double, char, charAt, Array, 2D Array
- if , else, else if, while, for, boolean
Den Link habe ich oben in der Frage ergänzt, da ich die Frage für andere im Forum lassen möchte, welche ein ähnliches Problem haben. Beim Link kommst du direkt auf den verbesserten Code, bei welchem nun nur noch der Array Probleme macht.
LG
Alex
Ich lese gerade in der anderen Frage, dass dein Code funktioniert, also hat sich das Thema für mich erledigt.
int count = 0;
if (count<3) { …
Das if Statement ist immer True, da 0 < 3 true ist. Wozu dann also die if Abfrage?
Diese Stelle hast du zwei mal im Code.
Danke für deine Rückmeldung. Habe ich mittlerweile auch herausgefunden ;) danke dir trotzdem für deine Rückmeldung. Die Fehler konnte ich überall ausmerzen, nun habe ich nur noch mit dem Array der beiden letzten while Funktionen zu kämpfen (siehe Link oben). Evtl. kannst du mir nochmals eine Rückmeldung geben? Ich würde mich freuen.
LG
Alex
Danke für deine Rückmeldung. Habe ich mittlerweile auch herausgefunden ;) danke dir trotzdem für deine Rückmeldung; war nicht sicher ob es an den Deklarationen lag obwohl ich es hätte wissen müssen. Die Fehler konnte ich überall ausmerzen, nun habe ich nur noch mit dem Array der beiden letzten while Funktionen zu kämpfen (siehe Link oben). Evtl. kannst du mir nochmals eine Rückmeldung geben? Ich würde mich freuen.
LG
Alex