Hallo,
nachdem ich schon gelesen habe, dass hier keine kompletten Aufgaben gelöst werden, was gut ist, denn ich möchte auch selbst etwas zu denken haben, habe ich eine Frage zu einem Schritt bei einer Aufgabe, den ich so noch nie gemacht habe.
Ich lasse eine beliebige Person interaktiv mit der input Funktion die Länge einer quadratischen Matrix angeben, was noch sehr einfach ist.
Im nächsten Schritt sollte allerdings eine leere Quadratmatrix dieser Länge als Listen in einer Liste herauskommen, die die Person nun Zahl für Zahl füllen kann und zudem soll eine Liste mit allen Zahlen, die in der Matrix stehen dürfen ausgegeben werden, die Liste soll der spätere Benutzer aber nicht sehen, er soll nur darauf hingewiesen werden, wenn er eine Zahl verwendet, die nicht mehr in der Liste steht.
Wie mache ich das? Danke für eure Lösungen und Erklärungen, wie man das macht, denn ich weiß es leider nicht.
Schöne Grüße
Python24
Leere Matrix öffnen
Dann zeig uns doch mal, was du schon sehr einfaches gemacht hast. Wie du den User die Eingabe machen laesst.
Und dann sehen wir mal weiter...
Denn so ist das hier schlicht doch das fragen nach der eierlegenden Wollmilchsauloesung.
Und dann sehen wir mal weiter...
Denn so ist das hier schlicht doch das fragen nach der eierlegenden Wollmilchsauloesung.
Leider ist es nicht viel...
n=input("Länge der Quadratmatrix")
...diese eine Zeile, und dann sollten die Matrix aufgehen und die Liste erstellt werden, also wenn der Nutzer zum Beispiel 2 eingibt sollte sich
[[ , ] , [ , ]] oder etwas ähnliches öffnen und z.B. [1, 2, 3, 4] erstellt werden und nun kann immer eine Zahl aus der Liste irgendwo in die Matrix eingesetzt werden, der Nutzer sieht die Liste nicht, aber sollte er z.B. die 5 einsetzen wollen, wird er darauf hingewiesen, dass diese fehlt.
Ich habe es schon mit for-Schleifen und while-Schleifen probiert, aber nichts hat geklappt, es sei denn ich habe vor dem input etwas vergessen, denn wenn dann später noch weitere Bedingungen für die Matrix gelten sollen, fehlt vielleicht ein def oder class, aber das kann ich nicht sicher sagen, dafür bin ich wohl zu unerfahren, sorry
Ich hoffe das hilft bei der Beantwortung meines Problems, denn ich habe schon einiges versucht.
n=input("Länge der Quadratmatrix")
...diese eine Zeile, und dann sollten die Matrix aufgehen und die Liste erstellt werden, also wenn der Nutzer zum Beispiel 2 eingibt sollte sich
[[ , ] , [ , ]] oder etwas ähnliches öffnen und z.B. [1, 2, 3, 4] erstellt werden und nun kann immer eine Zahl aus der Liste irgendwo in die Matrix eingesetzt werden, der Nutzer sieht die Liste nicht, aber sollte er z.B. die 5 einsetzen wollen, wird er darauf hingewiesen, dass diese fehlt.
Ich habe es schon mit for-Schleifen und while-Schleifen probiert, aber nichts hat geklappt, es sei denn ich habe vor dem input etwas vergessen, denn wenn dann später noch weitere Bedingungen für die Matrix gelten sollen, fehlt vielleicht ein def oder class, aber das kann ich nicht sicher sagen, dafür bin ich wohl zu unerfahren, sorry
Ich hoffe das hilft bei der Beantwortung meines Problems, denn ich habe schon einiges versucht.
Zuerstmal etwas technisches: benutze bitte die code-tags um deinen Quellcode zu formatieren. Sonst ist der schlicht unlesbar, auch und gerade bei Python, da die Einrueckung kaputt gemacht wird, und der Code nicht verstanden wird.
input sollte man eigentlich nicht benutzen, weil das zu Sicherheitsproblemen fuehren kann. Beziehungsweise zu komischen Fehlern, weil man zB eine Gleitkommazahl oder eine Zeichenkette bekommt.
Besser darum
Und jetzt, wo du n hast - ja, da musst du eine Liste anlegen, mit n Elementen drin, und jedes dieser Elemente ist wieder eine Liste mit n Zahlen drin.
Direkt hingeschrieben zb
Das ist natuerlich nicht dynamisch. Versuch doch erst einmal, eine Liste nur mit n Eintraegen von 0 zu machen. Mit einer For-Schleife, und der append-Methode einer Liste geht das zB.
input sollte man eigentlich nicht benutzen, weil das zu Sicherheitsproblemen fuehren kann. Beziehungsweise zu komischen Fehlern, weil man zB eine Gleitkommazahl oder eine Zeichenkette bekommt.
Besser darum
Code: Alles auswählen
n = int(raw_input("Bitte Dimension eingeben")) # nur input bei Python 3Direkt hingeschrieben zb
Code: Alles auswählen
matrix = [ [0, 1], [2, 3]]Hier einmal einer meiner Versuche, damit man sieht, was ich alles schon versucht habe und wie mich diese Aufgabe runterzieht:
Außerdem gehe ich davon aus, wenn da mehr als [] herauskäme, wäre die Matrix gefüllt, aber sie muss eben leer sein, ebenso fehlt wieder der input für den späteren Benutzer.
Nachdem ich nun schon einen ersten Anstoß bekommen habe, versuche ich es morgen nochmal, aber ich denke, das einzige, was mir wirklich helfen würde ist eine Musterlösung ohne Kommentare, denn so weiß ich einerseits wie es geht und andererseits muss ich doch noch selbst überlegen, wenn ich dann einer anderen Person erklären müsste, was das Programm genau macht.
Code: Alles auswählen
n=input("Dimension der Quadratmatrix")
L=[]
M=[]
x=n
while(x<n):
M=x
M.append(L)
x+=1
y=n
while(y<n):
N=y
L.append(N)
y+=1
print(M)Nachdem ich nun schon einen ersten Anstoß bekommen habe, versuche ich es morgen nochmal, aber ich denke, das einzige, was mir wirklich helfen würde ist eine Musterlösung ohne Kommentare, denn so weiß ich einerseits wie es geht und andererseits muss ich doch noch selbst überlegen, wenn ich dann einer anderen Person erklären müsste, was das Programm genau macht.
-
BlackJack
@Python24: Das kann so ganz offensichtlich nicht funktionieren. Nach ``x = n`` hast Du eine Schleife die überhaupt nur durchlaufen wird wenn ``x < n`` ist, was natürlich nicht der Fall ist wenn die gleich sind.
Die Klammern um die Bedingungen bei ``while`` gehören da nicht hin. (Und eigentlich sollten das auch keine ``while``-Schleifen sein, sondern ``for``-Schleifen.)
Die Name sollten besser gewählt sein und nicht bloss aus je einem Buchstaben bestehen. Ein Name sollte dem Leser die Bedeutung des Wertes im Programm vermitteln. Wenn man die Namen hier sprechend wählen würde, dann würde einem auch bei der einen oder anderen Zeile auffallen das keinen Sinn macht.
Eine übliche Lösungsstrategie ist es ein Problem in kleinere Teilprobleme zu zerlegen. Und diese Teilprobleme wieder in kleinere Teilprobleme. Solange bis ein Teilproblem so klein ist, dass man es mit einer Funktion mit wenigen Zeilen lösen kann. Und aus diesen *getesteten* Teillösungen setzt man dann grössere Teillösungen zusammen, bis man eine Gesamtlösung hat. Bei dieser Aufgabe hat man das Problem eine n×n-Matrix vom Benutzer eingeben zu lassen. Also n Zeilen mit je n Elementen. Also könnte man ein Teilproblem herausziehen vom Benutzer eine n Elemente eingeben zu lassen. Wenn man so eine Funktion hätte, könnte man die ja einfach n-mal Aufrufen und die Ergebnisse in eine Liste stecken. Und die Eingabe von n Elementen in einer Liste kann man runterbrechen auf eine Funktion die *ein* Element vom Benutzer eingeben lässt. Und die kann man dann n-mal aufrufen und die Ergebnisse in eine Liste stecken. Und bei der Funktion zur Eingabe *eines* Elements vom Benutzer kann man auch den Test auf die Menge von Elementen machen, aus denen der Benutzer wählen muss. Menge passt hier übrigens auch besser als Datentyp (`set`) anstelle von einer Liste.
Also fang doch einfach mal mit einer Funktion an die den Benutzer nach *einer* Zahl fragt, und das mit einer Menge von erlaubten Eingaben abgleicht, und erst ein Ergebnis zurück gibt, wenn der Benutzer eine passende Zahl eingegeben hat. Wenn die Funktion vor der Rückgabe diese Zahl aus der Datenstruktur mit den erlaubten Zahlen auch noch entfernt, dann ist eine Gesamtlösung nur noch ein zwei Funktionen die sehr ähnlich sind, und sehr kurz sind, entfernt. Wichtig: Alle Werte (ausser Konstanten) die von einer Funktion verwendet werden, sollten diese als Argumente betreten.
Edit: Mir war mal wieder nach CBM BASIC V2:
Testlauf:
Die Klammern um die Bedingungen bei ``while`` gehören da nicht hin. (Und eigentlich sollten das auch keine ``while``-Schleifen sein, sondern ``for``-Schleifen.)
Die Name sollten besser gewählt sein und nicht bloss aus je einem Buchstaben bestehen. Ein Name sollte dem Leser die Bedeutung des Wertes im Programm vermitteln. Wenn man die Namen hier sprechend wählen würde, dann würde einem auch bei der einen oder anderen Zeile auffallen das keinen Sinn macht.
Eine übliche Lösungsstrategie ist es ein Problem in kleinere Teilprobleme zu zerlegen. Und diese Teilprobleme wieder in kleinere Teilprobleme. Solange bis ein Teilproblem so klein ist, dass man es mit einer Funktion mit wenigen Zeilen lösen kann. Und aus diesen *getesteten* Teillösungen setzt man dann grössere Teillösungen zusammen, bis man eine Gesamtlösung hat. Bei dieser Aufgabe hat man das Problem eine n×n-Matrix vom Benutzer eingeben zu lassen. Also n Zeilen mit je n Elementen. Also könnte man ein Teilproblem herausziehen vom Benutzer eine n Elemente eingeben zu lassen. Wenn man so eine Funktion hätte, könnte man die ja einfach n-mal Aufrufen und die Ergebnisse in eine Liste stecken. Und die Eingabe von n Elementen in einer Liste kann man runterbrechen auf eine Funktion die *ein* Element vom Benutzer eingeben lässt. Und die kann man dann n-mal aufrufen und die Ergebnisse in eine Liste stecken. Und bei der Funktion zur Eingabe *eines* Elements vom Benutzer kann man auch den Test auf die Menge von Elementen machen, aus denen der Benutzer wählen muss. Menge passt hier übrigens auch besser als Datentyp (`set`) anstelle von einer Liste.
Also fang doch einfach mal mit einer Funktion an die den Benutzer nach *einer* Zahl fragt, und das mit einer Menge von erlaubten Eingaben abgleicht, und erst ein Ergebnis zurück gibt, wenn der Benutzer eine passende Zahl eingegeben hat. Wenn die Funktion vor der Rückgabe diese Zahl aus der Datenstruktur mit den erlaubten Zahlen auch noch entfernt, dann ist eine Gesamtlösung nur noch ein zwei Funktionen die sehr ähnlich sind, und sehr kurz sind, entfernt. Wichtig: Alle Werte (ausser Konstanten) die von einer Funktion verwendet werden, sollten diese als Argumente betreten.
Edit: Mir war mal wieder nach CBM BASIC V2:
Code: Alles auswählen
10 REM DIMENSION ERFRAGEN
20 INPUT "DIMENSION DER QUADRATMATRIX";N:M=N*N
30 REM MATRIX ERFRAGEN
40 DIM M(N,N),S(M)
50 FOR I=1 TO N:FOR J=1 TO N
60 PRINT "M(";I;",";J;")";:INPUT X
70 IF X=INT(X) AND X>=1 AND X<=M THEN 90
80 PRINT "NUR GANZE ZAHLEN VON 1 BIS";M;"!":GOTO 60
90 IF S(X) THEN PRINT X;"WURDE SCHON GEWAEHLT!":GOTO 60
100 S(X)=-1:M(I,J)=X:NEXT:NEXT
110 REM MATRIX AUSGEBEN
120 FOR I=1 TO N:FOR J=1 TO N:PRINT TAB((J-1)*4);M(I,J);:NEXT:PRINT:NEXTCode: Alles auswählen
RUN
DIMENSION DER QUADRATMATRIX? 3
M( 1 , 1 )?
NUR GANZE ZAHLEN VON 1 BIS 9 !
M( 1 , 1 )? 1.5
NUR GANZE ZAHLEN VON 1 BIS 9 !
M( 1 , 1 )? 0
NUR GANZE ZAHLEN VON 1 BIS 9 !
M( 1 , 1 )? 1
M( 1 , 2 )? 1
1 WURDE SCHON GEWAEHLT!
M( 1 , 2 )? 2
M( 1 , 3 )? 3
M( 2 , 1 )? 4
M( 2 , 2 )? 5
M( 2 , 3 )? 6
M( 3 , 1 )? 7
M( 3 , 2 )? 8
M( 3 , 3 )? 9
1 2 3
4 5 6
7 8 9
READY.Was du hier machst ist wirklich einleuchtend. DANKE dafür gleich einmal.
Allerdings erkenne ich nicht, wo du eine Liste mit den Zahlen, die in der Matrix erlaubt sind erstellst z.B. von 1 bis n²
und des Weiteren ist mir noch nicht klar, was ich tun müsste, wollte ich zahlen an einer beliebigen Stelle in der Matrix einsetzen, du bist darauf angewiesen spaltenweise durch alle Zeilen durchzugehen, was aber, wenn ich bei (1,3) beginne, dann (2,1), dann (3,1)...?
Allerdings erkenne ich nicht, wo du eine Liste mit den Zahlen, die in der Matrix erlaubt sind erstellst z.B. von 1 bis n²
und des Weiteren ist mir noch nicht klar, was ich tun müsste, wollte ich zahlen an einer beliebigen Stelle in der Matrix einsetzen, du bist darauf angewiesen spaltenweise durch alle Zeilen durchzugehen, was aber, wenn ich bei (1,3) beginne, dann (2,1), dann (3,1)...?
-
BlackJack
@Python24: Der Quelltext in meinem letzten Beitrag ist BASIC für den Commodore 64 und kein Python!
In dem BASIC-Programm gibt es ein Array (``S()``) um die schon benutzen Zahlen zu markieren. Das ist am Anfang nach dem Anlegen mit ``DIM`` mit 0-Werten gefüllt, was in CBM BASIC ”falsch” im boole'schen Kontext bedeutet und jeder Wert ist ein Flag für die Zahl die den Index darstellt. Wenn eine Zahl benutzt wurde, wird der Eintrag auf -1 gesetzt, was in CBM BASIC im boole'schen Kontext ”wahr” bedeutet. Dieses Vorgehen könnte man wenn die erlaubten Zahlen tatsächlich von 0 oder 1 bis n² gehen sogar so ähnlich umsetzen. Dran denken das bei Python das zählen bei 0 anfängt und Endpunkte normalerweise nicht inklusive sind, man also eventuell noch 1 drauf addieren muss.
Wenn Du in beliebiger Reihenfolge Zahlen setzen möchtest, dann müsstest Du eventuell doch die komplette Matrix einmal ”leer” erstellen. Oder ein Wörterbuch verwenden das Koordinaten auf Werte abbildet. Und dann entweder die Reihenfolge vorgeben, oder vor- oder zusätzlich zum jeweiligen Wert noch die Koordinaten vom Benutzer abfragen. Ausserdem braucht man dann ja eventuell noch zusätzliche Prüfungen, zum Beispiel ob die Matrix komplett gefüllt ist. Damit veränderst Du allerdings auch die Anforderungen, denn von so etwas war im ersten Beitrag keine Rede. Welche Datenstruktur man für eine Aufgabe wählt und wie man dann vorgeht, hängt davon ab was für Operationen man auf den Daten vornehmen will/muss. Was willst Du denn eigentlich machen? Was ist das Ziel? Was sind die Anforderungen an das Programm?
In dem BASIC-Programm gibt es ein Array (``S()``) um die schon benutzen Zahlen zu markieren. Das ist am Anfang nach dem Anlegen mit ``DIM`` mit 0-Werten gefüllt, was in CBM BASIC ”falsch” im boole'schen Kontext bedeutet und jeder Wert ist ein Flag für die Zahl die den Index darstellt. Wenn eine Zahl benutzt wurde, wird der Eintrag auf -1 gesetzt, was in CBM BASIC im boole'schen Kontext ”wahr” bedeutet. Dieses Vorgehen könnte man wenn die erlaubten Zahlen tatsächlich von 0 oder 1 bis n² gehen sogar so ähnlich umsetzen. Dran denken das bei Python das zählen bei 0 anfängt und Endpunkte normalerweise nicht inklusive sind, man also eventuell noch 1 drauf addieren muss.
Wenn Du in beliebiger Reihenfolge Zahlen setzen möchtest, dann müsstest Du eventuell doch die komplette Matrix einmal ”leer” erstellen. Oder ein Wörterbuch verwenden das Koordinaten auf Werte abbildet. Und dann entweder die Reihenfolge vorgeben, oder vor- oder zusätzlich zum jeweiligen Wert noch die Koordinaten vom Benutzer abfragen. Ausserdem braucht man dann ja eventuell noch zusätzliche Prüfungen, zum Beispiel ob die Matrix komplett gefüllt ist. Damit veränderst Du allerdings auch die Anforderungen, denn von so etwas war im ersten Beitrag keine Rede. Welche Datenstruktur man für eine Aufgabe wählt und wie man dann vorgeht, hängt davon ab was für Operationen man auf den Daten vornehmen will/muss. Was willst Du denn eigentlich machen? Was ist das Ziel? Was sind die Anforderungen an das Programm?
Wie bereits gesagt, ist mein Problem eben die Erstellung der leeren Matrix, also der Listen in einer Liste.
Um die Aufgabe genauer zu erklären:
Der Benutzer des Programms gibt später die Dimension n der Matrix ein
Eine leere Matrix wird ihm angegeben und eine Liste wird erstellt, die alle Zahlen enthält, die die Matrix enthalten darf z.B. von 1 bis n²
Der Nutzer füllt an einer beliebigen Stelle eine Zahl ein und wird darauf hingewiesen, ob er diese Zahl noch verwenden kann und auch bestimmte andere Bedingungen erfüllt sind, die ich aber selbst eingeben kann und deshalb hier nicht diskutieren will, sollte aber ein Beispiel notwendig sein, nehmen wir einfach an, dass die Summen der Hauptdiagonalen gleich sein müssen.
Um die Aufgabe genauer zu erklären:
Der Benutzer des Programms gibt später die Dimension n der Matrix ein
Eine leere Matrix wird ihm angegeben und eine Liste wird erstellt, die alle Zahlen enthält, die die Matrix enthalten darf z.B. von 1 bis n²
Der Nutzer füllt an einer beliebigen Stelle eine Zahl ein und wird darauf hingewiesen, ob er diese Zahl noch verwenden kann und auch bestimmte andere Bedingungen erfüllt sind, die ich aber selbst eingeben kann und deshalb hier nicht diskutieren will, sollte aber ein Beispiel notwendig sein, nehmen wir einfach an, dass die Summen der Hauptdiagonalen gleich sein müssen.
Ich habe nun einmal versucht deinen BASIC-Text in Python zu übersetzen, aber da habe ich schon Probleme, da mir BASIC überhaupt nichts sagt:
Allein das zu korregieren wäre schon hilfreich, obwohl ich dann doch mit der eigentlichen Frage, die ich vorher nochmal erklärt habe glücklicher wäre.
Code: Alles auswählen
N=input("DIMENSION DER QUADRATMATRIX")
M=(N,N),S=(M),M=N*N
for I in N:
for J in N:
print("M(",I,",",J,")")
input(X)
if X in INT(X) and X>=1 and X<=M:
print("NUR GANZE ZAHLEN VON 1 BIS",M,"!")
if S(X):
print(X,"WURDE SCHON GEWAEHLT!")
for I in N:
for J in N:
print(tab((J-1)*4), M(I,J),next(print(next)))
@Python24: vergiß das BASIC, das ist nur eine Homeworkcopyprotection. Du willst also eine Liste mit n Listen , die n Elemente enthalten. Das Objekt für nicht vorhanden ist in Python üblicherweise None. Jetzt kannst Du Dir überlegen, welche Funktionen Du kennst, um Listen zu erzeugen, oder Elemente an Listen anzuhängen. for-Schleifen kennst Du ja schon.
-
BlackJack
@Python24: Die Aufgabe war am Anfang vielleicht noch gerade so an der Grenze von etwas was man an einem Stück lösen kann, aber mittlerweile ist ziemlich deutlich dass man das in kleinere Teilaufgaben zerlegen sollte, also mehrere kleine, in sich geschlossene Funktionen schreiben sollte die jeweils eine Teilaufgabe lösen. Und das Hauptprogramm sollte auch in einer Funktion stecken, damit man gar nicht erst in die Versuchung kommt auf globale Variablen zuzugreifen und alles immer schön sauber über Argumente und Rückgabewerte macht.
So jetzt habe ich es selbst nochmal probiert und bin mit den Tipps ziemlich weit gekommen:
Erst einmal, um Missverständnisse zu vermeiden, soll die Liste mit den erlaubten Zahlen dem späteren Nutzer nicht gezeigt werden, deshalb steht kein print(L).
Probleme, die nun noch bestehen, wo füge ich nun den input an, damit der spätere Nutzer auch etwas in die Matrix eintragen kann, und durch was muss die 1 bei N.append(1) ersetzt werden, damit die Matrix leer aber eben befüllbar ist?
Code: Alles auswählen
n=int(input("Dimension der Quadratmatrix")) #Eingabefunktion zur Dimension
L=[]
for t in range(1, n**2+1):
L.append(t) #Erstellen der Liste mit den erlaubten Zahlen
M=[]
for u in range(1, n+1):
N=[]
for v in range(1, n+1):
N.append(1)
M.append(N)
print(M) #Erstellen der leeren MatrixProbleme, die nun noch bestehen, wo füge ich nun den input an, damit der spätere Nutzer auch etwas in die Matrix eintragen kann, und durch was muss die 1 bei N.append(1) ersetzt werden, damit die Matrix leer aber eben befüllbar ist?
-
BlackJack
@Python24: Was ist denn eine ”leere” Matrix? Irgendwas muss da ja an den einzelnen Positionen hinterlegt sein. Den üblichen Wert für ”nichts” hat Sirius3 ja schon genannt: `None`.
Bessere Namen wären nicht schlecht, dann braucht man weniger Kommentare. Denn der Kommentar was `L` *eigentlich* bedeutet steht ja nur an einer Stelle im Quelltext. Wenn man statt `L` einen Namen wählt der beschreibt was der Wert bedeutet braucht man a) den Kommentar nicht mehr und b) steht die Bedeutung dann überall dort wo man den Namen verwendet und man muss nicht im Quelltext nach einem Kommentar suchen der einem das vielleicht erklärt.
Die Listen lassen sich auch alle einfacher/kompakter erstellen. Beim jetzigen `L` kann man einfach die `list()`-Funktion verwenden, der kann man nämlich ein beliebiges iterierbares Objekt übergeben und die Elemente daraus werden dann in einer Liste gesammelt und zurückgegeben.
Allerdings braucht man die Werte doch gar nicht in einer Liste stehen haben, denn jedes Element dort ist einfach nur der Wert vom Index + 1. Man will doch aber gar nicht die Werte sondern nur wissen ob ein Wert schon verwendet wurde oder nicht. Das lässt sich mit einem einfachen `True` oder `False` pro Wert ausdrücken. Man kann also auch einfach eine Liste mit n²+1 `False`-Werten erstellen. Dazu solltest Du mal nachlesen was passiert wenn man eine Liste mit einer ganzen Zahl multipliziert.
*Das* und „list comprehension“-Syntax kann auch das erstellen der Matrix zu einem einfachen Einzeiler werden lassen.
Edit: Und ich sehe da immer noch keine Funktion(en). Das ist wichtig! Du willst gar nicht erst anfangen grössere Programme auf Modulebene zu schreiben. Das macht hinterher nur unnötig Arbeit das auf Funktionen aufzuteilen.
Bessere Namen wären nicht schlecht, dann braucht man weniger Kommentare. Denn der Kommentar was `L` *eigentlich* bedeutet steht ja nur an einer Stelle im Quelltext. Wenn man statt `L` einen Namen wählt der beschreibt was der Wert bedeutet braucht man a) den Kommentar nicht mehr und b) steht die Bedeutung dann überall dort wo man den Namen verwendet und man muss nicht im Quelltext nach einem Kommentar suchen der einem das vielleicht erklärt.
Die Listen lassen sich auch alle einfacher/kompakter erstellen. Beim jetzigen `L` kann man einfach die `list()`-Funktion verwenden, der kann man nämlich ein beliebiges iterierbares Objekt übergeben und die Elemente daraus werden dann in einer Liste gesammelt und zurückgegeben.
Allerdings braucht man die Werte doch gar nicht in einer Liste stehen haben, denn jedes Element dort ist einfach nur der Wert vom Index + 1. Man will doch aber gar nicht die Werte sondern nur wissen ob ein Wert schon verwendet wurde oder nicht. Das lässt sich mit einem einfachen `True` oder `False` pro Wert ausdrücken. Man kann also auch einfach eine Liste mit n²+1 `False`-Werten erstellen. Dazu solltest Du mal nachlesen was passiert wenn man eine Liste mit einer ganzen Zahl multipliziert.
*Das* und „list comprehension“-Syntax kann auch das erstellen der Matrix zu einem einfachen Einzeiler werden lassen.
Edit: Und ich sehe da immer noch keine Funktion(en). Das ist wichtig! Du willst gar nicht erst anfangen grössere Programme auf Modulebene zu schreiben. Das macht hinterher nur unnötig Arbeit das auf Funktionen aufzuteilen.
Ok, wenn ich dich jetzt verstanden habe, könnte ich mir die Matrix leichter geben lassen eben mit 'list', allerdings bleibe ich dann doch lieber bei dem mir vertrauten.
Nochmal, die Matrix soll nicht mit 'None' gefüllt werden, sie soll leer sein, so dass ein Nutzer später beliebig zahlen einsetzen kann, und wenn das nicht geht, erhalten die Felder eben Namen von a11 bis ann.
Den vorletzten Abschnitt verstehe ich leider überhaupt nicht, soll ich nun statt eine Liste von 1 bis n² eine Liste mit n² Mal 'True' und unendlich Mal 'False' erstellen?
Zum letzten Abschnitt habe ich auch noch eine Frage, wieso soll ich das als Funktion definieren, die späteren Bedingungen der Matrix hängen doch davon ab und da bringen doch mehrere Funktionen auch nichts?
Wäre eine tolle Hilfe, wenn mir das einmal veranschaulicht werden könnte, aber in meinem Kopf bringe ich das Puzzle nicht zusammen.
Danke und im Falle der Verzweifelung einfach mal ausprobieren, vielleicht finde ich ja zufällig eine Lösung
Nochmal, die Matrix soll nicht mit 'None' gefüllt werden, sie soll leer sein, so dass ein Nutzer später beliebig zahlen einsetzen kann, und wenn das nicht geht, erhalten die Felder eben Namen von a11 bis ann.
Den vorletzten Abschnitt verstehe ich leider überhaupt nicht, soll ich nun statt eine Liste von 1 bis n² eine Liste mit n² Mal 'True' und unendlich Mal 'False' erstellen?
Zum letzten Abschnitt habe ich auch noch eine Frage, wieso soll ich das als Funktion definieren, die späteren Bedingungen der Matrix hängen doch davon ab und da bringen doch mehrere Funktionen auch nichts?
Wäre eine tolle Hilfe, wenn mir das einmal veranschaulicht werden könnte, aber in meinem Kopf bringe ich das Puzzle nicht zusammen.
Danke und im Falle der Verzweifelung einfach mal ausprobieren, vielleicht finde ich ja zufällig eine Lösung
-
BlackJack
@Python24: Eine Matrix bei den in den Elementen wirklich nichts gespeichert ist kann es nicht geben. Irgendeinen Wert muss man da nehmen. Wie sollte das mit dem ”nichts” denn sonst aussehen? Und der Wert wenn man “nichts“ meint ist in Python üblicherweise `None`.
Wenn Du bei dem Dir vertrauten bleibst dann lass das mit dem Programm ganz sein, denn Python war Dir ja nicht vertraut.
Jetzt hast Du's etwas gelernt. Also geh auch den nächsten Schritt und lerne das was zum Problem besser passt, statt alles aus ein bisschen Halbwissen zusammen zu klöppeln. Die eingebauten Datentypen, Iteratoren/iterierbare Objekte, die `list()`-Funktion und „list comprehensions“ gehören zu den Python-Grundlagen. Das sind Sachen die man nach einer Einführung in Python kennen sollte und kein Spezialwissen für Fortgeschrittene.
Wieso unendlich mal `False`? n²+1-mal `False` für den Anfang. Bedeutet das noch keine Zahl verwendet wurde. Und wenn man dann eine Zahl verwendet, setzt man den Eintrag an dem Index auf `True`.
Wenn Du bei dem Dir vertrauten bleibst dann lass das mit dem Programm ganz sein, denn Python war Dir ja nicht vertraut.
Wieso unendlich mal `False`? n²+1-mal `False` für den Anfang. Bedeutet das noch keine Zahl verwendet wurde. Und wenn man dann eine Zahl verwendet, setzt man den Eintrag an dem Index auf `True`.
Wenn ihr also wirklich meint, dass ich mit Python überhaupt nicht zurechtkomme, dann versuche ich es eben wieder allein, denn durch eure Kommentare bin ich mit etwas eigenem Überlegen auf mögliche Ideen gekommen, die auch den Rahmen des mir vertrauten nicht sprengen.
Also Danke, aber ich will mich hier auch nicht erniedrigen lassen, schließlich habe ich doch eine Einführung ins Programm gemacht und bekomme die Grundlagen auf jeden Fall hin, also Entschuldigung, dass ich eure Zeit verschwendet habe und ihr mir das nicht früher gesagt habt.
Also Danke, aber ich will mich hier auch nicht erniedrigen lassen, schließlich habe ich doch eine Einführung ins Programm gemacht und bekomme die Grundlagen auf jeden Fall hin, also Entschuldigung, dass ich eure Zeit verschwendet habe und ihr mir das nicht früher gesagt habt.
Sollte dennoch immer noch jemand hilfsbereites in diesem Forum unterwegs sein, darf er mir natürlich gerne helfen, obwohl ich bereits sagte, dass mir wohl nur Musterlösungen wirklich weiterhelfen.
Ich nehme aber natürlich aber auch gerne Links zu anderen Seiten, diese anzusehen kann auch nicht schaden.
Für alle die nun selbst Interesse an der Aufgabe haben, erkläre ich sie nochmal kurz: Erstelle ein Programm, das einen zweiten Nutzer folgendes interaktiv tun lässt:
Die Dimension einer Quadratmatrix eingeben, diese in beliebiger Reihenfolge und an beliebigen Stellen mit den Zahlen von 1 bis n² füllen, wobei beliebige aber bestimmte Bedingungen (Diagonalsummen gleich...) erfüllt sind, tritt ein Fehler ein, wird der Nutzer zum Wiederholen aufgefordert, ist er fertig, wird die fertige Matrix aufgebaut.
Sollte jemand etwas haben, darf er es liebend gerne posten, denn ich habe leider eine Deadline.
Abschließend zu meinem vorherigen Kommentar noch: Es tut mir Leid, dass ich so unverschämt wurde und es ist echt nett, dass ihr mir helfen wollt, aber eure Antworten kommen teilweise bei mir nicht an, da ich jemand bin, der gerne etwas greifbares hat (meint hier etwas, das in Python eingegeben wurde) und ich gerne mit meinen Methoden eine Lösung finden möchte, also wer mir immer noch helfen will, eben so, dass es bei mir ankommt, darf das gerne weiter tun.
Ich nehme aber natürlich aber auch gerne Links zu anderen Seiten, diese anzusehen kann auch nicht schaden.
Für alle die nun selbst Interesse an der Aufgabe haben, erkläre ich sie nochmal kurz: Erstelle ein Programm, das einen zweiten Nutzer folgendes interaktiv tun lässt:
Die Dimension einer Quadratmatrix eingeben, diese in beliebiger Reihenfolge und an beliebigen Stellen mit den Zahlen von 1 bis n² füllen, wobei beliebige aber bestimmte Bedingungen (Diagonalsummen gleich...) erfüllt sind, tritt ein Fehler ein, wird der Nutzer zum Wiederholen aufgefordert, ist er fertig, wird die fertige Matrix aufgebaut.
Sollte jemand etwas haben, darf er es liebend gerne posten, denn ich habe leider eine Deadline.
Abschließend zu meinem vorherigen Kommentar noch: Es tut mir Leid, dass ich so unverschämt wurde und es ist echt nett, dass ihr mir helfen wollt, aber eure Antworten kommen teilweise bei mir nicht an, da ich jemand bin, der gerne etwas greifbares hat (meint hier etwas, das in Python eingegeben wurde) und ich gerne mit meinen Methoden eine Lösung finden möchte, also wer mir immer noch helfen will, eben so, dass es bei mir ankommt, darf das gerne weiter tun.
-
rmp
Im Folgenden zuerst einige Anmerkungen (als Kommentar)
[quote="Python24"]Hier einmal einer meiner Versuche, damit man sieht, was ich alles schon versucht habe und wie mich diese Aufgabe runterzieht:
Auch solltest du darauf achten, dein Problem möglichst präzise zu erklären. Wenn ich dich richtig verstehe, dann willst du L und M gleich groß haben. Auch solltest du dir grundsätzlich angewöhnen, nichts offen zu lassen, also Variablen zu initialisieren. Dazu eignen sich notfalls bestimmte Werte, die ausserhalb deines Definitionsbereiches liegen; wenn du also, mal angenommen, nur positive Zahlen in deiner Matrix willst, dann könntest du 0 (null) zum Initialisieren verwenden. So löst du nebenbei gleich noch das Problem, dass Python keine leeren Arrays anlegen will.
Was du suchst scheint das da zu sein -> "L = [0] * n; M = [0] * n"
[quote="Python24"]Hier einmal einer meiner Versuche, damit man sieht, was ich alles schon versucht habe und wie mich diese Aufgabe runterzieht:
Code: Alles auswählen
n=input("Dimension der Quadratmatrix")
L=[]
M=[]
x=n ## lieber x = int(n)
while(x<n): ## (abgesehen von der Klammer) -> x kann nicht kleiner n sein, weil Du es eben noch gleich gesetzt hast.
M=x ## damit sagst Du Python, dass M kein array mehr sein soll sondern eine Zahl bzw. ein String
M.append(L) ## und an eine Zahl oder einen String kannst du kein array anhängen
...Was du suchst scheint das da zu sein -> "L = [0] * n; M = [0] * n"
-
BlackJack
@rmp: Für ”nichts” ist `None` das vorgesehene Objekt. Das hat gegenüber 0 den Vorteil dass Versuche damit zu rechnen durch eine Ausnahme sofort auffallen, während man auf 0, zum Beispiel bei der Quersumme, noch mal extra testen muss.
