# Magisches Quadrat in der Konsole



## Quick_Mik (9. April 2004)

Hallo.

ich stehe vor folgender Aufgabe:

Ich soll ein "Magisches Quadrat" als Konsolenanwendeung realisieren.

Das ganze soll so aussehen, dass der Benutzer die gewuenschte Seitenlänge eingeben soll und dann automatisch ein solches Quadrat erzeugt werden soll.

Das "grafische" Layout habe ich soweit fertig, und den Algorithmus zum Bestücken der Felder habe ich auch.

Einziges Problem ist, dass ich bei dem Algorithmus wissen muss, ob ein Feld bereits belegt ist.

Wie kann ich das nun in der Konsole realisieren?

Für alle, die mit "Magisches Quadrat" nichts anfangen können: Da ist ein Quadrat, bei welchem die Summen der Zeilen, Spalten und der vollen Diagonalen den gleichen Wert haben.

Danke für evtl. Hilfe schonmal im Voraus.

Gruß

M.


----------



## basd (10. April 2004)

der plumbeste Trick ist das "Magisches Quadrat" erst einmal im Speicher zu erzeugern und wenn es fertig ist erst auf die Konsole zu bringen .. falls es länger dauert kann man ja so ein rotiertendes   / -  \  |     anzeigen mit Bitte warten als Text.

Ansonsten kann man "flags" verwenden, sprich Booleans die ein Feld mit besetzt oder nicht besetzt  kennzeichnen (natürlich nur im Speicher).


----------



## fizban (10. April 2004)

#include <stdio.h>
#include <stdlib.h>

void main()
{
	int zahl[25][25];
	int kantenlaenge;
	int posx, posy;
	int x;

	/*** Der Array wird mit 0 initialisiert ***/
	for(posy = 0; posy < 25; posy++)
	{
		for(posx = 0; posx < 25; posx++)
			zahl[posy][posx] = 0;
	}

	printf("Die Kantenlaenge muss eine ungerade Zahl sein!\n\n");

	/*** Die Kantenlaenge wird auf eine gültige Eingabe geprüft.   ***/
	/*** kantenlaenge % 2 liefert den Rest von kantenlaenge / 2    ***/
	/*** ist der Rest gleich 0 handelt es sich um eine gerade Zahl ***/
	for(kantenlaenge = 2; kantenlaenge % 2 == 0
	{
		printf("Kantenlaenge: ");
		scanf("%d", &kantenlaenge);
		if(kantenlaenge % 2 == 0)
			printf("Fehler! Kantenlaenge muss eine ungerade Zahl sein!\n");
	}

	/*** Regel 1 ***/	
	posx = kantenlaenge / 2;
	posy = kantenlaenge / 2 + 1;
	zahl[posy][posx] = 1;

	for(x = 2; x <= kantenlaenge * kantenlaenge; x++)
	{
		/*** Regel 2 ***/
		posx++;
		posy++;

		if(posx > kantenlaenge - 1)
			posx = 0;
		if(posy > kantenlaenge - 1)
			posy = 0;

		if(zahl[posy][posx] == 0)
			zahl[posy][posx] = x;
		else
		{
			/*** Regel 3 und 4 ***/
			for(; x <= kantenlaenge * kantenlaenge; x++)
			{
				posx--;
				posy++;

				if(posx < 0)
					posx = kantenlaenge - 1;
				if(posy > kantenlaenge - 1)
					posy = 0;
				if(zahl[posy][posx] == 0)
				{
					zahl[posy][posx] = x;
					break;
				}
			}
		}
	}

	/*** Ausgabe des Magischen Quadrats ***/
	printf("\nDas Magische Quadrat mit einer Kantenlaenge von %d lautet:\n\n", kantenlaenge);
	for(posy = 0; posy < kantenlaenge; posy++)
	{
		for(posx = 0; posx < kantenlaenge; posx++)
			printf("%4d", zahl[posy][posx]);
		printf("\n");
	}
	printf("\n");
}


----------



## Quick_Mik (10. April 2004)

Danke für den Code  

Den kann ich nun in aller Ruhe integrieren.

So long


M.


----------

