Semikolon zu viel - ich raffs nicht..

Moin zusammen,

ich sitze gerade an der folgenden Aufgabe:

"Ein magisches Quadrat ist eine quadratische Matrix, für die die Summe jeder Zeile, jeder Spalte und der beiden Diagonalen denselben Wert ergibt. Lesen sie eine Zahl n sowie eine n*n Matrix ein und stellen sie fest, ob es ein magisches Quadrat ist".

Hier mein selbst programmierter Code (ich bin Einsteiger, sicherlich kann man den Code an vielen Stellen optimieren):
Java:
static int[][] magic(int[][] a) {
        int[][] b = new int[a.length][a[0].length];
      
        int i, j, sumZeile1, sumZeile2, sumSpalte1, sumSpalte2, sumDiag1, sumDiag2;
      
            for (i = 0, j = 0; j < a[0].length; j++){
                sumZeile1 = sumZeile1 + a[i][j]; }
            do {
            for (i++, j++; j < a[0].length; j++){
                sumZeile2 = sumZeile2 + a[i][j]; }
            }while (sumZeile1 == sumZeile2);  
                if (sumZeile1 != sumZeile2)
                    {Out.print("Es handelt sich nicht um ein Magisches Quadrat"); break;}
              
        for (i = 0, j = 0; i < a[0].length; i++){
            sumSpalte1 = sumSpalte1 + a[i][j]; }
            do {
            for (i++, j++; i < a[0].length; i++){
            sumSpalte2 = sumSpalte2 + a[i][j]; }
            }while (sumSpalte1 == sumSpalte2);  
                if (sumSpalte1 != sumSpalte2)
                {Out.print("Es handelt sich nicht um ein Magisches Quadrat"); break;}

        for (i = 0, j = 0; i < a[0].length; i++, j++){
            sumDiag1 = sumDiag1 + a[i][j]; }
        for (i = a.length - 1, j = a.length - 1; i == -1; i--, j--){
            sumDiag2 = sumDiag2 + a[i][j]; }
        if (sumDiag1 != sumDiag2)
        {Out.print("Es handelt sich nicht um ein Magisches Quadrat"); break;}
      
        if (sumZeile1 == sumSpalte1 && sumZeile1 == sumDiag1){
            {Out.print("Es handelt sich hier um ein Magisches Quadrat"); break;}
        }
        return b;
    }
}

    public static void main(String[] args) {
        int i, m, n;
        Out.print("Geben Sie eine Zahl für die Länge der Matrix ein. Diese ist gleichzeitig die Breite.");
        int[][] a = new int[i = In.readInt()][i];
        Out.print("Geben Sie nacheinander die einzelnen Werte der Matrix ein.");
        for (m = 0; m < i; m++)
            for (n = 0; n < i; n++)
                a[m][n] = In.readInt();
    }
}

Das zweite Semikolon nach return zeigt er mir als zu viel an, lösche ich das färbt er mir fast meine ganze Methode rot. Ich suche schon lange rum und finde das Problem nicht.
Ob der Code jetzt im Einzelnen richtig ist weiß ich nicht, das konnte ich noch nicht testen.

Ich bedanke mich schon mal für eure Hilfe!

PS: Nicht wundern, ich muss mit den Klassen von Mössenböck arbeiten, Autor von "Sprechen Sie Java?".
 
X

Xyz1

Gast
Du hättest einen Block in Block nach if (sumZeile1 == sumSpalte1 && sumZeile1 == sumDiag1){, das ist definitiv nicht gewollt. Entferne, in der nachfolgenden Zeile, {}-Klammern.
 

mrBrown

Super-Moderator
Mitarbeiter
nach dem return ist eine geschlossene } zu viel.

Benutzt du einen JavaEditor? Der sollte da noch einige weitere Fehler markieren...


Du hättest einen Block in Block nach if (sumZeile1 == sumSpalte1 && sumZeile1 == sumDiag1){, das ist definitiv nicht gewollt. Entferne, in der nachfolgenden Zeile, {}-Klammern.
Ist aber irrelevant^^
 
nach dem return ist eine geschlossene } zu viel.

Benutzt du einen JavaEditor? Der sollte da noch einige weitere Fehler markieren...

Ja, ich arbeite mit Eclipse. Dann muss ich doch die Methode überarbeiten.
Mein Problem da ist, dass ich die break-Statements nicht richtig unterbekomme.
Eclipse meckert da und sagt, dass break im Loop sein muss. Was ist da bei mir falsch?
 

mrBrown

Super-Moderator
Mitarbeiter
Ja, ich arbeite mit Eclipse. Dann muss ich doch die Methode überarbeiten.
Mein Problem da ist, dass ich die break-Statements nicht richtig unterbekomme.
Eclipse meckert da und sagt, dass break im Loop sein muss. Was ist da bei mir falsch?

Sie sind nicht in einem Loop.

An den Stellen, an denen das angemeckert wird, sind deine Schleifen schon zu Ende, du bist nur noch in einem if, daraus kann man nicht breaken. break springt nur ans Schleifenende.
 
Sie sind nicht in einem Loop.

An den Stellen, an denen das angemeckert wird, sind deine Schleifen schon zu Ende, du bist nur noch in einem if, daraus kann man nicht breaken. break springt nur ans Schleifenende.

Ja natürlich. Wie dumm :eek:
Gibt es denn eine andere Möglichkeit (außer den Code umzuschreiben) bei der if-Bedingung abzubrechen, also eine Art von "else break"?
 
X

Xyz1

Gast
Ich habe das mal gemockt,
Java:
    static class OUT {
        void print(String s) {
            System.out.println(s);
        }
    }
    static OUT Out = new OUT();

    static class IN {
        int readInt() {
            return 0;
        }
    }
    static IN In = new IN();

    static int[][] magic(int[][] a) {
        int[][] b = new int[a.length][a[0].length];

        int i, j, sumZeile1 = 0, sumZeile2 = 0, sumSpalte1 = 0, sumSpalte2 = 0, sumDiag1 = 0, sumDiag2 = 0;

        for (i = 0, j = 0; j < a[0].length; j++) {
            sumZeile1 = sumZeile1 + a[i][j];
        }
        do {
            for (i++, j++; j < a[0].length; j++) {
                sumZeile2 = sumZeile2 + a[i][j];
            }
        } while (sumZeile1 == sumZeile2);
        if (sumZeile1 != sumZeile2) {
            Out.print("Es handelt sich nicht um ein Magisches Quadrat");
            // break;
        }

        for (i = 0, j = 0; i < a[0].length; i++) {
            sumSpalte1 = sumSpalte1 + a[i][j];
        }
        do {
            for (i++, j++; i < a[0].length; i++) {
                sumSpalte2 = sumSpalte2 + a[i][j];
            }
        } while (sumSpalte1 == sumSpalte2);
        if (sumSpalte1 != sumSpalte2) {
            Out.print("Es handelt sich nicht um ein Magisches Quadrat");
            // break;
        }

        for (i = 0, j = 0; i < a[0].length; i++, j++) {
            sumDiag1 = sumDiag1 + a[i][j];
        }
        for (i = a.length - 1, j = a.length - 1; i == -1; i--, j--) {
            sumDiag2 = sumDiag2 + a[i][j];
        }
        if (sumDiag1 != sumDiag2) {
            Out.print("Es handelt sich nicht um ein Magisches Quadrat");
            // break;
        }

        if (sumZeile1 == sumSpalte1 && sumZeile1 == sumDiag1) {
            {
                Out.print("Es handelt sich hier um ein Magisches Quadrat");
                // break;
            }
        }
        return b;
    }

    public static void main(String[] args) {
        int i, m, n;
        Out.print("Geben Sie eine Zahl für die Länge der Matrix ein. Diese ist gleichzeitig die Breite.");
        int[][] a = new int[i = In.readInt()][i];
        Out.print("Geben Sie nacheinander die einzelnen Werte der Matrix ein.");
        for (m = 0; m < i; m++) {
            for (n = 0; n < i; n++) {
                a[m][n] = In.readInt();
            }
        }
    }

DEINE aufgabe ist es jetzt, die Programmablauflogik zu verstehen. Das Buch kenn ich nicht.
 
X

Xyz1

Gast
Also so schwer ist das nicht, wenn ich länger draufschaue komme ich in Versuchung das zu verstehen. :D
Zuerst wird gesummt usw.

Was ich aber NICHT verstehe:
1. magic wird nirgendwo aufgerufen,
2. Rückgabe von b ist sinnlos,
3. DU hast das wahrscheinlich KOMPLETT falsch abgeschrieben.

Punkt 3 soll kein vorwurf sein. Ich selber tippe auch alles falsch ab. So viel dazu. ALSO:
Verklag' mich nicht! :D

(4. Eclipse würd ich dir in deinem "Stadion" nicht empfehlen.)
 
Vielen Dank für die ganzen Antworten.
Ich habe hier nichts abgeschrieben, sondern selbst programmiert - wenn auch ziemlich verkehrt, wie ich feststellen musste.
Ich habe mich jetzt nochmal hingesetzt und das Programm umgeschrieben - ich hänge euch mal den funktionierenden Code an:
Java:
static void magic(int[][] a) {
       
        int i = 0; int j = 0;
        int sumZeile1 = 0; int sumZeile2= 0;
        int sumSpalte1= 0; int sumSpalte2= 0;
        int sumDiag1= 0; int sumDiag2 = 0;
       
            for (i = 0, j = 0; j < a.length; j++){
                sumZeile1 = sumZeile1 + a[i][j]; }
            i++; j= 0;
            while (j < a.length){
            sumZeile2 = sumZeile2 + a[i][j];
            j++;
            }
            if (sumZeile1 != sumZeile2){
                Out.print("Es handelt sich nicht um ein Magisches Quadrat");   
                return;}
           
            for (i = 0, j = 0; i < a.length; i++){
                sumSpalte1 = sumSpalte1 + a[i][j]; }
                i = 0; j++;
            while (i < a.length){
                sumSpalte2 = sumSpalte2 + a[i][j];
                i++;
            }
            if (sumSpalte1 != sumSpalte2) {
                Out.print("Es handelt sich nicht um ein Magisches Quadrat");   
                return;}
                   
        for (i = 0, j = 0; i < a[0].length; i++, j++){
            sumDiag1 = sumDiag1 + a[i][j]; }
        i = 0; j = 0;
        for (i = a.length - 1, j = a.length - 1; i > -1; i--, j--){
            sumDiag2 = sumDiag2 + a[i][j]; }
        if (sumDiag1 != sumDiag2){
        Out.print("Es handelt sich nicht um ein Magisches Quadrat");
        return;}
       
        if (sumZeile1 == sumSpalte1 && sumZeile1 == sumDiag1){
            {Out.print("Es handelt sich hier um ein Magisches Quadrat");
            return;
            }
        }
    }
    public static void main(String[] args) {
        int i, m, n;
        Out.print("Geben Sie eine Zahl für die Länge der Matrix ein. Diese ist gleichzeitig die Breite.");
        int[][] a = new int[i = In.readInt()][i];
        Out.print("Geben Sie nacheinander die einzelnen Werte der Matrix ein.");
        for (m = 0; m < i; m++)
            for (n = 0; n < i; n++)
                a[m][n] = In.readInt();
        magic(a);
    }
}
 

InfectedBytes

Top Contributor
und du würdest dir selbst einen groß Gefallen tun, wenn du deinen Code einmal ordentlich einrücken würdest. Dadurch sieht man gleich viel schneller wo denn Probleme liegen könnten.
Schau dir mal zum Vergleich diesen kleinen Ausschnitt an:
Java:
if(sumZeile1 == sumSpalte1 && sumZeile1 == sumDiag1){
           {Out.print("Es handelt sich hier um ein Magisches Quadrat");
           return;
           }
       }
und einmal in "schöner"
Java:
if(sumZeile1 == sumSpalte1 && sumZeile1 == sumDiag1){
  {
    Out.print("Es handelt sich hier um ein Magisches Quadrat");
    return;
  }
}
Hier sieht man jetzt auch, das du einen unnötiges paar geschweifte Klammern benutzt, das schadet zwar nicht, macht es aber wieder unübersichtlicher

Ansonsten, wie @DerWissende schon geschrieben hat, solltest du uns schon sagen was wir jetzt mit deinem Code anfangen sollen. Kommt eine Fehlermeldung? Funktioniert es nicht? Wenn ja, was denn genau? etc.
 
Danke für euer Feedback. Der Code funktioniert und ich wollte einfach den überarbeiteten und funktionierenden Code nochmal hochladen für diejenigen, die mir schon geholfen haben und ggf. sehen wollten wie ich das jetzt gelöst habe.

Ich stehe wie schon gesagt noch relativ am Anfang, weshalb es mir z.T. auch schwer fällt, mehrere Methoden zu implementieren. Aber ich nehme eure Punkte gern auf und versuche, da in Zukunft mehr drauf zu achten.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
monsterherz Fehler Semikolon fehlt - ich weiss aber nicht wo da noch eines hin sollte... Java Basics - Anfänger-Themen 21
G Semikolon rausschreiben? Java Basics - Anfänger-Themen 7
Q Compilerfehler - fehlendes Semikolon und "not a stateme Java Basics - Anfänger-Themen 2
GilbertGrape Semikolon nach geschweifter Klammer Java Basics - Anfänger-Themen 11
W Schleife und einmal variable++ zu viel Java Basics - Anfänger-Themen 20
P Geht es vielleicht viel kürzer? Java Basics - Anfänger-Themen 7
B Wieso wird hier so viel als falsch angezeigt? Java Basics - Anfänger-Themen 2
O Zu viel static im Projekt Java Basics - Anfänger-Themen 9
A Ein Programm modifizieren, viel Aufwand? Java Basics - Anfänger-Themen 7
R ArrayList sehr viel schneller als Array? Java Basics - Anfänger-Themen 2
R Irgendwo ein Zeichen zu viel oder zu wenig Java Basics - Anfänger-Themen 5
S JTextArea mit LineWrap true viel zu groß! Java Basics - Anfänger-Themen 2
K Arrays - Komma zu viel, kein Problem? Java Basics - Anfänger-Themen 3
P Java erzeugt zu viel Last? Java Basics - Anfänger-Themen 15
M Zu viel Code? Java Basics - Anfänger-Themen 7
R GridBagLayout und JTextField: Textfeld ist viel zu schmal Java Basics - Anfänger-Themen 4
T Feststellen wie viel Arbeitsspeicher belegt ist Java Basics - Anfänger-Themen 2
S die java machine läuft viel zuuuu langsam, woher kommt das?? Java Basics - Anfänger-Themen 3
D Rekursion - Ich raffs nicht Java Basics - Anfänger-Themen 16
F Ich raffs nicht! - Wie mache ich ein einfaches Java-window? Java Basics - Anfänger-Themen 54
P Statischer Import - ich raffs nicht! Java Basics - Anfänger-Themen 3

Ähnliche Java Themen


Oben