In Dynexite ist es möglich, Aufgaben zu parametrisieren. Dies bedeutet, dass bei einer Aufgabe verschiedene Variablen (z.B. Wörter oder Zahlen) zwischen vorgegebenen Werten automatisch variiert werden können. Die Programmierung erfolgt über Python.
Die zulässige Sprache ist Python 3 in der Version 3.7.4.
Runden von Zahlenwerten
Zahlen werden in Python nicht automatisch mathematisch gerundet!x = round(3.25, 1) wird zu 3.2
y = dynexite.round(3.25, 1) wird zu 3.3Verwenden Sie die bereitgestellte Funktion dynexite.round, um Ihre Zahlen mathematisch korrekt zu runden.
dynexite.random(1,5)
, um eine zufällige Zahl zwischen 1 und 5 zurückzugeben.dynexite.choice([1,2,"Apple"])
, um ein zufällig ausgewähltes Element aus einer angegebenen Sequenz (hier: 1, 2, Apple) zurückzugeben.dynexite.sample(["Alex", "Sophie", "Marc"], 2)
, um eine bestimmte Anzahl an Elementen (hier: 2) zufällig aus einer angegebenen Sequenz (hier: Alex, Sophie, Marc) zurückzugeben.Code-Beispiel:
# Wert zwischen 1 und 5 in 0.25er Schritten
x = dynexite.random(1, 5, 0.25)
y = x * 2
w = 0
if y > 8:
w = 2
# Wähle einen zufälligen Namen
name = dynexite.choice(["Alex", "Martin"])
# Wähle eine zufälliges Unternehmen
company = {
"name": dynexite.choice(["Cares and Tires Corp.", "House Building Inc."]),
"employee_income": dynexite.sample([100, 200, 500, 800], 2)
}
Die Parametrisierung ist bei verschiedenen Aufgabentypen nutzbar:
Um eine Aufgabe zu parametrisieren, erstellen Sie zunächst die Aufgabe und klicken Sie dann im geöffneten Aufgabeneditor am rechten Seitenrand auf </>. Ein Logikfeld für die Eingabe der Python-Programmierung öffnet sich.
Anschließend müssen Sie eine Verbindung zwischen dem Python-Code und den Aufgabenteilen, die Sie variieren lassen möchten, herstellen. Wie dies geht, erklären die folgenden Beispiele:
Nutzen Sie die Parametrisierung bei Einfachauswahl- oder Mehrfachauswahl-Aufgaben, wenn mehrere richtige und falsche Antworten existieren, von denen Sie jedoch nur einen Teil abfragen möchten.
Das folgende Beispiel zeigt die Parametrisierung einer Mehrfachauswahl-Aufgabe. Hierbei liegt für die richtigen bzw. falschen Antworten je eine Liste vor: Die Liste x
(right_anwers
) enthält die richtigen Antworten und die Liste y
(wrong_anwers
) enthält die falschen Antworten. Je nach Aufgabenvariante sind abhängig von der Kompilierung des Codes andere (richtige und falsche) Antworten in der Aufgabe enthalten.
Um die Aufgabe nachzuvollziehen, gehen Sie wie folgt vor:
Erstellen Sie eine Mehrfachauswahl-Aufgabe.
Geben Sie die Antwortmöglichkeiten der Aufgabe ein. Dabei müssen richtige Antwortmöglichkeiten auf die Liste x
, falsche Antwortmöglichkeiten auf die Liste y
zugreifen: Tragen Sie daher {{x[0]}}
und {{x[1]}}
als richtige Antworten ein und aktivieren Sie die jeweilige Checkboxen. Tragen Sie anschließend {{y[0]}}
, {{y[1]}}
und {{y[2]}}
als die drei falschen Antworten ein.
Der Code verwendet die Python-Funktion
dynexite.sample
und bewirkt für die Mehrfachauswahl-Aufgabe folgendes:
Aus der Liste mit richtigen Antworten (right_answers = ["Eibe", "Fichte", "Kiefer", "Lärche"]
) werden zufällig zwei Antworten ausgewählt (x = dynexite.sample(right_answers, 2)
).
Aus der Liste mit falschen Antwortenwrong_answers = ["Linde", "Buche", "Eiche", "Birke", "Ahorn"]
werden zufällig drei Antworten ausgewählt (y = dynexite.sample(wrong_answers, 3)
).
Im Feld darunter wird der interpretierte Code mit den richtigen und falschen Antworten angezeigt, die für diese Variante zufällig erzeugt wurden (ein Klick auf den Button Neu kompilieren würde eine neue Variante erzeugen):
In dieser Variante der Mehrfachauswahl-Aufgabe werden als richtige Antworten "Fichte" und "Kiefer" sowie als falsche Antworten "Eiche", "Ahorn" und "Linde" vorgegeben.
5. Lösen Sie die Aufgabe testweise und klicken Sie auf den Button Abgeben. Die Aufgabe sollte dann so aussehen:
Da die Antwortmöglichkeiten gemischt wurden (bei Mehrfachauswahl-Aufgaben ist das Mischen der Antworten standardmäßig aktiviert), entsprechen die Positionen der richtigen Antworten nicht denen vom Erstellen der Aufgabe.
In Lückentexten können Sie die Parametrisierung dazu nutzen, die richtigen Antworten in Abhängigkeit von der generierten Aufgabe auszuwählen.
Das folgende Beispiel zeigt die Parametrisierung für eine Lückentext-Aufgabe mit Textlücken. Die zugehörigen richtigen Antworten zum ausgewählten Bundesland x
sind in den Variablen y
(Hauptstadt) und z
(Fläche) hinterlegt.
Um die Aufgabe nachzuvollziehen, gehen Sie wie folgt vor:
{{ x }}
sowie zwei Lücken:Wenn Sie in den Bereich neben der Aufgabe klicken, sieht die Aufgabe mit den bisher unkonfigurierten Lücken so aus:
Die Funktion
dynexite.choice
wählt aus einer vorgegebenen Liste zufällig ein Bundeslandx
aus. Die richtigen Antworten in den Lücken [1] und [2] werden abhängig von diesem Bundesland ermittelt. Dahauptstadtdict
undflaechedict
Dictionaries mit dem Bundesland als Schlüssel vorgegeben sind, kann auf die zugehörige Information mithaupstadtdict[x]
bzw.einwohnerdict[x]
zugegriffen werden.
Im Feld darunter wird der interpretierte Code mit den Antworten für die Variablen y
(Hauptstadt) und z
(Fläche) angezeigt, die zu dem zufällig ausgewählten Bundesland x
in der aktuellen Variante gehören (ein Klick auf den Button Neu kompilieren würde eine neue Variante erzeugen):
Klicken Sie nun in der Lückentext-Aufgabe auf die erste Lücke [1], um das Konfigurationsfenster zu öffnen. Die erste Lücke ist eine Textlücke. Diese Lückenart ist beim Öffnen des Konfigurationsfensters standardmäßig ausgewählt, so dass Sie die Lückenart nicht verändern müssen.
Tragen Sie in das Feld Primäre Lösung die Variable {{ y }}
ein.
Klicken Sie oben auf den Button Nächste, um zur nächsten Lücke zu wechseln.
Wählen Sie im Drop-down-Menü Art der Lücke die Option Zahlen (siehe Schaubild unter 9., (A)) aus.
Geben Sie nun die Variable in das Lösungsfeld ein, aber beachten Sie den folgenden Hinweis:
Möchten Sie bei Lückentext-Aufgaben mit Zahlenlücken eine Variable eingeben, da das Ergebnis auf Parametrisierung basiert, ist dies zunächst nicht möglich. Grund hierfür ist, dass in das Zahlenfeld ausschließlich Ziffern eingetragen werden können. Löschen Sie in diesem Fall die voreingegebene "0". Dann vergrößert sich das Eingabefeld und Sie können auch Variablen eingeben.
Nachdem Sie also durch Löschen der Null die Eingabe von Variablen im Lösungsfeld möglich gemacht haben, tragen Sie hier die Variable z
(B) ein (ohne geschweifte Klammern).
Möchten Sie wie im Beispiel eine Abweichung erlauben, wählen Sie im Drop-down-Menü Abweichung (C) eine der vorgegebenen Optionen aus - hier ist es Absolut - und tragen Sie den erlaubten Abweichwert in das Feld daneben (D) ein.
Schließen Sie das Konfigurationsfenster durch einen Klick auf den Button Close
In der Vorschau sollte die Aufgabe nun so aussehen:
Es gibt verschiedene Möglichkeiten, LaTeX-Code zu parametrisieren.
Das folgende Beispiel zeigt, wie Sie Variablen für die Parametrisierung in LaTeX-Code verwenden können.
Um das Beispiel nachzuvollziehen, gehen Sie wie folgt vor:
Erstellen Sie eine Aufgabe. Fügen Sie dann einen Inhaltsblock mit dem Blocktyp Text ein und darunter eine Ergebniseingabe-Aufgabe.
Generieren Sie nun im Inhaltsblock eine 4x4-Matrix (den zugehörigen LaTeX-Code können Sie hier kopieren).
Aufgabenstellung ist es, die zugehörige Determinante der Matrix A zu bestimmen. Ziel der Parametrisierung ist, dass die Werte in der Matrix variieren.
det
ein, aber beachten Sie den folgenden Hinweis:Möchten Sie bei Lückentext-Aufgaben mit Zahlenlücken eine Variable eingeben, da das Ergebnis auf der Parametrisierung basiert, ist dies zunächst nicht möglich. Grund hierfür ist, dass in das Zahlenfeld ausschließlich Ziffern eingetragen werden können. Löschen Sie in diesem Fall die voreingegebene "0". Dann vergrößert sich das Eingabefeld und Sie können auch Variablen eingeben.
Schließen Sie das Konfigurationsfenster durch einen Klick auf den Button Close.
Nun müssen Sie noch den zugehörigen Python-Code eingeben. Öffnen Sie hierzu das Logikfeld auf der rechten Seite des Aufgabeneditors durch einen Klick auf </> und fügen Sie den zugehörigen Code ein (den Code für dieses Beispiel können Sie hier kopieren).
Für die Darstellung der Matrix wird die LaTeX-Umgebung
pmatrix
verwendet. Mittels{{matrix[i][j]}}
wird mit den entsprechenden Indizesi
undj
auf jedes Matrixelement zugegriffen. Als Lösung für diese Aufgabe wird die mittelsnp.linalg.det
berechnete Determinante der entsprechenden Matrix angegeben.
Im Feld darunter wird der interpretierte Code angezeigt (ein Klick auf den Button Neu kompilieren würde eine neue Variante erzeugen):
Eine weitere Möglichkeit LaTeX-Code zu parametrisieren besteht darin, den entsprechen LaTeX-Ausdruck im Programmcode zu generieren. Dazu wird ein String erstellt, der den entsprechenden LaTeX-Code enthält.
Das folgende Beispiel zeigt das Erstellen einer Summe mit zufällig generierten Summengrenzen.
Um das Beispiel nachzuvollziehen, gehen Sie wie folgt vor:
Erstellen Sie eine Aufgabe. Fügen Sie dann einen Inhaltsblock mit dem Blocktyp Text ein und darunter eine Mehrfachauswahl-Aufgabe.
Geben Sie in den Inhaltsblock die Variable {{ x }}
ein.
Geben Sie als Antwortmöglichkeiten die Variablen {{ result }}
, {{ options[0] }}
, {{ options[1] }}
und {{ options[2] }}
ein.
Die Variable
x
enthält den entsprechenden LaTeX-Code als String. Dabei wird die untere Grenze der Summe durch die Variablestart
und die obere Grenze der Summe durch die Variableend
festgelegt. Das Ergebnis der Summe wird mit der unten angegebenen for-Schleife berechnet und in der Variablenresult
gespeichert. Die Variableoptions
ist eine Liste der Länge 3 mit falschen Antwortmöglichkeiten aus dem Wertebereich 20-51.
Im Feld darunter wird der interpretierte Code angezeigt (ein Klick auf den Button Neu kompilieren würde eine neue Variante erzeugen):
Das gleiche Ergebnis lässt sich auch durch folgende Eingabe in der Aufgabenstellung erzielen:
$$ \sum_{i ={{start}}}^{{{end}}} i$$
.
Hier werden die Variablenstart
undend
dann durch den entsprechenden Wert ersetzt.
Möchten Sie auch die LaTeX-Formel variieren (zum Beispiel ob eine Summe oder ein Produkt berechnet werden soll), können Sie dies tun, indem Sie abhängig davon\sum
oder\prod
in einer Variablen speichern und diese dann im LaTeX-Code verwenden.
Bei Variablen im Exponenten müssen Sie eine zusätzliche Klammer setzen, wenn die Variable mehr als eine Stelle besitzen kann. Zum Beispiel:
2^{ {{x}} }
, da andernfalls bei z.B. "x=16" die Formel "2^{{x}}" als 216 dargestellt werden würde.
Die Parametrisierung kann auch bei Lückentext-Aufgaben mit Auswahllücken verwendet werden, wenn die Antwortmöglichkeiten immer die gleichen sein sollen, die richtige Antwort jedoch variiert.
Das folgende Beispiel zeigt eine Lückentext-Aufgabe mit Auswahllücke, bei der eine Liste mit allen möglichen Antworten gegeben ist. Über eine if-else Abfrage wird die richtige Antwort bestimmt.
Um das Beispiel nachzuvollziehen, gehen Sie wie folgt vor:
Erstellen Sie eine Lückentext-Aufgabe. Tragen Sie $ a = {{ a }}, b = {{ b }} $
in die Aufgabenbeschreibung ein.
Klicken Sie darunter in den Bereich für den Lückentext und geben Sie a - b ist ___[1]___ 0.
dort ein.
Wählen Sie im Drop-down-Menü Art der Lücke die Option Auswahl (A). Geben Sie dann unter Möglichkeiten als Antwortmöglichkeiten {{Richtig}}
, {{Falsch[0]}}
und {{Falsch[1]}}
ein (B) und aktivieren Sie die Checkbox neben {{Richtig}}
(der richtigen Antwort). Vergeben Sie eine Punktzahl (C) für die Aufgabe und schließen Sie das Fenster durch einen Klick auf den Button Close (D).
Nun müssen Sie noch den zugehörigen Python-Code eingeben. Öffnen Sie hierzu das Logikfeld auf der rechten Seite des Aufgabeneditors durch einen Klick auf </> und fügen Sie folgendes ein (den Code für dieses Beispiel können Sie hier kopieren):
Verwenden Sie
_ = dynexite.random
, um den Code schmaler zu gestalten. Dies ist besonders hilfreiche bei einer großen Anzahl an Variablen.
Im Feld darunter wird der interpretierte Code angezeigt (ein Klick auf den Button Neu kompilieren würde eine neue Variante erzeugen):
Da die Antwortmöglichkeiten gemischt wurden, entsprechen die Positionen der richtigen Antworten nicht denen vom Erstellen der Aufgabe.
Bei bestimmten Aufgaben kann es sinnvoll sein, bestimmte Fälle von der Parametrisierung auszuschließen. Dies erfolgt über eine while-Schleife, die erst verlassen wird, wenn alle definierten Bedingungen erfüllt sind (in diesem Fall: a-b darf nicht = 0 sein).
In der folgenden Beispielaufgabe soll eine Division durch 0 ausgeschlossen werden.
Um das Beispiel nachzuvollziehen, gehen Sie wie folgt vor:
Erstellen Sie eine Ergebniseingabe-Aufgabe. Tragen Sie $ a = {{a}}, b = {{b}}, c = {{c}} $
in die Aufgabenbeschreibung ein.
Klicken Sie auf den Frageblock und geben Sie $ c/(a-b)= $
dort ein.
Wählen Sie im Drop-down-Menü Art der Lücke die Option Zahlen (A). Klicken Sie dann unter Lösungen in das Feld Lösung #1 und löschen Sie die 0. Geben Sie dann Antwort
ein (B). Vergeben Sie anschließend eine Punktzahl (C) für die Aufgabe und schließen Sie das Fenster durch einen Klick auf den Button Close (D).
Nun müssen Sie noch den zugehörigen Python-Code eingeben. Öffnen Sie hierzu das Logikfeld auf der rechten Seite des Aufgabeneditors durch einen Klick auf </> und fügen Sie folgendes ein (den Code für dieses Beispiel können Sie hier kopieren):
Hier wird die Hilfsvariable
condition = 0
eingesetzt. Es werden solange neue Parameter bestimmt, bis die Bedingung a-b ungleich 0 erfüllt ist. Wenn die Abbruchsbedingung erfüllt wird, wird die Hilfsvariable auf 1 gesetzt und die while-Schleife kann verlassen werden.
Im Feld darunter wird der interpretierte Code angezeigt (ein Klick auf den Button Neu kompilieren würde eine neue Variante erzeugen):
In diesem Beispiel wurde nur eine Bedingung gestellt. Es können auch mehrere Bedingungen gestellt werden, z.B. mit Hilfsvariablen wie condition1
, condition2
,.... Innerhalb der while-Schleife wird jede Bedingung einzeln abgefragt - und nur wenn alle erfüllt sind, wird die Schleife verlassen.
Es ist wichtig, alle Hilfsvariablen zu Beginn der Schleife auf 0 zu setzen. Ansonsten könnte es passieren, dass eine Bedingung mit der alten Parametrisierung zwar erfüllt war, mit der Neuen jedoch nicht).
Alternativ können Sie auch eine einzige Variable verwenden und diese wieder auf 0 setzen, falls eine der Bedingungen nicht erfüllt wird. Achten Sie hierbei auf die Reihenfolge der Abfragen.
Manchmal lassen sich Ergebnisse nicht berechnen oder man will Objekte mit festen Attributen verwenden. Hier eignet sich der Einsatz von Dictionaries in Kombination mit den Funktionen dynexite.choice
oder dynexite.sample
.
Der Datentyp Dictionary ermöglicht in Python den Aufbau einer Zuordnungstabelle. Wie bei einem Wörterbuch werden Schlüssel-Objekt-Paare gebildet, wobei dann zu einem bestimmten Schlüssel ein bestimmtes Objekt gehört.
In dieser Beispielaufgabe gibt es drei verschiedene PKW mit festgelegten Werten:
Name | max. Tankinhalt | Verbrauch | Farbe |
---|---|---|---|
PKW 1 | 37 | 6.2 | blau |
PKW 2 | 65 | 8.3 | silber |
PKW 3 | 35 | 4.4 | schwarz |
Davon werden 2 zufällig in der Aufgabe verwendet. Zusätzlich wird von beiden verwendeten PKW einer anhand des Attributs "Farbe" ausgewählt. Die Elemente können in der Aufgabenstellung z.B. mit {{PKW_1.Name}}
aufgerufen werden.
Um das Beispiel nachzuvollziehen, gehen Sie wie folgt vor:
Erstellen Sie eine Aufgabe. Fügen Sie dann einen Inhaltsblock mit dem Blocktyp Text (A) und einen mit dem Blocktyp Tabelle (B) ein.
Fügen Sie darunter eine Ergebniseingabe-Aufgabe (C) und darunter eine Einfachauswahl-Aufgabe (D).
Füllen Sie die Textblöcke und Aufgaben entsprechend der folgenden Abbildung (die Tabelleninhalte für dieses Beispiel können Sie hier kopieren):
Wählen Sie im Drop-down-Menü Art der Lücke die Option Zahlen (A). In diesem Beispiel wurde zudem die Checkbox Nachkommastellen begrenzen aktiviert und die Anzahl der Nachkommastellen durch den Eintrag "2" im Textfeld daneben (B) festgelegt. Klicken Sie anschließend unter Lösungen in das Feld Lösung #1 und löschen Sie die 0. Geben Sie dann Zufall.Reichweite
ein (C). Vergeben Sie eine Punktzahl (D) für die Aufgabe und schließen Sie das Fenster durch einen Klick auf den Button Close (E).
Nun müssen Sie noch den zugehörigen Python-Code eingeben. Öffnen Sie hierzu das Logikfeld auf der rechten Seite des Aufgabeneditors durch einen Klick auf </> und fügen Sie folgendes ein (den Code für dieses Beispiel können Sie hier kopieren):
Was macht der Code?
(1): Die einzelnen PKW werden definiert.
(2): Alle möglichen PKW werden in der ListeAutos_Liste
angelegt.
(3): Es werden zufällig 2 PKW bestimmt und inAutos
gespeichert.
(4): Die fehlenden Werte werden berechnet, in diesem Fall der Verbrauch.
(5): Für den ersten Aufgabenteil ("Welche Reichweite hat das Auto der Farbe...?) wird mithilfe vondynexite.choice
eine Variante ausgewählt.
(6): Das Auto mit der maximalen Reichweite wird bestimmt. Die richtigen und falschen Antwortmöglichkeiten werden vorbereitet.
Sie können problemlos in anderen IDEs entwickeln und dann den Quellcode zu Dynexite kopieren.
Beachten Sie dabei die Versionsnummern der verwendeten Bibliotheken.
Um in externen IDEs entwickeln zu können, können Sie hier ein Beispielprojekt herunterladen (wir verwenden Anaconda (bzw. Conda/ Miniconda) zur Verwaltung der Environments):
Wie kann ich parametrisierte Aufgaben in Prüfungen oder Übungen verwenden?
Parametrisierte Aufgaben werden Prüfungen oder Übungen genauso hinzugefügt, wie nicht-parametrisierte Aufgaben. In Schritt 18 der Prüfungsentwicklung können Sie die Variantenanzahl einer Aufgabe konfigurieren.
Welche Sprache wird in Dynexite für die Parametrisierung genutzt?
Python 3
Gibt es spezielle Befehle innerhalb des Systems für die Programmierung?
dynexite.random
(Parametrisierung von Zahlen in einem Zahlenraum)dynexite.choice
(Variation von Wörtern)dynexite.sample
(Auswahl an Wörtern)Worin besteht der Unterschied zwischen
dynexite.choice
unddynexite.sample(...,1)
?
dynexite.choice
liefert ein Wort (string, Zahl...) zurück.dynexite.sample(...,1)
liefert ein Array der Länge 1.Wie kopiere ich eine Liste?
Verwenden Sie new_list = list.copy()
, um eine Liste zu kopieren. Dadurch bleibt die alte Liste unverändert erhalten und kann in anderen Unterpunkten erneut verwendet werden.
new_list = list
erstellt einen pointer auf die originale Liste. Diese wird somit auch geändert, wenn die neue Liste geändert wird.
Welche Bibliotheken sind hinterlegt?