Veröffentlicht 26. April 200223 j 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!
26. April 200223 j Sollst Du den Algorithmus selbst ausarbeiten, oder wurde der vorgegeben? Wie Woodstock schon sagte, wenn Du nicht konkreter wirst, können wir Dir nicht helfen.
26. April 200223 j 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.
26. April 200223 j so was wollte ich doch auch nur! ich weis nur nicht, wie ich die Bedingungen schreiben muss, der rest ist ja kein Problem!
26. April 200223 j 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!
27. April 200223 j feld[i][k]=c;Hier ist das Problem (bzw. hier wirkt es sich aus). Nach Deiner Initialisierungsschleife stehen i und k auf n. Du solltest sie mit sinnvollen Werten füllen.
27. April 200223 j 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.
28. April 200223 j 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!
29. April 200223 j 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?
29. April 200223 j 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!
29. April 200223 j // 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]
30. April 200223 j 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...
30. April 200223 j @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.
30. April 200223 j 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.
1. Dezember 200915 j 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
1. Dezember 200915 j 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.
1. Dezember 200915 j 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 1. Dezember 200915 j von unbekannt09
1. Dezember 200915 j Hier gibt's eine Anleitung für 4x4, aber die ist zugegebenermaßen ziemlich einfach, da könntest du auch fast gleich das fertige Quadrat in deinen Code schreiben.
1. Dezember 200915 j oh sehr freundlich danke was für freundliche umgangsformen in diesem forum hätt ich ja nicht gedacht vielen dank
2. Dezember 200915 j 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.
2. Dezember 200915 j 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
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.