#!/usr/bin/env python # coding: utf-8 # # Was ist Programmieren? # # Nach diesem Streifzug durch einige einführende Beispiele stellt sich die Frage, # was "Programmieren" überhaupt sein soll? # Die einfachste Antwort ist, dass es die # # > Übersetzung eines Algorithmus in eine für die Maschine (aka "Computer") verständliche Form ist. # # Was ist dann ein **Algorithmus**? # # > Das ist eine Vorschrift, wie ein ein gegebenes Problem mittels klar definierter Anweisungen gelöst werden kann. # # Wichtig ist, dass jeder Schritt explizit und direkt abläuft, # und sie jeweils auf eindeutigen und klaren Definitionen basieren. # Jede Ausführung des Algorithmus basiert auf Eingabedaten, # welche die jeweilige Instanz des zu lösenden Problems bestimmen. # Nur auf Basis dieser Daten kann das Ergebnis berechnet werden. # Abschließend sollte die Ausgabe des Ergebnisses wieder in einer für den Menschen lesbaren Form geschehen (Textdatei, Grafik, ...). # Eine **Programmiersprache** ist das Zwischenstück, # um einem Computer so einen Algorithmus beizubringen. # Es handelt sich damit um das Kernelement, # warum Computer überhaupt für den Menschen nutzbar wurden # und warum sie so eine hohe Flexibilität aufweisen. # # Mittels der Programmiersprache muss es möglich sein, # sowohl die Eingeabedaten als auch den Ablauf des Algorithmuses repräsentieren zu können. # Intern verarbeitet ein Computer ausschließlich binär codierte Daten und Befehle, # welche für den Menschen nicht aussagekräftig sind. # Dies sind die sogenannten "Bits", welche `True`/`False` bzw. `1`/`0` Werte annehmen können. # 8er Gruppen von Bits sind Bytes und Gruppen von Bytes werden zum Repräsentieren von Text, Zahlen und Rechenoperationen verwendet. # # Daher ist es wichtig zu verstehen, # dass der Zweck einer Programmiersprache darin besteht, # eine für den Menschen lesbare Form des Programmes anzugeben, # welche dann in eine für die Maschine verständliche Form übersetzt oder interpretiert wird. # ## Kontrollstrukturen und Funktionen # # Um den Ablauf des Algorithmus im Detail programmieren zu können, # muss eine *imperative* Programmiersprache **Kontrollstrukturen** (engl. "control structures") bereitstellen. # Der lineare Ablauf einer Liste von Befehlen wird dabei zu einem komplexeren Ablauf, # welcher aus # # * bedingten Verzweigungen (Entscheidungen), # * Wiederholungen (Schleifen, Iterationen, ...) # * aufrufbaren Codeblöcken (Funktionen, Methoden) # * und anderem (Coroutinen, Threads, ...), etc. # # besteht. # # Da sich während des gesamten Ablaufs Teilstrukturen wiederholen können, # gibt es für *prozedurale* Programmiersprachen die Möglichkeit, # den gesamten Code in kleinere Blöcke zu separieren und nach Bedarf aufzurufen. # Das wird "**Funktion**" genannt. # # Die Kunst besteht darin, # diese Basiselemente geschickt zu kombinieren, # damit das Programm für alle zulässigen Eingabewerte das richtige und gewünschte Ergebnis ausgibt. # ## Daten und Datenstrukturen # # Daten in einem Programm bestehen aus elementaren Basistypen und daraus zusammengestellten Datenstrukturen. # # In Python sind die wichtigsten Basistypen: # # * Wahrheitswert (bool): entweder `True` oder `False`. # * Nichts: `None` ist der Wert, der für nichts/leer steht. # * Integer (int/long): eine Ganzzahl beliebiger Größe, z.B. `231425232` # * Fließkommazahl (float): eine beschränkte Fließkommazahl, z.B. `3.1415`, mit Basis und Exponenten, also `3e9` steht für $3 \times 10^9$. # # Darüber hinaus gibt es auch noch komplexe Zahlen, z.B. `2+3j` (`j` ist die Wurzel aus -1) # # Eine gute Repräsentation der Daten ist die zweite elementare Zutat für ein Programm. # Im elementarsten bestehen Daten aus binären Datenblöcken, # welche durch eine Namensgebung für den Programmierer eine Bedeutung bekommen (Variablenwert und Variablenname). # Diese Datenblöcke können zu komplexeren Strukturen zusammengesetzt werden: # # * Listen: eine lineare, geordnete Struktur (Vektor) # * Assoziative Listen: Jeder Eintrag erhält einen eindeutigen Namen, unter dem er abgerufen werden kann (surjektiv) # * Verschachtelungen: ein Eintrag einer assoziativen Liste kann eine Liste sein, etc. # * Mengen: jedes Element kommt nur einmal vor # * ... und viele Spezialstrukturen: typisierte Vektoren, Matritzen; Graphen, Bäume; kreisförmige Strukturen, etc. # # Werden bestimmte Datenstrukturen immer wieder verwendet, # so bietet die Programmiersprache Python sogenannte "Klassen" (engl. `class`) an, # um diese Strukturen einen Namen zu geben und auf Abruf immer wieder verwenden zu können. # Dies sind benannte Strukturen, welche neben den Daten auch darauf abstimmte Funktionen beinhalten können - diese Funktionen nennt man dann "Methoden". # So eine benannte Datenstruktur ist dann ein **Datentyp**, # welcher erlaubt komplexere Konzepte in einem für den Menschen verständliche Art zu implementieren -- # wobei gleichzeitig die darunterliegende Binärstruktur für den Computer verständlich bleibt. # ### Beispiel: Datenstruktur eines Bruchs. # # Ein Bruch besteht aus einem Nenner und einem Zähler, # welche jeweils Ganzzahlen sein sollen. # Ein Datentyp "`Bruch`" fasst nun diese beiden Ganzzahlen zusammen. # Eine mit diesem Datentyp assoziierte Funktion "`add`" würde es erlauben, # zwei Brüche korrekt miteinander zu addieren, # indem `add` als Argument einen anderen Bruch erhält und die Rückgabe dieser Methode ein neuer `Bruch` -- eben die Summe -- ist. # ## Links # # * [What Is Programming?](http://interactivepython.org/courselib/static/pythonds/Introduction/WhatIsProgramming.html) # * [Wikipedia: Algorithm](http://en.wikipedia.org/wiki/Algorithm) # * [Wikipedia: Computer Program](http://en.wikipedia.org/wiki/Computer_program)