~~NOTOC~~ ===== Lernziele heute ===== Sollten attraktiv und verständlich sein. * ''while''-Schleifen kennenlernen (bereits informell im Zeichenprogramm verwendet) * ''for''-Schleifen kennenlernen * ... und wie man diese sinnvoll verwendet * Test des Prüfungsformats (vermutlich per FORMS) ====== Schleifen ====== In Python gibt es drei Arten von Schleifen: * ''repeat''-Schleifen ((Genaugenommen gibt es diese Struktur nur in unserem "Java-Dialekt" Jython von Python.)) * ''while''-Schleifen * ''for''-Schleifen Was eine ''repeat''-Schleife ist, wissen wir seit der ersten Doppellektion. ===== ''while''-Schleifen ===== Eine ''while''-Schleife wird mit dem Schlüsselwort ''while'' (für deutsch //solange//) eingeleitet und hat die folgende Struktur (beachte den Doppelpunkt und die Einrückung): while : # der sogenannte Kopf der Schleife Vergleich mit ''if''-Selektion: Wenn man ''while'' durch ''if'' ersetzt, wird der eingerückte Code-Block genau einmal durchgeführt, wenn die Ausführ-Bedingung erfüllt ist. Bei der ''while''-Schleife wird dieser solange ausgeführt, wie die Ausführbedingung erfüllt ist. ===== Aufgabe 1, erste Erfahrungen mit ''while''-Schleifen ===== **Einzelarbeit, ca. 10 Minuten** - Teste das folgende Programm. - Was passiert, wenn du die letzte Zeile nicht einrückst? - Was passiert, wenn du die beiden letzten Zeile miteinander vertauschst? - Was passiert, wenn du die Zeile ''x = x + 3'' löschst (oder mit ''#'' auskommentierst)? - Ändere das Programm so, dass es alle Zahlen zwischen 5 und 19 ausgibt (einschliesslich der beiden Grenzen 5 und 19). Dabei soll natürlich weiterhin eine ''while''-Schleife verwendet werden. - Ändere das Programm so, dass es alle Potenzen von 2 ausgibt (also 1, 2, 4, 8, 16, etc.), die kleiner als 100000 sind. Dabei soll natürlich weiterhin eine ''while''-Schleife verwendet werden. x = 0 while x < 20: x = x + 3 print(x) ===== Aufgabe 2, Ausgabe in einer Zeile (Ausgabe-String schrittweise aufbauen) ===== **Einzelarbeit, ca. 10 Minuten** Im Programm aus der vorigen Ausgabe ist es nicht so schön, dass jede neue Zahl in einer neuen Zeile ausgegeben wird. Wenn man alle Zahlen in einer Zeile ausgeben möchte, kann man dies beispielsweise erreichen, indem man die Zeichenkette, die am Ende ausgegeben werden soll, innerhalb der ''while''-Schleife schrittweise aufbaut und erst nach Beendigung der Schleife ausgibt. Man beginnt den Aufbau mit der "leeren Zeichenkette". x = 0 ausgabeZeichenkette = "" # Zeichenkette der Länge Null (auch leere Zeichenkette genannt); zwischen den beiden begrenzenden Anführungszeichen steht kein Zeichen while x < 20: x = x + 3 ausgabeZeichenkette = ausgabeZeichenkette + str(x) + ", " print(ausgabeZeichenkette) Ändere dieses Programm so, dass vom Benutzer eine Zahl eingelesen wird und dann alle Quadrate der Zahlen von 1 bis zu dieser Zahl in einer Zeile ausgegeben werden (bitte weiterhin die ''while''-Schleife verwenden). Bei Eingabe 10 soll die Ausgabe wie folgt aussehen: 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, ===== Vorbereitung zur ''for''-Schleife ===== Die Funktion ''range'' (deutsch //Bereich//) nimmt als Parameter eine ganze Zahl entgegen und liefert eine sogenannte **Liste**. Teste dies am folgenden Programm: x = range(11) print(x) print(range(6)) Beachte, dass die Liste bei 0 startet (und NICHT bei 1) und NICHT beim angegebenen Parameter endet, sondern eine Zahl vorher. Es ist auch möglich, der Funktion ''range'' zwei Parameter zu übergeben (der erste sollte kleiner sein als der zweite). Dann wird eine Liste erzeugt, die beim ersten Parameter startet und eins vor dem zweiten Parameter endet. Teste dies am folgenden Programm x = range(4, 11) print(x) print(range(-3, 6)) Mit anderen Worten liefern ''range(13)'' und ''range(0, 13)'' dieselbe Liste. ===== Aufgabe 3, ''for''-Schleife kennenlernen ===== **Einzelarbeit, ca. 10 Minuten** Teste das folgende Programm. for x in range(6): # der sogenannte Kopf der Schleife print(x) # der sogenannte Körper der Schleife Beim Ausführen dieser ''for''-Schleife nimmt die sogenannte **Laufvariable** ''x'' nacheinander alle Werte der Liste ''range(6)'' an, wobei jeweils der Schleifenkörper ausgeführt wird. - Ändere ''range(6)'' in ''range(4, 13)''. - Ändere den Namen der Laufvariable ''x'' in ''zahl'' und gib in jedem Schleifendurchlauf das Quadrat von ''zahl'' aus. - Bonus: Überlege dir, dass man jede ''for''-Schleife auch als ''while''-Schleife realisieren kann. ===== Aufgabe 4, Baum variabler Grösse als Textgrafik ausgeben ===== **Einzelarbeit, ca. 10 Minuten** Verstehe das folgende Programm. for i in range(5): print(i * " " + "H" + (5-i) * "all" + "o Ba" + i * "na") Schreibe nun ein Programm, das vom Benutzer eine Zahl ''n'' entgegennimmt und dann einen Baum mit ''n'' "Blattschichten" und Stammlänge ''2'' zeichnet. Bei Eingabe 5 soll die Ausgabe so aussehen: X XXX XXXXX XXXXXXX XXXXXXXXX X X ===== Aufgabe 5, Zahlen aufsummieren ===== **Einzelarbeit, ca. 10 Minuten** Schreibe mit Hilfe einer ''if''-Schleife ein Programm, das vom Benutzer eine Zahl entgegennimmt und die Summe aller Zahlen von 1 bis zu dieser Zahl ausrechnet. Beispiel: Bei Eingabe 10 soll die Ausgabe lauten: Die Summe der Zahlen von 1 bis 10 ist 55. Ändere dein Programm so, dass bei Eingabe 10 die Ausgabe wie folgt lautet (und analog für andere Eingaben): Ich habe das Folgende berechnet: 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = 55 Baue den Ausgabestring schrittweise auf Wenn du willst, kannst du auch die Summe der Quadrate berechnen, also beispielsweise Ich habe das Folgende berechnet: 1 + 4 + 9 + 16 + 25 + 36 = 91 ===== Aufgabe 6, verschiedene "Divisionszeichen" verstehen ===== **Einzelarbeit, ca. 5 Minuten** Es gibt in Python drei Arten der Divison in Python, nämlich ''/'', ''//'' und ''%''. Verstehe diese, indem du mit dem folgenden Programm herumspielst; ändere etwa die Zahlen! x = 23 / 5 y = 23 // 5 z = 23 % 5 print(x) print(y) print(z) * ''/'' ist die "normale" Division * ''//'' ganzzahlige Division: Wie oft passt die eine Zahl maximal in die andere hinein? (vergiss Nachkommastellen) * ''%'' liefert den Rest bei der ganzzahligen Division ===== Aufgabe 7, Teiler einer Zahl ausgeben ===== **Einzelarbeit, ca. 10 Minuten** Schreibe ein Programm, das vom Benutzer eine Zahl (damit meinen wir eine positive Nicht-Kommazahl) einliest und all ihre Teiler ausgibt. Beispiel: Bei Eingabe 24 soll die Ausgabe wie folgt aussehen. Die Teiler von 24 sind: 1, 2, 3, 4, 6, 8, 12, 24, Verwende das "Divisions-Zeichen" ''%'', das den Rest der ganzzahligen Division liefert, um zu testen, ob eine Zahl ein Teiler einer anderen Zahl ist. Eine Zahl ''x'' ist genau dann ein Teiler von ''y'', wenn ''y % x == 0'' gilt Gib zusätzlich aus, wie viele Teiler die Zahl hat. ===== Hausaufgabe (Thema - kann eventuell während der Lektion begonnen werden) ===== Lerne auf die Prüfung! * Beachte die Lösungsvorschläge, die stets am Ende der Web-Seiten stehen, meist in "Ausklapp-Boxen". * Bitte melden, wenn Lösungen fehlen oder unklar sind oder sonstige Fragen aufkommen. Am schnellsten geht das über meine Email-Adresse an der Kanti am Burggraben MeinVorname.MeinNachname@ksbg.ch (Meine Brühl-Adresse und Teams checke ich nicht so oft. Mein Name steht unten rechts auf dieser Seite.) ===== Zusammenfassung ===== * Ich kann ''while''- und ''for''-Schleifen programmieren und sinnvoll einsetzen. * Ich kann Ausgabe sinnvoll formatieren, z. B. in einer Zeile statt mehrzeilig. ===== Bonusaufgabe ===== Verwende ''while''- oder ''if''-Schleife zur Turtle-Steuerung. ===== Fragebox - auch zum Besprechen von Programmen während der Lektion (NICHT für Hausaufgaben) ===== Bitte einfach am Anfang des Programms oder der eingereichten Datei die Frage aufschreiben (mit oder ohne Hashtag ''#'' als Kommentareinleitungszeichen am Zeilenanfang). [[https://bldsg-my.sharepoint.com/:f:/g/personal/olaf_schnuerer_ksbg_ch/EmLIcTN64lJIlEKu0EyiDYoBg9smMusTs1nVj04-F1tEFQ|Link zur Fragebox]] ===== Lösungsvorschläge ===== ===== Link zur Kursseite ===== [[lehrkraefte:snr:informatik:bruehl-2022:|Zur Kursseite]]