====== Ein- und Ausgabe, Variablen ====== ==== Zum Aufwärmen: Wiederholung etc. ==== Besprechung der Hausaufgabe. [[lehrkraefte:snr:informatik:bruehl-2022:algorithmen:quiz|Quiz zum letzten Mal]] ==== Lernziele heute ==== * Wie geht Ein- und Ausgabe in Python? * Wie speichert man Daten und verarbeitet sie? ==== Tipp des Tages ==== * :-) Lernen geht am besten durch Spielen! :-) * :-) Beim Programmieren immer Sachen ausprobieren, den Code leicht verändern, kreativ sein! So kann man viel lernen. :-) ===== Unser Programmier-Ziel heute ===== Ein (kurzes und flexibles) Programm entwerfen, das die folgende "Spirale" zeichnet: {{:lehrkraefte:snr:informatik:bruehl-2022:eck-spirale.png}} Natürlich kann man das "von Hand" machen und alle Linien selbst zeichnen. === Diskussion und Analyse des Problems === Z. B. * Wie lang ist welche Linie? * Was sollte die Schildkröte können? Welche Fähigkeit fehlt ihr bisher? ===== Lernen am Beispiel und durch Demonstration ===== Wir schreiben gemeinsam ein Programm((Das du später mehr oder weniger auf dieser Seite finden wirst.)) und ich erkläre dabei möglichst viel (per Einzelschritt-Debugging durchgehen; Tabelle mit Namen und Werten und Typen der Variablen). **Variablen** dienen dem Speichern von Daten, insbesondere von Zahlen und Zeichenketten/Text. * Jede Variable hat einen Namen und einen Wert. * Mit dem Zeichen "=" weist man einer Variablen einen Wert zu. Wenn die Variable noch nicht existiert, wird sie erzeugt. * Der Befehl ''x = 3'' erzeugt eine Variable (mit Namen) ''x'' und Wert ''3'', wenn es noch keine Variable ''x'' gibt. * Existiert die Variable ''x'' bereits, so weist ''x = 3'' der Variablen ''x'' den Wert ''3'' zu. * Rechts vom Gleichheitszeichen sind auch Ausdrücke erlaubt, die ''x'' enthalten, etwa ''x = 3 * x + 2'' oder ''x = 3 * x + y''. Dann wird der Ausdruck rechts des Gleichheitszeichens berechnet (dabei wird der "alte" Wert von ''x'' verwendet) und zum "neuen" Wert der Variablen ''x''. * Jede Variable hat einen Typ, etwa den Typ ''int'' alias ''integer'', also "normale" Zahl, oder den Typ ''float'' alias ''floating point'', also Fliesskommazahl, d.h. Kommazahl. * Ein- und Ausgabe und weiteres ist in den Kommentaren im Programm in der nachfolgenden Aufgabe erklärt. ==== Wiederholungsaufgabe ==== Unten steht mehr oder weniger das Programm, das wir gerade geschrieben haben, aber mit Zusatzkommentaren (falls ich mündlich etwas vergessen habe...). Führe es im Einzelschrittmodus aus und lies alle Kommentare. Bei jedem Schritt ändert sich etwas in Tigerjython, entweder im Ausgabefenster unten oder in der "Variablentabelle" rechts. Versuche, jeden einzelnen Schritt zu verstehen. Du darfst gerne Teile des Programms verändern. Bei Fragen melden! # Ausgabe von Zeichenketten print("Grüezi zäme!") print("------------------") print("Zahlen") # Ausgabe von Zahlen und Rechnen mit Zahlen print(5) print(5+4) print(5*3) print(5/2) print("------------------") print("Variablen") # Mit Variablen kann man Zahlen wie -2, -1, 0, 1, 2, ... 42 speichern. # Das Gleichheitszeichen ist ein Zuweisungszeichen: # Der Variablen x wird der Wert rechts des Gleichheitszeichens zugewiesen. x = 2 print(x) # Man kann mit Variablen rechnen. print(3*x) # Variablen können wilde Namen haben. meinFreund_Nummer17a = 3 * x + 5 # Es ist Konvention, dass Variablen mit einem Kleinbuchstaben anfangen. # Die meisten Sonderzeichen wie *, +, !, = in Variablennamen sind verboten, # denn sie werden anderweitig verwendet. # Auch bereits belegte Namen wie "print", "penUp" etc. sind verboten. print(meinFreund_Nummer17a) abc = meinFreund_Nummer17a / x print(abc) # Wie schon oben verwendet, hat das Gleichheitszeichen # beim Programmieren eine Zuweisungsfunktion. # Die nächste Programmzeile weist der bereits existierenden Variablen x einen neuen Wert zu. # Der Ausdruck rechts des Gleichheitszeichens wird (unter Verwendung des # "alten" Werts von x) berechnet. Das Ergebnis ist der neue Wert von x. x = x+1 # Beachte, dass x hier sowohl rechts als auch links des # Zeichens "=" auftaucht. # # Achtung: # In der Mathematik ist die obige Gleichung relativ uninteressant: Sie ist für keinen Wert von x erfüllt. # Später: Die mathematische Abfrage auf Gleichheit wird mit "==" geschrieben. print(x) x= meinFreund_Nummer17a-x print(x) # Jede Variablen hat nicht nur einen Namen und einen Wert, sondern auch einen Typ. print("------------------") print("Der Typ einer Variablen") print(type(x)) print(type(meinFreund_Nummer17a)) print(type(abc)) print("------------------") print("Eingabe von Zahlen") # Eingabe von Integers, also Zahlen ohne Komma. # Die mit Anführungszeichen markierte Zeichenkette wird angezeigt. # Zurückgeliefert wird die eingegebene Zahl. eingegebeneZahl = inputInt("Gib eine Zahl ein!") # Oft ist es wie hier getan sinnvoll, sprechende Variablennamen zu verwenden. # Dann erinnert man sich sofort, was gemeint ist. print(eingegebeneZahl) k = inputFloat("Gib eine Kommazahl (oder eine 'normale' Zahl) ein!") print(k) ==== Aufgaben ==== **HAUSAUFGABE für die 1AFG:** Abgabe bis **spätestens Sonntagabend 23:59 Uhr** vor der nächsten Doppellektion über den folgenden Link: * [[https://bldsg-my.sharepoint.com/:f:/g/personal/olaf_schnuerer_ksbg_ch/Eiv_N_pzTfFKhwrL34v63toBqSTCbdsshKmr2ygQqsk9Vg|Klasse 1AFGsK]] Schreibe ein Programm, das vom Benutzer zwei Zahlen einliest (integer oder float, wie du willst) und ihre Summe und ihr Produkt ausgibt. Eine Beispielausgabe des Programms könnte lauten: Salü! ----------------------------- Eingegeben Zahlen: 13 und -3 ***************************** Summe dieser Zahlen: 10 Produkt dieser Zahlen: -29 ----------------------------- Uf Wiederluege! **HAUSAUFGABE für die 1CFP (oder eine der nachfolgenden Aufgaben):** Abgabe bis **spätestens Sonntagabend 23:59 Uhr** vor der nächsten Doppellektion über den folgenden Link: * [[https://bldsg-my.sharepoint.com/:f:/g/personal/olaf_schnuerer_ksbg_ch/Er2yNBSS4o9DpBiQ6TU5uq8B3n9WKibj_BA_HFspdDgQiA|Klasse 1CFP]] Schreibe ein Programm, das eine Zahl (zwischen 1 und 10) entgegennimmt und die entsprechende Spalte in der Kleinen-Einmaleins-Tabelle ausgibt. Bei Eingabe 7 sollte die Ausgabe so aussehen: 7 14 21 28 35 42 49 56 63 70 Bemerkung: Es geht ohne ''repeat''-Struktur, aber deutlich eleganter mit ''repeat''. Versuche, diese Lösung zu finden! Verwende ''repeat 10:'' und ausserdem eine Variable ''vielfaches'', die anfangs Null ist und in jeder Wiederholung um die eingegebene Zahl erhöht und ausgegeben wird. ---- Bonusaufgabe (Seerosenfläche auf einem (unendlich grossen) See verdoppelt sich jede Woche): Verändere das Programm so, dass zuerst die eingegebene Zahl ausgegeben wird und dann von jeder Zeile zur nächsten eine Verdopplung stattfindet. Statt einer Verdopplung (= Multiplikation mit 2) kannst du auch mit einem beliebigen anderen Wachstumsfaktor, etwa 1.3, multiplizieren. Dies simulert exponentielles Wachstum. Turtle-Exkurs: Ersetze die drei letzten Zeilen des folgenden Programms so, dass es ein regelmässiges ''n''-Eck mit Seitenlänge ''s'' zeichnet. Für die angegebenen Werte soll also ein 7-Eck mit Seitenlänge 100 (in Pixel) gezeichnet werden. Wenn man stattdessen ''n = 13'' und ''s = 80'' schreibt, soll ein 13-Eck mit Seitenlänge 80 gezeichnet werden. from gturtle import * makeTurtle() n = 7 s = 100 ?????? ?????? ?????? Bemerkung: Wenn du ''n = 360'' setzt und ''s'' klein wählst, bekommst du (fast) einen Kreis. ==== Zusammenfassung ==== * Ein- und Ausgabe (per Text oder Grafik) dienen der Kommunikation mit dem Computer. * Variablen sorgen dafür, dass der Computer (oder die Schildkröte :-)) sich etwas merken kann, also ein Gedächtnis hat! * Variablen beeinflussen die Programmausführung und sorgen dafür, dass das Programm flexibel auf verschiedene Eingaben reagieren kann. * Variablen haben einen Namen, einen Wert und einen Typ. === Key take-aways === * Eingabe von Zahlen per ''inputInt("...")'', Eingabe von Kommazahlen per ''inputFloat("...")''. * Ausgabe per print(...), etwa von Zeichenketten per ''print("Grüezi")'' oder von Zahlen per ''print(2 * x + 3)''. * Variablen werden mit ''x = ...'' erzeugt bzw. verändert. ==== Bonusaufgaben (Textausgabe) ==== Schreibe ein Programm, das eine positive Zahl entgegennimmt und die Summe aller Zahlen von 1 bis zu dieser Zahl ausrechnet. Beispiel: Bei Eingabe 9 sollte als Ergebnis 45 ausgegeben werden, denn $1+2+3+4+5+6+7+8+9=45$. Die Ausgabe sollte also etwa so aussehen: Die Summe aller Zahlen von 1 bis 9 ist 45 Schreibe ein Programm, das das Kleine Einmaleins als Tabelle ausgibt. Die Tabelle darf wild aussehen: 1 2 3 4 5 6 7 8 9 10 2 4 6 8 10 12 14 16 18 20 3 6 9 12 15 18 21 24 27 30 4 8 12 16 20 24 28 32 36 40 5 10 15 20 25 30 35 40 45 50 6 12 18 24 30 36 42 48 54 60 7 14 21 28 35 42 49 56 63 70 8 16 24 32 40 48 56 64 72 80 9 18 27 36 45 54 63 72 81 90 10 20 30 40 50 60 70 80 90 100 Benötigtes Zusatzwissen: * Mit ''str(x)'' wandelt man eine Integer-Variable ''x'' in eine Zeichenkette um. * Mit ''+'' kann man Zeichenketten hintereinanderhängen. Beispiel ''print("Hallo " + "Welt!")''. ===== Zurück zur Turtle und zum Spiralproblem ===== Zeichne mit der Turtle wie folgt eine Spirale. Nach jeder $90^\circ$-Rechtsabbiegung geht die Turtle 10 Pixel weiter geradeaus als zuvor. Am Anfang geht sie ''s = 10'' Pixel geradeaus. Insgesamt soll die Turtle ''n = 12'' mal vorwärts gehen. Bonusaufgabe (freiwillig): Ändere das Programm so, dass es die oben abgebildete Spirale (die sich von der gerade beschriebenen unterscheidet) zeichnet: Auf Häuschen-Papier wird jeder Gitterpunkt besucht. **Hausaufgabe (die eventuell schon während der Lektion erledigt werden kann)** Schreibe ein Programm, das vom Benutzer eine Zahl ''n'' erfragt und dann entsprechend viele konzentrisch ineinanderliegende Quadrate zeichnet, so dass das kleinste Quadrat Seitenlänge ''s = 10'' hat und die Seitenlängen benachbarter Quadrate sich jeweils um ''differenz = 20'' unterscheiden. Farbe und Stiftdicke darfst du beliebig wählen. Die Stiftdicke darf auch von Quadrat zu Quadrat unterschiedlich sein. Für ''n = 8'' soll die Ausgabe so aussehen: {{:lehrkraefte:snr:informatik:bruehl-2022:konzentrische-quadrate.png?300|}} Abgabe bis **spätestens Sonntagabend 23:59 Uhr** vor der nächsten Doppellektion über den folgenden Link: * [[https://bldsg-my.sharepoint.com/:f:/g/personal/olaf_schnuerer_ksbg_ch/Eiv_N_pzTfFKhwrL34v63toBqSTCbdsshKmr2ygQqsk9Vg|Klasse 1AFGsK]] * [[https://bldsg-my.sharepoint.com/:f:/g/personal/olaf_schnuerer_ksbg_ch/Er2yNBSS4o9DpBiQ6TU5uq8B3n9WKibj_BA_HFspdDgQiA|Klasse 1CFP]] Verwende eine ''repeat''-Struktur: In jeder Wiederholung wird ein Quadrat gezeichnet (und am Ende die Seitenlänge erhöht für das nächste Quadrat). Damit die Quadrate alle ihren Mittelpunkt in der Mitte haben: Gehe jeweils mit ''home()'' auf die Ausgangsposition, dann um die halbe aktuelle Quadratseitenlänge nach oben und zeichne dann das Quadrat von dort aus. Bonus (freiwillig): Du darfst auch konzentrisch ineinanderliegende $n$-Ecke oder Sterne o.ä. zeichnen. ==== Bonusaufgabe (Grafikausgabe) ==== Verändere das Programm für die Spirale so, dass der Winkel statt der Strecke nach jedem Abbiegen um eine fest Grösse, etwa $1^\circ$, verkleinert (oder vergrössert) wird. Du kannst natürlich auch Winkel und Strecke gleichzeitig verändern. Spiele herum: Verschiedene Längen und Abbiegewinkel am Anfang. Verschieden Winkel- und Längenvergrösserungen. Du solltest etwa ein solches Bild erzeugen können (Strecke konstant, Winkelverkleinerung um $1^\circ$): {{:lehrkraefte:snr:informatik:bruehl-2022:notenschluessel.png?400|}} ===== 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). Link bereitstellen SORRY ONEDRIVE MACHT GERADE PROBLEME ===== Lösungsvorschläge ===== WIRD HAUSAUFGABE, FALLS WIR NUR SO WEIT KOMMEN SOLLTEN..... WIRD HAUSAUFGABE, FALLS WIR NUR SO WEIT KOMMEN SOLLTEN..... einzufuegen === Bonusaufgaben === n = inputInt("Gib eine Zahl ein!") summe = 0 i = 0 repeat n: i = i + 1 summe = summe + i print("Die Summe aller Zahlen von 1 bis") print(n) print("ist") print(summe) x = 0 repeat 10: x = x+1 y=0 s = "" repeat 10: y = y+1 s = s + str(x*y) + " " # Die vorige Zeile auskommentieren und die nächste entkommentieren, # wenn man eine anständige Tabelle will. # Dies verwendet "formatierte Ausgabe". # s = s + ("%4d" % (x*y)) print(s) ===== Link zur Kursseite ===== [[lehrkraefte:snr:informatik:bruehl-2022:|Zur Kursseite]]