Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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!

Geschrieben

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.

Geschrieben

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!

Geschrieben

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.

Geschrieben

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!

Geschrieben
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?

Geschrieben

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!

Geschrieben

// 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]

Geschrieben

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...

Geschrieben

@Crush:

Deine Variante unterscheidet sich zumindest so weit, dass bei Dir diese wiederholte Prüfung, ob ein Feld schon besetzt ist, nicht nötig ist. Dafür hast Du eine c%n-Prüfung drin.

Geschrieben

Klar, aber ich meinte jetzt die Vorgehensweise um das magische Quadrat zu erstellen unabhängig von der programmtechnischen Umsetzung... ist auch egal: Vielfalt ist Lebensqualität.

  • 7 Jahre später...
Geschrieben

also ich habe auch das problem das ich ein magisches 4x4 quadrat programmieren soll

und ich habe einfache keine ahnung wie der algorithmus zum füllen des quadrats auszusehen hat

bitte dringend um hilfe!!

mfg unbekannt09

Geschrieben
und ich habe einfache keine ahnung wie der algorithmus zum füllen des quadrats auszusehen hat
Das heißt, du hast einen 7 1/2 Jahre alten Thread ausgegraben, ihn aber nicht gelesen? Denn da sind mehrere Algorithmen drin.
Geschrieben (bearbeitet)

ja aber das wird ja bei mir dann noch etwas komplizierter

und hab ja noch nicht mal den anfang verstanden

und find leider nichts zum 4x4 Quadrat hier drin sorry

Bearbeitet von unbekannt09
Geschrieben
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.

Geschrieben

Also ohne dir zu nahe treten zu wollen, würd ich an deiner stelle echt english lernen, weil als programmieren kommst du um englisch nicht drum rum...

is zumindest meine meinung

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...