Zum Hauptinhalt springen
Version: 28Gb

1. Intro

Algorithmus

«Ein Algorithmus beschreibt die Methode, mit der eine Aufgabe gelöst wird. Ein Algorithmus besteht aus einer Folge von Schritten, deren korrekte Abarbeitung die gestellte Aufgabe löst. Die Abarbeitung oder den Vorgang selbst bezeichnet man als Prozeß.»

Les Goldschlager/Andrew Lister: Informatik, 1984

Damit wir von einem Algorithmus sprechen, müssen also zwei Bedingungen erfüllt sein:

  1. Es muss eine Schritt-für-Schritt-Anleitung vorliegen.
  2. Diese Schritt-für-Schritt-Anleitung muss eine Aufgabe oder ein Problem lösen.

Struktur

Ein Algorithmus definiert, in welcher Reihenfolge die einzelnen Schritte nacheinander abgearbeitet werden. Die Beschreibung dieser Reihenfolge ist die Struktur des Algorithmus. Während die Einzelschritte je nach Anwendungsgebiet unterschiedlich sind, sind die Strukturen (beim Programmieren spricht man von Kontrollstrukturen) von Algorithmen universell.

Folgende Strukturen können unterschieden werden:

Sequenz 👣
eine Folge von Schritten/Anweisungen, die nacheinander abgearbeitet werden.
from turtle import *

forward(100)
left(120)
forward(100)
left(120)
forward(100)
left(120)
Wiederholung 🔁
Einer oder mehrere Schritte werden eine bestimmte Anzahl mal wiederholt.
from turtle import *

for i in range(3):
forward(100)
left(120)
Bedingte Ausführung ⑂
Einer oder mehrere Schritte werden nur ausgeführt, wenn eine bestimmte Bedingung erfüllt ist.
from random import randint

zahl1 = randint(1, 10)
zahl2 = randint(1, 10)
antwort = input(f'{zahl1} * {zahl2} = ? ')
antwort = int(antwort)
lösung = zahl1 * zahl2
if antwort == lösung:
print(f'😎 Richtig! {zahl1} * {zahl2} = {lösung}')
else:
print(f'🥸 {antwort} ist Falsch! {zahl1} * {zahl2} = {lösung}')
Unterprogramm 🏷
Eine Sequenz kann mit einem Namen versehen werden. Anstatt immer die ganze Sequenz aufzuschreiben, kann der Name angegeben werden.
from turtle import *
def dreieck():
for i in range(3):
forward(100)
left(120)
dreieck()
left(90)
dreieck()
Parameter ⊕ ⊖
Das Ergebnis eines Algorithmus kann variiert werden durch Werte, welche bei jeder Ausführung neu festgelegt werden.
from turtle import *
def dreieck(seitenlänge, farbe):
color(farbe)
for i in range(3):
forward(seitenlänge)
left(120)
dreieck(100, 'blue')
dreieck(50, 'red')

Schleifen

Mit Schleifen können Anweisungen wiederholt ausgeführt werden, ohne dass diese mehrfach aufgeschrieben werden müssen. Es gibt zwei Arten von Schleifen:

  • Zählschleifen: Die Anzahl der Wiederholungen ist im Voraus bekannt.
  • Bedingte Schleifen: Die Anzahl der Wiederholungen ist nicht im Voraus bekannt, sondern hängt von einer Bedingung ab.

Bisher haben wir nur Zählschleifen - die for-Schleife - kennengelernt.

Die for-Schleife

from turtle import *

for i in range(5):
forward(100)
left(72)

Das i in der Schleife ist der sog. Schleifenzähler. Er wird bei jeder Wiederholung um 1 erhöht und beginnt standardmässig bei 0. Der Schleifenzähler kann innerhalb der Schleife verwendet werden.

from turtle import *

for i in range(5):
forward(10 * i) # Die Länge der Linie hängt vom Schleifenzähler ab
left(90)
Beachte

Es gibt nur 4 gezeichnete Linien, da der Schleifenzähler bei 0 beginnt und bis 4 geht (was auf Z. 4 Seitenlängen von 0, 10, 20, 30, 40 erzeugt).

for i in range(start, stopp):

Die for-Schleife kann auch mit zwei Parametern verwendet werden: start und stopp. Der Schleifenzähler beginnt dann bei start und läuft bis stopp - 1.

from turtle import *

for i in range(1, 6): # Schleifenzähler läuft von 1 bis 5
forward(10 * i)
left(90)
Merke

Bei der for-Schleife muss bereits im Voraus bekannt sein, wie oft die Schleife durchlaufen werden soll.

Die while-Schleife

Die while-Schleife ist eine bedingte Schleife, ein Code-Block wird so lange wiederholt, wie eine bestimmte Bedingung erfüllt ist. Zähl-Schleifen können immer auch mit einer while-Schleife realisiert werden - es braucht dazu aber eine zusätzliche Variable, die den Zählerstand speichert.

for-Schleife
from turtle import *


for i in range(4):
forward(100)
left(90)
while-Schleife
from turtle import *

i = 0
while i < 4:
forward(100)
left(90)
i = i + 1
Beachte
Z. 3
Der Schleifenzähler i wird initialisiert (auf 0 gesetzt).
Z. 4
Die Bedingung der Schleife. Solange i kleiner als 4 ist, wird die Schleife ausgeführt.
Z. 8
Der Schleifenzähler wird um 1 erhöht.
Achtung: -Schleifen!

Wenn die Bedingung der while-Schleife niemals falsch wird, läuft die Schleife unendlich weiter. Dann muss der Tab geschlossen und erneut geöffnet werden!

for zu while

Schreiben Sie das untenstehende Programm so um, dass nur noch while Schleifen verwendet werden.

from turtle import *

left(60)

for i in range(5):
forward(100)
left(72)
backward(20)
from turtle import *
Laden...

Die eigentliche Stärke der while-Schleife liegt aber darin, dass die Anzahl Wiederholungen im Voraus nicht bekannt sein muss. Die Schleife läuft so lange, bis eine bestimmte Bedingung erfüllt ist.

Obiges Kopfrechnen-Beispiel könnte mit einer while-Schleife zu einem Kopfrechnen-Trainer erweitert werden, der so lange neue Aufgaben stellt, bis x eingegeben wird:

from browser import alert
from random import randint
antwort = ''
while antwort != 'x':
zahl1 = randint(1, 10)
zahl2 = randint(1, 10)
antwort = input(f'{zahl1} * {zahl2} = ? (x zum Beenden) ')
if antwort != 'x':
antwort = int(antwort)
lösung = zahl1 * zahl2
if antwort == lösung:
alert(f'😎 Richtig! {zahl1} * {zahl2} = {lösung}')
else:
alert(f'🥸 {antwort} ist Falsch! {zahl1} * {zahl2} = {lösung}')

Anwendung

Die while-Schleife kommt oft bei Benutzerinteraktionen, Simulationen oder bei sich dynamisch ändernden Daten vor. Sonstige Wiederholungen lassen sich normalerweise einfacher mit einer for-Schleife umsetzen.

Erkenntnis
while-Schleife
Die while-Schleife wird immer dann verwendet, wenn die Anzahl Wiederholungen im Voraus unbekannt ist.
for-Schleife
Ist die Anzahl Wiederholungen im Voraus bekannt, wird meistens die for-Schleife verwendet.