Zum Inhalt springen

Magisches Quadrat in C++


DFBL-Benjamin

Empfohlene Beiträge

ich habe ein kleines problem.

ich sollte das Magische Quadrat programmieren, aber irgendwie will das nicht so richtig klappen.

hat das schon jemand programmiert?

bitte nicht objektorientiert, weil so weit bin ich in der Schule noch nicht!

also hoffe, doch das mir jemand helfen kann!

also sendet mir das programm zu wenn ihr es haben solltet!

im voraus vielen dank schon!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hat er doch gesagt, daß er den Sourcecode und eine Erklärung haben möchte!

Das magische Quadrat muß eine ungerade Größe haben. Es wird erzeugt, in dem man bei 1 anfängt und nach rechts oben weiterzählt. Kommt man oben über den Rand raus wird die Zahl in der nächsten Spalte ganz unten reingeschrieben. Kommt man rechts am Rand hinaus ist die darüberliegende Zeile das Kästchen links als nächstes dran. Trifft man bei der Durchnummerierung auf ein belegtes Feld, wird die Zahl in das Kästchen darunter eingeschrieben und die nächste Schrägzeile ausgefüllt.

Das hört sich komplizierter an als es in Wirklichkeit ist. Starte einfach das Programm und schau Dir ein paar kleinere Quadrate an, dann erkennst Du das Prinzip auch ohne Erklärung.


#include <stdio>

#define MAX 25


void magquad(int n)

{

	int a[MAX][MAX];

	int c=1,i=1,j=(n+1)/2;

	for (;c<=n*n;c++)

	{

		a[i][j]=c;

		if (c%n==0) i++;

		else

		{

			i=(i==1)?n:i-1;

			j=(j==n)?1:j+1;

		}

	}

	for (i=1;i<=n;i++)

	{

		for (j=1;j<=n;j++)

		{

			printf("%4d",a[i][j]);

		}

		printf("\n");

	}

}

Der Aufruf sieht dann so aus:

magquad(19);

Die Ausgabe erfolgt ins DOS-Fenster.

Link zu diesem Kommentar
Auf anderen Seiten teilen

ich schreibe jetzt mal meinen Quelltext hier her, aber es gibt nur die 1 aus, sonst leider nichts und es bringt auch "Speicherfehler"!

Schaut euch mal den Quellcode durch, vielleicht entdeckt ihr ja den Fehler!

----------------------------------

# include <iostream>

using namespace std;

/**

* Einsprungspunkt der Anwendung

*

* \return Rueckgabewert ans Betriebssystem 0 -> OK

*/

int main()

{

// Deklaration

int x = 0; // Zahl

int i = 1; // Zeile

int n; // Zeilen- und Spaltennr.

int k; // Spalte

// Ausgabe Ueberschrift

cout << "Magisches Quadrat\n\n";

// Eingabe Kantenlaenge

do

{

cout << "Bitte geben Sie die Kantenlänge ein: \n";

cin >> n;

}while(n % 2 == 0);

// Deklaration Spielfeld

int feld[n][n];

// Die Felder werden mit 0 Deklariert

for(i=0; i != n; i++)

{

for (int k=0; k != n; k++)

{

feld[k]=0;

}

}

// Bestimmung des Feldes der Zahl 1

feld [(n/2)+1][n/2] = (x + 1);

// Bestimmung der anderen Felder

for (int c = 1; c <= n*n; c++)

{

feld[k]=c;

if (c % n == 0)

{

i++;

}

else if(i == 1)

{

n = i-1;

}

else if(k == n)

{

n = k+1;

}

}

// Ausgabe der Felder

for(i = 0; i != n; i++)

{

for(k = 0; k != n; k++)

{

cout << feld [k];

}

cout << "\n";

}

return 0;

}

----------------------------------

noch ein kleiner Tipp: Ich programmiere unter Linux!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe mir Deinen Code mal genauer angesehen:


// Deklaration Spielfeld
int feld[n][n];[/CODE] Das dürfte kein Compiler mitmachen. Wenn Du vorher nicht weißt, wie groß das Quadrat wird, dann musst Du den Speicher dynamisch holen. Alternativ kannst Du, wie in Crushs Beispiel, einen Maximalwert vorgeben.
[CODE]// Bestimmung des Feldes der Zahl 1
feld [(n/2)+1][n/2] = (x + 1);
Du rechnest zwar (auf Basis eines mir unbekannten Algorithmus) aus, wo die 1 hingehört, aber nachdem Du den Wert zugewiesen hast (was Du eigentlich in der Schleife danach machen solltest), wirfst Du die errechneten Koordinaten sozusagen weg. Besser: i = 1; k = n/2;
// Bestimmung der anderen Felder (geändert von Klotzkopp)
for (int c = 1; c <= n*n; c++)
{
feld[i][k]=c;
if (c%n==0) {
i++;
}
else
{
if( i == 1 ) {
i = n;
}
else {
i--;
}
if( k == n ) {
k = 1;
}
else {
k++;
}
}
}
[/code] Hast Du versucht, Crushs Fragenzeichen-Doppelpunkt-Konstrukt aufzulösen? Das müsste dann eigentlich so aussehen. Auf keinen Fall darfst Du in der Schleife n ändern.
[CODE]// Ausgabe der Felder
for(i = 0; i != n; i++)
{
for(k = 0; k != n; k++)
{
cout << feld [i][k];
}
cout << "\n";
}

Du weist die Werte des magischen Quadrats mit einem 1-basierten Index zu, gibst sie hier aber mit 0-basiertem Index aus. Wird nicht funktionieren. Außerdem solltest Du setw verwenden, sonst stehen alle Zahlen direkt hintereinander.

Link zu diesem Kommentar
Auf anderen Seiten teilen

irgend etwas stimmt immer noch am Programm nicht, aber ich weis leider nicht was!

das mit "int feld[n][n] " nimmt der Linux Compiler, aber der Mircosoft Visual c++ Compiler nicht! Aber ich Programmiere ja unter Linux, da ist es dann ja kein Problem!

so sieht jetzt mein Programm aus:

-------------------------------------------

# include <iostream>

using namespace std;

/**

* Einsprungspunkt der Anwendung

*

* \return Rueckgabewert ans Betriebssystem 0 -> OK

*/

int main()

{

// Deklaration

int i = 1; // Zeile

int n; // Zeilen- und Spaltennr.

int k; // Spalte

int x = 1; // Zahl

// Ausgabe Ueberschrift

cout << "Magisches Quadrat\n\n";

// Eingabe Kantenlaenge

do

{

cout << "Bitte geben Sie die Kantenlänge ein: \n";

cin >> n;

}while(n % 2 == 0);

// Deklaration Spielfeld

int feld[n][n];

// Die Felder werden mit 0 Deklariert

for(i=0; i != n; i++)

{

for (int k=0; k != n; k++)

{

feld[k]=0;

}

}

i = n/2+1;

k = n/2;

// Bestimmung der anderen Felder

do

{

// Regel 1

feld[k]=x;

// Regel 2

if(i < n && k < n)

{

i++;

k++;

}

// Regel 4 zu große Zeilen-/ Spaltennr. else if(i > n-1 || k > n-1)

{

if(i)

{

i=0;

}

else

{

k=0;

}

}

// Regel 4 zu kleine Zeilen-/ Spaltennr. else if(i < 0 || k < 0)

{

if(i)

{

i=n-1;

}

else

{

k=n-1;

}

}

// Regel 3

else

{

i++;

k--;

}

x++;

}while(x != n*n);

// Ausgabe der Felder

for(i = 0; i != n; i++)

{

for(k = 0; k != n; k++)

{

cout << feld [k] << "\t";

}

cout << "\n";

}

return 0;

}

-------------------------------------------

hoffe doch das mir einer helfen kann! Besonders sollte man mal die Regel 3 anschauen. Ich weis nicht, wie ich das Schreiben kann, wenn das Feld besetzt ist. Das es dann zu der Regel Zeile +1 und Spalte -1 macht, wie geht das?

die anderen Regeln müssten normalerweise stimmen, oder? wenn nicht einfach reinschreiben ins Forum!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von DFBL-Benjamin

die anderen Regeln müssten normalerweise stimmen, oder?

Ich kann nur wiederholen, was ich schon in meinem ersten Beitrag dieses Thread gesagt habe: Sag uns, was für einen Algorithmus Du verwendest!

Offensichtlich gibt es mehr als einen Algorithmus, um ein magisches Quadrat zu erzeugen, denn der, den Du verwendest, unterscheidet sich von dem, den Crush weiter oben implementiert hat.

Wie sollen wir Dir helfen, die "Regeln" für Deinen Algorithmus in C umzusetzen, wenn Du uns nicht sagst, wie die Regeln im Klartext lauten?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die Regeln für das Programm:

1. Positioniere die 1 in dem Feld unmittelbar unter der Mitte des Quadrats!

2. Wenn die Zahl x in der Zeile i und der Spalte k positioniert wurde, dann versuche die Zahl x+1 in der Zeile i+1 und der Spalte k+1 abzulegen! Handelt es sich bei diesen Angaben um ungültige Zeilen- oder Spaltennr. so verwende Regel 4! Ist das Zielfeld bereits besetzt, so verwende Regel 3!

3. Wird versucht, eine Zahl in einem bereits besetzten Feld in der Zeile i und er Spalte k zu positionieren, so versuche statt desen die Zeile i+1 und die Spalte k-1. Handelt es sich bei diesen Angaben um ungültige Zeilen- oder Spaltennr., so verwende Regel 4. Ist das Zielfeld bereits besetzt, so wende Regel 3 an!

4. Die Zeilen- und Spaltennr. laufen von 0 bis n-1. Ergibt sich im Laufe des Verfahrens eine zu kleine Zeilen- oder Spaltennr., so setzte die Nummer auf den Maximalwert n-1! Ergibt sich eine zu große Spalten- oder Zeilennr., so setzte die Nr. auf den Minimalwert 0!

Hier die Regeln für das Programm. Hoffe, das ihr mir jetzt helfen könnt!

Link zu diesem Kommentar
Auf anderen Seiten teilen


// Bestimmung der anderen Felder
while( true ) {
// Regel 1
feld[i][k]=x;

if( x == n*n ) {
// fertig
break;
}

// Regel 2
i++;
k++;

bool feldgefunden = false;
while( !feldgefunden ) {
// regel 4
if( i >= n ) i = 0;
if( i < 0 ) i = n-1;
if( k >= n ) k = 0;
if( k < 0 ) k = n-1;

// regel 3
if( feld[i][k] != 0 ) {
i++;
k--;
}
else {
feldgefunden = true;
}
}
x++;
};
[/CODE]

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das sind wohl dieselben Regeln, nur daß bei ihm von links nach recht und diagonal nach unten die Felder gefüllt werden und bei mir nach diagonal nach oben - das entspricht eigentlich nur eine Spiegelung an der y-Achse. Insgesamt gibt es also 4 Varianten um das magische Quadrat zu berechnen. (links und rechts sind auch vertauschbar). Mit Sicherheit gibt es noch Zeilen- und Spalten-verschiebende Varianten, weil ich schon optisch unlogischere magische Quadrate gesehen habe, aber mir sind keine genauen Regeln dafür bekannt...

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 7 Jahre später...
oh sehr freundlich danke

was für freundliche umgangsformen in diesem forum

hätt ich ja nicht gedacht vielen dank

Die Ironie ist unangebracht. Der Tipp war durchaus nicht unfreundlich, und meiner Meinung nach war es ein guter Tipp. Wenn du kein Englisch kannst, solltest du daran etwas ändern. Es gibt viel mehr Dokumentation in Englisch als in Deutsch.

Schreib die Zahlen von 1 bis 16 zeilenweise in dein Quadrat. Dann vertauschst du jedes Feld, das nicht auf einer der Diagonalen liegt, mit dem jeweils gegenüberliegenden Feld.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Gast
Dieses Thema wurde nun für weitere Antworten gesperrt.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...