Hilfe zur CodeHilfe
Mit der CodeHilfe können Schülerinnen und Schüler Lücken in einem Programm ergänzen, Codebausteine einsetzen und durcheinandergeratene Zeilen sortieren. Die Lösung wird direkt im Browser überprüft.
Eine CodeHilfe erstellen
Grundlage jeder CodeHilfe ist das fertige, richtige Programm. Darin markierst du, was die Schülerinnen und Schüler ergänzen oder ordnen sollen. Das Werkzeug ist sprachunabhängig; die Beispiele auf dieser Seite verwenden Python und Kotlin.
- Öffne den Editor, füge den Lösungscode ein und wähle die Programmiersprache für die Syntaxhervorhebung. Zum Ausprobieren lädt „Beispiel laden“ eine kleine fertige Aufgabe.
- Wähle Text aus und setze mit den Knöpfen über dem Codefeld Lücken und Zeilenmarkierungen. Du kannst die Markierungen auch direkt tippen.
- Lege unter Einstellungen fest, ob Zeilen sortiert werden, wie Lücken gefüllt werden und ob eine Lösung angezeigt wird.
- Ergänze bei Bedarf eine Überschrift und eine Aufgabenstellung.
- Prüfe die Aufgabe in der Vorschau. Sie verhält sich genau so wie bei deinen Schülerinnen und Schülern. Stimmt etwas mit den Markierungen nicht, erklärt die Vorschau, was zu ändern ist.
- Teile den Link, den QR-Code oder bette die Aufgabe ein (siehe Teilen).
Ein umfassendes Beispiel
Dieses Beispiel verbindet sortierbare und feste Zeilen, zu tippende Lücken, Codebausteine, eine überflüssige Zeile und einen zusätzlichen Baustein. Außerdem kann die Lösung nach einem fehlerhaften Versuch angezeigt werden.
Aufgabe – Temperaturbericht
Baue einen Temperaturbericht für Mainz zusammen. Heute sind es
18 °C, morgen soll die Temperatur um 2 °C
steigen. Das fertige Programm soll folgende Ausgabe erzeugen:
Heute in Mainz: 18 °C Vorhersage für morgen: 20 °C
Fülle die Lücken und bringe die Zeilen in die richtige
Reihenfolge. Die Zuweisungen für Ort und heutige Temperatur dürfen
ihre Reihenfolge tauschen. Ziehe die nicht benötigte Ausgabezeile
in die Ablage oder nutze dafür den Knopf ✕. Einer der
angebotenen Bausteine wird nicht benötigt.
def temperaturbericht(): §§fest
ort = §§"Mainz"§§ §§gruppe
heute = §§18§§ §§gruppe
print(f"Heute in {ort}: {heute} °C")
print("Vorhersage für morgen:") §§fest
morgen = heute + §§2::tippen§§
print(f"{morgen} °C")
print("Keine Daten") §§extra
§§20::extra§§
temperaturbericht() §§fest
Der Lösungscode dazu, wie er im Editor steht:
def temperaturbericht(): §§fest
ort = §§"Mainz"§§ §§gruppe
heute = §§18§§ §§gruppe
print(f"Heute in {ort}: {heute} °C")
print("Vorhersage für morgen:") §§fest
morgen = heute + §§2::tippen§§
print(f"{morgen} °C")
print("Keine Daten") §§extra
§§20::extra§§
temperaturbericht() §§fest
Einstellungen: Zeilen mischen und sortieren lassen, Lücken füllen durch Tippen oder Bausteine, Lösung anzeigen nach einem Fehlversuch.
Referenz
Einstellungen
| Einstellung | Werte | Bedeutung |
|---|---|---|
| Zeilen mischen und sortieren lassen | an / aus (Standard) | Die beweglichen Zeilen mischen und sortierbar machen. Ist die Einstellung aus, bleibt ihre Reihenfolge fest. Lücken können unabhängig davon immer verwendet werden. |
| Zeilen verschieben | über feste Zeilen hinweg (Standard), nur innerhalb ihres Abschnitts | Die beweglichen Zeilen über feste Zeilen hinweg mischen und verschieben oder beides auf die durch feste Zeilen begrenzten Abschnitte beschränken. Nur beim Sortieren wirksam. |
| Lücken füllen | durch Tippen (Standard), durch Tippen oder Bausteine | Für alle Lücken festlegen, ob nur eine getippte Lösung erwartet
oder zusätzlich ein Codebaustein angeboten wird. Richtig
eingetippter Text wird in beiden Fällen anerkannt. Für einzelne
Lücken lässt sich das mit ::tippen oder
::baustein überschreiben. |
| Lösung anzeigen | nie (Standard), nach einem Fehlversuch, jederzeit | Keine Lösungsanzeige anbieten, sie erst nach einer erfolglosen Überprüfung freischalten oder von Anfang an anbieten. |
Markierungen im Lösungscode
| Markierung | Knopf | Bedeutung |
|---|---|---|
§§antwort§§ |
Lücke | Eine Lücke. Standardmäßig wird die Antwort eingetippt. |
§§antwort§alternative§§ |
+ Alternative | Eine zu tippende Lücke mit mehreren akzeptierten Antworten. Die
Antworten werden durch ein einzelnes § getrennt. |
§§antwort::baustein§§ |
Baustein | Für diese Lücke einen Codebaustein anbieten. Die richtige Antwort darf weiterhin eingetippt werden. |
§§antwort::tippen§§ |
Nur tippen | Für diese Lücke ausschließlich eine getippte Antwort erwarten. |
§§antwort::extra§§ |
Extra-Baustein | Einen zusätzlichen Codebaustein anbieten, der für keine Lücke benötigt wird. Die Markierung muss allein in einer Zeile stehen und erscheint nicht im zusammengesetzten Code. |
§§fest am Zeilenende |
Fest | Die Zeile bleibt an ihrer Position. Leerzeichen oder Tabs vor der Markierung werden zusammen mit ihr entfernt. |
§§gruppe am Zeilenende |
Austauschbar | Direkt aufeinanderfolgende Zeilen mit dieser Markierung dürfen innerhalb ihrer Gruppe in beliebiger Reihenfolge stehen. |
§§gruppe=name am Zeilenende |
Gruppe … | Alle gleich benannten Zeilen dürfen die für diese Gruppe vorgesehenen Positionen untereinander tauschen. Sie müssen nicht direkt aufeinanderfolgen und dürfen durch feste Zeilen getrennt sein. |
§§extra am Zeilenende |
Überflüssig | Die ganze Zeile gehört nicht zur Lösung und muss in die Ablage verschoben werden. |
Zeilenmarkierungen (§§fest, §§gruppe,
§§extra) wirken nur, wenn Zeilen sortiert werden. Der
Editor schaltet das Sortieren deshalb ein, sobald du eine davon
setzt, und richtet alle Zeilenmarkierungen untereinander aus.
Aufgabenstellung formatieren
| Eingabe | Wirkung |
|---|---|
| Leerzeile | Beginnt einen neuen Absatz. Ein einfacher Zeilenumbruch bleibt als Umbruch erhalten. |
`print(x)` |
Code im Fließtext |
**wichtig** |
Fettdruck |
- Punkt |
Aufzählung; mit 1. Schritt eine nummerierte
Liste |
``` … ``` |
Die Zeilen zwischen zwei ```-Zeilen erscheinen als
Block in fester Schriftbreite, z.B. für eine erwartete
Ausgabe. |
Überprüfung und Kopieren
- Die Überprüfung ist textbasiert; der Code wird nicht kompiliert.
- Bei Lücken sind Leerzeichen um Operatoren und Satzzeichen unerheblich. Groß- und Kleinschreibung muss stimmen.
- Mehrere akzeptierte Antworten sind nur bei zu tippenden Lücken möglich. Ein Codebaustein hat genau eine Form.
- Der Copy-Button oben rechts im Code kopiert den aktuellen Bearbeitungsstand ohne CodeHilfe-Markierungen. Eine überflüssige Zeile wird mitkopiert, solange sie noch nicht in der Ablage liegt.
Empfehlungen für den Einsatz
- Die CodeHilfe eignet sich besonders als freiwillige Hilfe zu einer offenen Programmieraufgabe: Stelle die Aufgabe offen und biete den Link für alle an, die nicht weiterkommen.
- Bei Aufgaben, die ein Projekt einführen oder neue Inhalte vermitteln, bietet sich Lösung anzeigen: nach einem Fehlversuch an.
- Bei Übungsaufgaben sollte keine Lösung angezeigt werden (Lösung anzeigen: nie).
- Überflüssige Zeilen und Extra-Bausteine erhöhen den Anspruch, weil Ausprobieren allein nicht mehr zum Ziel führt.
Teilen, Speichern und Datenschutz
Wege zum Teilen
| Weg | Wofür |
|---|---|
| Link für Schülerinnen und Schüler | Öffnet nur die Aufgabe, z.B. über Moodle, Messenger oder E-Mail. |
| QR-Code | Für Tablets und Smartphones im Unterricht, etwa über den Beamer. Je länger die Aufgabe, desto feiner wird der Code. |
| Einbetten | Ein iframe-Code für Webseiten oder eine
Moodle-Textseite. Die eingebettete Aufgabe erscheint ohne Rahmen
auf weißem Grund. |
| Link zum Weiterbearbeiten | Nur für dich: Öffnet die Aufgabe wieder im Editor. Damit kannst du sie später ändern oder als Vorlage für eine neue Aufgabe nutzen. Mit dem Schülerlink geht das nicht: Er unterscheidet sich nicht nur im Seitennamen, und der Editor lehnt ihn ab. |
| Datei | Eine Sicherungskopie (.codehilfe.json), die du
über „Öffnen …“ wieder lädst. |
Wo wird die Aufgabe gespeichert?
-
Nirgends auf einem Server. Die Aufgabe steckt
vollständig und komprimiert im Link, im Teil hinter dem
#. Diesen Teil schicken Browser nicht an den Server. Es gibt keine Anmeldung und keine Datenbank. - Links laufen deshalb nicht ab. Sie lassen sich aber auch nicht nachträglich ändern: Jede Änderung ergibt einen neuen Link. Wer den alten Link hat, sieht weiterhin die alte Fassung.
- Dein aktueller Entwurf wird nur in deinem Browser zwischengespeichert. Löschst du die Browserdaten oder wechselst das Gerät, ist er dort weg. Bewahre deshalb den Bearbeitungslink oder eine Datei auf.
- Die Lösung steckt ebenfalls im Link. Wer sich auskennt, kann sie auslesen. Die CodeHilfe ist zum Üben gedacht, nicht für Leistungsüberprüfungen.
- Zum Erzeugen und Öffnen der Links ist ein aktueller Browser nötig (Chrome, Edge oder Firefox ab 2023, Safari ab Version 16.4).
Beispiele
Jedes Beispiel hat einen Schwerpunkt. Mit „Im Editor öffnen“ kannst du es als Vorlage für eine eigene Aufgabe verwenden.
Beispiel 1 – Einfache Zeilensortierung
Für eine reine Sortieraufgabe genügt die Einstellung Zeilen mischen und sortieren lassen. Die erste und letzte Zeile bleiben hier fest.
Bringe die drei beweglichen Zeilen so in die richtige Reihenfolge, dass das Programm zunächst eine Zahl speichert, sie verdoppelt und anschließend das Ergebnis ausgibt.
def verdoppeln(): §§fest
zahl = 5
doppelt = zahl * 2
print(doppelt)
verdoppeln() §§fest
Beispiel 2 – Einfache Lücken
Ohne weitere Einstellungen bleiben die Zeilen geordnet und die Lösungen werden eingetippt. Es wird kein Lösungsbutton angezeigt.
Ergänze den Datentyp des Attributs und gib dem Hund den Namen
Bello.
class Hund {
var name: §§String§§ = "§§Bello§§"
}
Beispiel 3 – Getrennte Sortierabschnitte
Mit Zeilen verschieben: nur innerhalb ihres Abschnitts werden bewegliche Zeilen nur innerhalb des jeweiligen, durch feste Zeilen begrenzten Abschnitts gemischt und verschoben.
Sortiere zuerst die Begrüßung und danach die Berechnung. Die Trennlinie zwischen den beiden Programmteilen bleibt dabei an ihrer Position.
def ausgabe(): §§fest
name = "Ada"
print(f"Hallo {name}")
print("----------------") §§fest
zahl = 5
doppelt = zahl * 2
print(doppelt)
ausgabe() §§fest
Beispiel 4 – Tippen und Bausteine mischen
Mit ::baustein kann bei der standardmäßigen Texteingabe
für eine einzelne Lücke ein Baustein angeboten werden. In jedes Feld
kann trotzdem getippt werden. Ein Baustein in einer reinen Tipplücke
gilt dagegen als falsch.
Ergänze die Person: Setze ihren Namen als Baustein ein und tippe ihr Alter in die zweite Lücke.
class Person {
val name = §§"Ada"::baustein§§
val alter = §§17§§
}
Beispiel 5 – Alternative Antworten und sofortige Lösung
Alternative Antworten werden mit einem einzelnen §
getrennt. Lösung anzeigen: jederzeit zeigt den Lösungsbutton
von Anfang an.
Ergänze die Funktion so, dass sie das Doppelte der übergebenen Zahl zurückgibt.
def verdoppeln(zahl):
return §§zahl * 2§2 * zahl§§
Beispiel 6 – Direkt aufeinanderfolgende austauschbare Zeilen
Direkt aufeinanderfolgende Zeilen mit §§gruppe bilden
eine unbenannte Gruppe. Ihre Reihenfolge ist für die Lösung
unerheblich.
Sortiere die Klasse Hund. Die beiden Attribute dürfen
in beliebiger Reihenfolge direkt hinter dem Klassenkopf stehen.
class Hund { §§fest
var name = "" §§gruppe
var alter = 0 §§gruppe
fun bellen() {
println("Wuff")
}
} §§fest
Beispiel 7 – Verteilte austauschbare Zeilen
Eine benannte Gruppe gilt in der gesamten CodeHilfe. Gleich benannte Zeilen dürfen deshalb auch über eine feste Zeile hinweg ihre vorgesehenen Plätze tauschen.
Sortiere die Funktion. Sie soll zuerst Beginn, danach
die beiden Farben in beliebiger Reihenfolge und zuletzt
Ende ausgeben.
def farben_ausgeben(): §§fest
print("Beginn")
print("Rot") §§gruppe=farben
print("----------------") §§fest
print("Blau") §§gruppe=farben
print("Ende")
farben_ausgeben() §§fest
Beispiel 8 – Überflüssige Zeile
Eine mit §§extra markierte Zeile gehört nicht zur Lösung.
Sie kann in die Ablage gezogen oder mit dem Knopf ✕
dorthin verschoben werden.
Sortiere die Funktion so, dass sie die gespeicherte Zahl ausgibt. Verschiebe die syntaktisch fehlerhafte Zeile in die Ablage.
def zahl_ausgeben(): §§fest
zahl = 5
print(zahl)
print zahl §§extra
zahl_ausgeben() §§fest
Beispiel 9 – Hinweise bei fehlerhaften Markierungen
Erkennt die CodeHilfe eine widersprüchliche oder unvollständige Konfiguration, zeigt sie anstelle der Aufgabe konkrete Hinweise. Im Editor erscheinen sie in der Vorschau; Schülerlink und QR-Code gibt es erst, wenn alles stimmt. Das folgende Beispiel ist absichtlich fehlerhaft: Die Lücke soll ein Baustein sein, hat aber zwei Antworten, und eine Gruppe besteht aus nur einer Zeile.
Ergänze eine Tierart und ordne die Ausgabe richtig in das Hauptprogramm ein.
fun main() { §§fest
val tier = §§"Hund"§"Katze"§§
println(tier) §§gruppe
} §§fest
In eigene Webseiten einbinden
Für eine einzelne Aufgabe genügt der iframe-Code aus dem
Editor. Wer eigene Webseiten mit mehreren CodeHilfen gestaltet, kann
das Skript auch direkt einbinden. Dazu den Ordner
lib/codehilfe aus dem Quelltext dieses Werkzeugs in das
eigene Projekt kopieren.
<link rel="stylesheet" href="lib/codehilfe/css/codehilfe.css">
…
<article>
<pre class="quelltext codehilfe" data-zeilen-sortieren><code class="language-python">
…
</code></pre>
</article>
…
<script src="lib/codehilfe/js/codehilfe.js"></script>
-
Eine CodeHilfe ist ein normaler Quelltextblock aus
preundcode. Daspre-Element erhält die Klassecodehilfe, eine Klasse wielanguage-pythonamcode-Element steuert die Syntaxhervorhebung. Fehlt sie, wird der Code ohne Hervorhebung angezeigt. -
Die Stile erwarten, dass die CodeHilfe innerhalb eines
article-Elements steht. -
Für Syntaxhervorhebung und Copy-Knopf zusätzlich
Prism mit den Plugins
Toolbar, Copy to Clipboard und Normalize
Whitespace vor
codehilfe.jsladen. -
Zeichen wie
<und&werden im Quelltext wie in jedem HTML-Code als<bzw.&geschrieben.
Attribute am pre-Element
| Attribut | Werte | Einstellung im Editor |
|---|---|---|
data-zeilen-sortieren |
ohne Wert | Zeilen mischen und sortieren lassen |
data-zeilen-verschieben |
ueberall (Standard), abschnitt |
Zeilen verschieben |
data-luecken-eingabe |
tippen (Standard), baustein |
Lücken füllen |
data-loesung |
nie (Standard), nach-fehler,
immer |
Lösung anzeigen |
Beispiel 10 – CodeHilfe als aufklappbare Hilfe
Auf einer eigenen Seite kann die CodeHilfe als freiwillige Hilfe zu einer offenen Programmieraufgabe in einem aufklappbaren Bereich stehen. Wer die Aufgabe selbstständig löst, sieht sie nicht.
Entwickle ein Programm, das die Zahlen von 1 bis
n addiert und die Summe ausgibt.
Hilfe zum Programm
Bringe die Zeilen in die richtige Reihenfolge. Eine Zeile wird nicht benötigt.
n = int(input("n: ")) §§fest
summe = 0 §§gruppe
zahl = 1 §§gruppe
while zahl <= n:
summe = summe + zahl
zahl = zahl + 1
print(summe) §§extra
print("Summe:", summe) §§fest
<details class="frage">
<summary>Hilfe zum Programm</summary>
<p>
Bringe die Zeilen in die richtige Reihenfolge. Eine Zeile wird nicht
benötigt.
</p>
<pre class="quelltext codehilfe" data-zeilen-sortieren data-loesung="nach-fehler"><code class="language-python">
n = int(input("n: ")) §§fest
summe = 0 §§gruppe
zahl = 1 §§gruppe
while zahl <= n:
summe = summe + zahl
zahl = zahl + 1
print(summe) §§extra
print("Summe:", summe) §§fest
</code></pre>
</details>