Programmieren

Schlaufen

Wenn du komplexere Programme schreiben möchtest, wirst du oft einen Gruppe von Befehlen mehrmals ausführen wollen. Dafür kannst du Schlaufen verwenden. Am einfachsten zu verstehen ist wohl die for-Schlaufe. Sie führt den Schlaufeninhalt für jedes Element eines Vektros aus.

for i = 1:10 i end

Die erste Zeile definiert die i-Werte für die der Schlaufeninhalt ausgeführt werden soll. Statt 1:10 kannst jeden Vektor verwenden. Im Beispiel ist der Schlaufeninhalt nicht besonders spannend. Er gibt einfach die Zahl wieder aus.

Aufgabe 1

Passe das Beispiel oben so an, dass es die Quadratzahlen der Primzahlen unter 20 (1 3 5 7 11 13 17 19) berechnet. Natürlich ist das Beispiel etwas unnütz, denn du könntest das auch ohne Schlaufe. Wie?

Lösung Anzeigen

for i = [1 3 5 7 11 13 17 19] i^2 end % ohne for-Schlaufe: a = [1 3 5 7 11 13 17 19]; a.^2

Neben der for-Schlaufe, gibt es noch while-Schlaufen. Ausserdem kennt Octave noch do-until-Schlaufen. Beide sind sehr ähnlich. Sie führen die Befehle in der Schlaufe so lange aus, bis eine bestimmte Bedingung erfüllt ist. while prüft dabei vor dem ersten Durchlauf, do danach.

last = 1; this = 1; next = 0; while this < 20 next = last+this last = this; this = next; end % oder in Octave do next = last+this last = this; this = next; until this > 20

Aufgabe 2

Verwende eine der beiden Schlaufenarten um die Variable a = 2 so lange zu verdoppeln, bis sie grösser ist als 10000.

Lösung Anzeigen

a=2; while a < 10000 a = a*2 end % oder a=2; do a = a*2 until a > 10000

Aufgabe 3

Implementiere folgendes Programm:

  1. Lese eine beliebige natürliche Zahl a ein.
  2. Wiederhole folgendes solange bis du 1 erreichst (max. 1000 Wiederholungen)
    • Wenn die Zahl durch 2 teilbar ist, setze a = a/2
    • sonst setze a = 3*a + 1
  3. Gib nach jeder Wiederholung das aktuelle a aus.

Hinweise: Um zu bestimmen ob eine Zahl durch eine andere teilbar ist, kannst du den Befehl mod verwenden.

Lösung Anzeigen

% http://de.wikipedia.org/wiki/Collatz-Problem a = input('a = ') count = 0; while (a ~= 1) && (count < 1000) if (mod(a,2)==0) a = a/2 else a = 3*a+1 endif count = count+1; end disp('Total Schritte:') count

Aufgabe 4

Du wirst das Programm oben wohl für verschiedene Zahlen ausprobieren wollen. Dazu kannst du es mehrmals hinter einander starten. Es wäre aber eleganter, das Programm so lange zu wiederholen, bis du aufhören möchtest. Das erreichst du, in dem du das ganze Skript aus Aufgabe 3 in eine weitere Schleife verpackst, die so lange wiederholt wird, bis du zum Beispiel 0 eingibst.

Hinweise: Mit while 1 kannst du eine Endlosschleife erzeugen. Diese kannst du dann mit break gezielt unterbrechen.

Lösung Anzeigen

% collatz.m function count = collatz(a) count = 0; while (a ~= 1) & (count < 1000) if (mod(a,2)==0) a = a/2 else a = 3*a+1 end count = count+1; end % Hauptteil while 1 disp('Gib eine natürliche Zahl > 0 ein') a = input('a = ') if (a <= 0) break end c = collatz(a) disp('Total Schritte:') c end

Bedingte Befehlsabfolge 2: switch

Vollständigkeitshalber möchten wir hier noch eine weitere Möglichkeit zur bedingten Befehlsabfolge vorstellen. Komplexe if ... elseif Konstrukte lassen sich einfacher mit switch ... case implementieren.

switch x case 1 disp('x hat den Betrag 1') case {2,3,4} disp('x hat den Betrag 2,3 oder 4') otherwise disp('x hat weder den Betrag 1,2,3 noch 4') end

switch vergleicht den Wert eines Ausdrucks mit den Werten in den verschiedenen case. Das erste case,von dem einer der Werte mit dem Ausdruck übereinstimmt, wird ausgeführt. Ein case kann mehrere Werte haben. Es wird maximal ein case ausgeführt. Stimmt keiner der Werte mit dem Ausdruck überein, so werden die unter otherwise aufgelisteten Befehle abgearbeitet. (Falls otherwise existiert.)

Aufgabe 5

Programmiere eine Funktion temp = temperatur(skala,T), welche die Temperaturen von der Kelvin-, Rankine- oder Fahrenheit-Skala in die Celsius-Temperatur umrechnet.

Die Temperaturskala und der Wert in dieser Skala sind die Eingabeparameter der neuen Funktion. Verwende switch ... case um die korrekte Formel für die Umrechnung zu bestimmen.

Lösung Anzeigen

% temperatur.m function temp = temperatur(skala,T) switch skala case 'K' % Kelvin-Skala temp=T-273.15; case 'R' % Rankine-Skala temp=5/9*T-273.15; case 'F' % Fahrenheit-Skala temp=5/9*(T-32); end % Aufruf: temperatur('F', 100)