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.
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:
lilhill2002
User
Beiträge: 17
Registriert: Donnerstag 9. November 2006, 18:33

also habe meine es jetzt so weit bekommen habe den Consolen Skript noch eingefügt damit ich das später die Oberfläsche bearbeiten kann aber das brechen fellt mir echt schwer.. :cry:

Code: Alles auswählen

# -*- coding: utf-8 -*-
###############################################

import console

bilds = console.Console()
bilds.clrScr()
bilds.setTitle('.:::Magisches Quadrat:::.')
bilds.gotoXY(0,24)
bilds.cPuts('geben sie ein Ungerade Zahl ein ( 3,5,7,9,11): ')
eingabe = bilds.cGets(2)
dim = int(eingabe)

if dim in [3, 5, 7, 9, 11]:
# Eine Liste initialisieren:

#    bilds.clrScr()
    bilds.clrScr()
    eingabe =[]
    for i in range (dim):
        liste = ['_']*dim
        eingabe.append(liste)
    eingabe [0] [dim/2] = 1

    print eingabe

# Ein Quadrat erstellen:

else:
    # Bei falscher Eingabe Programm beenden:
    bilds.clrScr()
    bilds.cPuts('falsche Eingabe -> Programm wird beendet!')
BlackJack

Also nochmal: Beschreibe in Worten wie Du Schritt für Schritt vorgehst um die Zahlen einzutragen. Du musst Dir jeweils merken welches Feld als letztes ausgefüllt wurde -> Koordinaten. Und dann musst Du beschreiben wie Du diese Koordinaten veränderst um zum jeweils nächsten Feld zu kommen.
Lilmil
User
Beiträge: 5
Registriert: Mittwoch 29. November 2006, 15:05
Wohnort: Bremen

Hi leute ich bin mit lilhil2002 in einer klasse das beudetet auf dem gleichen level und ich krieg es nicht gebacken die zahlen so zu positionieren das es waggerecht diagonal und senkrecht das gleich eergibt ich hab es nur bisher das die 1 immer inner mitte der ersten zeile ist.
so zum beispiel:

[0,0,1,0,0]
[0,0,1,0,0]
[0,0,1,0,0][/code]
Bin ein Anfänger in Sachen Programmieren und hab nochnie vorher C/C++ oder andere Programmiersprachen geschrieben.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hallo Lilmil, willkommen im Forum,
Lilmil hat geschrieben:ich krieg es nicht gebacken die zahlen so zu positionieren das es waggerecht diagonal und senkrecht das gleich eergibt ich hab es nur bisher das die 1 immer inner mitte der ersten zeile ist.
Tja, dann wirst du daran noch etwas arbeiten müssen. Aber es ist sicherlich zu schaffen, ich wünsche dir viel Glück.

Hast du auch eine Frage und magst du einfach nur deine Zwischenergebnisse dokumentieren?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Lilmil
User
Beiträge: 5
Registriert: Mittwoch 29. November 2006, 15:05
Wohnort: Bremen

Toll ichd achte hier bekommt man hilfe. mein lehrer meint ich brauch den modulo operator (%) aber kp wi eman den einsetzt.-
Bin ein Anfänger in Sachen Programmieren und hab nochnie vorher C/C++ oder andere Programmiersprachen geschrieben.
Benutzeravatar
Blattlaus
User
Beiträge: 55
Registriert: Donnerstag 24. August 2006, 08:55

Man bekommt Hilfe. Du willst allerdings keine hilfe, du willst, dass dir jemand das Endergebnis gibt.
Und wenn du nicht weißt, was Modulo ist, kannst du entweder deinen Lehrer fragen, oder irgendwo nachschauen. Beispielsweise hier: http://de.wikipedia.org/wiki/Modulo
BlackJack

Nochmal eine Zusammenfassung "unserer" "Forderungen":

Der Algorithmus selbst steht bei Wikipeda.

Erster Schritt: Das ganze mit Papier und Bleistift nachvollziehen und dann in natürlicher Sprache möglichst genau, Schritt für Schritt formulieren was gemacht werden muss. Felder und "Bewegungen" von einem Feld zum nächsten dabei in Koordinaten ausdrücken. Überprüfen ob ein wirklich dämlicher Mensch damit was anfangen kann, weil ihr das später einem Rechner "erklären" müsst. Rechner können gut und schnell mit Zahlen, sind sonst aber dumm wie Brot.

Zweiter Schritt: Versuchen die Beschreibung wenn nötig noch etwas genauer zu formulieren und in Programmcode umzuwandeln.

Dritter Schritt: Beschreibung und Programmcode herzeigen und beschreiben wo genau das Problem liegt, oder wo das gezeigte Programm etwas anderes macht als ihr erwartet.

Wir helfen hier gerne bei konkreten Problemen. Was es im allgemeinen nicht gibt, sind Komplettlösungen zu Hausaufgaben oder wirklich ganz grundlegende Erklärungen, die man sich durch ein Anfängertutorial erarbeiten kann, bzw. die eigentlich im Unterricht erklärt werden müssten.

Modulo kann man übrigens benutzen, um den Quelltext etwas zu verkürzen, aber es geht auch ohne. Also nicht krampfhaft nach einer Lösung mit Modulo suchen, sondern lieber erstmal das Problem als ganzes Lösen. Optimieren kann man später immer noch.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Lilmil hat geschrieben:Toll ichd achte hier bekommt man hilfe. mein lehrer meint ich brauch den modulo operator (%) aber kp wi eman den einsetzt.-
Deine frage ist, wie man Modulo verwendet? Fein, das kann ich dir erklären, man nutzt es so:

Code: Alles auswählen

In [2]: 5 % 2
Out[2]: 1
In [3]: 5 % 5
Out[3]: 0
In [4]: 5 % 1
Out[4]: 0
In [5]: 5 % 3
Out[5]: 2
In [6]: 10 % 5
Out[6]: 0
In [7]: 10 % 3
Out[7]: 1
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Lilmil
User
Beiträge: 5
Registriert: Mittwoch 29. November 2006, 15:05
Wohnort: Bremen

lol ich weiß das ich selber auf das ergebnis kommen muss und es auch unbedingt will hast falsch verstanden vllt. naja auf jeden fall kenn ich auch den modulo operator und seine aufgabe. naja hab das prog. jetzt fertig und mache noch ein paar erweiterungen.ciao :lol: thx für eure hilfe
Bin ein Anfänger in Sachen Programmieren und hab nochnie vorher C/C++ oder andere Programmiersprachen geschrieben.
lilhill2002
User
Beiträge: 17
Registriert: Donnerstag 9. November 2006, 18:33

Hallo habe mich mit ein Kopel zusammen gesetzt und haben das raus bekommen es funktioniert .. aber sieht noch nicht schick aus.. vielleicht irgend jemand paar vorschläge ....
Danke :D

Code: Alles auswählen

# -*- coding: utf-8 -*-



import console

bilds = console.Console()
bilds.clrScr()
bilds.setTitle('.:::Magisches Quadrat:::.')
bilds.gotoXY(0,24)

eingabe = input('Wie gross soll ihr magisches Quadrat werden? : ')
print 45*'='

magischequadrat = []
lieste = []
ersatz = 0
x = 0
y = 0

# Schreibe Nullen in das Magische Quadrat
for i in range (eingabe):
    lieste=[]
    for j in range (eingabe):
        lieste+=[0]
    magischequadrat+=[lieste]


if eingabe % 2 == 1:

    x = eingabe / 2

    magischequadrat[y][x] = 1

# berechnung des Magischen Quadrates
    for i in range (2, eingabe*eingabe+1):
        altexwert = x
        alteywert = y
# wagerechts verschiebung
        y -= 1
        if y < 0:
            y = eingabe - 1
# senkerecht verschiebung
        x += 1
        if x > eingabe - 1:
            x = 0
# wenn das Feld bestz ist dann ersetzte das alte mit den neuen
        if magischequadrat[y][x] > 0:
           x = altexwert
           y = alteywert + 1
           if y == eingabe:
                y = 0
        magischequadrat[y][x] = i

# ausgeben des Magesches Quadrat
    print ''
    for lieste in magischequadrat:
        print lieste

# Fehlermeldung bei gerader Zahl

else:
    # Bei falscher Eingabe Programm beenden:
    bilds.clrScr()
    bilds.cPuts('falsche Eingabe -> Programm wird beendet!')
BlackJack

Na bitte, sieht doch gut aus. :-)

Und letztendlich war es doch gar nicht so schwer, oder? Du bzw. Ihr habt dabei sehr viel mehr gelernt, als wenn ihr den Problemen und Fehlern nicht selbst begengnet wärt. Eine Problemstellung als Algorithmus zu formulieren und in Quelltext zu giessen, kann man nur durch selbermachen/üben gut lernen.

Ein paar Kleinigkeiten an der Form könnten noch verbessert werden. Zum Beispiel Leerzeichen vor und nach Operatoren und keine zwischen Funktionsname und Argumenten. Der Block ab Zeile 45 ist etwas inkonsistent eingerückt.

Die Kommentare sollte man passend zum Quelltext einrücken. Eine der Stärken von Python ist ja, dass man die Programmstruktur an der Einrückung erkennen kann, dem laufen diese "hervorstechenden" Kommentare ein wenig zuwider.

Dann solltest Du unbedingt `lieste` durch `liste` ersetzen. `magisches_quadrat` und `alter_x_wert` wären ein wenig lesbarer.

Aber wie gesagt, das sind alles nur Kleinigkeiten.

Strukturell könnte man das Programm so ändern, dass in der Schleife erst die Zahl an die aktuellen Koordinaten gesetzt wird und dann die neue Position bestimmt wird. Dann bräuchte die 1 keine extra Zeile im Quelltext sondern könnte auch in der Schleife gesetzt werden. Und Du kannst Dir überlegen wo der Modulo-Operator nützlich sein könnte, wenn Euer Lehrer den erwähnt hat.
Antworten