Subsections


6.2 Auswahl

In Programmen ist es häufig notwendig, Entscheidungen zu treffen, welche Strukturblöcke abgearbeitet werden sollen. Man trifft dabei mit Hilfe von logischen Ausdrücken, sogenannten Bedingungen, Entscheidungen, die den Ablauf eines Programms direkt beeinflussen.

Dafür gibt es in jeder Programmiersprache sogenannte Steueranweisungen, die die einzelnen Anweisungsblöcke einrahmen. Diese definieren den Beginn und das Ende der Steueranweisung und regeln den Ablauf innerhalb des Steuerkonstrukts.

In MATLAB gibt es für Entscheidungen zwei Strukturen, den sogenannten IF-Block oder die Auswahlanweisung, die in der Folge an konkreten Beispielen besprochen werden.


6.2.1 IF-Block

Die einfachste Form des IF-Blocks ist die einseitig bedingte Anweisung, die die bedingte Ausführung eines Anweisungsblocks erlaubt.

 if Bedingung
    Anweisungsblock
 end
Diese Form wird häufig auch in einer einzeiligen Version geschrieben:
if Bedingung, Anweisung; end

Diese einfachste Form kann durch beliebig viele elseif Anweisungen und maximal eine else Anweisungen erweitert werden. In ihrer vollständigen Form hat der IF-Block daher die folgende Form:

 if Bedingung 1
    Anweisungsblock 1
 elseif Bedingung 2
    Anweisungsblock 2
 ...
 else
    Anweisungsblock n
 end

MATLAB EXAMPLE:
Das Programmfragment erkennt, ob eine Zahl $ x$ durch 2 und 3, bzw. nur durch 2 oder nur durch 3 oder gar nicht durch 2 und 3 teilbar ist.

if mod(x,2)==0 & mod(x,3)==0
    disp('Durch 2 und 3 teilbar!')      
elseif mod(x,2)==0
    disp('Nur durch 2 teilbar!')          
elseif mod(x,3)==0
    disp('Nur durch 3 teilbar!')              
else
    disp('Nicht teilbar!')
end
Mit dem Befehl mod(a,b) wird die Modulodivision $ a/b$ durchgeführt. Wenn diese Null ergibt ist die Zahl $ a$ durch $ b$ teilbar.

Es wird immer nur ein Anweisungsblock ausgeführt, obwohl die Bedingungen bei mehreren erfüllt sein können.

Folgende wichtige Regeln gelten für IF-Blöcke:


6.2.2 Auswahlanweisung

Die Auswahlanweisung ist dem IF-Block sehr ähnlich und ermöglicht die Ausführung maximal eines Blocks von mehreren möglichen Anweisungsblöcken. Eine Auswahlanweisung hat folgende Form:

 switch Schalter
 case Selektor 1 
    Anweisungsblock 1
 case Selektor 2 
    Anweisungsblock 2
 ...
 otherwise 
    Anweisungsblock 2
 end

Bei der Verwendung ist Folgendes zu beachten:

MATLAB EXAMPLE:

switch sign(x)
case -1
    disp('x<0')
case 1
    disp('x>0')
case 0
    disp('x==0')
end

switch sign(x)
case -1
    disp('x<0')
case 1
    disp('x>0')
otherwise
    disp('x==0')
end
Dieser Programmteil zeigt an, ob die Zahl $ x$ kleiner, gleich oder größer Null ist.

Als Schalter dient dafür die Signum-Funktion sign.

Im zweiten Teil wird wird an Stelle des dritten Falles einfach otherwise verwendet, da es sonst keine Möglichkeiten mehr gibt.

MATLAB EXAMPLE:

switch str
case 'a'
    disp('Fall a')
case 'b'
    disp('Fall b')
case {'c','d','e'}
    disp('Fall c, d, oder e')
otherwise
    disp('Nicht bekannt!')
end
Dieser Programmteil zeigt an, ob ein String str gleich einem bestimmten Buchstaben ist.

Als Schalter dient dafür einfach der String str.

Im dritten Fall wird eine Liste zum Vergleich herangezogen. Listen werden in MATLAB mit dem Klammerpaar {} umschlossen.

MATLAB EXAMPLE:

function [tage] = tagepromonat(monat,jahr)
sj = 0;
switch jahr > 1582
case 1
    if mod(jahr,  4)==0, sj=1; end
    if mod(jahr,100)==0, sj=0; end
    if mod(jahr,400)==0, sj=1; end
end

switch monat
case {4,6,9,11},        tage = 30;
case {1,3,5,7,8,10,12}, tage = 31;
case 2
    switch sj
    case 0, tage = 28;
    case 1, tage = 29;
    end
otherwise
    tage = 0; error('Falscher Monat');
end
Dieses kleine Unterprogramm berechnet die Tage pro Monat in einem beliebigen Jahr unter Berücksichtigung der Schaltjahre ab der Kalenderreform im Jahr 1582.

An diesem Beispiel sieht man die Verschachtelung von switch-case- und if-Strukturen.

Wenn in der Zeile Platz ist, können die Keywörter und die Befehle in einer Zeile stehen. Als Trennzeichen wird dann der Beistrich verwendet.

Winfried Kernbichler 2005-04-26