~~NOTOC~~ ===== Zu konjunktiver Normalform ===== https://de.wikipedia.org/wiki/Konjunktive_Normalform Dort sind Links zu https://de.wikipedia.org/wiki/Verfahren_nach_Quine_und_McCluskey und https://de.wikipedia.org/wiki/Karnaugh-Veitch-Diagramm ====== Videos von Ivos Seite ====== * https://www.youtube.com/watch?v=QZwneRb-zqA, https://www.youtube.com/watch?v=I0-izyq6q5s, Minecraft: https://www.youtube.com/watch?v=tDxKhiJfgYk * 8-Bit Adder mit TTL-Logic https://www.youtube.com/watch?v=X31B1pVow1o ====== Koordinatengrafik ====== Lass zuerst zwei konzentrische Fünfecke mit Turtle zeichnen! Dann mit ''kantigrafik'' und Trigonometrie. ====== Pen verwenden, mit Python ====== dann vielleicht Escherbilder malen? Kaleidoskop? ===== Online turtle (and python) tutorial ===== https://hourofpython.trinket.io/a-visual-introduction-to-python#/welcome/an-hour-of-code ====== Pygame Installationsprobleme ====== Vermutlich ist "python -m pip install" besser als "pip install": relativ neu: https://stackoverflow.com/questions/60782785/python3-m-pip-install-vs-pip3-install älter: https://stackoverflow.com/questions/25749621/whats-the-difference-between-pip-install-and-python-m-pip-install ===== Pygame docu ===== https://www.pygame.org/wiki/GettingStarted test pygame with "python -m pygame.examples.aliens" Example files are located in ~/.local/lib/python3.10/site-packages/pygame/examples https://stackoverflow.com/questions/71742916/no-module-named-pygame-after-using-pip Command palette: "Python: Select interpreter" ===== Turtle demo files ===== /usr/lib/python3.10/turtledemo https://docs.python.org/3/library/turtle.html#module-turtledemo ====== Planung ====== Ivo nimmt https://pypi.org/project/graphics.py/ ===== Erwartetes Vorankommen ===== Jeweils "spätester" Termin (vermutlich sind einige deutlich schneller): * Klasse 2aLIM: * am 13.09. fertig mit Abschnitt 3. * am 20.09. Mitte Abschnitt 5 * am 27.09. Abschnitt 6 beginnen * am 25.10. Abschnitt 7 beginnen * ------ ab hier Planung ------ * (1.11. Allerheiligen) * am 08.11. Biber-Training und Abschnitt 7 beenden * am 15.11. Biber und Abschnitt 8 beginnen * am 22.11. Abschnitt 9 beginnen * am 29.11. Abschnitt 10 beginnen * am 06.12. u.a. ? Infos zum Ablauf der Prüfung ? * am 13.12. Prüfung * Klasse 2lW: * am 14.09. fertig mit Abschnitt 3. * am 20.09. Mitte Abschnitt 5 * am 28.09. Abschnitt 6 beginnen * am 26.10. Abschnitt 7 beginnen * ------ ab hier Planung ------ * am 02.11. Abschnitt 8 beginnen * am 09.11. Biber-Training und Abschnitt 8 beenden * am 16.11. Biber und Abschnitt 9 beginnen * am 23.11. Abschnitt 10 beginnen * am 30.11. Abschnitt 10 fertig, ? Infos zum Ablauf der Prüfung ? * am 07.12. * am 14.12. Prüfung * Klasse 2rG und 2kWG (eine Doppellektion fiel aus wegen "Impulse Day"): * am 23.09. fertig mit Abschnitt 3. * am 30.09. Mitte Abschnitt 5 * am 28.10. Mitte Abschnitt 6 * ------ ab hier Planung ------ * am 04.11. Biber-Training und Abschnitt 7 beginnen * am 11.11. Biber und Abschnitt 7 beenden * am 18.11. Abschnitt 8 * am 25.11. Abschnitt 9 * am 02.12. Abschnitt 10, ? Infos zum Ablauf der Prüfung ? * am 09.12. Prüfung ==== Diverses ==== in terminal: python -m turtledemo * https://code.visualstudio.com/docs * Jupyter-Notebooks (haben neuen Namen, habe dies irgendwo ausprobiert): Sinnvoll für Unterricht? * https://www.youtube.com/watch?v=qUeud6DvOWI * Kopfrechentrainer schreiben * per python * per pyscript * per javascript (hatte schon mal angefangen, mit Latex-Syntax für Brüche!) * per beeware (für Handys) ====== von Karlheinz gelernt bzw. mit ihm ====== * Wahrheitstabellen mit Python erzeugen: https://fginfo.ksbg.ch/dokuwiki/doku.php?id=lehrkraefte:sbtsnr:python:logic * AREPL for python * .vscode folder, wohl bei workspaces * Hexeditor (python extension) * https://simulator.io/ für logische Schaltungen * für Robotik: wohl eigene SD-Card oder so (hat Karlheinz mit Ivo besprochen) * wie geht Oxocard? allgemein bzw. mit VSCode? ====== Ideen für Informatik, 2. Klassen im Schuljahr 2022/23 ====== Bei logischen Schaltungen: Nimm Schaltjahr Beispiel auf! Wahrheitstabelle Bei Unicode: KCharSelect zum Auswählen/Finden von Unicode-Symbolen. Wenn es nur um Emojis etc. geht, tut es der Emoji-Selector (oder ibus?) Online Python-Shell: https://pyodide.org/en/latest/console.html Debugger für pygame in vs code? Geht schon so halbwegs, setze Breakpoint und bewege Spielfeld weg von VSCode-Fenster (etwa anderer Bildschirm). Pygame: Ohne update, einfach reinzeichnen? (Punkte gehen, so wie ich im Chaosgame) (Gibt auch pixelarray in pygame, kann wohl direkt reinschreiben) Schreibe falsches Programm. Lass es debuggen! Als Art Verständnistest. "Spass mit der Turtle: jedes Thema, eine Aufgabe!" * Ausgabe: Haus des Nikolaus, Eingabe und Variablen * Wahrheitswerte und logische Verknüpfungen * for-loops (n-Eck zeichnen, Spirale zeichnen) * if-(else-)statements (frage, ob Spirale oder n-Eck gezeichnet werden soll) * while Labyrinth/snake/roter Kasten mit Tastatursteuerung mit while! vorher Listen? Dann könnte for-loop über listen laufen lassen. Reicht aber eigentlich auch, wenn ich das mache, sobald wir Listen haben. Mehr Zeit einplanen, denn ab jetzt kann nette Aufgaben stellen. ====== Recursion ====== Podcast mit Al Sweigart gehört, er hat neues Buch. Schlechte Beispiele sind: Fakultät und Fibonacci (Fakultät liefert stackoverflow bei Argument 1000, Fibonacci wohl schon bei 50 länger als Universum). Gut alles baumartige: Weg aus Irrgarten finden! Turtle für fraktale Graphiken. recursive function: Muss sich selbst aufrufen (recursive case) und base case haben. In Python maximal Rekursionstiefe 1000, wird von Interpreter abgefangen (kann man aber erhöhen, ab ca. 2700 stürzt Betriebssystem ab), schon bei trivialem sich selbst aufrufendem Miniprogramm. (Vorteil von Interpreter zu Compiler). Jede Rekursion lässt sich auch mit Schleife=Iteration und Stack erledigen Misnomer sind: bottom-up recursion (ist gar keine Rekursion) und top-down recursion (das ist jede Rekursion). Beides per Fibonacci leicht erläuterbar. Ebenso ist dynamic programming misnomer (nur wegen NSA-project so genannt, wohl von Bell(?), wollte Geld). Ist im wesentlichen Schleife mit Stack statt Rekursion, in der wohl diverses mehrfach berechnet wird. Wie bei Fibonacci recursive. auch sowas wie tail optimazation ist nur Auflösen einer Rekursion durch Schleife mit Stack. Rekursion unnötig, falls nur ein rekursiver Aufruf am Ende, dann besser Schleife. ===== bald zu machen ===== * Debuggen? * Strings? length, Substrings mit [::] (alles dann wieder bei Listen); replace, find, uppercase, split, Befehl ''dir'' erklären. Dann "Drei Chinesen ..." ersetze. Uppercase. * Funktionen (Modularisierung); dabei evtl. Turtle-Grafik. * Listen; Listen VOR ''if''? Dann wird ''range'' klarer... * Zufall ''random'' bzw. ''randint'' * Farben * Graph zeichnen? Histogramm? * Goethe-Analyse? * "Brauche" Listen: String-Befehle, rauskriegen etwa per ''dir(s)'' wobei ''s'' String ist ====== optional, als Bonus-Sachen ====== * Dateien: lesen schreiben? * Ascii-Escape-Codes, Cursor positionieren, einfaches Game? Farben * mehr zu strings: raw strings mit ''r"er sagte:"Hallo \n"'' oder so ähnlich. Alternative mit Escape-Sachen oder verschiedenen Anführungszeichen. Wie gebe ''\n'' mit print aus? ===== Nettes ===== * Koralle? * roten Kasten mit Tastatur steuern! * Snake! * Männchen durch Labyrinth steuern? Ich gebe Labyrinth vor in Bibliothek/Module/Library. Dafür nötig: * Tastatur-Listening (Bibliothek bereitstellen oder pygame? PYGAME: Ich habe wormy von Al Sweigart verändert!) * einfache Grafik-Bibliothek? * selbst Turtle-Grafik erstellen? * Ascii-Pixel-Testfeld mit Farben? (was geht wo unter Windows?) * auch dort könnte Cursor steuern. ===== Prüfung ===== Am liebsten Open Book. Wie verhindere ich stupides Kopieren/Emailen der Lösungen? Bei jeder Aufgabe irgendwo deinen Namen einbauen! Als Variablennamen, als Ausgabe, n = Anzahl Buchstaben in deinem Namen. Lasse Programm debuggen! ===== Erledigtes ===== * f-Strings; im Prinzip können sie Sachen mit casting und Konkatenation ausgeben. auch print mit mehreren Argumenten erklären, end="". Also sollte eventuell erklären, wie man Stellenanzahl, Platz etc. angibt..., vgl. https://stackoverflow.com/questions/45310254/fixed-digits-after-decimal-with-f-strings * bei "for" einfach sagen, dass noch keine Listen, aber trotzdem mal ''list(range(30))'' hinschreiben? * Wahrheitswerte (evtl. vor ''if'' and ''while''), Vergleiche, gleich, ungleich, groesser, kleiner als Bonus-Sache erklärt: * print(..., sep = "----|") * print(a, b, "hallo", c) ====== readchar ====== Muss testen, ob das unter Windows geht... from readchar import readkey, key x = 0 print(dir(key)) weiter = True while weiter: taste = readkey() if taste == key.RIGHT: if x < 20: x = x + 1 elif taste == key.LEFT: if x > 0: x = x - 1 else: weiter = False print(x * " " + "X") ===== Geht cv2 alias opencv-python in Windows? ===== Ja, muss jedoch vorher: pip install numpy pip install opencv-python import numpy as np # Musste opencv-python installieren. import cv2 bild = np.zeros((512, 512, 3), np.uint8) cv2.line(bild, (20, 200), (300, 30), (0,0,255), 5) cv2.rectangle(bild, (200, 60), (20, 200), (255, 0, 0), 3) cv2.circle(bild, (80, 80), 50, (0, 255, 0), 4) cv2.putText(bild, "Hello World!", (100, 300), cv2.FONT_HERSHEY_SCRIPT_COMPLEX, 1, (255, 255, 0)) cv2.imshow("Bild", bild) cv2.waitKey(0) cv2.destroyAllWindows() ===== Geht curses in Windows? ===== curses gibt es nicht (unter Linux ist das im Python module index, also Standard), es gibt aber windows-curses, was zwar läuft, aber nicht richtig. import curses import os import random def main(bildschirm): bildschirm.clear() maxY, maxX = bildschirm.getmaxyx() bildschirm.addstr(1, 0, f"({maxY}, {maxX})") curses.mousemask(curses.BUTTON1_CLICKED) for y in range(maxY): for x in range(maxX): try: bildschirm.addstr(y, x, " ") except curses.error as e: pass xPos = maxX // 2 yPos = maxY // 2 while True: bildschirm.addstr(0, 0, f"({yPos}, {xPos})") zeichen = chr(bildschirm.inch(yPos, xPos) & 0xFF) if zeichen == " ": neu = "A" elif zeichen == "Z": neu = "A" else: neu = chr(ord(zeichen) + 1) try: bildschirm.addstr(yPos, xPos, neu) except curses.error as e: pass bildschirm.move(yPos, xPos) taste = bildschirm.getch() bildschirm.addstr(1, 0, str(taste)) if taste == curses.KEY_UP: if yPos > 0: yPos = yPos - 1 elif taste == curses.KEY_DOWN: if yPos + 1 < maxY: yPos = yPos + 1 elif taste == curses.KEY_LEFT: xPos = max(xPos - 1, 0) elif taste == curses.KEY_RIGHT: xPos = min(xPos + 1, maxX - 1) elif taste == curses.KEY_MOUSE: mausID, mausX, mausY, mausZ, drueckZustand = curses.getmouse() if 0 <= mausX < maxX and 0 <= mausY < maxY: xPos = mausX yPos = mausY elif taste == 27: break # https://stackoverflow.com/questions/27372068/why-does-the-escape-key-have-a-delay-in-python-curses os.environ.setdefault('ESCDELAY', '25') curses.wrapper(main) ====== Link zum ersten Versuch (Herbst 2022): Funktionen ====== https://fginfo.ksbg.ch/dokuwiki/doku.php?id=lehrkraefte:snr:informatik:glf22:python:funktionen-erster-versuch ====== Altes, ausgesondertes Material ====== ===== aus Abschnitt über while-loop: Bonus-Aufgabe: Bankautomat ===== Schreibe ein Programm, das einen Bankautomat simuliert: Der Benutzer gibt den gewünschten Betrag (in Franken) ein, der Computer gibt diesen Betrag in Banknoten aus und versucht dabei, die Anzahl der ausgegebenen Noten möglichst gering zu halten. Welche Banknoten es gibt, erfährst du zum Beispiel hier: https://www.snb.ch/de/iabout/cash/history/id/cash_history_serie9 Verwende ''//'' (ganzzahlige Division) um herauszufinden, wie oft eine Banknote ausgegeben werden soll. Verwende ''%'' (Rest der ganzzahligen Division) um den Betrag herauszufinden, der dann noch übrig bleibt. DIESE AUFGABE IST VIELLEICHT EINFACH ÜBERFLÜSSIG UND KANN AUSGELASSEN WERDEN (UND ICH SOLLTE SIE LOESCHEN ...). Bis jetzt haben wir auf dieser Seite fast nur in der Python-Shell gearbeitet. Alles geht natürlich auch in Python-Programmen. Welche Ausgaben erwartest du bei dem folgenden Programm? Es gibt 18 Mal "True" oder "False" aus. Notiere die 18 Ausgaben, die du erwartest, auf einem Zettel. Prüfe deine Antworten, indem du das Programm abspeicherst und laufen lässt! Zum Erleichtern des Vergleichs habe ich alle ''print''-Befehle durchnummeriert (durch die Zahl in der jeweiligen Kommentarzeile davor). # 1 print(True and False) # 2 print(True or True) # 3 print(2 < 5) # 4 print((235236235 < 2346346) or True) a = (5 != 6) # a ist eine Boolesche Variable # Es ist erlaubt, hier die Klammern wegzulassen, denn das Vergleichszeichen != bindet staerker als das Zuweisungszeichen =. # Klammern verbessern aber oft die Lesbarkeit und dienen der Fehlervermeidung. # (Nur als Vielprogrammierer wird man sich genau merken können, was staerker bindet.) # 5 print(a) b = not (False or (True and (2 < 5))) # 6 print(b) # 7 print(True != True) # 8 print(True == (False or True)) # 9 print((2 > 3) == (-1 >= 0)) # Die Leerzeichen sind optional, dienen aber der besseren Lesbarkeit: # print((2>3)==(-1>=0)) # hat dieselbe Bedeutung. # Ebenso dienen Leerzeilen der besseren Lesbarkeit. # 10 print(2 * "python" == "python" + "python") # 11 print(not("Python" != "python")) antwort = "Sanggalle" # 12 print(antwort == "St. Gallen") x = 100 # 13 print(4 <= x and x < 10) x = -10 # 14 print(4 <= x and x < 10) x = 10 # 15 print(4 <= x and x < 10) x = 4 # 16 print(4 <= x and x < 10) # 17 print(x*x*x == x**3) x = 2 # 18 print(x+x+x+x == x**3) ====== Aus Funktionen-Abschnitt ====== Schreibe nun eine Funktion mit drei Parametern ''setzeZustand(x, y, alpha)'', die die Turtle //ohne zu zeichnen// auf den Punkt ''(x, y)'' setzt mit Blickrichtung ''alpha''. Verwende diese Funktion und die Funktion ''quadrat(s)'' aus der vorigen Aufgabe, um das folgende Bild zu erstellen! Verschachtelte (und gedrehte) Quadrate? ====== EINZUFUEGEN ====== Schreibe Buchstaben/Zahlen! Funktion für jeden Buchstaben! (das ist jedenfalls sinnvoll) https://fginfo.ksbg.ch/dokuwiki/doku.php?id=lehrkraefte:snr:informatik:bruehl-2022:funktionen Dort gefallen mir besonders die ineinanderliegenden $n$-Ecke. Diverse Erklärtexte dort sind auch gut. Quadrat fixer bzw. variabler Seitenlänge. * Funktionen oder: Wie man grössere Programm übersichtlich gestaltet: modularer Entwurf, Baukastenprinzip.