magisches Quadrat

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
lilhill2002
User
Beiträge: 17
Registriert: Donnerstag 9. November 2006, 18:33

Hallo an alle profies. ich bin noch ein anfenger :( in Programierung, und bitte euch um Hilfe und zwar muss ich eine magischis Quadrat Fertigen aber ich weißi nicht wo mit ich anfangen soll, es so folgendes Funktionieren der benutzer gibt eine zahl ein zb 3 ... meine programm muss 3x3 Felder erstellen und es aus rechen....

Vielen Dank im Voraus... :idea:
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hallo lilhill2002, willkommen im Forum!

Um so ein magisches Quadrat erstellen zu können brauchst du einen Algoritmus - und der hat erstmal nichts mit der Programmiersprache zu tun.

Wie wäre es mit so einem magischen Quadrat, wenn der User 3 eingibt:

Code: Alles auswählen

[1][1][1]
[1][1][1]
[1][1][1]
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
lilhill2002
User
Beiträge: 17
Registriert: Donnerstag 9. November 2006, 18:33

JA genau wie die Algoritmus geht ist mir klar das ist schon richtig was du da geschrieben hast, aber ich weiß imme noch nicht wie ich anfangen soll


wenn der user 3 eingebt:
[/code]

Code: Alles auswählen

[x] [x] [x]
[x] [x] [x]
[x] [x] [x]
oder wenn er 5 eingebt:

Code: Alles auswählen

[x] [x] [x] [x] [x]
[x] [x] [x] [x] [x]
[x] [x] [x] [x] [x]
[x] [x] [x] [x] [x]
[x] [x] [x] [x] [x]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

So eine verschachtelte Struktur bekommst du ganz leicht:

Code: Alles auswählen

In [21]: [[[1] for i in xrange(3)] for i in xrange(3)]
Out[21]: [[[1], [1], [1]], [[1], [1], [1]], [[1], [1], [1]]]
Jetzt musst du nur noch die Zahlen in die Zellen setzen und das Quadrat ausgeben.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
lilhill2002
User
Beiträge: 17
Registriert: Donnerstag 9. November 2006, 18:33

also die Zellen muss ich Programmieren, also der User gibt nur ein Zagl ein (zB.:3) und das muss eine Magisches Quadrat sein also

senkrecht =15
wage recht = 15
didagonal = 15

konnte leider mit den pytohn Code nicht viel anfangen :oops: weil ich noch anfänger bin :oops:

Danke für deine Mühe
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Schau dich am besten mal im Wiki um:
[wiki]Tutorial[/wiki]
[wiki]FAQ#WieFangeIchAlsEinsteigerAn[/wiki]

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ja eben. Wie lautet denn dein Algoritmus (kann auch in Pseudocode sein), um so ein magisches Quadrat zu erstellen?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
lilhill2002
User
Beiträge: 17
Registriert: Donnerstag 9. November 2006, 18:33

Danke für euer antworten, habe mich bei wiki rum geguckt da sind sehr hilf reiche informationen, was ich mir jedentag rein schauen werde. ich habe auch schon paar grundlagen drauf, wie zB. : Schleifen, split, und ein bisschen von Listen und noch paar kleinig keiten, und weiß immer noch nicht anfangen soll.
BlackJack

Leonidas fragte nach Deinem Algorithmus um ein magisches Quadrat zu erstellen. Das ist erst einmal unabhängig von der Programmiersprache.

Wenn Du ein solches Quadrat erstellen sollst und Dich mit Papier und Bleistift da dran setzen würdest, was würdest Du machen?

Nachtrag: Ich habe mich gerade mal ein paar Minuten damit beschäftigt. Falls Deine Antwort nicht "Brute-Force" ist, oder Du Mathe studierst, denke ich es ist legitim im Netz nach einem effizientem Algorithmus zu suchen und den dann in Python zu implementieren. Das ist schon etwas kompliziertere Mathematik.
lilhill2002
User
Beiträge: 17
Registriert: Donnerstag 9. November 2006, 18:33

also ich habe mir das genauer auf einem zettel gemacht und verrucht es anzuwenden so weit komme ich, aber dann habe ich schwerigkeiten:

hier habe ich für die "1" eine Feste position gemacht. und wie ich die andere zahlen zu weißen soll habe bisschen schwerigkeiten.. :roll:

Code: Alles auswählen

print'\n', 'Magisches Quadrat'
print '================='



eingabe = input ('geben sie eine Zahl ein: ')
liste = ['_']* eingabe*eingabe
liste[eingabe/2]=1
# test: print "liste:", liste

for item in range(2,eingabe**2+1):
# test:    print "."*20, item

BlackJack

Du bist Dir darüber im klaren, dass Du nur eine eindimensionale Liste hast und keine verschachtelte? Es geht natürlich auch so, aber verständlicher wird das Programm wahrscheinlich wenn die Datenstruktur ein zweidimensionales Feld wiederspiegelt.

Ich gehe mal davon aus Du hast einen relativ einfachen Algorithmus gefunden um magische Quadrate mit ungeraden "Kantenlängen" zu füllen. Wenn Du das auf dem Papier machst, was musst Du Dir dann alles merken? Zufällig bei welchen Koordinaten Du gerade die letzte Zahl eingetragen hast?

Ansonsten gibt's mit dem Programmstückchen ein Problem: Es läuft nicht weil die ``for``-Schleife keinen Rumpf hat -> `IndentationError`.

Und die Eingabe mit `input()` ist etwas unsicher, weil der Benutzer beliebigen Python-Quelltext eingeben kann, der dann ausgeführt wird. Sauberer wäre es `raw_input()` zu verwenden und die eingegebene Zeichenkette mit `int()` in eine Zahl zu wandeln.

Du solltest versuchen das ganze Programm nicht linear "runterzuhacken" sondern in sinnvolle Funktionen aufzuteilen. Zum Beispiel eine die prüft ob eine Zahl (un)gerade ist um dem Benutzer zu warnen wenn er eine gerade "Kantenlänge" eingibt. Und eine die das Ergebnis überprüft, also ob das Quadrat das Du erzeugst wirklich "magisch" ist.
lilhill2002
User
Beiträge: 17
Registriert: Donnerstag 9. November 2006, 18:33

ja also ich habe wollte zu erst so linear machen nur um erstmal damit klar zu kommen. später werde ich es auch magisch machen. :) also zb. 3x3 Feld. die schleife habe ich auch noch nicht fertig gemacht ist mir schon klar das es nicht so geht :D habe das ergebniss auf dem Papier gemacht. ich habe raus gestellt das es 3 möglich keiten habe also in drei zeilen. das programieren kann. aber bekomme das nicht in Programmier sprache hin :roll: könnt ihr mir paar tipps geben bitte.. :)

Danke nochmal
lilhill2002
User
Beiträge: 17
Registriert: Donnerstag 9. November 2006, 18:33

Code: Alles auswählen

 
[ ][1][ ]
[3][ ][ ]
[ ][ ][2]   #usw. 
BlackJack

Nochmal: Formuliere es doch erst einmal in natürlicher Sprache.

Du fragst den Benutzer nach der Kantenlänge (im Beispiel 3).

Mit dieser Information kannst Du dann die Datenstruktur erstellen. So ein zweidimensionales Feld lässt sich am natürlichsten auf eine verschachtelte Liste abbilden, die eine Liste pro Zeile enthält und in jeder Zeile ist ein Eintrag für ein "Kästchen" aus dem Feld. Wie man das macht hat Leonidas grundsätzlich schon gezeigt, allerdings ist er dabei vielleicht etwas zu dicht an Deinem Wunsch geblieben der etwas zu kompliziert ist. Deine Beispiele sehen immer so aus als wenn jedes einzelne Kästchen auch nochmal eine Liste mit einem Element enthalten soll. Das ist eine Ebene zu tief verschachtelt.

Was Du am Ende haben möchtest, sieht eher so aus:

Code: Alles auswählen

[[9, 1, 5],
 [3, 4, 8],
 [6, 7, 2]]
Diese Datenstruktur mit Nullen gefüllt, legt man so an:

Code: Alles auswählen

In [54]: dimension = 3

In [55]: [[0] * dimension for dummy in xrange(dimension)]
Out[55]: [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
Und der Zugriff sieht so aus:

Code: Alles auswählen

In [59]: field = [[0] * dimension for dummy in xrange(dimension)]

In [60]: field[0][1] = 42

In [61]: field
Out[61]: [[0, 42, 0], [0, 0, 0], [0, 0, 0]]

In [62]: field[2][0]
Out[62]: 0
Der erste Index bestimmt die Zeile, der zweite die Spalte. Du hast also ein Feld bei dem die Felder mit Zeilen und Spaltennummer erreichbar sind.

Und nun bitte Schritt für Schritt beschreiben wie Du diese Nummern auswählst, um der Reihe nach die Kästchen zu füllen.
lilhill2002
User
Beiträge: 17
Registriert: Donnerstag 9. November 2006, 18:33

also ich werde es so vor gehen wenn ich einzeln die einzellne felder ausfüllen soll.

Code: Alles auswählen

field = [[0] * dimension for dummy in xrange(dimension)]

field[0][0] = 9
field[0][1] = 1
field[0][2] = 5
field[1][0] = 3
field[1][1] = 4
field[1][2] = 8
field[2][0] = 6
field[2][1] = 7
field[2][2] = 2
ist das eine Übung für ich :P
BlackJack

Na prima, dann hast Du jetzt eine Lösung. :-)
lilhill2002
User
Beiträge: 17
Registriert: Donnerstag 9. November 2006, 18:33

ja das habe ich geschaft die liste aus zu füllen ist ja nicht schwer :).. aber das programmieren zu können ist es schwer... also wie ist liste Aus fülle ist nicht schwer aber was wenn der benutzer mehr als drei felder eingebt Zb. 5... es muss doch eine Algorithmus geben wie man das an stellt. und das was ich da gemacht habe sind ja Fertige listen :) kann man ja noch einfacher Programmieren... sorry, wenn ich zu viel Frage, ich bin ja neueling von Python habe angefangen erst seit 3 monaten... :oops:
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

lilhill2002 hat geschrieben:es muss doch eine Algorithmus geben wie man das an stellt.
Stimmt, Wikipedia beschreibt einen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Nach dem Beispiel mit den ersten drei Zahlen das von *ihm* kam, dachte ich eigentlich den Algorithmus von Wikipedia kennt er schon. Das wäre sonst schon ein ziemlich grosser Zufall...
lilhill2002
User
Beiträge: 17
Registriert: Donnerstag 9. November 2006, 18:33

die die Algorithmus ist mir bekannt.. es war keine zufall... aber die berechnung kann ich nicht... oder das erzetzen nach einandere mit Whli oder for Schleife... :roll:
Antworten