Ich erklärte das von IPA (FE Test Executing Agency) veröffentlichte Python-Beispielproblem. Fehler oder verwirrende Teile werden nacheinander korrigiert und ergänzt. Stellen Sie daher bitte Fragen oder Kommentare. Natürlich sind Kenntnisse in Python erforderlich, da es sich um ein Problem von Python handelt. Darüber hinaus sind jedoch Kenntnisse in Mathematik (Zahlen) und Mathematik (Dreiecksfunktionen) erforderlich.
Die Position des Markers (Leerzeichen a1) und die Fahrtrichtung (Leerzeichen a2) nach Ausführung der Befehlssequenz α (R3; R4; F100; T90; E0; F100; E0) werden abgefragt. Die Befehlssequenz α besteht aus einem sich doppelt wiederholenden Intervall, wie in Fig. 2 gezeigt. Das durch Befehl 0 (R3) angegebene äußere Wiederholungsintervall wird als Wiederholungsintervall 0 (grün) bezeichnet, und das durch Befehl 1 (R4) angegebene Wiederholungsintervall wird als Wiederholungsintervall 1 (rot) definiert. Wenn die Befehlssequenz α ausgeführt wird, zeichnet Befehl 2 (F100) zuerst die Linie. Danach dreht sich Befehl 3 (T90) um 90 ° gegen den Uhrzeigersinn. Da dies mit Befehl 1 viermal wiederholt wird, zeichnen Sie ein Quadrat (rot gepunktete Linie in der folgenden Abbildung). Dann überschreibt Befehl 5 (F100) die bereits gezeichnete Linie und erreicht die untere rechte Ecke des Quadrats. Bis Sie die rechte Seite dieses Quadrats erreichen, ist es eine Wiederholung des Befehls 0 (R3) (grün gepunktete Linie in der Abbildung unten). Wenn die zweite und dritte Wiederholung des Befehls 0 ausgeführt werden, erhöhen sich die Quadrate um eins. Da die Position des Markers nach dem Ausführen der Befehlssequenz α rechts unten auf dem Quadrat ganz rechts liegt, ist dies die Position von ② in Fig. 3 (Option a1). Die Richtung des Markers ist rechts, dh die positive Richtung der x-Achse (Option a2). Die richtige Antwort ist daher die Kombination der Optionen c (①, positive Richtung der x-Achse). Antwort: Wahl C (a1: ②, a2: positive Richtung der x-Achse)
Die Befehlssequenz, die das reguläre Fünfeck in Fig. 4 zeichnet, wird abgefragt. Bevor wir uns die Befehlssequenz ansehen, wollen wir uns die Mathematik der Mittelstufe ansehen. Erinnern Sie sich an die Eigenschaft, dass die Summe der Außenwinkel eines Polygons (diesmal eines regulären Fünfecks) 360 ° beträgt. Für ein normales Fünfeck beträgt der Außenwinkel 360 ° ÷ 5 = 72 °. Um das reguläre Fünfeck in Abb. 4 zu zeichnen, stellen Sie 100 vor und drehen Sie es fünfmal um 72 ° gegen den Uhrzeigersinn. Der Befehl zum Vorrücken von 100 ist F100, und der Befehl zum Drehen um 72 ° gegen den Uhrzeigersinn ist T72. Um dies fünfmal zu wiederholen, können Sie es in R5 und E0 einschließen, sodass die Befehlssequenz R5, F100, T72, E0 lautet. Daher ist Option F die richtige Antwort.
def parse(s):
return [(x[0],Leer c) for x in s.split(';')]
Leer C ist eine Frage zum Ausfüllen der Lücke, die den Rückgabewert der Funktionsanalyse beantwortet. Diese Frage erfordert zwei Punkte: um die Spezifikationen der in der Problemstellung gezeigten Funktionsanalyse zu verstehen und um die verstandenen Spezifikationen mit Python-Grammatikkenntnissen zu implementieren. Es ist eine große Herausforderung.
Die Funktion Parse ist eine Funktion, die eine bestimmte Zeichenfolge (z. B. 'R4: F100: T90: E0') analysiert und in ein Format konvertiert, das für das Programm leicht zu interpretieren ist. Gibt den relevanten Teil der Problemstellung an. Die "als Argument angegebene Zeichenfolge" lautet "R4: F100: T90: E0". Es gibt vier Taples ('R', 4), ('F', 100), ('T', 90) und ('E', 0). Ein Taple (zum Beispiel ('R', 4)) entspricht einer Anweisung. R ist der Befehlscode und 4 ist der numerische Parameter. Fügen Sie diese Taples (4) in eine Liste ein und geben Sie sie als Rückgabewert zurück.
Die für diese Frage erforderlichen Python-Grammatikkenntnisse sind wie folgt. --Inbegriffen --Taple --Aufführen
def parse(s):
return [(x[0],Leer c) for x in s.split(';')]
Nur eine Zeile von Rückgabeprozessen "konvertiert die vom Argument angegebene Anweisungszeichenfolge in eine Liste, deren Elemente Taples sind". Es ist ein komplizierter Prozess, aber lassen Sie uns ihn verstehen, indem wir ihn in einzelne Elemente aufteilen. Angenommen, Sie erhalten als Anweisungszeichenfolge 'R4: F100: T90: E0'. Diese Zeichenfolge wurde der Variablen s zugewiesen. Zuerst wird geteilt. split ist eine Funktion, die eine Zeichenfolge aufteilt und als Liste zurückgibt. Wenn Sie die Split-Funktion für die Zeichenfolge verwenden, wird eine Liste wie folgt zurückgegeben: Da ';' als Trennzeichen angegeben ist, wird es in R4, F100, T90 und E0 unterteilt und als Liste angezeigt. Als nächstes folgt die for-Anweisung. Diese for-Anweisung wird als "Einschluss" verwendet. Für das Verarbeitungsziel x der for-Anweisung werden x [0] und das Leerzeichen c als Taple ausgegeben. Ich weiß nicht, was Sie sagen, daher werde ich dies anhand des Ergebnisses der Aufteilung ['R5', 'F100', 'T72', 'E0'] als Beispiel erläutern. Erstens gibt es einfache Anweisungen. Dies entspricht der Rückgabe des Inhalts des Arrays als Liste. Das am weitesten links stehende x gibt einfach x als Element der Liste aus, sodass dieselbe Liste als Ergebnis angezeigt wird. Das ist nicht sehr interessant. Wie wäre es dann mit x [0] gemäß der Problemstellung? x [0] repräsentiert das erste Zeichen der Variablen x (Zeichenfolge). Daher wird das erste Zeichen jedes Elements als Liste zurückgegeben. Wenn Sie das zweite Zeichen x [1] anzeigen möchten, versuchen wir dies ebenfalls. Das zweite Zeichen wird angezeigt. In der Problemstellung werden die Werte nach dem zweiten Zeichen als "numerische Parameter" behandelt. Betrachten Sie daher eine Methode, um das zweite und nachfolgende Zeichen als Zahlen zu extrahieren. Verwenden Sie x [1:], um das zweite und nachfolgende Zeichen abzurufen. Die erste 1 ist das zweite Zeichen, und wenn nach: nichts angegeben wird, bedeutet dies "alles danach". Versuchen wir, Einschlüsse zu verwenden, um zu sehen, wie das Ergebnis von x [1:] aussehen wird. Ich konnte die Nummern sicher abrufen. Zu diesem Zeitpunkt handelt es sich jedoch um eine Zeichenfolge. Verwenden Sie die Funktion int, um eine Zahlenfolge in eine Zahl umzuwandeln. Ich konnte die Nummern sicher abrufen. Ändern wir es nun leicht, sodass das erste Zeichen (x [0]) und die Zahlen nach dem zweiten Zeichen als Tapples zurückgegeben werden. Daher wird das Leerzeichen c mit der Option A "int (x [1:])" gefüllt.
Dies ist ein Problem beim Ausfüllen der Lücke für die Vorwärtsfunktion.
Die Problemstellung beschreibt die Vorwärtsmethode der Klasse Makert wie folgt.
forward(val) Stellen Sie die Positionskoordinaten des Markers um die durch val angegebene Länge in der aktuellen Fahrtrichtung vor und zeichnen Sie ein Liniensegment. Argument: Wertlänge
In dieser Frage geht es also darum, wie man eine Linie zieht. Mathematikkenntnisse auf High School-Niveau (Grundlagen der Dreiecksfunktionen) sind erforderlich. Als Voraussetzung enthalten self.x und self.y die aktuellen Positionskoordinaten des Markers, und self.angle enthält die Frequenzanzeige (90 °, 180 ° usw.) in der aktuellen Fahrtrichtung. Die folgende Abbildung zeigt die Funktionsweise der Vorwärtsmethode. Der rote Pfeil ist die Linie, die Sie zeichnen möchten. Zeichnen Sie eine Linie von (x1, y1) unten links nach (x2, y2) oben rechts. Hier ist die Erklärung des Programms.
rad = math.radians(self.angle)
In dieser Zeile wird der in dem variablen Winkel gespeicherte Wert (die in der Frequenzmethode gespeicherte Fahrtrichtung) in die Bogengradmethode umgewandelt und in der Variablen rad gespeichert. Die Potenzmethode oder die Bogengradmethode ist eine Notationsmethode für Winkel. In Pythons Mathematikbibliothek (math. *) Wird die Bogengradmethode für Winkel verwendet, daher wird sie hier von der math.radians-Methode in die Bogengradmethode (Radian-Notation) konvertiert.
dx = val *Leer d1
dy = val *Leer d2
Finden Sie die Länge dx in der x-Achsenrichtung und die Länge dy in der y-Achsenrichtung der Linie in der obigen Abbildung. Aus der Definition der Dreiecksfunktion ergibt sich dx = val * cos (rad), dy = val * sin (rad). Daher enthält Leerzeichen d1 `math.cos (rad)`
und Leerzeichen d2 enthält `` math.sin (rad)
`.
Im Leerzeichen e wird der Wert gefragt, der x1 und y1 zugewiesen werden soll. Was x1 und y1 betrifft, ist der Hinweis, dass die Linie darunter "Zeichnen einer Linie" in einem Kommentar erklärt. Die Koordinaten des Startpunkts des Liniensegments sind x1 und y1.
Die aktuelle Position des Markers wird in den Variablen self.x und self.y gespeichert. Daher sind self.x und self.y die Startpunkte des Liniensegments. Daher ist x1 self.x und y1 self.y.
Die `self.x + dx``` und`
self.y + dy```, die dem leeren e folgen, sind ebenfalls gute Hinweise. dx und dy waren die Länge der zu zeichnenden Linie in Richtung der x-Achse und die Länge in Richtung der y-Achse. Daher ist der Wert, der durch Subtrahieren von dx von self.x + dx (dh self.x) erhalten wird, die x-Koordinate des Startpunkts des Liniensegments, und der Wert, der durch Subtrahieren von dy von self.y + dy (dh self.y) erhalten wird, ist das Liniensegment. Es kann auch als y-Koordinate des Startpunkts gelesen werden.
Daher wird das Leerzeichen e mit der Option c "self.x, self.y" gefüllt.
Es ist ein Problem, bei dem die Funktion gezeichnet wird. Für die Funktionszeichnung gibt es eine Erklärung in der Problemstellung. Lesen Sie daher das Programm und die Problemstellung in Verbindung miteinander.
(3) Die Funktion draw interpretiert und führt jeden Befehl in der als Argument angegebenen Befehlsfolge aus und zeigt das Zeichnungsergebnis an. (Weggelassen) Der Umriss der Funktionszeichnung ist unten dargestellt. (1) Konvertieren Sie die Befehlssequenz mithilfe der Funktionsanalyse in eine Liste, deren Elemente Taples sind. (2) Verwenden Sie den Class Maker, um den Marker zu bedienen. ③ Verwenden Sie einen Stapel, um die Verschachtelung sich wiederholender Intervalle zu handhaben. (4) Der Stapel wird durch eine Liste dargestellt, und jedes Element ist ein Wörterbuch mit der Startposition opno der Wiederholung und der Restanzahl der Ruhezeiten. ⑤ Verwenden Sie die Druckfunktion an der Programmposition β, um die Stapelstatusänderung auszugeben.
Die folgende Abbildung zeigt die obige Erklärung zum Programm.
Der zu beachtende Punkt ist (1) intsts. Das Ergebnis der Verwendung der Befehlssequenz "R2; R3; E0; E0" von Ausführungsergebnis 2 als Argument der Analysefunktion [('R', 2), ('R', 3), ('E', 0), (' Die Liste von E ', 0)] ist intsts zugeordnet. Da insts beispielsweise eine Liste ist, ist der Wert von inst [0] taple ('R', 2) und der Wert von inst [1] taple ('R', 3). Wenn zum Beispiel opno 0 (Anfangswert) ist und Sie `Code ausführen, wird val = insts [opno]`
, 'R' wird Code zugewiesen und 2 wird val zugewiesen. Mit anderen Worten, der Anweisungscode wird dem Code zugewiesen und der numerische Parameter wird val zugewiesen.
Beachten Sie, dass opno eine Variable ist, die angibt, "wie viele Befehlssequenzen gerade ausgeführt werden".
Nun, es ist leer f.
if code == 'F':
marker.forward(Leer f)
elif code == 'T':
marker.turn(Leer f)
elif code == 'R':
stack.append({'opno':opno, 'rest':Leer f})
Wenn der Anweisungscode (Codevariable) 'F', 'T' oder 'R' ist, wird das Argument abgefragt, das an jede Funktion der Marker-Klasse übergeben werden soll. Im vorherigen `Code, val = insts [opno]`
, ist bekannt, dass das Paar mit dem Code val ist, so dass Sie es relativ intuitiv verstehen können. Das Leerzeichen f ist mit val gefüllt.
Wenn der Befehlscode beispielsweise "F" lautet, wird ein Liniensegment mit der durch den numerischen Parameter (val) angegebenen Länge gezeichnet, wie in Tabelle 1 gezeigt. In der Erklärung der Funktion forward heißt es auch "Vorrücken um die durch val angegebene Länge und Zeichnen einer Linie", und Sie können sehen, dass val als Argument von forward angegeben werden sollte. (Die Turn-Funktion entspricht dem Anweisungscode 'T')
Daher ist im leeren f die Option d (val) die richtige Antwort.
elif code == 'E':
if stack[-1]['rest']Leer g:
Leer h
stack[-1][['rest'] -= 1
else:
Leer i
Die Verarbeitung wird abgefragt, wenn der Anweisungscode "E" ist, dh der Endpunkt der Wiederholung. Um diese if-Aussage grob zu erklären, --Wenn die Bedingung der if-Anweisung wahr ist (nicht am Ende der Iteration), kehrt sie zum Anfang der Iteration zurück.
`{{'opno': 0, 'rest': 2}, {'opno': 1, 'rest': 1}]` `ist, ist stack [-1] Das letzte Element ist
{'opno': 1, 'rest': 1}
. Wenn der Rest des letzten Elements des Stapels (innerste Iteration) größer als 1 ist (dh größer oder gleich 2), erhält opno zu Beginn der Iteration den Wert (in diesem Fall 'opno': 1), um die Iteration durchzuführen. , Ersetzen Sie den Stapel programmgesteuert [-1] ['opno']). Diese Operation gibt die Ausführungsposition der Befehlssequenz an den Anfang der Iteration zurück. Dies allein führt jedoch zu einer Endlosschleife, so dass
`stack [-1] [['rest'] - = 1``` die Anzahl der Wiederholungen um 1 reduziert.
Wenn Rest 1 ist, ist keine weitere Wiederholung erforderlich, sodass die Wiederholung beendet wird. Löschen Sie das letzte Element des Listenstapels, um die Iteration zu beenden. Verwenden Sie pop (), um das letzte Element in der Liste zu entfernen.
Wenn Sie diese Aktionen auf die Leerzeichen anwenden, ist das Leerzeichen g die Option o "> 1", das Leerzeichen h die Option A "opno = stack [-1] ['opno'] und das Leerzeichen i die Option c. "Stack.pop ()" von wird jeweils eingegeben.Inclusion ist eine Grammatik, die ein Element extrahiert, das die Bedingung C für ein bestimmtes Array B erfüllt, und das Ergebnis der Verarbeitung A für dieses Element als Liste zurückgibt.
[Verarbeitung für x A für x in Array B, wenn x Bedingung C ist]
(Beachten Sie, dass das Ganze in [] eingeschlossen ist). Dies bedeutet, dass die Ergebnisse von Prozess A als Liste für die Elemente von Array B zurückgegeben werden, die die Bedingung C erfüllen. Beispielsweise wird für eine gerade Zahl von 0 bis 9 der quadratische Wert dieser geraden Zahl als Liste zurückgegeben. Natürlich können Sie dasselbe tun, indem Sie das Array initialisieren, eine if-Anweisung in die for-Schleife schreiben und an das Array anhängen. Diese Methode erfordert jedoch ungefähr 4 Zeilen. Es ist ziemlich mächtig, dies in nur einer Zeile schreiben zu können. Übrigens war das leere c eine vereinfachte Verwendung ohne den if-Teil der Aufnahme.
In der Mathematik bis zur Junior High School wird der Winkel in der Gradmethode (90 ° usw.) ausgedrückt, in der Mathematik von der High School ist es die Bogengradmethode (π / 2 usw.). Dies liegt daran, dass es besonders mit der differentiellen Integration kompatibel ist. Die Einheit ist ° für die Frequenzmethode und [rad](als Bogenmaß gelesen) für die Bogengradmethode. Die Umwandlung zwischen der Frequenzmethode und der Bogengradmethode wird durch die folgende Gleichung durchgeführt. 1 [rad] = 180°/π 1° = π/180 [rad] Es ist kompliziert, so dass Sie sich nur die typischen Werte merken müssen. Zum Beispiel 45 ° = π / 4 [rad], 90 ° = π / 2 [rad], 180 ° = π [rad], 360 ° = 2π [rad] und so weiter.
Recommended Posts