Autorensysteme - eExMx

Tutorial 3 - Eine Mathematik-Übung programmieren

Anmerkung: Bevor Sie dieses Tutorial durchgehen, sollten Sie die ersten beiden Tutorials gelesen haben. Hier werden die Programmfunktionen aus den Vorgängerlektionen nicht erneut erklärt.

In diesem Tutorial werden wir verschiedene Mathematikübungen im Zahlenraum bis 1000 für die vierte Klasse Grundschule programmieren. Für alle vier Grundrechnungen soll je ein Übungsblock bestehend aus drei Übungen entstehen. Die Blöcke sollen mit den Kleinbuchstaben von a bis d gekennzeichnet werden.

Die Kopfdaten für eine neue Übung sind erfasst, in diesem Tutorial geht es nun darum die Übung zu programmieren. Schalten Sie in der eExMx-Toolleiste um auf Aufgabe.

Tipp: für Übungen empfiehlt sich das Ausschalten des automatischen Zeilenumbruchs. Klicken Sie mit der rechten Maustaste in das Eingabefenster. Im erscheinenden Kontextmenü können Sie den Zeilenumbruch ein- oder ausschalten.

Übungstexte und Code für die Addition erfassen

Geben Sie in das Textfeld Aufgabenvariante 1 folgenden Text ein:

a) {$a1} + {$a2} = {?ea1}

Mit a) haben wir den ersten Block gekennzeichnet.

{$a1} und {$a1} sind die Platzhalter für die beiden Summanden, deren Werte sich bei jedem Aufgabenaufruf ändern sollen. Mit {?ea1} definieren wir das Eingabefeld, in das der Anwender das Ergebnis der Summe eingeben kann.

Aufgabeparameter (in den meisten Programmiersprachen auch Variablen genannt) werden in geschweifte Klammern im Aufgabentext eingeschlossen und beginnen immer mit einem $-Zeichen. Hinter dem Dollar-Zeichen kann ein oder mehrere Zeichen oder Zahlen oder Kombinationen aus Zeichen und Zahlen stehen. Gleiches gilt auch für die Eingabefelder: Sie werden ebenfalls in geschweifte Klammern eingeschlossen, beginnen aber mit einem Fragezeichen.

In dem Fenster Aufgabenparameter erfassen wir folgenden Code:

//a 
$a1 = Zufall(100, 500) 
$a2 = Zufall(100, 500) 
$ea1 = $a1 + $a2 

Dieser Programmstand ist bereits funktionsfähig, Sie können ihn testen, indem Sie auf den Schalter Vorschau in der Toolleiste klicken. Den Stand dieser Übung können Sie auch hier testen.

Noch eine Anmerkung zum Quellcode: Dieser beginnt mit der Zeile //a. Diese Programmzeile hat keine Bedeutung für die Programmausführung, es handelt sich hierbei um einen Kommentar. Kommentare sind sinnvoll für die Dokumentation des Quelltextes, vor allem dann wenn die Aufgaben die Sie programmieren komplexer werden. Ein Kommentar wird durch zwei Schrägstriche eingeleitet. Das eExMx-Codefenster zeigt diese Zeilen in grüner Schrift. Damit heben sich die Kommentare gut vom restlichem Code ab.

Wir haben in der Übung die Grenzen für die Aufgabenparameter so gewählt, dass die Summe innerhalb des vorgegebenen Zahlenraums bleibt. So wie die Zahlen gegenwärtig erzeugt werden, kann keiner der Summanden größer als 500 werden. Zum Üben wären aber auch größere sinnvoll. Deshalb werden wir die nächste Übung etwas anders aufbauen.

a) {$a1} + {$a2} = {?ea1}
{$a3} + {$a4} = {?ea2}

Dazu der Quellcode:

$a3 = Zufall(500, 900) 
$ea2 = Zufall($a3 + 10, 1000) 
$a4 = $ea2 - $a3 

Der erste Aufgabenparameter wird eine Zahl zwischen 500 und 900 sein. Um den vorgegebenen Zahlenraum nicht zu verletzten hätten wir es uns einfach machen können und den zweiten Summanden auf eine Zufallszahl zwischen 1 und 100 setzen können. Damit verschenken wir aber Potential. Wenn nämlich der erste Summand kleiner als 900 ist (das wird er die meiste Zeit auch sein), dann dürfte der zweite Summand auch größer als 100 ausfallen. Um diese Möglichkeit zu nutzen ermitteln wir zuerst ein Zufall-Ergebnis und stellen hier sicher, dass dafür der Zahlenraum stimmt. Wie Sie sehen, haben wir für den Zufallsgenerator diesmal statt eines fixen Wertes für die Untergrenze einen Term verwendet, in dem der erste Summand einfließt. Die Ergebnis-Obergrenze ist durch den verfügbaren Zahlenraum vorgegeben.

Um den zweiten Summanden zu bestimmen, verwenden wir die Umkehrrechnung zur Addition. Damit haben wir alle Vorgaben für die zweite Übung erfüllt: Eine der beiden Zahlen ist größer als 500 und der vorgegebene Zahlenraum wird eingehalten.

Ist das wirklich so? Wenn Sie den Quellcode noch mal betrachten, werden Sie feststellen dass die obige Aussage nicht ganz richtig ist. Nicht einer der beiden Summanden ist größer als 500 sondern immer nur der erste. Wäre doch schön, wenn sich das ab und zu ändern würde. Um das zu erreichen erweitern wir unseren Code um zwei weitere Zeilen:

$a3 = ZufallAus($a3,$a4) 
$a4 = $ea2 - $a3  

Wenn Sie das Ergebnis dieser Erweiterung testen und die Aufgabe wiederholt laden, werden Sie feststellen, dass der größere Summand zwischendurch wechselt.

Aufgabe formatieren

Unsere Aufgabe funktioniert ganz ordentlich, optisch ist Sie jedoch nicht gerade ansprechend. Das hat mehrere Ursachen. Am auffallendsten ist, dass die Blockkennzeichnung (das kleine a mit Klammer) die erste Übung kräftig einrückt, während die zweite Zeile wieder ganz vorne beginnt. Vielleicht ist es Ihnen noch nicht aufgefallen: in der zweiten Übung könnte einer der Summanden auch eine zweistellige Zahl sein. Das würde den Versatz des zweiten Eingabefeldes noch verstärken und damit noch unschöner machen. Das wollen wir ändern indem wir als nächstes die Ausgabe formatieren. Ändern Sie den Code im Aufgabenfenster wie folgt:

|| a)| {$a1}| + | {$a2}| = | {?ea1}|
 |   | {$a3}| + | {$a4}| = | {?ea2}|| 

Zugegeben, der Code sieht nicht mehr so schön aus wie vorher, aber das Ergebnis kann sich dafür sehen lassen. Mit den Ergänzungen im Code haben wir ein unsichtbares Gitter (Tabelle) über die Übungstexte gelegt. Ein Gitter wird mit zwei senkrechten Balken begonnen und mit zwei senkrechten Balken abgeschlossen. Die einzelnen Gitterzellen werden durch einzelne Balken begrenzt. Die Position des Textes in der Gitterzelle bestimmt die Textausrichtung in der Zelle. Folgende Formatierungen sind möglich:

Der Text folgt gleich hinter dem ersten Balken, zwischen Text und rechten Balken befindet sich mindestens ein Leerzeichen, der Text wird linksbündig in der Gitterzelle ausgerichtet.

|Text |

Zwischen linken Balken und Text befindet sich mindestens ein Leerzeichen, der rechte Balken folgt gleich hinter dem Text, der Text wird rechtsbündig in der Gitterzelle ausgerichtet.

| Text| 

Zwischen Balken und Text befindet sich mindestens ein Leerzeichen, der Text wird zentriert in der Gitterzelle ausgerichtet.

| Text | 

Zwischen Balken und Text sind keine Leerzeichen, der Text wird zentriert in der Gitterzelle ausgerichtet.

|Text| 

Aufgabe erweitern, Eingabefelder formatieren

Nach gleichem Schema können wir nun unsere Aufgabe mit weiteren Übungen ergänzen. Hier soll vorerst die Subtraktion gezeigt werden. Formatierter Aufgaben-Code für Subtraktion:

|| b)| {$b1}| - | {$b2}| = | {?eb1}| 
 |   | {$b3}| - | {$b4}| = | {?eb2}|| 

Und der Code für die Aufgabenparameter und Ergebnisberechnung:

//b 
$b1 = Zufall(100,900) 
$eb1 = Zufall(10,99) 
$b2 = $eb1 + $b1 

$b3 = Zufall(500,1000) 
$b4 = Zufall(1,$b3-499) 
$eb2 = $b3 - $b4 

Das Ergebnis dieser Erweiterung können Sie hier testen.

Ist Ihnen das kleinere Eingabefeld in der ersten Subtraktionsübung aufgefallen? Das kommt daher, weil wir das Ergebnis dieser Rechnung in einen Bereich von 10 bis 99 festgelegt haben. Dieses Ergebnis ist zweistellig, während alle anderen Ergebnisse aus drei Ziffern bestehen. eExMx analysiert die Ergebnisse und passt bedarfsgerecht die Breite der Eingabefelder an. Das macht das Programmieren einfacher, Sie müssen sich nie darüber Gedanken machen, wie breit die Felder sein müssen. eExMx übernimmt diese Anpassung automatisch für Sie. Es gibt, speziell in diesem Fall, dennoch einen Nachteil: Das kürzere Feld wäre eine unfreiwillige Hilfestellung für den Anwender. Das wollen wir beseitigen. Ändern Sie die erste Übungszeile im Block b wie folgt ab:

|| b)| {$b1}| - | {$b2}| = | {?eb1,,4}|

Das Ergebnis dieser kleinen Änderung können Sie hier sehen. Alle Eingabefelder haben nun die gleiche Größe. Wir haben durch die vorgenommene Änderung die automatische Größenanpassung von eExMx ausgeschaltet und dafür eine feste Größe 4 vorgegeben.

Bei der Angabe der Feldgrößen müssen Sie genau darauf aufpassen das Feld nicht zu unterdimensionieren. Das würde bedeuten, dass der Anwender ein richtiges Ergebnis gar nicht erst in das Feld eintragen könnte und damit keine Chance hätte, die Aufgabe richtig zu lösen.

Sie werden sich vielleicht fragen, warum zwischen Parametername und der Feldgrößenangabe zwei Kommas stehen. Das ist deshalb so, weil zwischen diesen beiden Kommas ein weiterer optionaler Parameter angegeben werden kann. Dessen Bedeutung erfahren Sie in einem weiteren Tutorial. Ungeduldige können das in der eExMx-Hilfedatei nachlesen.

Eingabe von Sonderzeichen

Kommen wir zum nächsten Übungsblock, zur Multiplikation. Die Logik für die Multiplikation enthält keine Überraschungen. Sie müssen lediglich darauf aufpassen, den Zahlenraum nicht zu überschreiten. Vielleicht möchten Sie aber triviale Übungen, wie die Multiplikation mit einem Vielfachen von 10 vermeiden. Hier ein Vorschlag für die Suche nach zweistelligen Zufallszahlen, die sich nicht durch 10 teilen lassen:

$c1 = Zufall(1,9) * 10 + Zufall(1,9)

Einer Besonderheit bei der Multiplikation begegnen wir bei der Eingabe des Aufgabentextes. Im deutschen Schulunterricht wird als Malzeichen der Malpunkt oder Mittelpunkt verwendet. Nur werden Sie dieses Zeichen vergeblich auf Ihrer (deutschen) Tastatur suchen, es ist nämlich nicht da. Es gibt dennoch einen Trick wie Sie das Malzeichen Ihrer Tastatur entlocken können. Das funktioniert so:

| c)| {$c1}| · | {$c2}| = | {?ec1}|

In naturwissenschaftlichen Fächern sind oft weitere Sonderzeichen erforderlich. Wie Sie diese erzeugen können, erfahren Sie in der eExMx-Hilfedatei.

Download

Die hier programmierte Aufgabe können Sie im eexmx-Format auch downloaden. Diese Datei können Sie mit der eExMx-Software öffnen und weiter bearbeiten. Sie enthält den vollständigen Übungscode, also auch die Blöcke c und d für Multiplikation und Division. Im Code gibt es keine weiteren Überraschungen, er ist ähnlich aufgebaut wie die beiden hier vorgestellten Blöcke. Lediglich bei der Division müssen Sie darauf aufpassen, dass das Ergebnis immer eine Ganzzahl ist (Stichwort Umkehrrechnung, siehe auch Tutorial 1).