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.
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?
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
Verwende eine der beiden Schlaufenarten um die Variable a = 2 so lange zu verdoppeln, bis sie grösser ist als 10000.
a=2; while a < 10000 a = a*2 end % oder a=2; do a = a*2 until a > 10000
Implementiere folgendes Programm:
a = a/2
a = 3*a + 1
Hinweise: Um zu bestimmen ob eine Zahl durch eine andere teilbar ist,
kannst du den Befehl mod
verwenden.
% 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
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.
% 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
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.)
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.
% 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)