Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung | |||
| planung:microbitpython [2023/05/09 22:08] – marroc | planung:microbitpython [2023/05/10 08:32] (aktuell) – alte Version wiederhergestellt (2023/01/01 21:20) marroc | ||
|---|---|---|---|
| Zeile 14: | Zeile 14: | ||
| - Multiplizieren Sie die Zahl mit 100. | - Multiplizieren Sie die Zahl mit 100. | ||
| - Halbieren Sie das Resultat. | - Halbieren Sie das Resultat. | ||
| - | - Wenn Sie bereits Geburtstag hatten, addieren Sie das aktuelle Jahr und subtrahieren 2100. (Falls das Geburtsdatum vor dem Jahr 2000 ist, so wäre dies nicht 2100 sondern 2000) | + | - Wenn Sie bereits Geburtstag hatten, addieren Sie das aktuelle Jahr und subtrahieren 2100. |
| - | - Wenn Sie noch nicht Geburtstag hatten, addieren Sie das aktuelle Jahr und subtrahieren 2101. (Falls das Geburtsdatum vor dem Jahr 2000 ist, so wäre dies 2001 und nicht 2001) | + | - Wenn Sie noch nicht Geburtstag hatten, addieren Sie das aktuelle Jahr und subtrahieren 2101. |
| - Subtrahieren Sie die letzten beiden Zahlen Ihres Jahrganges (z.B. bei 1991 subtrahieren Sie 91). | - Subtrahieren Sie die letzten beiden Zahlen Ihres Jahrganges (z.B. bei 1991 subtrahieren Sie 91). | ||
| - Ihre Zahl sollte dreistellig sein. Die erste Ziffer besteht aus der Zahl, welche Sie sich am Anfang gemerkt haben, die letzten beiden Ziffern sind Ihr Alter in Jahren. Verblüffend, | - Ihre Zahl sollte dreistellig sein. Die erste Ziffer besteht aus der Zahl, welche Sie sich am Anfang gemerkt haben, die letzten beiden Ziffern sind Ihr Alter in Jahren. Verblüffend, | ||
| Zeile 48: | Zeile 48: | ||
| **<color # | **<color # | ||
| - | **<color # | + | **<color # |
| **<color # | **<color # | ||
| Zeile 173: | Zeile 173: | ||
| * Schliessen Sie den Microbit per USB-Kabel an Ihrem Computer an. | * Schliessen Sie den Microbit per USB-Kabel an Ihrem Computer an. | ||
| - | * Öffnen Sie **https:// | + | * Öffnen Sie **https:// |
| * Ein Erklärungsvideo finden Sie [[https:// | * Ein Erklärungsvideo finden Sie [[https:// | ||
| * Grundsätzlich kann auch ein anderer Browser ihrer Wahl genutzt werden, dann muss über ein Download und ein manuelles " | * Grundsätzlich kann auch ein anderer Browser ihrer Wahl genutzt werden, dann muss über ein Download und ein manuelles " | ||
| Zeile 191: | Zeile 191: | ||
| <code python> | <code python> | ||
| - | kiste = 100 | + | Kiste = 100 |
| </ | </ | ||
| Der Wert wird einer Variablen durch das Gleichsetzen zugewiesen. Eine Zuweisung eines Werts an die Variable ist, wie wenn man einen Gegenstand in die Kiste legt. \\ | Der Wert wird einer Variablen durch das Gleichsetzen zugewiesen. Eine Zuweisung eines Werts an die Variable ist, wie wenn man einen Gegenstand in die Kiste legt. \\ | ||
| - | :!: <color # | + | :!: <color # |
| - | Im Beispiel ist eine Variable mit dem Namen //kiste// erstellt worden und in dieser Variablen wird der Wert //100// gespeichert. Jedes Mal, wenn nun die Variable //kiste// im Programm aufgerufen wird, ersetzt das Programm //kiste// durch //100//. | + | Im Beispiel ist eine Variable mit dem Namen //Kiste// erstellt worden und in dieser Variablen wird der Wert //100// gespeichert. Jedes Mal, wenn nun die Variable //Kiste// im Programm aufgerufen wird, ersetzt das Programm //Kiste// durch //100//. |
| \\ | \\ | ||
| == Beispiel == | == Beispiel == | ||
| <code python> | <code python> | ||
| - | kiste = 100 | + | Kiste = 100 |
| - | kiste = 50 | + | Kiste = 50 |
| - | kiste = 50 + kiste | + | Kiste = 50 + Kiste |
| </ | </ | ||
| - | Im obigen Beispiel eines kurzen Programms, welches von oben links zeilenweise nach unten rechts durchlaufen wird, werden der Variablen | + | Im obigen Beispiel eines kurzen Programms, welches von oben links zeilenweise nach unten rechts durchlaufen wird, werden der Variablen |
| - | * Zuerst wird der Variablen | + | * Zuerst wird der Variablen |
| - | * Dann wird die Variable | + | * Dann wird die Variable |
| - | * Die Variable | + | * Die Variable |
| Wer beim Arbeiten mit dem Micro:bit Variablen verwendet möchte, kann dies auf ganz verschiedene Arten tun. | Wer beim Arbeiten mit dem Micro:bit Variablen verwendet möchte, kann dies auf ganz verschiedene Arten tun. | ||
| Beispielsweise kann das folgende Programm ähnlich wie das Kisten-Beispiel für den Micro:bit programmiert werden: | Beispielsweise kann das folgende Programm ähnlich wie das Kisten-Beispiel für den Micro:bit programmiert werden: | ||
| - | <code python | + | <code python |
| from microbit import * | from microbit import * | ||
| - | kiste=2 | + | Kiste=2 |
| - | kiste=kiste * 3 | + | Kiste=Kiste * 3 |
| - | display.scroll(' | + | display.scroll(' |
| - | display.show(kiste) | + | display.show(Kiste) |
| </ | </ | ||
| - | In diesem Beispiel ist die Variable | + | In diesem Beispiel ist die Variable |
| + | |||
| + | // | ||
| <WRAP center round todo 80%> | <WRAP center round todo 80%> | ||
| Zeile 228: | Zeile 230: | ||
| - Studieren Sie das kurze Programm unten. Diskutieren Sie zu zweit, was hier programmiert wurde. Halten Sie dies kurz schriftlich fest. | - Studieren Sie das kurze Programm unten. Diskutieren Sie zu zweit, was hier programmiert wurde. Halten Sie dies kurz schriftlich fest. | ||
| - Schliessen Sie den Micro:bit an, kopieren Sie das Programm in Ihren Editor (mico:bit classroom). Senden Sie dies dann an den Micro:bit und überprüfen Sie so die angestellten Vermutungen und Überlegungen von Aufgabe 1. | - Schliessen Sie den Micro:bit an, kopieren Sie das Programm in Ihren Editor (mico:bit classroom). Senden Sie dies dann an den Micro:bit und überprüfen Sie so die angestellten Vermutungen und Überlegungen von Aufgabe 1. | ||
| - | - Identifizieren Sie alle Variablen und Variablenwerte dieses Programms und markieren Sie diese, indem Sie den Code in ein Textdokument kopieren und kommentieren. :!: Kommentare können mit einem # direkt im Programm notiert werden. | + | - Identifizieren Sie alle Variablen und Variablenwerte dieses Programms und markieren Sie diese, indem Sie den Code in ein Textdokument kopieren und kommentieren. |
| - | - Erweitern bzw. verändern Sie den Rechner1 so, dass auch andere Operationen (Grundoperationen) durchgeführt werden. | + | |
| </ | </ | ||
| Zeile 248: | Zeile 249: | ||
| display.scroll(a+b) | display.scroll(a+b) | ||
| </ | </ | ||
| + | |||
| + | === Importieren von Python-Modulen === | ||
| + | Sicher haben Sie sich auch schon gefragt, warum die beiden Zeile '' | ||
| + | In Python gibt es vordefinierte Bibliotheken (eine Sammlung von Dateien, sogenannten Modulen), die von jedem Programmierer genutzt werden kann, es muss somit keine Erweiterung installiert werden, die benötigten " | ||
| + | Grundsätzlich können für die ersten Schritte mit dem Micro:bit die folgenden (oder ähnliche) Importbefehle nützlich sein: | ||
| + | ^ Befehl ^ Bedeutung ^ | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | |'' | ||
| + | |||
| + | <WRAP center round todo 80%> | ||
| + | **2. Programmieraufgabe**\\ | ||
| + | - Gegeben ist das untenstehende Programm. Schliessen Sie den Micro:bit an, laden Sie das Programm auf den Micro:bit und führen Sie das Programm aus. Was genau wurde programmiert? | ||
| + | - Verändern Sie das Programm so, dass mit dem Satz des Pythagoras die Hypotenuse c mithilfe der beiden Katheten a und b berechnet werden kann. Dabei sollen nach wie vor die Variablen und ihre Werte, sowie das Ergebnis mit dem Variablennamen c dargestellt werden. Optional kann auch noch ' | ||
| + | - Schreiben Sie ein neues Programm, welches das Volumen einer [[https:// | ||
| + | - Beantworten Sie die drei Lernfragen schriftlich in Ihr OneNote: | ||
| + | - Wo sind die Variablen? | ||
| + | - Wo liegt der Fehler? | ||
| + | - Was passiert, wenn das Import fehlt? | ||
| + | - Erweitern Sie diesen Reichner mit weiteren Funktionalitäten und schreiben Sie dazu ein kurzes passendes Programm. | ||
| + | </ | ||
| + | |||
| + | <code python Rechner2.py> | ||
| + | #Aufgabe 1, Mathematische Formeln | ||
| + | from microbit import * | ||
| + | from math import * | ||
| + | |||
| + | #Variablen definieren und einen Wert zuweisen | ||
| + | a=3 | ||
| + | b=5 | ||
| + | |||
| + | # | ||
| + | display.scroll(' | ||
| + | display.scroll(a) | ||
| + | display.scroll(' | ||
| + | display.scroll(b) | ||
| + | display.scroll(' | ||
| + | display.scroll(a+b) | ||
| + | </ | ||
| + | |||
| + | <WRAP center round todo 80%> | ||
| + | **3.Programmieraufgabe**\\ | ||
| + | Was genau macht das untenstehende Programm? Schreiben Sie für jede Zeile einen Kommentar, was diese Zeile bzw. die Befehle und Methoden dieser Zeile genau bewirken. Wo gibt es eine Variable? Verändern Sie das Programm so, dass es das Doppelte des Knopfdruckwertes zurückgibt. | ||
| + | </ | ||
| + | |||
| + | <code python Programm1.py> | ||
| + | #Programm 1 | ||
| + | from microbit import * | ||
| + | |||
| + | display.scroll(' | ||
| + | sleep(3000) | ||
| + | knopfdruck=button_a.get_presses() | ||
| + | display.scroll(knopfdruck) | ||
| + | </ | ||
| + | 8-O | ||
| + | ---- | ||
| + | |||
| + | |||
| + | < | ||
| + | <panel title=' | ||
| + | <code python> | ||
| + | ## Aufgabe 1a) Lösung | ||
| + | from microbit import * | ||
| + | from math import * | ||
| + | |||
| + | #Variablen definieren und einen Wert zuweisen | ||
| + | a=3 | ||
| + | b=5 | ||
| + | # | ||
| + | display.scroll(' | ||
| + | display.scroll(a) | ||
| + | display.scroll(' | ||
| + | display.scroll(b) | ||
| + | display.scroll(' | ||
| + | display.scroll(' | ||
| + | display.scroll(sqrt(a^2+b^2)) | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ===== Teil 2 Display und die while-Schleife===== | ||
| + | {{ : | ||
| + | == Beispiel: == | ||
| + | <code python countA.py> | ||
| + | #Programm 1 | ||
| + | from microbit import * | ||
| + | |||
| + | display.scroll(' | ||
| + | sleep(3000) #3000ms Zeit,in welcher der Benutzer den Knopf A einige Male drücken muss. | ||
| + | knopfdruck=button_a.get_presses() #Es wirdgezählt, | ||
| + | display.scroll(knopfdruck) #Es wird die Anzahl Betätigungen angezeigt. | ||
| + | </ | ||
| + | |||
| + | Durch dieses kleine Programm 1 wird gezählt, wie oft der Knopf A gedrückt in 3000ms gedrückt wird. Es wird neben der vordefinierten Methode '' | ||
| + | |||
| + | :!: **Das <color # | ||
| + | **\\ | ||
| + | Das Programm ist sehr kurz und es fällt auf, dass es nur einen Durchlauf gibt. Durch ein erneutes Starten des Programms (die Stop- und Starttaste bei der Simulation oder dem Aus- und Einschalten des Micro:bits) kann ein weiteres Mal gezählt werden, wie oft A gedrückt wird. | ||
| + | Das Programm kann natürlich auch wie folgt erweitert werden. | ||
| + | == Beispiel: == | ||
| + | <code python countB.py> | ||
| + | #Programm 2 | ||
| + | from microbit import * | ||
| + | |||
| + | display.scroll(' | ||
| + | sleep(3000) | ||
| + | knopfdruck=button_a.get_presses() | ||
| + | display.scroll(knopfdruck) | ||
| + | sleep(2000) | ||
| + | display.scroll(' | ||
| + | sleep(3000) | ||
| + | knopfdruck=button_a.get_presses() | ||
| + | display.scroll(knopfdruck) | ||
| + | sleep(2000) | ||
| + | display.scroll(' | ||
| + | sleep(3000) | ||
| + | knopfdruck=button_a.get_presses() | ||
| + | display.scroll(knopfdruck) | ||
| + | </ | ||
| + | |||
| + | Beim Programm 2 wird die Programmzeilen dreimal wiederholen. Der Code-Block ist viel länger. | ||
| + | Wie kann dieses Wiederholen besser programmiert werden, sodass das Programmieren effizient ist und das Programm ästhetisch und gut leserlich wirkt? Wie kann durch eine kleine Änderung im Programm erreicht werden, dass das Programm nicht dreimal hintereinander zählt, sondern zwanzigmal? | ||
| + | |||
| + | Neben den Variablen ist ein zweites wichtiges Programmierkonzept die Schleifen. Eine Schleife ist dann nötig, wenn ein Programmteil (Code-Block) sich mehrfach wiederholt. **Durch das Verwenden einer Schleife muss die Programmzeile nicht immer wiederholt im Programm notiert werden.** Somit ist dies genau das, was Programm 2 verbessern würde. | ||
| + | |||
| + | Es gibt grundsätzlich zwei Schleifentypen: | ||
| + | |||
| + | ===while-Schleife=== | ||
| + | {{: | ||
| + | Eine while-Schleife wird unter anderem dann verwendet, wenn: | ||
| + | * ...man nicht weiss, wie oft eine Wiederholung einiger Programmzeilen ausgeführt werden muss, man kennt somit die Anzahl der Wiederholungen nicht. | ||
| + | * .... die Anzahl Wiederholungen bekannt ist und eine **Zähl-Variable** vorhanden ist. | ||
| + | |||
| + | Jede Schleife hat eine **Bedingung** (eine " | ||
| + | |||
| + | Bei der Schleife wird der Body (die Programmzeile, | ||
| + | === Beispiel: === | ||
| + | {{ : | ||
| + | <code python countC.py> | ||
| + | #Programm 3 | ||
| + | from microbit import * | ||
| + | |||
| + | zaehler=1 #ein Zähler ist nötig, um eine Bedingung, ein Stop-Kriterium zu definieren | ||
| + | while (zaehler< | ||
| + | display.scroll(' | ||
| + | sleep(3000) | ||
| + | knopfdruck=button_a.get_presses() | ||
| + | display.scroll(knopfdruck) | ||
| + | zaehler=zaehler+1 #Der Zähler muss um eins erhöht werden! | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | Hier ist ein Zähler nötig, denn dadurch kann die Anzahl Wiederholungen durch das Erhöhen in jedem Durchlauf ('' | ||
| + | |||
| + | <WRAP center round todo 80%> | ||
| + | **4. Programmieraufgabe**\\ | ||
| + | Für diese Aufgabe orientieren Sie sich am Programm Rechner 1 von weiter oben (1.Programmieraufgabe). Schreiben Sie ein Programm mit folgenden Eigenschaften: | ||
| + | * Der Variablenwert von a soll durch die Anzahl Bedienungen des Knopfs A bestimmbar sein. Dieser Wert soll per Scroll angezeigt werden. | ||
| + | * Gleiches für den Variablenwert b. | ||
| + | * Danach soll das Produkt der beiden Werte angezeigt werden. | ||
| + | </ | ||
| + | |||
| + | <WRAP center round todo 80%> | ||
| + | **5. Programmieraufgabe**\\ | ||
| + | {{ : | ||
| + | Verändern Sie das Programm 3 so, dass der Knopfdruckwert von Startwert 20 subtrahiert wird, bei jedem Durchlauf der Wiederholung dann von diesem Zwischenresultat weiter subtrahiert wird. Wenn durch diese Subtraktion 0 erreicht wird, soll ein Ton abgespielt. | ||
| + | </ | ||
| + | |||
| + | === Die Endlosschleife === | ||
| + | {{ : | ||
| + | Die '' | ||
| + | Um diese Endlosschleife zu programmieren, | ||
| + | Diese Schleife wird während immer ausgeführt, | ||
| + | <WRAP center round todo 80%> | ||
| + | **6. Programmieraufgabe**\\ | ||
| + | Verändern Sie das Programm 3 so, dass es eine Endlosschleife enthält und nicht nach 3 Wiederholungen stoppt. | ||
| + | </ | ||
| + | |||
| + | <WRAP center round todo 80%> | ||
| + | **7. Programmieraufgabe**\\ | ||
| + | Ein Programm wurde geschrieben und sieht bei der Ausführung wie folgt aus: | ||
| + | {{youtube> | ||
| + | |||
| + | Schreiben Sie dieses Programm, dabei sollte eine '' | ||
| + | |||
| + | </ | ||
| + | <WRAP center round todo 80%> | ||
| + | **8. Programmieraufgabe**\\ | ||
| + | - Lassen Sie den Micro:bit ein zufriedenes Smiley anzeigen. Hier hilft Ihnen das Menü Display. {{ : | ||
| + | - Verändern Sie Ihr kleines Programm so, dass zuerst das Smiley und danach ein anderes Symbol leuchtet, dabei sollten die LEDs nicht alle mit der selben Leuchtkraft leuchten und zwischen den beiden Elementen sollte es eine kurze Pause geben! | ||
| + | - Nutzen Sie nun eine '' | ||
| + | </ | ||
| + | |||
| + | |||
| + | <WRAP center round todo 80%> | ||
| + | **Lernfragen**\\ | ||
| + | Beantworten Sie die drei Lernfragen: | ||
| + | - Was ist der Unterschied zwischen '' | ||
| + | - Was genau macht die Schleife '' | ||
| + | - Warum sind Variablen nötig? | ||
| + | - Worauf muss geachtet werden, wenn eine sich endlich wiederholende '' | ||
| + | - Was passiert, wenn auf das Einrücken in der '' | ||
| + | </ | ||
| + | |||
| + | |||
| + | ---- | ||
| + | < | ||
| + | <panel title=" | ||
| + | from microbit import * | ||
| + | import music | ||
| + | |||
| + | startwert=20 | ||
| + | zaehler=1 | ||
| + | while (startwert >0): | ||
| + | display.scroll(' | ||
| + | sleep(3000) | ||
| + | knopfdruck=button_a.get_presses() | ||
| + | startwert=startwert-knopfdruck | ||
| + | display.scroll(startwert) | ||
| + | |||
| + | music.play(music.BA_DING) | ||
| + | |||
| + | |||
| + | from microbit import * | ||
| + | |||
| + | |||
| + | |||
| + | number = 0 | ||
| + | while number < 10: | ||
| + | display.scroll(number) | ||
| + | number = number + 2 | ||
| + | display.scroll(' | ||
| + | |||
| + | |||
| + | |||
| + | from microbit import * | ||
| + | |||
| + | |||
| + | while True: | ||
| + | display.show(Image.HEART) | ||
| + | sleep(1000) | ||
| + | display.show(Image(' | ||
| + | ' | ||
| + | ' | ||
| + | ' | ||
| + | ' | ||
| + | sleep(1000) | ||
| + | </ | ||
| + | |||
| + | |||
| + | </ | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | ===== Teil 3, Knöpfe, Sensoren und ' | ||
| + | |||
| + | === Beispiel === | ||
| + | |||
| + | Ein Beispiel zum Starten, hierbei ist zu bemerken, dass ein Beschleunigungssensor, | ||
| + | |||
| + | <code python beschleunigung1.py> | ||
| + | # | ||
| + | from microbit import * | ||
| + | |||
| + | # | ||
| + | |||
| + | while True: | ||
| + | if accelerometer.was_gesture(' | ||
| + | display.show(Image.CONFUSED) | ||
| + | sleep(200) | ||
| + | else: | ||
| + | display.show(Image.HAPPY) | ||
| + | |||
| + | |||
| + | </ | ||
| + | {{ : | ||
| + | In diesem kurzen Programm wird durch eine Endlosschleife immer wieder über den Akzelerometer überprüft, | ||
| + | Falls dies der Fall ist, wird ein " | ||
| + | |||
| + | **Dadurch verzweig sich das Programm** in zwei oder mehrere Äste. Ein einzelner Programmteil wird **nur dann ausgeführt**, | ||
| + | |||
| + | Falls es nur ein '' | ||
| + | |||
| + | |||
| + | <WRAP center round todo 80%> | ||
| + | **9. Programmieraufgabe** | ||
| + | - Untersuchen Sie das untenstehende unvollständige Programm. Was genau passiert? Beschreiben Sie kurz. | ||
| + | - Erweitern Sie das Programm so, dass beim Drücken von Knopf B ein kurzer Ton erzeugt wird und das Display "Bitte Knopf A drücken" | ||
| + | - Verändern Sie das Programm weiter, sodass wenn beide Knöpfe gleichzeitig gedrückt werden, ein Symbol Ihrer Wahl angezeigt wird und eine Folge von absteigenden Tönen erzeugt wird. | ||
| + | - Erweitern Sie das Programm weiter, dass wenn der Micro:bit mit dem Logo nach unten gehalten wird, die aktuelle Raumtemperatur gemessen wird und diese auf dem Display auch per scroll angezeigt wird, gefolgt von einer kleinen Pause von einer Sekunde. | ||
| + | </ | ||
| + | {{ : | ||
| + | |||
| + | <code python beschleunigung2.py> | ||
| + | |||
| + | while True: | ||
| + | if button_a.was_pressed(): | ||
| + | display.scroll(' | ||
| + | sleep(400) | ||
| + | display.clear() | ||
| + | </ | ||
| + | |||
| + | <WRAP center round todo 80%> | ||
| + | **10. Programmieraufgabe** | ||
| + | - Zeichnen Sie das Aktivitätsdiagramm des unten beschriebenen Programms, diskutieren Sie zu zweit. | ||
| + | - Schreiben Sie das Programm, welches die beiden Pulse misst. | ||
| + | - Ergänzen Sie das Programm, sodass die Werte von einem Micro:bit zum anderen gesendet werden! | ||
| + | <WRAP center round box 100%> | ||
| + | // | ||
| + | Es soll den jeweiligen Pulsschlag pro Minute von zwei Personen nacheinander anzeigen, dazu soll eine '' | ||
| + | Der Puls soll wie auf dem Foto abgebildet, {{ : | ||
| + | </ | ||
| + | |||
| + | Tipps: | ||
| + | * Die Bedingung '' | ||
| + | * Die 2.Programmieraufgabe könnte helfen | ||
| + | * Ein Zähler ist nötig. | ||
| + | * Die gemessenen Pulsschläge sind mit einem geeigneten Faktor proportional auf eine Zeitspanne von 60 Sekunden zu rechnen. | ||
| + | * Das Menü Radio hilft für Teilaufgabe C. | ||
| + | * {{ : | ||
| + | |||
| + | </ | ||
| + | |||
| + | <WRAP center round todo 60%> | ||
| + | **Lernfragen**\\ | ||
| + | - Wie kann erreicht werden, dass ein Teil eines Programms nur in bestimmten Fällen ausgeführt wird? | ||
| + | - Warum ist das Verzweigen (Entscheiden) des Programms überhaupt nötig? | ||
| + | - Worauf muss geachtet werden, wenn eine ' | ||
| + | - Welches sind die wichtigsten Erkenntnisse der Programmieraufgaben 1 bis 10? Notieren Sie dies kurz! | ||
| + | </ | ||
| + | |||
| + | |||