Das magische Quadrat

fr0st

Mitglied
Hallo zusammen. 🙂
Ich hab ein kleines Problemchen.
Ich muss von der Schule her ein Programm schreiben, dass ein magisches Quadrat generiert.
Die Grösse des Quadrates ist n(Eingabe). Leider funktioniert es aber nicht. Hier der Quelltext.
Ich hoffe ihr könnt mir helfen.

Java:
package kapitel4;
import javax.swing.*;

public class MagischesQuadrat {

	public static void main(String[] args) {
		
		// Abfrage für die grösse des magischen Quadrates
		
		String Eingabe = JOptionPane.showInputDialog ("Ungerade Zahl zwischen 1 und 10 eingeben: ");
		int n = Integer.parseInt(Eingabe);
		
		// Kontrolle, ob es die richtige Zahl ist
		
			if(n>2 && n<10 && n%2 != 0) {
            JOptionPane.showMessageDialog (null, "Magisches Quadrat wird berechnet!");
            	}
			
            else {
            	JOptionPane.showMessageDialog (null, "Error");
				JOptionPane.showMessageDialog (null, "Bitte starten sie das Programm neu.");
				System.exit (0);
            	}

			// Initialisieren des Arrays
			
			int Quadrat[][] = new int [n][n];
			int zeile = ((n/2)+1);
			int spalte = (n/2);
			Quadrat[zeile][spalte] = 1;
			
			
			
			
			
			// Einfüllen der Zahlen
			
			for (int i = 1; i == n; i++) {
				Quadrat[zeile][spalte] = i;
				spalte++;
				zeile--;
				
				if (zeile < 0) {
				zeile = (n-1);
				}
				
				if (spalte == n) {
				spalte = 0;
				}
				
				if (Quadrat[zeile][spalte] == 0){
				zeile++;
				spalte++;
				 
				 if (zeile == n) {
				 	zeile = 0;
				 }
				 
				 if (spalte == n) {
				 	spalte = 0;
				 }
				}
			}
			
			
			
			
			// Ausgabe des Magischen Quadrates
			
	         for (int i2 = 0; i2 < Quadrat.length; i2++) {
	               for (int j = 0; j < Quadrat.length; j++)
	                
	                   System.out.print("\t" + Quadrat[i2][j]);
	               
	              System.out.println(" ");
			
			
	         }
		}
}


Liebe Grüsse fr0st
 
Das Einfüllen der Zahlen.
Also im Abschnitt //Einfüllen der Zahlen.
Wenn ihr wollt kann ich euch die GedankenVorlage abschreiben.
Algorhitmus und so.
 
Du solltest dir das Füllen nochmal überlegen...
Du hast eine Schleifen Bedingung auf i von 1 bis Eingabe, prüfst in der Schleife aber immer auf Zeile und Spalte. --> d.h. du befüllst hier entweder nur eine Zeile oder Spalte, je wie du das sehen willst 🙂
Um hier durch alle Felder zu kommen solltest du entweder eine zweite Schleife verwenden wie bei der Ausgabe, oder du überlegst dir eine Methode die du rekursiv aufrufst bis das Quadrat befüllt ist.

Außerdem ist deine solltest du hier die bedingung auf
Java:
i<=n
ändern 😉
 
Zuletzt bearbeitet:
Guten Abend 🙂
Erstmal Danke für die schnelle Antwort.
Durch das ändern der Abbruchbedingung hat er jetzt wenigstens eine (1) Zeile befüllt mit gemischten Zahlen von 1 - 5. Das ist doch schonmal ein Fortschritt :rtfm::bloed:

Wie stellst du dir das befüllen mit zwei Schleifen vor?
Ich bin recht neu in der "Java-Szene" und kann mir überhaupt nichts darunter vorstellen.

Könntest du mir ein Beispiel machen und anhand davon erklären?

lg fr0st
 
Java:
for (int i = 0; i < row; i++) {
        for (int j = 0; j < column; j++) {
				Array[i][j] = '0';

	}

}
Hier ein Beispiel 😉
Versuche es mal zu erklären...
Also du gehst mit den jeweiligen Schleifen durch die Reihen bzw. Spalten(Die du vorher initialisiert hast) und setzt in diesem Fall bei jedem Koordinatenpaar eine '0'.
 
Ich visualisiere das mal ein bisschen.

Du willst ja ein Quadrat erzeugen, also so eine Struktur hier:

Code:
x x x x
x x x x
x x x x
x x x x

Das Ganze stellen wir uns also 2-Dimensional vor. Es gibt Zeilen (die wir mal mit i betiteln) und Spalten (die wir mal mit j betiteln)
Jetzt wird das ganze wie ein Koordinatensystem zusammen gesetzt, sodass folgende Struktur heraus kommt:

Code:
  1 2 3 4
1 x x x x
2 x x x x
3 x x x x
4 x x x x

So. Da wir nun immer bei den Zeilen anfangen, haben wir sie i genannt (weil i vor j kommt :bloed🙂 und danach kommen eben die Spalten j.
Wie du an dem Raster jetzt sicher sehen kannst, kann man jedes Feld über die Zeile + Spalte eindeutig identifizieren.

Genau das macht die Schleife von FaJo.
Das hat übrigens noch nichts mit Java zutun, sondern ist nur ein bisschen Mathematik mit mehrdimensionalem Denken 🙂
 
Zuletzt bearbeitet:
N'Abend 🙂
Ich habs jetzt doch per while-Schlaufe gemacht. War ziemlich easy ab dem Moment als ich es gecheckt habe 😉
Ist das ein akzeptabel geschriebenes Programm 😛?
Java:
package kapitel4;
import javax.swing.*;

public class MagischesQuadrat {

	public static void main(String[] args) {
		
		// Abfrage für die grösse des magischen Quadrates
		
		String Eingabe = JOptionPane.showInputDialog ("Ungerade Zahl zwischen 1 und 10 eingeben: ");
		int n = Integer.parseInt(Eingabe);
		
		// Kontrolle, ob es die richtige Zahl ist
		
			if(n%2 != 0) {
            JOptionPane.showMessageDialog (null, "Magisches Quadrat wird berechnet!");
            	}
			
            else {
            	JOptionPane.showMessageDialog (null, "Error");
				JOptionPane.showMessageDialog (null, "Bitte starten sie das Programm neu.");
				System.exit (0);
            	}
			 
			// Initialisieren des Arrays
			
			int Quadrat[][] = new int [n][n];
			int zeile = ((n/2)+1);
			int spalte = (n/2);
			Quadrat[zeile][spalte] = 1;
			
			
		//Einfüllen der Zahlen
			
			int i = 1;
			while (i <= (n*n)) {
				
				Quadrat[zeile][spalte] = i;
				spalte++;
				zeile--;
				
				
				if (zeile < 0) {
				zeile = (n-1);
				}
				
				if (spalte == n) {
				spalte = 0;
				}
				
				if (Quadrat[zeile][spalte] != 0){
				zeile++;
				spalte++;
				 
				 if (zeile == n) {
				 	zeile = 0;
				 }
				 
				 if (spalte == n) {
					 spalte = 0;
				 }
				 
				}
				i++;
				
			}
			
			
			
			
			// Ausgabe des Magischen Quadrates
			
	         for (int i2 = 0; i2 < Quadrat.length; i2++) {
	               for (int j = 0; j < Quadrat.length; j++)
	                
	                   System.out.print("\t" + Quadrat[i2][j]);
	               
	              System.out.println(" ");
			
			
	         }
		}
}
 

Zurück
Oben