DFBL-Benjamin Geschrieben 26. April 2002 Geschrieben 26. April 2002 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!
Woodstock Geschrieben 26. April 2002 Geschrieben 26. April 2002 Was kalppt denn bei Dir nicht? Du musst etwas konkreter werden! Bine
Klotzkopp Geschrieben 26. April 2002 Geschrieben 26. April 2002 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.
Crush Geschrieben 26. April 2002 Geschrieben 26. April 2002 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.
DFBL-Benjamin Geschrieben 26. April 2002 Autor Geschrieben 26. April 2002 so was wollte ich doch auch nur! ich weis nur nicht, wie ich die Bedingungen schreiben muss, der rest ist ja kein Problem!
DFBL-Benjamin Geschrieben 26. April 2002 Autor Geschrieben 26. April 2002 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!
Klotzkopp Geschrieben 27. April 2002 Geschrieben 27. April 2002 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.
DFBL-Benjamin Geschrieben 27. April 2002 Autor Geschrieben 27. April 2002 du meinst jetzt das ich das feld[k]=c umbennen soll z. B. so feld[a]=c? oder wie?
Klotzkopp Geschrieben 27. April 2002 Geschrieben 27. April 2002 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.
DFBL-Benjamin Geschrieben 28. April 2002 Autor Geschrieben 28. April 2002 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!
Klotzkopp Geschrieben 29. April 2002 Geschrieben 29. April 2002 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?
DFBL-Benjamin Geschrieben 29. April 2002 Autor Geschrieben 29. April 2002 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!
Klotzkopp Geschrieben 29. April 2002 Geschrieben 29. April 2002 // 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]
Crush Geschrieben 30. April 2002 Geschrieben 30. April 2002 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...
Klotzkopp Geschrieben 30. April 2002 Geschrieben 30. April 2002 @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.
Crush Geschrieben 30. April 2002 Geschrieben 30. April 2002 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.
unbekannt09 Geschrieben 1. Dezember 2009 Geschrieben 1. Dezember 2009 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
Klotzkopp Geschrieben 1. Dezember 2009 Geschrieben 1. Dezember 2009 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.
unbekannt09 Geschrieben 1. Dezember 2009 Geschrieben 1. Dezember 2009 (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 1. Dezember 2009 von unbekannt09
Klotzkopp Geschrieben 1. Dezember 2009 Geschrieben 1. Dezember 2009 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.
unbekannt09 Geschrieben 1. Dezember 2009 Geschrieben 1. Dezember 2009 nur das ich kein wort englisch verstehe
chooter696 Geschrieben 1. Dezember 2009 Geschrieben 1. Dezember 2009 da kann ich dir nen super tipp geben... ... lern es! ....
unbekannt09 Geschrieben 1. Dezember 2009 Geschrieben 1. Dezember 2009 oh sehr freundlich danke was für freundliche umgangsformen in diesem forum hätt ich ja nicht gedacht vielen dank
Klotzkopp Geschrieben 2. Dezember 2009 Geschrieben 2. Dezember 2009 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.
Rekon1602 Geschrieben 2. Dezember 2009 Geschrieben 2. Dezember 2009 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
Empfohlene Beiträge