EINSTIEG IN DIE PROGRAMMIERUNG MIT PYTHON - MÄRZ 2022 - WIKITOLEARN ...

 
WEITER LESEN
Einstieg in die
Programmierung mit Python

          8. März 2022
This book is the result of a collaborative effort of a community of people
                 like you, who believe that knowledge only grows if shared.
                 We are waiting for you!

                 Get in touch with the rest of the team by visiting http://join.wikitolearn.org

You are free to copy, share, remix and reproduce this book, provided that you properly give
credit to original authors and you give readers the same freedom you enjoy.
Read the full terms at https://creativecommons.org/licenses/by-sa/3.0/
Inhaltsverzeichnis

1 Arbeitsblätter                                                                      1
  1.1   Erstes Ziel - Primzahlen ausrechnen . . . . . . . . . . . . . . . . .          1
        1.1.1   Einstieg . . . . . . . . . . . . . . . . . . . . . . . . . . . . .     2
        1.1.2   Linux installieren    . . . . . . . . . . . . . . . . . . . . . . .    2
        1.1.3   Arbeitsumgebung kennenlernen          . . . . . . . . . . . . . . .    3
        1.1.4   Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . .       4
        1.1.5   Algorithmus     . . . . . . . . . . . . . . . . . . . . . . . . . .    4
        1.1.6   Primzahlen-Programm         . . . . . . . . . . . . . . . . . . . .    4
  1.2   Software installieren . . . . . . . . . . . . . . . . . . . . . . . . . .      5
        1.2.1   Neue Software installieren      . . . . . . . . . . . . . . . . . .    5
        1.2.2   Software mit YaST installieren (openSUSE)           . . . . . . . .    6
        1.2.3   Software mit der Kommandozeile installieren . . . . . . . .            8
        1.2.4   Ausblick    . . . . . . . . . . . . . . . . . . . . . . . . . . . .    8
  1.3   Tunneler anpassen . . . . . . . . . . . . . . . . . . . . . . . . . . .        9
        1.3.1   Quellcode holen und bauen . . . . . . . . . . . . . . . . . . 10
        1.3.2   Programm analysieren und ändern . . . . . . . . . . . . . . 13
        1.3.3   Ausblick    . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
  1.4   Tunneler anpassen 2 . . . . . . . . . . . . . . . . . . . . . . . . . . 16
        1.4.1   Voraussetzung . . . . . . . . . . . . . . . . . . . . . . . . . 16
        1.4.2   Debugging mit printf()      . . . . . . . . . . . . . . . . . . . . 16
        1.4.3   Die Funktion system()       . . . . . . . . . . . . . . . . . . . . 17
        1.4.4   Pixel-Schrift verkleinern     . . . . . . . . . . . . . . . . . . . 17
        1.4.5   Ausblick    . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

2 Programmier-Einstieg                                                                20
  2.1   Python interaktiv . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
  2.2   Python-Code in Dateien . . . . . . . . . . . . . . . . . . . . . . . . 22
  2.3   Rechnen und Schleifen . . . . . . . . . . . . . . . . . . . . . . . . . 24
Inhaltsverzeichnis                                                                              3 / 86

         2.4   grep . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

      3 FAQ                                                                               38
         3.1   Die Kommandozeile . . . . . . . . . . . . . . . . . . . . . . . . . . 38
               3.1.1   Kommandozeile starten . . . . . . . . . . . . . . . . . . . . 38
               3.1.2   Yakuake installieren . . . . . . . . . . . . . . . . . . . . . . 39
               3.1.3   Einstieg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
               3.1.4   Dateien und Verzeichnisse      . . . . . . . . . . . . . . . . . . 40
               3.1.5   Erweitert . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
               3.1.6   Bash-Fun . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
         3.2   Aufgaben für Zwischendurch       . . . . . . . . . . . . . . . . . . . . . 44
         3.3   Weitere Fragen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
               3.3.1   Schriftarten finden und installieren      . . . . . . . . . . . . . 45
               3.3.2   Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
               3.3.3   Internet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

      4 Eigenes System                                                                    50
         4.1   GNU,Linux installieren . . . . . . . . . . . . . . . . . . . . . . . . . 50
               4.1.1   In VirtualBox einbinden      . . . . . . . . . . . . . . . . . . . 50
               4.1.2   Auf USB-Stick . . . . . . . . . . . . . . . . . . . . . . . . . 50
               4.1.3   Auf eingebauter Festplatte     . . . . . . . . . . . . . . . . . . 50
         4.2   Software finden und installieren . . . . . . . . . . . . . . . . . . . . 51
               4.2.1   Einstieg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
               4.2.2   Weiteres    . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
               4.2.3   Befehlsübersicht . . . . . . . . . . . . . . . . . . . . . . . . 52
               4.2.4   Spezial-Infos . . . . . . . . . . . . . . . . . . . . . . . . . . 52
         4.3   Empfehlenswerte Programme . . . . . . . . . . . . . . . . . . . . . 57
               4.3.1   Programme (in der AG)        . . . . . . . . . . . . . . . . . . . 57
               4.3.2   Programme (für zuhause) . . . . . . . . . . . . . . . . . . . 60
               4.3.3   Spiele (nur ZUHAUSE) . . . . . . . . . . . . . . . . . . . . 61
         4.4   Lokales Netzwerk 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
               4.4.1   Firewall . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
               4.4.2   (im Aufbau) Desktop-Freigabe im Netzwerk          . . . . . . . . 69
               4.4.3   (im Aufbau) Heimnetzwerk . . . . . . . . . . . . . . . . . . 71
               4.4.4   Nützliche Netzwerk-Tools . . . . . . . . . . . . . . . . . . . 71

      5 Unsortiert                                                                        72
         5.1   Buch-Empfehlungen . . . . . . . . . . . . . . . . . . . . . . . . . . 72
Inhaltsverzeichnis                                                                              4 / 86

               5.1.1   Themen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
         5.2   Python3-Game-Programming . . . . . . . . . . . . . . . . . . . . . 74
               5.2.1   Frameworks      . . . . . . . . . . . . . . . . . . . . . . . . . . 74
               5.2.2   Tutorials / Ideen . . . . . . . . . . . . . . . . . . . . . . . . 79
               5.2.3   Andere    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
               5.2.4   Ideen für Spiele    . . . . . . . . . . . . . . . . . . . . . . . . 81
         5.3   Externe Materialien . . . . . . . . . . . . . . . . . . . . . . . . . . 81
               5.3.1   Unsortierte Materialsammlungen . . . . . . . . . . . . . . . 81

      6 Org_Meta                                                                          84

      7 Text- und Bildquellen, Autoren und Lizenzen                                       85
         7.1   Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
         7.2   Bilder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
         7.3   Inhaltslizenz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Kapitel 1. Arbeitsblätter                                    1 / 86

        Kapitel 1

        Arbeitsblätter

        1.1 Erstes Ziel - Primzahlen ausrechnen

    1   ______________________________
    2   / Hey Tux , um was geht es hier \
    3   \ eigentlich ?                  /
    4    ------------------------------
    5           \    ^__^
    6             \ (oo)\ _______
    7                (__)\        )\/\
    8                     ||----w |
    9                     ||     ||
   10                                   ____________
   11                                  < 2 3 5 7... >
   12                                   ------------
   13                                     \
   14                                       \
   15                                             .--.
   16                                            |o_o |
   17                                            |:_/ |
   18                                          //    \ \
   19                                         (|       | )
   20                                       /'\_     _/`\
   21                                       \___)=( ___/
   22
   23  _____
   24 < ??? >
   25 -----
   26           \       ^__^
   27               \   (xx)\ _______
   28                   (__)\         )\/\
   29                        ||----w |
   30                        ||     ||
   31
           _________________________________________
Kapitel 1. Arbeitsblätter                                                                  2 / 86

   32                                            / ...11 13 17... Primzahlen .
             Aber              \
   33                                            | Achtung : der Pfad zu den
            Primzahlen ist |
   34                                            | etwas verschlungen , da wir
             sehr viel         |
   35                                            \ neues kennenlernen werden .
                               /
   36
            -----------------------------------------
   37                                     \
   38                                       \
   39                                             .--.
   40                                            |o_o |
   41                                            |:_/ |
   42                                          //    \ \
   43                                         (|       | )
   44                                       /'\_     _/`\
   45                                       \___)=( ___/
   46
   47    _____________
   48   < Los geht 's! >
   49    -------------
   50           \    ^__^
   51             \ (oo)\ _______
   52                (__)\        )\/\
   53                     ||----w |
   54                     ||     ||

        1.1.1 Einstieg

        Lese dir folgende Abschnitte der Reihe nach durch:

           • Programmier-Einstieg/Überblick
           • Programmier-Einstieg/Initialisierung
           • Programmier-Einstieg/Der_Computer

        Lehrer: Ziel-Programm vorführen: https://github.com/feinstaub/tp64/blob/master/
        sample-code/prim-demo.py

        1.1.2 Linux installieren

           • Sorge dafür, dass du openSUSE Linux verfügbar hast. Z. B. indem du es
             auf einen USB-Stick installierst. Frage dazu jemanden, der es schon gemacht
             hat, ob er dir hilft. Hinweise:
                • Linux auf einen USB-Stick installieren: http://feinstaub.github.io/arbeitsblatt.
                  net/arbeitsblatt-linux-stick.html
Kapitel 1. Arbeitsblätter                                                                3 / 86

              • Linux mit VirtualBox ausführen: http://feinstaub.github.io/arbeitsblatt.
                net/arbeitsblatt-linux-image-virtualbox.html

         • Falls aus bestimmten Gründen die Installation heute nicht möglich ist (z.
           B. kein passender Stick dabei), dann mache folgendes:

              • Lese dir folgendes durch https://py-tutorial-de.readthedocs.io/de/python-3.
                3/introduction.html und probiere den Python-Code aus, indem du die-
                se Python-Online-Shell verwendest: https://repl.it/languages/python3
              • Bekannte Probleme:
                  • Was ist eine Fließkommazahl? –> Das ist noch nicht wichtig zu
                    wissen; bei Interesse siehe Wikipedia.
                  • Der Unterstrich (_) funktioniert bei mir nicht. –> Die Online-
                    Konsole scheint das nicht zu unterstützen. In diesem Fall über-
                    springen.
                  • Der Abschnitt zu “komplexen Zahlen” ist unverständlich. –> Wenn
                    du noch nicht gelernt hast, was komplexe Zahlen sind, dann bitte
                    überspringen.

         • Falls du damit fertig bist oder nicht weiterkommst

              • suche dir etwas von folgender Seite aus: Aufgaben für Zwischendurch
              • Bearbeite das Arbeitsblatt zu Binärzahlen: Course:Einstieg in die Pro-
                grammierung mit Python/Arbeitsblätter/Binäres Zahlensystem

         • Schülerfragen: Was ist der Vorteil von Linux? Was macht es aus?

      1.1.3 Arbeitsumgebung kennenlernen

      Neue Software installieren

      Mache dich damit vertraut, wie man neue Software installiert.

         • Öffne dazu FAQ/Software installieren und arbeite Punkt 1 und 2 durch.

      Die UNIX-Shell bash

      Arbeite folgendes durch:

         • FAQ/Die Kommandozeile (bis Abschnitt 1.4)

      BONUS-Aufgabe: Mit der Shell kann man sehr viel machen, wenn man weiß wie.
      Siehe z. B.

         • http://feinstaub.github.io/arbeitsblatt.net/arbeitsblatt-cowsay-fortune.html
Kapitel 1. Arbeitsblätter                                                                   4 / 86

      1.1.4 Python

      Interaktive Python-Shell

         • Arbeite folgendes durch: Python interaktiv

      Größere Programme mit Texteditor

         • Arbeite folgendes durch: py-Dateien

      Programmierkonzepte

         • Arbeite folgendes durch: Rechnen / Schleifen

         • BONUS-Aufgabe: Das grep-Tool: Programmier-Einstieg/grep

      1.1.5 Algorithmus

      Überlege zusammen mit deiner Gruppe einen Algorithmus (also eine schriftliche
      Vorgehensweise), der Primzahlen (2, 3, 5, 7, 11, 13, 17, ...) ausgibt.
      Also wie würde man systematisch herausfinden, welche der natürlichen Zahlen
      (ab 2) Primzahlen sind?
      Führe deinen Algorithmus für die ersten 7 Primzahlen per Hand durch.
      Hilfestellungen (immer einen Punkt weiterlesen, wenn du nicht weiterkommst):
      1) Überlege dir, mit welchen Schritten du für eine beliebige Zahl (z. B. 15 oder
      17) herausfinden würdest, ob es eine Primzahl ist oder nicht.
      2) Erinnere dich, was eine Primzahl ausmacht (nur durch 1 und sich selbst teilbar).
      3) Was wäre, wenn du nun für eine gegebene Zahl schaust, ob es eine Zahl zwischen
      2 und  gibt, durch die die Zahl teilbar ist? Ist es dann eine
      Primzahl oder nicht?
      4) Wenn du die Vorgehensweise für eine beliebige Zahl hast, dann kannst du sie
      auf alle natürlichen Zahlen der Reihe nach anwenden.

      1.1.6 Primzahlen-Programm

      Du hast nun folgende Programmierkonzepte und Python-Sprachelemente kennen-
      gelernt:

         • Variable (z. B. a)

         • Zuweisung (z. B. a = 5)

         • print-Ausgabe

         • Vergleichsoperatoren (z. B. a < 5)

         • if-Anweisung
Kapitel 1. Arbeitsblätter                                                                5 / 86

           • while-Schleife

        Versuche nun den den Primzahlen-Algorithmus aus dem vorigen Schritt in ein
        Python-Programm umzusetzen. Gebe auch die Nummer der Primzahl aus.
        Die Ausgabe für die ersten 10 Primzahlen sieht so aus:
    1   1: 2
    2   2: 3
    3   3: 5
    4   4: 7
    5   5: 11
    6   6: 13
    7   7: 17
    8   8: 19
    9   9: 23
   10   10: 29

        Bonus mit grep

        1. Nutze grep (mit dem Pipe-Symbol), um zu bestätigen, dass die Zahl 676763
        eine Primzahl ist.
        2. Ist die Zahl 676767 auch eine Primzahl?
        3. Suche nach der einemillionsten Primzahl.

        Ergebnis innerhalb der Gruppe vergleichen

           • Schreibe dein Programm so um, dass es bei Primzahlen größer als 1.000.000
             mit der Berechnung aufhört.

           • Leite das Ergebnis in die Datei prim_.txt um.

           • Kopiere die Ergebnisdatei deines Teamkollegen auf deinen Rechner.

           • Verwende das Programm KDiff3 oder Kompare, um festzustellen, ob bei-
             de Dateien gleich sind.

        1.2 Software installieren

        1.2.1 Neue Software installieren

    1   _______________________________________
    2   / Muh. Wie wird unter openSUSE Linux     \
    3   \ eigentlich neue Software installiert ? /
    4    ---------------------------------------
    5           \   ^__^
    6             \ (oo)\ _______
    7               (__)\         )\/\
    8                    ||----w |
Kapitel 1. Arbeitsblätter                                                                6 / 86

    9                         ||      ||
   10
            _________________________________________
   11                                  / Das steht auf dieser Seite
            . Und du bist \
   12                                  \ auch dabei ...
                          /
   13
            -----------------------------------------
   14                                     \
   15                                       \
   16                                             .--.
   17                                            |o_o |
   18                                            |:_/ |
   19                                          //    \ \
   20                                         (|       | )
   21                                       /'\_     _/`\
   22                                       \___)=( ___/
   23
   24  _______
   25 < Kuul. >
   26 -------
   27          \        ^__^
   28               \   (oo)\ _______
   29                   (__)\         )\/\
   30                        ||----w |
   31                        ||     ||

        1.2.2 Software mit YaST installieren (openSUSE)

        Hintergrund

        YaST ist die Abkürzung für “Yet another Setup Tool” (“Noch ein Administrati-
        onswerkzeug”). Es wird für Administrationszwecke unter openSUSE Linux ver-
        wendet. Es enthält unter anderem ein Modul zum Installieren und Deinstallieren
        von Software.

        Schritt für Schritt

        Aufgabe 1: Neue Software mit YaST installieren         Funktioniert mit: open-
        SUSE (13.2), 42.1, 42.2
        Ziel: Texteditor ’kate’ installieren

           • YaST aus dem K-Menü aufrufen.

           • Es öffnet sich ein Passwort-Fenster. Dort das root-Passwort eingeben. Was
             ist das?
Kapitel 1. Arbeitsblätter                                                                  7 / 86

         • “Software installieren oder löschen” [DE] bzw. “Software Management” [EN]
           anklicken.

         • Reiter “Suchen” auswählen.

         • “kate” eintippen.

         • “Suchen”-Knopf drücken.

         • Eintrag in der Liste rechts finden, der unter der Spalte “Paket” den Namen
           “kate” hat.

         • In das leere Quadrat ein Häkchen klicken (alternativ: rechte Maustaste ->
           “Installieren” klicken).

         • Reiter “Installationsübersicht” auswählen und ansehen, was tatsächlich in-
           stalliert werden wird.

         • ”Übernehmen”-Knopf drücken (unten rechts).

         • (kate wird heruntergeladen und installiert)

         • “Beenden”-Knopf unten rechts drücken.

         • Um zu prüfen, ob die Installation tatsächlich erfolgreich war:

              • kate im K-Menü finden und starten.
              • kate wieder schließen.

      Aufgabe 2: Software deinstallieren        Ziel: Texteditor ’kate’ wieder deinstal-
      lieren

         • YaST-Modul “Software-Management” aufrufen.

              • Entweder wie in Aufgabe 2
              • oder alternativ:
                  • Alt+Leertaste (oder mit KDE/Plasma-Version < 5: Alt+F2)
                    drücken.
                  • “Software” eintippen.
                  • “Software Management” mit den Cursor-Tasten auswählen und
                    ENTER-Taste drücken.

         • Reiter “Suchen” auswählen.

         • “kate” eintippen.

         • Eintrag in der Paket-Liste so lange anklicken, bis ein X erscheint (oder die
           rechte Maustaste verwenden).

         • ”Übernehmen”-Knopf drücken.

         • (kate wird deinstalliert)
Kapitel 1. Arbeitsblätter                                                                  8 / 86

        Aufgabe 3: Mehrere Programme auf einmal installieren

           • YaST-Modul “Software-Management” aufrufen.

           • Im Reiter “Suchen” “kate” eintippen und in der Paketliste abhaken.

           • Im Reiter “Suchen” “chess” eintippen und in der Paketsliste den Eintrag
             “gnome-chess” abhaken.

           • ”Übernehmen”-Knopf drücken.

           • (beide Programme werden installiert)

           • ’Chess’ (ein Schachprogramm) ausprobieren (Alt+Leertaste, “Chess”)

        1.2.3 Software mit der Kommandozeile installieren

        Ein Paket installieren

        Ziel: Das Programm cowsay mit Hilfe des Tools zypper installieren.

           • Das Programm “Konsole” öffnen (z. B. via K-Menü oder Alt+Leertaste,
             siehe auch FAQ/Die Kommandozeile.

           • cowsay Muh eingeben und ENTER drücken.

                • Befehl nicht gefunden.
                • cnf cowsay eingeben.
                      • Die Ausgabe sagt, was zu tun ist, um das (noch) nicht vorhandene
                        Programm zu installieren.

           • sudo zypper install cowsay eingeben.

                • Nach Rückfragen wird cowsay installiert.

           • cowsay Muh eingeben. Das sollte das Ergebnis sein:

    1_____
    2< Muh >
    3 -----
    4             \       ^__^
    5                 \   (oo)\ _______
    6                     (__)\         )\/\
    7                          ||----w |
    8                          ||     ||

           • Aufgabe: cowsay Hallo Welt eingeben.

        1.2.4 Ausblick

           • Siehe Eigenes System/Software finden und installieren
Kapitel 1. Arbeitsblätter                                                              9 / 86

        1.3 Tunneler anpassen

        Ziel: Lernen wie vorhandene Programme an eigene Bedürfnisse angepasst werden
        können.
    1   _______________________________
    2   < Und nun zum Tunneler - Spiel ... >
    3    -------------------------------
    4      \
    5        \
    6              .--.
    7             |o_o |
    8             |:_/ |
    9           //    \ \
   10          (|       | )
   11        /'\_     _/`\
   12        \___)=( ___/
   13
   14                                     ______________
   15                                    < Sehr schön . >
   16                                     --------------
   17                                             \   ^__^
   18                                               \ (oo)\ _______
   19                                                 (__)\         )\/\
   20                                                      ||----w |
   21                                                      ||     ||
   22    _________________________________________
   23   / Das Original - Tunneler wurde in Turbo      \
   24   | Pascal programmiert und war auf DOS         |
   25   | beliebt . Es wurde von Taneli Kalvas aus |
   26   | Finnland im Jahr 2003 mit der               |
   27   | Cross -Platform - Bibliothek SDL in der     |
   28   \ Sprache C nachprogrammiert .                /
   29    -----------------------------------------
   30      \
   31        \
   32              .--.
   33             |o_o |
   34             |:_/ |
   35           //    \ \
   36          (|       | )
   37        /'\_     _/`\
   38        \___)=( ___/
   39
   40                                           ____________
   41                                          < Und jetzt ? >
   42                                           ------------
   43                                                  \    ^__^
   44                                                    \ (oo)\ _______
   45                                                       (__)\        )\/\
Kapitel 1. Arbeitsblätter                                                                   10 / 86

   46                                                                     ||----w |
   47                                                                     ||     ||
   48  ________________________________________
   49 / Wir holen uns den freien Quellcode und \
   50 | machen unsere eigenen Änderungen an   |
   51 \ dem Programm .                          /
   52 ----------------------------------------
   53    \
   54      \
   55            .--.
   56           |o_o |
   57           |:_/ |
   58         //    \ \
   59        (|       | )
   60      /'\_     _/`\
   61      \___)=( ___/

        1.3.1 Quellcode holen und bauen

        Quellcode-Paket holen

        Erst schauen wir, was es für Pakete gibt, die den Namen “tunneler” enthalten.
    1   $ zypper se tunneler

        Ausgabe:
    1   Loading repository data ...
    2   Reading installed packages ...
    3
    4   S | Name     | Summary                          | Type
    5   --+----------+----------------------------------+-----------

    6   i | tunneler | Clone of legendary Tunneler game | package
    7     | tunneler | Clone of legendary Tunneler game |
           srcpackage

        Das “i” in der ersten Spalte bedeutet, dass das Paket “tunneler” installiert ist.
        Das Paket in der zweiten Zeile ist das Quell-Paket, siehe “Type” in der letzten
        Spalte (merkwürdig: auch wenn man das Paket im nächsten Schritt installiert,
        erscheint kein “i” in der ersten Spalte).
        Das Quellpaket installieren wird in zwei Schritten mit der source-install-Option:
        1) Abhängigkeiten installieren
    1   $ sudo zypper source - install tunneler

        2) Quell-Code ins eigene Home-Verzeichnis kopieren:
    1   $ zypper source - install tunneler
Kapitel 1. Arbeitsblätter                                                                  11 / 86

        Die mit source-install geholten Quellpakete befinden sich dann hier: ~/rpmbuil-
        d/SOURCES/
        Der Quellcode von Tunneler ist in dieser Datei: tunneler-1.1.1.tar.bz2 (Versi-
        onsnummer kann abweichen)
        Die Datei ist ein Archiv und muss erst entpackt werden, damit wir weiterarbeiten
        können. Das machen wir im nächsten Abschnitt.

        Quellcode-Archiv entpacken

        Die im Verzeichnis ~/rpmbuild/SOURCES/ befindliche Datei tunneler-1.1.1.tar.bz2
        enthält die Quellcode-Dateien, die mit bz2 komprimiert gepackt sind. Diese müs-
        sen erst entpackt werden.
        Erst ins richtige Verzeichnis wechseln:
    1   $ cd ~/ rpmbuild / SOURCES /

        (Die meisten Fehler passieren, wenn man nicht im richtigen Verzeichnis ist. Das
        Verzeichnis sieht man links neben dem Prompt oder man fragt es mit dem Befehl
        pwd ab.)
        Schauen, ob die Datei da ist:
    1 ~/ rpmbuild /SOURCES >        ls -l
    2 total 784
    3 -rw -r--r-- 1 gregor          users       78228 Aug 14     2009 tunneler
          -1.1.1. tar.bz2
    4 -rw -r--r-- 1 gregor          users          154 Aug 14    2009 tunneler .
          desktop
    5 -rw -r--r-- 1 gregor          users         4675 Aug 14    2009 tunneler .svg

        Entpacken:
    1   $ tar xvjf tunneler -1.1.1. tar.bz2

        Ein neuer Ordner “tunneler-1.1.1” wurde erstellt. Inhalt zur Kontrolle auflisten.
        1) Sind wir noch im richtigen Verzeichnis?
    1 $ pwd
    2 /home// rpmbuild / SOURCES /

        2) Auflisten:
    1   $ cd tunneler -1.1.1
    2   $ ls -l
    3
    4   -rwxr -xr -x   1   6404 Jun         3     2007   acinclude .m4
    5   -rw -r--r--    1 31565 Jun          5     2008   aclocal .m4
    6   -rw -r--r--    1      0 Jun         3     2007   AUTHORS
    7   -rw -r--r--    1      0 Jun         3     2007   ChangeLog
    8   -rwxr -xr -x   1 142434 Jun         5     2008   configure
    9   -rw -r--r--    1    444 Jun         5     2008   configure .in
Kapitel 1. Arbeitsblätter                                                             12 / 86

   10   -rw -r--r--    1   15119   Jun    3   2007   COPYING
   11   -rwxr -xr -x   1   17574   Sep   24   2007   depcomp
   12   -rw -r--r--    1    9416   Sep   24   2007   INSTALL
   13   -rwxr -xr -x   1   13184   Sep   24   2007   install -sh
   14   -rw -r--r--    1      14   Jun    3   2007   Makefile .am
   15   -rw -r--r--    1   17567   Jun    5   2008   Makefile .in
   16   -rwxr -xr -x   1   11135   Sep   24   2007   missing
   17   -rw -r--r--    1       0   Jun    3   2007   NEWS
   18   -rw -r--r--    1    2840   Jun    5   2008   README
   19   drwxr -xr -x   2    4096   Jun    5   2008   src

        Quellcode kopieren

        Wir fangen in den nächsten Abschnitten an, die Quellcode-Dateien zu modifi-
        zieren. Damit wir im Nachhinein besser vergleichen können, was im Vergleich
        geändert wurde, fertigen wir eine Kopie des Quellcode-Ordners an.

          1. Den Ordner “tunneler-1.1.1” umbenennen in “tunneler-2”:
           1   $ cd ~/ rpmbuild / SOURCES /
           2   $ mv tunneler -1.1.1 tunneler -2

          2. Das Quellcode-Archiv nochmal entpacken:
           1   $ tar xvjf tunneler -1.1.1. tar.bz2

        Wir haben jetzt zwei Ordner mit demselben Inhalt. Den “tunneler-1.1.1” lassen
        wir so, wie er ist. Im Folgenden arbeiten wir in “tunneler-2”.
        (Die Vorgehensweise bis hierhin ist für jedes openSUSE-Paket ähnlich durchzu-
        führen.)

        Vorbereiten des Bauens

        Bevor aus dem Quellcode eine ausführbare Datei gebaut werden kann, muss die
        Umgebung initialisiert werden. Das machen wir mit den folgenden Befehlen:
    1 $ pwd
    2 /home// rpmbuild / SOURCES
    3 $ cd tunneler -2/
    4 $ export LIBS=-lm
    5 $ ./ configure

        Erinnerung: Die Zeilen, die mit einem $ anfangen sind die Befehle, die ohne das
        $-Zeichen nach der Reihe abgetippt werden sollten. Bestätigung jeweils mit der
        Entertaste. Nach jedem Befehl ist die Konsolenausgabe zu prüfen, ob das Ergeb-
        nis ohne Fehlermeldungen ablief, ansonsten funktionieren die nächsten Befehle
        möglicherweise nicht richtig.
        Was haben wir damit gemacht?
Kapitel 1. Arbeitsblätter                                                             13 / 86

        1) Schauen, ob wir im richtigen Verzeichnis sind.
        2) Ins tunneler-2-Verzeichnis wechseln.
        3) Eine notwendige Option setzen (warum? –> siehe hier).
        4) Projekt einmalig “konfigurieren”.
        (Die Vorgehensweise bis hierhin ist für eine bestimmte Menge von Programmen
        - die, die die GNU autotools verwenden - ähnlich)

        Projekt bauen und ausführen

    1 $ pwd
    2 /home// rpmbuild / SOURCES /tunneler -2
    3 $ cd src
    4 $ make
    5 $ ./ tunneler

        Mit dem ersten Schritt wechseln wir in den src-Ordner.
        Der make-Befehl startet die Kompilierung, denn da Tunneler ist in der Program-
        miersprache C geschrieben ist, muss der Quellcode erst kompiliert werden. Den
        Prozess nennt man allgemein “Bauen”. Unter “Bauen” kann man aber auch das
        Programmieren einer Software an sich verstehen.
        Mit dem letzten Befehl wird die Datei tunneler, die durch den erstmaligen make-
        Aufruf erzeugt wurde, ausgeführt: Das Spiel startet. :-)

        1.3.2 Programm analysieren und ändern

        Wir arbeiten in folgendem Verzeichnis: ~/rpmbuild/SOURCES/tunneler-
        2/src/

        Titel ändern

        Wir machen nun unsere erste Änderung am Programm.
        Öffne die Datei main.c mit Kate.
        Suche nach der Zeile “PutStr( 18, 20, “Tunneler v.” VERSION, color[12] );”
        Tipp: Zeile 1014 (Erinnerung: mit F11 blendet man die Zeilennummerierung in
        Kate ein)
        Tipp: mit Strg+G springt man in eine Zeile
        Tipp: mit Strg+F sucht man in der Datei.
        Die Code-Zeile sorgt dafür, dass auf dem Startbildschirm der Name des Spiels
        und seine Version angezeigt wird. Damit wir unser geändertes Programm vom
        Original unterscheiden können, mache folgendes:
        Ändere die Zeile von vorher:
    1   PutStr ( 18, 20, " Tunneler v." VERSION , color [12] );
Kapitel 1. Arbeitsblätter                                                                14 / 86

        auf nachher:
    1   PutStr ( 5, 20, ">> Tunneler 2.0
Kapitel 1. Arbeitsblätter                                                              15 / 86

        Aufgabe 1) Ändere die Farbe des linken Spielers (inklusive der Umrahmung
        des Startfeldes) in gelb. Finde dazu heraus, welche Code-Zeilen für welche Teil-
        farbe verantwortlich sind.
        2) Ändere die Farbe des rechten Spielers in weiß.

        Geschwindigkeit ändern

           • game.h öffnen

           • Suche nach:

                • #define TANK_SPEED 130.0
                • #define DIG_SPEED 60.0

        Englische Vokablen

           • tank = Panzer

           • speed = Geschwindigkeit

           • dig = graben

        => Je mehr englische Vokabeln du kannst, umso einfacher ist es, Quellcode zu
        verstehen!
        Ansonsten kann man englische Wörter online unter http://dict.leo.org nachschla-
        gen. Oder besser offline mit KDing (Paket kding installieren, starten, danach
        Tastenkombination Meta+Umschalt+T verwenden).

        Aufgabe

           • Vertausche die beiden Zahlen für TANK_SPEED und DIG_SPEED.

           • Kompilieren, starten und ausprobieren:

    1   $ make && ./ tunneler

        Wie verhält sich der Panzer nun? Versuche den eigenen Kugeln davonzufahren.

        Änderungen und Original vergleichen

        Da du nun einige Änderungen am Code gemacht hast, ist es gut zu sehen, was
        eigentlich alles im Vergleich zum Original geändert wurde.
        Dies kannst du damit machen:
    1   $ cd ~/ rpmbuild / SOURCES /
    2   $ kdiff3 tunneler -1.1.1 tunneler -2

        (todo: mehr erklären; disable whitespace)
Kapitel 1. Arbeitsblätter                                                              16 / 86

        1.3.3 Ausblick

        Weitere Ideen

           • Selber den Code weiter analysieren und Änderungen vornehmen.

           • Die Texte vom Englischen ins Deutsche übersetzen.

           • Schriftart verkleinern, damit mehr Text hinpasst.

           • AI-Namen vergeben (Parameter -ai 1 um -ainame “Name1” erweitern)

           • Per Tastendruck die Kartenübersicht einblenden

           • Die Geschwindigkeit des Gefährts mittels Programmparameter einstel-
             len.

           • Die Geschwindigkeit des Gefährts mittels Sondertaste erhöhen und er-
             niedrigen.

        Nächste Schritte

        Weiter mit Teil 2.

        1.4 Tunneler anpassen 2

        1.4.1 Voraussetzung

        Voraussetzung für dieses Arbeitsblatt ist das erfolgreiche link removed.

        Nachtrag: Entpacken

        Alternativ kann man ein Archiv auch mit graphischen Tools entpacken:

          1. Verzeichnis ~/rpmbuild/SOURCES/ mit Dolphin öffnen

          2. Rechte Maustaste auf tunneler-1.1.1.tar.bz2 -> Extract -> Extract archive
             here, autodetect subfolder

        1.4.2 Debugging mit printf()

        main.c: - Achte auf die erste geschweifte Klammer auf und die letzte geschweifte
        Klammer zu.
    1   int main( int argc , char *argv [] )
    2   {
    3       printf (" main start \n");
    4       ...
    5       printf (" main end\n");
    6   }
Kapitel 1. Arbeitsblätter                                                17 / 86

        1.4.3 Die Funktion system()

        main.c:
    1   printf (" main start \n");
    2       system (" cowsay 'Tunneler startet ! '");
    3       system (" notify -send 'Tunneler startet ! '");
    4       system (" bash -c 'play /usr/ share /tong/ media /tick.ogg
           &'");
    5       system (" bash -c 'play /usr/ share / alienarena / data1 /
           sound/ music /dm - saucer .ogg & '");

        tunneler.c:
    1 /* Make new ammo */
    2    if( Tank[i]. fire && Time_Now () - Tank[i]. last >
         FIRE_DELAY && Tank[i]. deathc
Kapitel 1. Arbeitsblätter                                                    18 / 86

   25         for( i = 0; i < 8; i++ ) {
   26       for( j = 0; j < 8; j++ ) {
   27            if( font8x8 [j][i][( int)ch] )
   28           PutPixel_1 ( x + j, y + i, color , 2 );
   29       }
   30         }
   31   }

        1.4.5 Ausblick

        Weitere Ideen

            • system-Aufrufe
                • espeak
                • xcowsay
                    • tunneler.c:
                    1   /* Death */
                    2            int is_dead = 0;
                    3      if( Tank[i]. Shields
Kapitel 1. Arbeitsblätter                                                            19 / 86

                   27               sprintf (cmd , "bash -c 'xcowsay \"
                         Spieler %d hat das Zeitliche gesegnet .\
                         nPunktestand :\ nlinks =%d, rechts =%d\"' &", i,
                          Tank [0]. deaths , Tank [1]. deaths );
                   28               system (cmd);
                   29          }

         • Nachdem die Auflösung der Schrift vergrößert wurde:

               • Längere Texte möglich
               • Spielernamen als Parameter übergeben und in den Settings an-
                 stelle von “Tank 1” und “Tank 2” verwenden.

         • Programmiere dein eigenes Tunneler-Spiel mit Python und Qt.

      Die Sprache C

      Bücher

         • Lerne C programmieren auf Wikibooks: https://de.wikibooks.org/wiki/C-Programmierung

         • Lerne C programmieren: https://www.proggen.org/doku.php?id=c:start

      C-Strings

         • Am besten (ähnlich wie bei Datenbanken) schon vorher festlegen wie lange
           der String maximal sein soll.

               • siehe “Nullterminiert”: http://www.c-howto.de/tutorial-strings-zeichenketten-nullterminier
                 html

         • Länge

         • Kopieren

         • Variable length string in Blöcken: https://de.wikipedia.org/wiki/Variable_
           Length_Array

      Die Bibliothek SDL

         • Einstieg in SDL auf proggen.org

      IDEs

         • kdevelop: Funktioniert auf Anhieb; todo: beschreiben

         • Code::Blocks: ein vorhandenes Projekt zu importieren, ging nicht auf An-
           hieb
Kapitel 2. Programmier-Einstieg                                                      20 / 86

       Kapitel 2

       Programmier-Einstieg

       2.1 Python interaktiv

       Dieser Abschnitt erklärt den Umgang mit der Python-Shell, dem Kate-Editor
       und dem Konsolen-Suchtool grep.

       Den Computer rechnen lassen

       1. Öffne eine Bash-Shell indem du das Programm konsole startest (mehr In-
       fos dazu: https://de.wikipedia.org/wiki/Bash_(Shell), https://de.wikipedia.org/
       wiki/Konsole_(KDE), TIPP: https://de.wikipedia.org/wiki/Yakuake).
   1   gregor@linux -85 rg :~/ dev/ag >

       2. Gebe python3 und drücke ENTER.
   1 gregor@linux -85 rg :~/ dev/ag > python3
   2 Python 3.4.5 (default , Jul 03 2016 , 13:32:18) [GCC] on
         linux
   3 Type "help", " copyright ", " credits " or " license " for more
         information .
   4 >>>

       Du bist nun in der Python3-Shell.
       3. Drücke Strg+D und du bist wieder draußen.
       4. Drücke nochmal Strg+D und damit ist auch die Bash-Shell beendet.
       5. Wiederhole nun Schritt 1. und 2., aber überspringe Schritt 3. und 4. :-)
       6. Gebe 100 + 50 ein und drücke ENTER.
       Das Plus-Zeichen (+) nennt man Operator.

       Übung 1. Probiere die 4 Grundrechenarten aus. Die Operatoren dazu sind +
       (plus), - (minus), * (Multiplikation), / (Division)
       2. Probiere Multiplikation mit großen, sehr großen und irrsinnig großen Zahlen
       aus. Wie schnell ist der Computer im Vergleich zum Ausrechnen per Hand?
Kapitel 2. Programmier-Einstieg                                                     21 / 86

        3. Du kannst auch Potenzieren. Der Operator ist **. Berechne 2 hoch 4, 2 hoch
        10, 2 hoch 1000 und 2 hoch 1.000.000.
        TIPP: Wenn eine Berechnung zu lange dauert und du das Programm abbrechen
        möchtest, drücke Strg+C.

        Variablen, Ausgabe

        Gebe folgendes selber der Reihe nach in die Python ein:
   1    >>>   a = 5
   2    >>>   b = 6
   3    >>>   print (a + b)
   4    11
   5    >>>   c = a + 3 * b
   6    >>>   print (c)
   7    23
   8    >>>   c = 10
   9    >>>   print (c)
   10   10
   11   >>>

        Folgendes ist neu:

           • Neue Variable definieren und einen Wert zuweisen.

           • Mit Variablen rechnen

           • Die Ausgabe-Funktion print

           • Das Ergebnis einer Berechnung in einer Variablen speichern.

           • Einer vorhandenen Variablen einen neuen Wert zuweisen.

        Vergleichen

        Gebe folgendes selber der Reihe nach in die Python ein
   1    >>> a   = 5
   2    >>> b   = 7
   3    >>> a   > b
   4    False
   5    >>> a   < b
   6    True
   7    >>> a   >= 5
   8    True
   9    >>> a   > 5
   10   False
   11   >>> a   == b
   12   False
   13   >>> a   + 2 == b
   14   True
Kapitel 2. Programmier-Einstieg                                                       22 / 86

   15 >>> a != b
   16 True
   17 >>>

        Das Ergebnis eines Vergleichsoperators ist entweder True oder False.
        Der Operator ist übrigens binär, weil er mit zwei Ausdrücken arbeitet; ein Aus-
        druck kann eine Zahl, eine Variable oder auch etwas kompliziertes sein.
        Folgende Vergleichsoperatoren gibt es:
   1    <
   2    >
   3    =
   5    ==
   6    !=

        Übung Überlege dir vorher, was das Ergebnis der folgenden Ausdrücke ist,
        bevor du sie zur Kontrolle in Python eingibt:
   1    >>> a = 5
   2    >>> b = 7
   3
   4    a    < b
   5    a
Kapitel 2. Programmier-Einstieg                                                      23 / 86

       Damit du die grundlegenden Funktionen des Kate-Editors kennenlernst, lese dir
       folgendes durch:

          • Kate-Tipps (bis einschließlich Abschnitt 1.3)

       Programmtext eingeben         Ein einfaches Python-Programm sieht so aus:
   1   #!/ usr/bin/ python3
   2
   3   print (" Hallo Welt ")

       Wenn Umlaute (ä, ö, ü usw.) korrekt dargestellt werden sollen, dann sieht es so
       aus:
   1   #!/ usr/bin/ python3
   2   # -*- coding : utf -8 -*-
   3
   4   print (" Hallo Welt ")

          • Starte Kate.

          • Tippe den obigen Text ab (für den Anfang reicht die erste Variante).

          • Der Text befindet sich nun in einem ungespeicherten Dokument. Dies er-
            kennt man man dem Sternchen oben in der Titelleiste rechts neben dem
            Dokumentnamen.

       Datei speichern

          • Drücke Strg+S oder wähle im Menü Datei den Punkt Speichern.

          • Das Speichern-Dialog öffnet sich.

          • Wechsle in den Ordner ~/ag

               • Die Tilde (~) steht für das persönliche Verzeichnis des eingloggten
                 Benutzers
               • Der Unterordner ag ist möglicherweise noch nicht vorhanden. Erstelle
                 ihn mit dem entsprechenden Knopf im Speichern-Dialog

          • Wähle einen Dateiname (Textfeld unten): hallo.py.

               • Achte darauf, dass du keine Leerzeichen am Anfang oder am Ende
                 einfügst
               • Beim Programmieren ist es empfehlenswert, die Dateinamen immer
                 klein zu schreiben und anstelle von Leerzeichen Bindestriche (-) oder
                 Unterstriche (_) zu verwenden.

          • Drücke den Speichern-Knopf.
Kapitel 2. Programmier-Einstieg                                                        24 / 86

       In die Kommandozeile wechseln

          • Starte eine Bash-Kommandozeile.

          • Wechsle in das Verzeichnis, in das du im vorigen Schritt die py-Datei ge-
            speichert hast.

               • Verwende dazu den Befehl cd und ls. Wie das geht, lernst du hier:
                 Dateien_und_Verzeichnisse

       Programm mit python ausführen            Führe das Programm aus, indem du
       folgendes auf der Konsole eingibst (Erinnerung: das $-Zeichen wird nicht mit
       eingegeben):
   1   $ python3 hallo .py

       Programm ausführbar machen            Die Python-Datei wird mit folgendem Be-
       fehl (einmalig) ausführbar gemacht:
   1   $ chmod +x hallo .py

       Programm ausführen Nun kannst du das Programm auch ausführen, ohne
       python3 davorzuschreiben, weil der python-Befehl schon in der ersten Zeile deiner
       Datei steht (#!/usr/bin/python3):
   1   $ ./ hallo.py

       Bitte beachte das ”./” am Anfang. Damit sagt man dem System, es soll die Datei
       im aktuellen Verzeichnis ausführen und nicht in den Systempfaden (siehe echo
       $PATH) suchen.

       Fehler korrigieren Wenn das Programm fehlerhaft ist, dann gehe zurück zum
       Kate-Editor und versuche den Fehler zu finden und zu korrigieren.

       Nächste Schritte

       Programmier-Einstieg/Rechnen / Schleifen

       2.3 Rechnen und Schleifen

   1   ______________________________
   2   < Hey Tux , was lerne ich hier? >
   3    ------------------------------
   4           \    ^__^
   5             \ (oo)\ _______
   6                (__)\        )\/\
   7                     ||----w |
Kapitel 2. Programmier-Einstieg                                   25 / 86

   8                         ||        ||
   9
            ________________________________________
   10                                  / Hier geht es um
            grundlegende           \
   11                                  | Programmierkonzepte . Vor
            allem die      |
   12                                  | Schleife hat es in sich.
            Wenn du alles |
   13                                  | durchgearbeitet hast ,
            sollte das aber |
   14                                  \ kein Problem mehr für dich
             sein.       /
   15
            ----------------------------------------
   16                                     \
   17                                       \
   18                                             .--.
   19                                            |o_o |
   20                                            |:_/ |
   21                                          //    \ \
   22                                         (|       | )
   23                                       /'\_     _/`\
   24                                       \___)=( ___/
   25
   26  _______
   27 < Kuhl. >
   28 -------
   29          \        ^__^
   30               \   (oo)\ _______
   31                   (__)\         )\/\
   32                        ||----w |
   33                        ||     ||

        Variablen und Rechnen

        Tippe folgendes in den kate-Editor:
   1    #!/ usr/bin/ python3
   2
   3 a = 2
   4 print (a)
   5
   6    a = a + 5
   7    print (a)
   8
   9  b = 20
   10 c = a + b
   11 print (c)
Kapitel 2. Programmier-Einstieg                                                        26 / 86

        Speichere es in eine Datei rechnen.py.
        Wechsle zur Kommandozeile, mache die Datei ausführbar und führe die Datei
        aus.

        Ausgabe mit format

        Wie zuvor: Programmcode abtippen, in eine Datei speichern (entweder die gleiche
        oder eine neue: format.py), ausführbar machen und ausführen.
   1    #!/ usr/bin/ python3
   2
   3 a = 1234
   4 b = 4
   5 print ("a geteilt durch b = {}". format (a / b))
   6 print ("{} geteilt durch {} = {}". format (a, b, a / b))

        Verstehst du wie der format-Befehl arbeitet?

        Zählen für Anfänger

        Wir zählen bis 5:
   1    #!/ usr/bin/ python3
   2
   3    a = 0
   4    print (a)
   5
   6    a = a + 1
   7    print (a)
   8
   9    a = a + 1
   10   print (a)
   11
   12 a += 1    # += ist eine Abkürzung für a = a + 1
   13 print (a)
   14
   15 a += 1
   16 print (a)
   17
   18   a += 1
   19   print (a)

        Aufgabe: Zähle auf diese Weise bis 50
        (Tipp: die Befehle mit kate oft untereinander kopieren, Datei speichern und Pro-
        gramm auf der Konsole ausführen.)
Kapitel 2. Programmier-Einstieg                                                      27 / 86

       Lass den Computer zählen mit einer Schleife

       Nun lassen wir den Computer zählen und schauen zu wie schnell er ist. Dazu
       verwenden wir eine Schleife.
   1   #!/ usr/bin/ python3
   2
   3 i = 0
   4 while (True):
   5     print (i)
   6     i += 1

       Du kannst das Programm mit Strg+C unterbrechen.

       Vorzeitiges Ende mit der if-Anweisung und break

       Damit der Computer nicht zu viel rechnet und wir sehen, was am Anfang passiert,
       machen wir folgendes:
   1   #!/ usr/bin/ python3
   2
   3   i = 0
   4   while (True):
   5       print (i)
   6       i += 1
   7       if i > 10:
   8           break

       Übung: Quadratzahlen

          • Anstelle einfach nur zu zählen, lasse den Computer Quadratzahlen ausgeben
            und zwar die ersten 20:
          1   1
          2   4
          3   9
          4   16
          5   ...

          • Verwende die format-Anweisung, um die Ausgabe detaillierter zu gestalten:
          1 1 *     1   =   1
          2 2 *     2   =   4
          3 3 *     3   =   9
          4 4 *     4   =   16
          5 ...
Kapitel 2. Programmier-Einstieg                                                    28 / 86

        Verzögerung mit sleep

        Hier ein einfaches Beispiel wie man Verzögerungen in sein Programm einbauen
        kann:
   1    #!/ usr/bin/ python3
   2
   3    import time
   4
   5    i = 0
   6
   7  while (True):
   8      print ("{} Sekunde (n) vergangen .". format (i))
    9     time.sleep (1.0)
   10     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

        Für die folgenden Rechenübungen kannst du sleep verwenden, damit die Ausga-
        be 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 Reihen-
        folge - ausgeben.

        (NEU) Übung: Tannenbaum

        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    *
   2                                          ***
   3                                         *****
   4                                        *******
   5                                       *********
   6                                      ***********
   7                                     *************
   8                                          ***
   9                                          ***
   10                                        *****
Kapitel 2. Programmier-Einstieg                                                      29 / 86

        1) Wir beginnen mit der Baumkrone und definieren eine Funktion:
   1    def baumkrone (zeile ):
   2        i = 0
   3        while i < zeile :
   4            print ("*", end='')
   5            i += 1
   6        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:
   1    baumkrone (1)
   2    baumkrone (2)
   3    baumkrone (3)
   4    baumkrone (4)
   5    baumkrone (5)

        Das Ergebnis sollte so aussehen:
   1 *
   2 **
   3 ***
   4 ****
   5 *****

        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:
   1    *
   2    ***
   3    *****
   4    *******
   5    *********

        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:
   1    def baumkrone (zeile , size): # Neuer Parameter 'size '
   2        i = 0
   3        while /* ??? */:
   4            print (" ", end='')
   5            i += 1
   6
   7         i = 0
   8         while i < 2 * zeile - 1:
   9             print ("*", end='')
   10            i += 1
Kapitel 2. Programmier-Einstieg                                                      30 / 86

   11        print ()
   12
   13   baumkrone (1, 7) # Der neue Parameter muss auch beim
           Aufrufen angegeben werden
   14   baumkrone (2, 7)
   15   baumkrone (3, 7)
   16   baumkrone (4, 7)
   17   baumkrone (5, 7)

        4) Schreibe eine zusätzliche Funktion baum(size), die unter Angabe der Baum-
        größe, die Funktion baumkrone so aufruft, dass verschieden große Tannenbaum-
        kronen ausgegeben werden.
   1 def baumkrone (zeile , size):
   2     /* siehe oben */
   3
   4    def baum(size):
   5        /* ??? */
   6
   7  # Baumkronen in vier verschiedenen Größen ausgeben :
   8  baum (3)
    9 baum (4)
   10 baum (7)
   11 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

           • Lade die drei Dateien von hier (https://github.com/feinstaub/tp64/tree/
             master/html/baum) herunter und speichere sie unter ~/ag/htmlbaum/ ab.

           • Ö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.
Kapitel 2. Programmier-Einstieg                                                     31 / 86

       Teilen mit Rest

       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
   1   >>> 11 % 4
   2   3

       Verwende die interaktive Python-Konsole, um den %-Operator auszuprobieren.
       Überlege aber vorher selber, was rauskommt.
   1   0   %   5
   2   1   %   5
   3   2   %   5
   4   3   %   5
   5   4   %   5
   6   5   %   5
   7   6   %   5

       (NEU) Übung: Teilbar ohne Rest?

       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:
   1   Folgende Zahlen sind teilbar durch 7 ohne Rest:
   2     7
   3     14
   4     21
   5     ...

       Verwende dazu unter anderem folgende Anweisungen / Funktionen:

           • while-Schleife

           • if-Anweisung

           • %-Operator

           • print-Anweisung

       (NEU) Übung: Verschachtelte Schleifen: das SEHR große 1x1

       Ein guter Freund von dir hat in Mathe nicht aufgepasst und konnte zum wie-
       derholten Mal das kleine 1x1 nicht auswendig aufsagen (zur Erinnerung, siehe
Kapitel 2. Programmier-Einstieg                                                       32 / 86

        https://de.wikipedia.org/wiki/Einmaleins#Tabelle). Leider bekam er eine Straf-
        arbeit 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 ver-
        zweifelt. Wie soll er die Aufgabe lösen, ohne wochenlang nur mit Rechnen und
        Schreiben beschäftigt zu sein?
   1    _______________
   2    < Bitte. Hilfe ! >
   3     ---------------
   4            \   ^__^
   5              \ (oo)\ _______
   6                (__)\         )\/\
   7                     ||----w |
   8                     ||     ||

        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    1 x 1 = 1
   2    1 x 2 = 2
   3    1 x 3 = 3
   4    1 x 4 = 4
   5    1 x 5 = 5
   6    1 x 6 = 6
   7    1 x 7 = 7
   8    1 x 8 = 8
   9    1 x 9 = 9
   10   1 x 10 = 10
   11   2 x 1 = 2
   12   2 x 2 = 4
   13   ...
   14   9 x 8 = 72
   15   9 x 9 = 81
   16   9 x 10 = 90
   17   10 x 1 = 10
   18   10 x 2 = 20
   19   10 x 3 = 30
   20   10 x 4 = 40
   21   10 x 5 = 50
   22   10 x 6 = 60
Kapitel 2. Programmier-Einstieg                                                          33 / 86

   23 10    x   7 = 70
   24 10    x   8 = 80
   25 10    x   9 = 90
   26 10    x   10 = 100

        TIPP 1: Verwende eine verschachtelte Schleife, also eine äußere und eine innere
        Schleife:
   1    # ...
   2    while (...):
   3        # ...
   4        while (...) :
   5            # ...
   6        # ...

        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):
   1    $ ./ 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

        ASCII     Probiere folgendes aus (die Kommentare zeigen jeweils das Ergebnis):
   1 ord('A')         # 65
   2 ord('B')         # 66
   3 ord('a')         # 97
   4
   5 chr (65)       # 'A'
   6 chr (66)       # 'B'
   7 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
Kapitel 2. Programmier-Einstieg                                                       34 / 86

       plus verknüpfst. Zum Beispiel chr(65) + chr(66) + chr(67) == “ABC”

       Das random-Modul und help            Öffne eine interaktive Python3-Shell und
       versuche folgendes nachzuvollziehen:
       Wir brauchen das Modul random. Schauen, ob es schon da ist:
   1 >>> random
   2 Traceback (most recent call last):
   3   File "", line 1, in 
   4 NameError : name 'random ' is not defined

       Scheint nicht so. Also importieren wir es:
   1   >>> import random

       Ist es jetzt da?
   1   >>> random
   2   

       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:
   1   >>> random . randint (1, 10)
   2   7
   3   >>> random . randint (1, 10)
   4   3
   5   >>> random . randint (1, 10)
   6   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:
   1   >>> help( random . randint )
   2
   3   Help on method randint in module random :
   4
   5 randint (a, b) method of random . Random instance
   6     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 Zu-
       fallsbuchstaben ausgibt, also z. B.:
   1   lqZYWUiHxj
Kapitel 2. Programmier-Einstieg                                                       35 / 86

   2 UhoniELbgo
   3 zBvObSTGfv
   4 QjRJngcfuT
   5 ...

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

        2.4 grep

        In der Standard-Ausgabe suchen

        Die Standard-Ausgabe ist das, was du mit dem print-Befehl ausgibst. Auch an-
        dere Shell-Programme schreiben auf die Standard-Ausgabe (auch standard out
        genannt), z. B. der folgende Befehl listet alle Pakete auf, die das Wort ’test’
        enthalten:
   1    zypper se test

        Probiere es aus.
        Mit dem Pipe-Symbol (|) kann man einen Shell-Ausgabestrom in ein anderes
        Programm umleiten. Ein Programm, das man oft auf die rechte Seite der Pipe
        schreibt ist grep, ein Suchprogramm.
        Beispiel:
   1    zypper se test | grep samba

        Jetzt werden nur noch Zeilen ausgegeben, die das Wort samba enthalten. Außer-
        dem wird das Wort hervorgehoben.

        Beispiele / Zufallszeichenketten

        Hier ein Programm, dass Zufallszeichenketten ausgibt:
   1    #!/ usr/bin/ python3
   2
   3    import random
   4
   5    i = 0
   6    while (True):
   7        s = ""
   8        for a in range (0, 20):
   9            c = random . randint (65 , 122)
   10           s += chr(c)
   11       print (str(i) + ":" + s)
   12       i += 1

        Speichere es in der Datei rand-chr.py und lass das Programm laufen.
        Dann probiere der Reihe nach folgende Zeilen aus und schaue, was passiert:
Kapitel 2. Programmier-Einstieg                                                     36 / 86

   1 ./rand -chr.py | grep 0000
   2 ./rand -chr.py | grep -i gre

       Übung

          • Suche mit grep nach deinem Namen in den Zufallsbuchstaben (nur die ersten
            3 Buchstaben, sonst könnte es länger dauern)

       Die Prozessorauslastung anschauen          Außer dem Strg+C kannst du ein
       Programm auch anders beenden. Drücke
       Strg+Esc
       um den System-Monitor zu öffnen. Damit kannst du unter anderem jedes Pro-
       gramm suchen und beenden (“kill”).
       Frage: Warum z. B. nur 25 % statt 100 %? (Tipp: verwende ksysguard, um
       herauszufinden, wieviele Prozessor-Kerne deine CPU hat.)

       Bonus: Reguläre Ausdrücke          (TODO: erklären was reguläre Ausdrücke
       sind)
   1 ./rand -chr.py | grep '\( abc \) \|\( def \) '
   2 ./rand -chr.py | grep -i -E '(abc)|( def)'
   3 ./rand -chr.py | grep -E '([ abcdefg ]abc)|( def .*a)'

       Für zuhause: Sprachausgabe

       Installiere das Programm espeak.
       Schreibe ein kleines Zähl-Programm, das Zahlen ausgibt und speichere es in der
       Datei counter.py.
   1   #!/ usr/bin/ python3
   2
   3 i = 0
   4 while (True):
   5     print (i)
   6     i += 1

       Probiere folgende Befehle aus:
   1 ./ counter .py | espeak
   2 ./ counter .py | espeak -vde
   3 ./ counter .py | grep --line - buffered 1111 | espeak -vde
Kapitel 2. Programmier-Einstieg                                                  37 / 86

     Interne Anmerkung

        • grep scheint nicht zu funktionieren, wenn das Python-Programm sleep ver-
          wendet, um die Ausgabegeschwindigkeit zu drosseln. Warum? -> Lösung:
          import sys, sys.stdout.flush()
Kapitel 3. FAQ                                                                     38 / 86

     Kapitel 3

     FAQ

     3.1 Die Kommandozeile

     Wenn man unter GNU/Linux mit der Kommandozeile Befehle absetzen möch-
     te, dann kommt üblicherweise die Bash zum Einsatz. Die Bash ist eine UNIX-
     Shell. Man sagt auch Konsole oder Kommandozeile dazu.
     Die folgenden Aufgaben zeigen, wie man die Bash startet und wie sie bedient
     wird. Wenn im Folgenden von ’Kommandozeile’ gesprochen wird, dann ist die
     Bash gemeint.

     3.1.1 Kommandozeile starten

     Unter KDE/Plasma:

        • Alt+Leertaste drücken (-> Die krunner-Leiste öffnet sich am oberen Bild-
          schirmrand)

        • konsole eingeben und das Suchergebnis entweder mit der Maus anklicken
          oder die ENTER-Taste drücken.

     Es öffnet sich ein Fenster mit schwarzem Hintergrund und hellem Text, z. B.:
     spiderman@linux - host1 :~>

     Diesen Text nennt man Prompt, also Eingabeaufforderung. Dahinter ist ein
     helles Rechteck zu sehen, das anzeigt, wo die Buchstaben erscheinen, die der
     Benutzer mit der Tastatur eingibt.
     Das Prompt setzt sich im Einzelnen so zusammen:

        • spiderman: Der Benutzername des eingeloggten Benutzers

        • @ (at-Zeichen): Trennzeichen

        • linux-host1: der Rechnername

        • : (Doppelpunkt): Trennzeichen
Kapitel 3. FAQ                                                                       39 / 86

        • ~ (Tilde): Das aktuelle Verzeichnis. Die Tilde steht für das Home-Verzeichnis
          (“Persönlicher Ordner”) des eingeloggten Benutzers.

        • > (Größer-als-Zeichen): Trennzeichen

        • Cursor: hier werden Benutzereingaben eingefügt

     3.1.2 Yakuake installieren

        • yakuake ist eine Konsole, die man mit der F12-Taste öffnen kann und die
          immer im Hintergrund bereit ist.

        • Installiere sie mittels zypper (Wie geht das?).

        • yakuake einmalig mit krunner (Alt+Leertaste, yakuake eingeben, ENTER)
          starten.

        • Ab jetzt kann yakuake mit der Taste F12 geholt und mit nochmaligem
          Druck wieder versteckt werden.

     3.1.3 Einstieg

        • Neue Zeichen, die über die Tastatur eingegeben erscheinen immer dort, wo
          sich der Cursor (ausgefülltes Rechteck) befindet

        • Befehle werden immer zeilenweise eingegeben und jeweils mit der ENTER-
          Taste abgeschlossen.

     Erste Befehle absetzen

        • Öffne eine Kommandozeile (siehe oben). Es erscheint die Eingabeaufforde-
          rung, die so ähnlich aussieht:
        1   user@linux -85 rg:~>

        • Gebe date über die Tastatur ein:
        1   user@linux -85 rg:~> date

        • Drücke ENTER. Das Ergebnis sieht ungefähr so aus:
        1   user@linux -85 rg:~> date
        2   So 2. Okt 20:26:40 CEST 2016

        • Glückwunsch! Du hast den ersten Kommandozeilen-Befehl abgesetzt.

        • Drücke nun Taste “Cursor hoch” (das ist die obere Pfeiltaste aus dem Pfeil-
          tastenblock auf der Tastatur) => der letzte Befehl erscheint wieder.

        • Drücke ENTER => Der Befehl wird erneut ausgeführt.
Kapitel 3. FAQ                                                                        40 / 86

       Konvention: das $-Prompt

       Wenn im weiteren Verlauf des Kurses ein Bash-Befehl abgesetzt werden soll, dann
       wird das kenntlich gemacht, indem vor dem Befehl ein $-Zeichen steht. Also z. B.
   1   $ date

       bedeutet, dass du wie im vorigen Abschnitt beschrieben den date-Befehl ausfüh-
       ren sollst (das $-Zeichen gehört also nicht zum Befehl dazu).

       Übung

          • Führe den Befehl
          1   $ ls

              aus. => Das aktuelle Verzeichnis wird aufgelistet.

          • Führe den Befehl
          1   $ ls -la

              aus. => Das aktuelle Verzeichnis wird ausführlicher aufgelistet.

       ------------- STOPP --------------

       Wenn du von der Primzahlenaufgabe hierher kamst, dann bist du mit dieser Seite
       erst einmal fertig und kannst wieder zurückgehen und dort weitermachen.
       ------------- STOPP --------------

       3.1.4 Dateien und Verzeichnisse

          • Umgang mit Dateien: http://www.selflinux.org/selflinux/html/dateien_unter_
            linux01.html

          • Umgang mit Verzeichnissen: http://www.selflinux.org/selflinux/html/verzeichnisse_
            unter_linux02.html

       Weiteres Material

          • Linux-Verzeichnisstruktur: http://www.selflinux.org/selflinux/html/verzeichnisse_
            unter_linux01.html

                • siehe auch https://de.wikipedia.org/wiki/Filesystem_Hierarchy_Standard

          • Command line crash course: https://learnpythonthehardway.org/book/appendixa.
            html
Kapitel 3. FAQ                                                                       41 / 86

       3.1.5 Erweitert

       Was ist eine Shell?

          • Lese dir das hier durch: SelfLinux - Was ist eine Shell?

          • Die Bash ist eine Unix-Shell. Eine Unix-Shell ist einer von vielen Komman-
            dozeileninterpretern, wie z. B. der Python-interpreter.

          • Die Kommandozeile ist einzeln, aber auch in vielen Programmen verfügbar,
            um schnell System-Befehle absetzen zu können. Die Funktionsweise ist dabei
            immer die gleiche.
               • Konsole (einzeln als Programm)
               • Yakuake (Taste F12)
               • in Dolphin (Taste F4)
               • in Kate (als Terminal-Plugin)

       Historie abrufen

       Strg+R

          • Mit den Cursor-Tasten ’rauf’ und ’runter’ kann man sich vorher eingegebene
            Befehle wieder holen.
          • Mit Strg+R kann man in der Historie suchen:

       1. Strg+R drücken 2. Worte eingeben 3. So lange Strg+R drücken, bis die ge-
       wünschte Befehlszeile gefunden wurde.

       $ history    Die Strg+R-Methode ist bei wenig Übung etwas hakelig. Folgendes
       geht auch:
   1   $ history

       oder direkt nach etwas suchen (z. B. nach “cowsay”):
   1   $ history | grep cowsay

       Tastenkürzel

       Bash

          • Strg+A - An den Anfang der Zeile
          • Strg+E - Ans Ende der Zeile
          • Strg+K - Alles rechts vom Cursor löschen
          • Strg+A K - Ganze Zeile löschen
          • Siehe http://www.selflinux.org/selflinux/html/bash_basic02.html#d27e146
Kapitel 3. FAQ                                                                     42 / 86

       Konsole / Yakuake

         • Strg+Umschalt+T - Neue Session (= neuen Tab) öffnen

         • Umschalt+Cursor rechts/links - Zwischen Sessions umschalten

         • Geteilte Ansicht (split view): rechte Maustaste auf Session-Name ->
           “Split Left/Right”

       Konsole in Dolphin

         • Dolphin öffnen

         • F4 drücken

         • cd und ls verwenden und beobachten wie sich die Ordner-Ansicht oben
           synchronisiert.

         • In der Ordner-Ansicht navigieren und beobachten wie sich die Konsole syn-
           chronisiert.

       Aktuelles Verzeichnis mit Dolphin öffnen

   1   $ xdg -open .

       Standardeingabe und -ausgabe

         • TODO: Crash-Kurs

         • cowsay

              • Etwas schreiben und mit Strg+D beenden

         • create file aaa:

       c2b1a3

         • sort < aaa

         • sort -k 1 < aaa

         • etc.

       mit Python       todo:

         • http://stackoverflow.com/questions/1450393/how-do-you-read-from-stdin-in-python

         • https://en.wikibooks.org/wiki/Python_Programming/Input_and_Output
Sie können auch lesen