Navigation

A) While-Schleifen

Schleifen sind ein Programmierkonzept, mit dem man eine Abfolge von Befehlen in Abhaengigkeit von einem Kriterium mehrfach wiederholen kann.
Insofern gibt es eine starke Aehnlichkeit zu Fallunterscheidungen (if-Abfragen): die Befehle werden nur dann ausgefuehrt, wenn ein Kriterium erfuellt ist.
Im Gegensatz zu Fallunterscheidungen erfolgt diese Ausführung bei Schleifen jedoch normalerweise nicht nur einmal, sondern wird solange wiederholt, bis die Bedingung nicht mehr erfüllt ist. (Beim Kochrezept ist das der Unterschied zwischen "je nach Geschmack Zucker oder Salz beifuegen" und "Ruehren, bis sich alle Klumpen aufgeloest haben".)

T4A1) Kommen wir nochmal zurueck zu unserem hungrigen Studenten... Bei sehr hungrigen Studenten reicht eventuell ein Nachschlag nicht. In diesem Fall lautet der Algorithmus:

Bestimme das Gewicht
Solange Gewicht<300g
  sage "Noch einen Nachschlag bitte"
  und bestimme das neue Gewicht.
Dann: nimm den Teller 

 Uebertragung in Matlab sieht das so aus:

Gewicht=input('Gewicht? ');
while Gewicht<300
   disp('Noch einen Nachschlag bitte')
   Gewicht=input('Neues Gewicht? ');
end
disp('Teller nehmen')

Probieren Sie das Programm aus. Erweitern Sie es so, dass der Student eine pampige Antwort gibt, wenn der Koch etwas vom Teller herunternimmt, statt einen Nachschlag dazu zu legen.

T4A2) In einer While-Schleife werden solange Befehle ausgeführt, bis eine Abbruchbedinung erfüllt ist.  Warum geht folgende Schleife schief?

a=1; b=10;
while a<b
  b=2*b
end
sprintf('a=%g, b=%g',a,b)

 Wenn Sie diese Schleife ausprobieren: Man kann Matlabprogramme mit ctrl-C abbrechen!

T4A3) rand(1) erzeugt eine Zufallszahl zwischen 0 und 1. Schreiben Sie eine Funktion, die eine Zahl als Eingabeargument bekommt und solange Zufallszahlen auf dem Bildschirm ausgibt, bis die gezogene Zufallszahl groesser als die vom Benutzer der Funktion übergebene Zahl ist. Denken Sie daran, eine Abfrage zu machen, ob die Eingabe des Benutzers sinnvoll ist.
 

B) For-Schleifen

Prinzipiell reichen while-Schleifen fuer alle Anwendungen. Haeufig weiss man jedoch im vorhinein, wieviele Schritte erledigt werden muessen. In diesen Faellen ist es praktischer, eine Zaehlschleife zu benutzen. Diese wird in Matlab durch das Schluesselwort for gestartet und benutzt den Doppelpunktoperator, um den zu betrachtenden Zahlenbereich festzulegen.

T4B1)  Probieren Sie folgendes Programm aus und uebertragen Sie es in eine while-Schleife:

aktuell=1;
for z=1:1:10
  aktuell=aktuell*z;
  sprintf('aktueller Wert: %i ',aktuell)
end
 

T4B3) Der (uns ja schon lange bekannte) Doppelpunkt-Operator ist eine implizite for-Schleife. Schreiben Sie mit Hilfe von for-Schleifen neue Versionen der alten Aufgaben:
a) eine Funktion, die die Werte auf der Diagonalen einer quadratischen Matrix zurueckgibt
b) Erzeugen Sie ein 8*8 Schachbrett aus 0 und 1 und sehen es mit imagesc an.
*) Erzeugen Sie spasseshalber auch ein 25*25 Schachbrett und sehen es an. 

T4B4) Was ist der Unterschied zwischen dem Doppelpunktoperator und for-Schleifen? Faellt Ihnen ein Beispiel ein,  das man mit einer for-Schleife loesen kann, aber nicht mit einem Doppelpunktoperator? Gibt es auch umgekehrte Beispiele?

T4B5) Schleifen haben nicht nur Vorteile... in Matlab haben sie den massiven Nachteil, dass sie Programme sehr langsam machen koennen (insbesondere geschachtelte Schleifen.) Deshalb ist es immer eleganter, fuer ein Problem eine Loesung mit Matrixoperationen zu finden als mit Schleifen. Wir probieren das hier mal aus. Die Befehlskombination
tic
Befehle
toc
gibt auf dem Bildschirm aus, wieviel Zeit zwischen tic und toc, also beim Abarbeiten der Befehle vergangen ist. Benutzen Sie tic und toc, um zu untersuchen, wie schnell sich eine 1000 x 1000 Matrix aus lauter Nullen erzeugen laesst. Erzeugen Sie diese Matrix:
a) Mit dem Befehl zeros
b) Mit einer Schleife
c) Mit zwei geschachtelten Scheifen
d) Gibt es einen Unterschied, wenn man for oder while benutzt?

 


D) Hausaufgabe:

Aufgaben zum Schleifen-Ueben (suchen Sie sich welche aus):

Kleiner Tipp: Manche der Aufgaben lassen sich auch ohne Schleifen ganz gut loesen.

T4H1) Erzeugen Sie noch einmal eine Multiplikationstabelle fuer das kleine Einmaleins - diesmal mit Schleifen. 

T4H2) Schreiben Sie eine Funktion, die in einem beliebigen Vektor die Reihenfolge der Elemente umdreht. Z.B. aus [19 7 30] wird [30 7 19].

*T4H3) Nach der Legende soll der Erfinder des Schachspiels von seinem Koenig eine grosse Belohnung versprochen bekommen haben. Der Erfinder wuenscht sich fuer das erste Feld des Schachbretts ein Reiskorn, fuer das zweite zwei, fuer das dritte vier usw. in Verdoppelungen bis zum 64. Feld. Zunaechst ist der Koenig verstimmt, weil er dies fuer eine sehr geringe Belohnung haelt, tatsaechlich treibt ihn seine Zusage in den Ruin. Wieviele Reiskoerner schuldet der Koenig dem Erfinder und wieviele Tonnen Reis sind das, wenn man 0.05g pro Korn annimmt?

*T4H4) Schreiben Sie eine Funktion, die eine positive ganze Zahl N als Eingabe bekommt und N mal "diese Aufgabe ist langweilig" auf dem Bildschirm ausgibt.
Erweitern Sie diese Funktion so, dass sie bei geraden N stattdessen schreibt "diese Aufgabe ist gerade langweilig".

T4H5) Programmieren Sie ein Ratespiel, in dem ein Matlabprogramm mit so wenigen ja/nein Fragen wie moeglich eine ganze Zahl zwischen 1 und 20 erraet, die Sie sich ausdenken.
*) Erweitern Sie Ihr Programm so, dass das Matlabprogramm ueberprueft, ob Sie beim Antworten mogeln. 

 

*T4H6) Schreiben Sie eine Funktion mit den beiden Eingabeargumenten Zeilen und Spalten. Diese Funktion soll eine mit zweistelligen Dezimalzahlen gefuellte Matrix zurueckgeben,  die gerde dem Indexpaar des jeweiligen Eintrags entsprechen, also z.B.

 11  12  13  14
 21  22 23   24


Erweitern Sie Ihre Funktion so, dass Sie meckert, wenn der Benutzer eine Spaltenzahl >9 eingibt (denn dann wird die Sache sehr haesslich.)
 

*T4H7) Man kann mit Matlab auch wunderschoen farbige Flaechen und geometrische Figuren erzeugen.

a) machen wir zunaechst mal einen Kreis:
degrad = pi/180;
w=0:1:360;
si=sin(w*degrad);
co=cos(w*degrad);
plot(co,si)

Wenn man das ausprobiert, sieht dieser Kreis ziemlich eirig aus. axis equal macht die Axen quadratisch, so dass es schoener anzuschauen ist.
Einen geschlossenen Linienzug wie diesen Kreis kann man mit dem Befehl fill(x,y,farbdef) mit einer Farbe ausfuellen. Probieren Sie, den Kreis mit einer huebschen Farbe zu fuellen.
b) Zeichnen sie mehrere verschieden grosse Kreise ineinander, die mit verschiedenen Farben gefuellt sind.
c) Verschieben sie das Zentrum der Kreise gegeneinander, so dass ein dreidimensionaler Eindruck entsteht. (Wahrscheinlich sieht man das am besten bei sehr vielen nicht gefuellten Kreisen)
d) Wie zeichnet man ein Quadrat? Probieren Sie die Aufgaben a,b,c ebenfalls mit Quadraten verschiedener Groesse aus.

Interessantere Aufgaben:

**T4 H8) Um ein N-Eck mit zu zeichnen, kann man sich daran orientieren, wie in T5_H7 ein Kreis gezeichnet wird. Dieser ist naemlich genaugenommen ein 360-Eck.
a) Zeichnen Sie in gleicher Weise ein 3-Eck, ein 7-Eck und ein 25-Eck.
b) Probieren Sie aus, wie man die Groesse und die Richtung dieser Figuren aendert. 
c) Man muss das Programm nur geringfuegig veraendern, um einen in einem Zug gezeichneten fuenfzackigen Stern zu zeichnen. Wie?
d) Zeichnen Sie einen huebschen Sternenhimmel mit verschieden grossen, bunt gefuellten Sternen mit verschieden vielen Ecken vor dunkelem Hintergrund.
e) Fuer die Freaks: Zeichnen Sie Ihre Stern an zufaellige Orte auf den Himmel (eine Zufallszahl erzeugt man mit x=randn(1)). Stellen Sie dabei sicher, dass die verschiedenen Sterne sich nicht ueberlagern. 

** T4H9) (Wird spaeter weiterverwendet) Sie haben die Aufgabe, jeweils 10 maennliche und 10 weibliche Kohlmeisen, Amseln und Rotkehlchen zu fangen, zu beringen und ihr Gewicht zu bestimmen. Schreiben Sie eine Funktion, das diese Arbeit fuer Sie erledigt und eine Tabelle zurueckgibt, die fuer die 60 Tiere jeweils die Nummer des Ringes (aufsteigend von 1 bis 60 nach Fangreihenfolge), die Vogelart, das Geschlecht und das Gewicht enthaelt. Nutzen Sie dabei jeweils einen Zahlencode (z.B. Kohlmeise=1, Amsel=2, Rotkehlchen=3), der im Kommentar des Programms genau dokumentiert ist.
Die Voegel "fangen" Sie mit folgender Funktion [vogelfang.m], die mit [Art,Weibchen,Gewicht]=vogelfang aufgerufen wird und Ihnen zufaellige Voegel ins Netz flattern laesst. (Diese Funktion muessen Sie jetzt noch nicht verstehen sondern nur benutzen, wir besprechen sie am uebernaechsten Kurstag).
Rueckgabewerte: Art ist eine Zeichenkette, Weibchen ist ein Wahrheitswert zur Angabe des Geschlechts, Gewicht ist eine Zahl (in g)
Wenn Sie einen Vogel fangen, den Sie fuer Ihre Statistik nicht brauchen, lassen Sie ihn frei, ohne seine Daten aufzunehmen.

  Zum 5. Kurstag

Webmf3ynaster: Jutta Kretzbggqerlzq7gk5 (juttays.kret/dzberigvtmg@uouyl.de) (Stand: 07.11.2019)