Rechnen und Schleifen

 ______________________________                                           
< Hey Tux, was lerne ich hier? >                                          
 ------------------------------                                           
        \   ^__^                                                          
         \  (oo)\_______                                                  
            (__)\       )\/\                                              
                ||----w |                                                 
                ||     ||                                                 
                               ________________________________________   
                              / Hier geht es um grundlegende           \  
                              | Programmierkonzepte. Vor allem die     |  
                              | Schleife hat es in sich. Wenn du alles |  
                              | durchgearbeitet hast, sollte das aber  |  
                              \ kein Problem mehr für dich sein.      /   
                               ----------------------------------------   
                                 \                                        
                                  \
                                      .--.
                                     |o_o |
                                     |:_/ |
                                    //   \ \
                                   (|     | )
                                  /'\_   _/`\
                                  \___)=(___/
                              
 _______ 
< Kuhl. >
 ------- 
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

Variablen und Rechnen[Bearbeiten | Quelltext bearbeiten]

Tippe folgendes in den kate-Editor:

#!/usr/bin/python3

a = 2
print(a)

a = a + 5
print(a)

b = 20
c = a + b
print(c)

Speichere es in eine Datei rechnen.py.

Wechsle zur Kommandozeile, mache die Datei ausführbar und führe die Datei aus.

Ausgabe mit format[Bearbeiten | Quelltext bearbeiten]

Wie zuvor: Programmcode abtippen, in eine Datei speichern (entweder die gleiche oder eine neue: format.py), ausführbar machen und ausführen.

#!/usr/bin/python3

a = 1234
b = 4
print("a geteilt durch b = {}".format(a / b))
print("{} geteilt durch {} = {}".format(a, b, a / b))

Verstehst du wie der format-Befehl arbeitet?

Zählen für Anfänger[Bearbeiten | Quelltext bearbeiten]

Wir zählen bis 5:

#!/usr/bin/python3

a = 0
print(a)

a = a + 1
print(a)

a = a + 1
print(a)

a += 1   # += ist eine Abkürzung für a = a + 1
print(a)

a += 1
print(a)

a += 1
print(a)

Aufgabe: Zähle auf diese Weise bis 50

(Tipp: die Befehle mit kate oft untereinander kopieren, Datei speichern und Programm auf der Konsole ausführen.)

Lass den Computer zählen mit einer Schleife[Bearbeiten | Quelltext bearbeiten]

Nun lassen wir den Computer zählen und schauen zu wie schnell er ist. Dazu verwenden wir eine Schleife.

#!/usr/bin/python3

i = 0
while (True):
    print(i)
    i += 1

Du kannst das Programm mit Strg+C unterbrechen.

Vorzeitiges Ende mit der if-Anweisung und break[Bearbeiten | Quelltext bearbeiten]

Damit der Computer nicht zu viel rechnet und wir sehen, was am Anfang passiert, machen wir folgendes:

#!/usr/bin/python3

i = 0
while (True):
    print(i)
    i += 1
    if i > 10:
        break

Übung: Quadratzahlen[Bearbeiten | Quelltext bearbeiten]

  • Anstelle einfach nur zu zählen, lasse den Computer Quadratzahlen ausgeben und zwar die ersten 20:
    1
    4
    9
    16
    ...
  • Verwende die format-Anweisung, um die Ausgabe detaillierter zu gestalten:
    1 * 1 = 1
    2 * 2 = 4
    3 * 3 = 9
    4 * 4 = 16
    ...

Verzögerung mit sleep[Bearbeiten | Quelltext bearbeiten]

Hier ein einfaches Beispiel wie man Verzögerungen in sein Programm einbauen kann:

#!/usr/bin/python3

import time

i = 0

while (True):
    print("{} Sekunde(n) vergangen.".format(i))
    time.sleep(1.0)
    i += 1

Man kann auch Bruchteile von Sekunden schlafen, z. B. eine halbe Sekunde mit sleep(0.5). Oder auch länger, z. B. 10 Minuten: sleep(10 * 60).

Übung: Zahlenreihen[Bearbeiten | Quelltext bearbeiten]

Für die folgenden Rechenübungen kannst du sleep verwenden, damit die Ausgabe zur Kontrolle langsamer ist. Du kannst auch per if und break die Ausgabe vorzeitig abbrechen lassen.

1. Lass den Computer gerade natürliche Zahlen größer 0 ausgeben. Nehme dazu das Programm aus dem vorigen Abschnitt und schaue, an welcher Stelle du eine Anpassung vornehmen musst.

2. Lass den Computer ungerade natürliche Zahlen größer 0 ausgeben.

3. Lass den Computer gerade natürliche Zahlen größer ab -120 ausgeben.

4. Lass den Computer Zahlen ausgeben, die durch 5 teilbar sind.

6. Lass den Computer die Zahlen von 100 bis 1 - also in umgekehrter Reihenfolge - ausgeben.


(NEU) Übung: Tannenbaum[Bearbeiten | Quelltext bearbeiten]

Ziel ist es einen Tannenbaum in variabler Größe auszugeben. Ein Baum mit der Größe 7 (= Anzahl der Zeilen, die die Baumkrone bildet) sieht so aus:

                                *
                               ***
                              *****
                             *******
                            *********
                           ***********
                          *************
                               ***
                               ***
                              *****

1) Wir beginnen mit der Baumkrone und definieren eine Funktion:

def baumkrone(zeile):
    i = 0
    while i < zeile:
        print("*", end='')
        i += 1
    print()

Der end-Parameter mit dem Leerstring bei der print-Funktion ist notwendig, damit nach einem print keine neue Zeile eingefügt wird.

Die Funktion macht erst dann etwas, wenn man sie aufruft, z. B. so:

baumkrone(1)
baumkrone(2)
baumkrone(3)
baumkrone(4)
baumkrone(5)

Das Ergebnis sollte so aussehen:

*
**
***
****
*****

1b) Ändere die Funktionsaufrufe so, dass das Ergebnis auf dem Kopf steht (also die längste Zeile oben statt unten).

2) Verändere die Funktion, damit die Anzahl der Sterne dem des Zielbaums entsprechen:

*
***
*****
*******
*********

3) Gib der Funktion einen neuen Parameter "size" (= Größe) und verwende ihn, damit die Baumkronenzeilen zentriert ausgegeben werden, indem vor den Sternen eine passende Anzahl Leerzeichen ausgegeben wird:

def baumkrone(zeile, size): # Neuer Parameter 'size'
    i = 0
    while /* ??? */:
        print(" ", end='')
        i += 1

    i = 0
    while i < 2 * zeile - 1:
        print("*", end='')
        i += 1
    print()

baumkrone(1, 7) # Der neue Parameter muss auch beim Aufrufen angegeben werden
baumkrone(2, 7)
baumkrone(3, 7)
baumkrone(4, 7)
baumkrone(5, 7)

4) Schreibe eine zusätzliche Funktion baum(size), die unter Angabe der Baumgröße, die Funktion baumkrone so aufruft, dass verschieden große Tannenbaumkronen ausgegeben werden.

def baumkrone(zeile, size):
    /* siehe oben */

def baum(size):
    /* ??? */

# Baumkronen in vier verschiedenen Größen ausgeben:
baum(3)
baum(4)
baum(7)
baum(15)

5) Es fehlt noch der Stamm und der Baumstumpf. Ergänze dein Programm, so dass der vollständige Baum ausgegeben wird.

Bonus: Baum mit HTML[Bearbeiten | Quelltext bearbeiten]

  • Öffne die HTML-Datei mit Firefox.
  • Öffne die Datei nun mit Kate und versuche sie soweit zu verstehen, dass du sie so abändern kannst, dass ein 6x6 großes Schachbrettmuster entsteht.
    • Mit der Taste F5 kann man im Firefox die html-Datei neu laden.
  • Schreibe dein Python-Programm aus der vorigen Übung so um, dass es passenden HTML-Code ausgibt, der einen Baum anzeigt.
  • Diese Ausgabe kannst du mittels Bash-Dateiumleitung (>) in die Datei baum.html umleiten und das Ergebnis mit Firefox prüfen.
  • Erstelle eine Baumkrone, die 50 Zeilen hoch ist.

Teilen mit Rest[Bearbeiten | Quelltext bearbeiten]

Erinnere dich an früher, wo du "Teilen mit Rest" gelernt hast.

Zum Beispiel:

11 geteilt durch 4 ist gleich 2 Rest 3 (weil 2 * 4 = 8 und 8 + 3 = 11)

Beim Programmieren gibt es den Modulo-Operator, der durch das Prozent-Zeichen (%) ausgedrückt wird. Er liefert von zwei gegebenen Zahlen den Rest, wenn man sie durcheinander teilt. Für das Beispiel oben

>>> 11 % 4
3

Verwende die interaktive Python-Konsole, um den %-Operator auszuprobieren. Überlege aber vorher selber, was rauskommt.

0 % 5
1 % 5
2 % 5
3 % 5
4 % 5
5 % 5
6 % 5

(NEU) Übung: Teilbar ohne Rest?[Bearbeiten | Quelltext bearbeiten]

Schreibe eine Programm, das die Zahlen von 1 bis 100 durchgeht und ausgibt, ob die jeweilige Zahl durch 7 ohne Rest teilbar ist.

Die Ausgabe soll also so aussehen:

Folgende Zahlen sind teilbar durch 7 ohne Rest:
  7
  14
  21
  ...

Verwende dazu unter anderem folgende Anweisungen / Funktionen:

  • while-Schleife
  • if-Anweisung
  •  %-Operator
  • print-Anweisung


(NEU) Übung: Verschachtelte Schleifen: das SEHR große 1x1[Bearbeiten | Quelltext bearbeiten]

Ein guter Freund von dir hat in Mathe nicht aufgepasst und konnte zum wiederholten Mal das kleine 1x1 nicht auswendig aufsagen (zur Erinnerung, siehe https://de.wikipedia.org/wiki/Einmaleins#Tabelle). Leider bekam er eine Strafarbeit und hat nun die Aufgabe, nicht nur das kleine und Große 1x1 (https://de.wikipedia.org/wiki/Einmaleins#Tabelle, zweite Tabelle), sondern auch noch das SEHR Große 1x1 aufzuschreiben. Also wie das kleine 1x1, nur dass die Zahlen nicht bis 10 gehen, sondern bis 100!

1) Wenn man alle Zahlen untereinander schreibt, wie viele Zeilen umfasst

a) das kleine 1x1

b) das Große 1x1

c) das SEHR Große 1x1?

Dein Freund hat diese Zahlen eben auch ausgerechnet und ist nun etwas verzweifelt. Wie soll er die Aufgabe lösen, ohne wochenlang nur mit Rechnen und Schreiben beschäftigt zu sein?

 _______________
< Bitte. Hilfe! >
 ---------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

2) Hilf deinem Freund, indem du ein Programm schreibst, dass das SEHR Große 1x1 auf der Konsole ausgibt. Gehe dabei folgendermaßen vor:

2a) Schreibe ein Programm einmaleins.py, dass das kleine 1x1 ausgibt. So soll der Anfang und das Ende der Ausgabe aussehen:

1 x 1 = 1
1 x 2 = 2
1 x 3 = 3
1 x 4 = 4
1 x 5 = 5
1 x 6 = 6
1 x 7 = 7
1 x 8 = 8
1 x 9 = 9
1 x 10 = 10
2 x 1 = 2
2 x 2 = 4
...
9 x 8 = 72
9 x 9 = 81
9 x 10 = 90
10 x 1 = 10
10 x 2 = 20
10 x 3 = 30
10 x 4 = 40
10 x 5 = 50
10 x 6 = 60
10 x 7 = 70
10 x 8 = 80
10 x 9 = 90
10 x 10 = 100

TIPP 1: Verwende eine verschachtelte Schleife, also eine äußere und eine innere Schleife:

# ...
while (...):
    # ...
    while (...):
        # ...
    # ...

TIPP 2: Verwende die sleep-Funktion, wenn du in Zeitlupe sehen willst wie das Programm abläuft.

2b) Ändere das Programm so, dass es das Große 1x1 ausgibt (Zahlen von 1 bis 20).

2c) Jetzt sollte es leicht sein, auch noch das SEHR Große 1x1 auszugeben.

(Psst. Nicht verraten, dass es am Ende gar nicht so schwer war.)

3) BONUS: Um die Ausgabe deines Programms bequem deinem Freund schicken zu können, wäre es praktisch, wenn die Ausgabe in einer Datei stehen würde. Das geht mit der bash-Shell so (ohne das $-Zeichen):

$ ./einmaleins.py > tabelle.txt

Die Datei tabelle.txt wird erzeugt (oder - falls schon vorhanden - überschrieben). Öffne die Datei mit kate und schaue sie dir an.

Bonus: Zufallszahlen und -Buchstaben[Bearbeiten | Quelltext bearbeiten]

ASCII[Bearbeiten | Quelltext bearbeiten]

Probiere folgendes aus (die Kommentare zeigen jeweils das Ergebnis):

ord('A')  # 65
ord('B')  # 66
ord('a')  # 97

chr(65)  # 'A'
chr(66)  # 'B'
chr(97)  # 'a'

ord liefert also zu einem Buchstaben eine Zahl und chr zu einer Zahl einen Buchstabe.

Warum genau diese Zahlen und keine anderen? Weil das so in der ASCII-Tabelle steht: https://de.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange#ASCII-Tabelle

Übung: Suche die Buchstaben deines Namens aus der ASCII-Tabelle heraus und baue eine Zeichenkette zusammen, indem du mehrere chr-Ergebnisse mit plus verknüpfst. Zum Beispiel chr(65) + chr(66) + chr(67) == "ABC"

Das random-Modul und help[Bearbeiten | Quelltext bearbeiten]

Öffne eine interaktive Python3-Shell und versuche folgendes nachzuvollziehen:

Wir brauchen das Modul random. Schauen, ob es schon da ist:

>>> random
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'random' is not defined

Scheint nicht so. Also importieren wir es:

>>> import random

Ist es jetzt da?

>>> random
<module 'random' from '/usr/lib64/python3.4/random.py'>

Ja, ist es. Neugierige können diese Datei einmal öffnen und sehen wie Original-Python-Bibliotheks-Code ausschaut.

Die Funktion randint aus dem Modul random verwenden:

>>> random.randint(1, 10)
7
>>> random.randint(1, 10)
3
>>> random.randint(1, 10)
8

random.randint(1, 10) liefert Zufallszahlen zwischen 1 und 10. Aber ist 1 und 10 inklusive oder nicht? Rufe dazu die eingebaute Hilfe auf:

>>> help(random.randint)

Help on method randint in module random:

randint(a, b) method of random.Random instance
    Return random integer in range [a, b], including both end points.

Den Hilfeanzeigemodus kannst du mit der Taste q wieder verlassen.

Arbeite jetzt wieder mit Dateien:

Übung 1: Schreibe ein Programm, das zeilenweise Zufallszahlen zwischen -100 und 100 ausgibt.

Übung 2: Schreibe ein Programm, das zeilenweise Zeichenketten von je 10 Zufallsbuchstaben ausgibt, also z. B.:
lqZYWUiHxj
UhoniELbgo
zBvObSTGfv
QjRJngcfuT
...

(todo später: https://github.com/feinstaub/tp64/blob/master/sample-code/rand-chr.py: for in range)

 ZurückWeiter