CompMath-Vorlesung 30.10.2020

Einfuehrung in die strukturierte Programmierung: Alternative, Zaehlzyklus

Contents

Sequenz

clear; clc;
x = linspace(0,pi,21);
y = sin(x);
plot(x,y)

Alternative [IF-THEN-ELSE]

clear; clc;

Einseitige Alternative

x = 4;
% x = input('Eingabe x: ');
if  x~=0
    disp(['x = ',num2str(x),'  ist ungleich Null.']);
end

% und jetzt zusaetzlich mit logischen Operatoren
if x>0 && mod(x,2)==0
     disp(['x = ',num2str(x),'  ist eine positive gerade Zahl.']);
end;
x = 4  ist ungleich Null.
x = 4  ist eine positive gerade Zahl.

Zweiseitige Alternative

x = 4;
% x = input('Eingabe x: ');
if  x~=0
    s = 'ungleich';
    y = 1/x;
else
    s = 'gleich';
    y = nan;
end
disp(['x = ',num2str(x),'  ist ',s, ' Null.']);
disp(y);
x = 4  ist ungleich Null.
    0.2500

Mehrseitige Alternative

fb = 33;
% fb = input('\nFeinstaubkonzentration in �g/m^3: ');

if  fb > 50
    s = ' kein Auto fahren.';
elseif  fb > 5
    s = 'naja';
elseif  fb >= 0
    s = 'sauber';
else
    s = 'Messfehler';
end

disp(['Einschaetzung: ',s]);
Einschaetzung: naja

Auswahlkriterium [SWITCH]

clear; clc;

name_monat = {'january', 'february','march','april','may','june','july','august','september','october','november','december'};

monat = 3;
% monat = input('Monatsnummer: ');

switch monat
    case {4,6,9,11}
        tage = 30;
    case {1,3,5,7,8,10,12}
        tage = 31;
    case 2
        tage = 28;          % Achtung: Schaltjahr muss noch beruecksichtigt werden!!
    otherwise
        tage = 0;           % entspricht Fehler
end

if  tage ~=0
    disp([name_monat{monat}, ' has ', num2str(tage), ' days.']);
else
    disp('Eingabefehler!!');
end
march has 31 days.

Zaehlzyklus [FOR-Loop]

Demo einfacher FOR-Schleifen

Summe ungerader natuerlicher Zahlen bis 10
clc; clear

Variante 1

summe = 0;
n = 10;
for i = 1:2:n           %  fuer allg. n
    summe = summe+i;
end
disp(['Summe1 = ',num2str(summe)]);
Summe1 = 25

Variante 2

summe = 0;
for i = [9 3 5 7 1]     %  nicht fuer allg. n
    summe = summe+i;
end
disp(['Summe2 = ',num2str(summe)]);
Summe2 = 25

Variante 3

summe = 0;
for i = linspace(1, 9, 5)     %  fuer allg. n moeglich
% for i = linspace(1, n-1+mod(n,2), (n+mod(n,2))/2 )     %  fuer allg. n möglich
    summe = summe+i;
end
disp(['Summe3 = ',num2str(summe)]);
Summe3 = 25

Variante 4

summe = 0;
n = 10;
for i = 1:1:n           %  fuer allg. n
    if mod(i,2)==1
        summe = summe+i;
    end
end
disp(['Summe4 = ',num2str(summe)]);
Summe4 = 25

Range-For

x = rand(1,20);
summe = 0;
n = 10;
for v = x           %  fuer allg. n
    summe = summe+v;
end
disp(['Summe5 = ',num2str(summe)]);
disp(['Sum  5 = ',num2str( sum(x) )]);
Summe5 = 10.2225
Sum  5 = 10.2225

geschachtelte Zyklen: Hilbertmatrix

$H_{i,j} := \frac{1}{i+j-1}$

clc; clear
n = 10;
% Speicher reservieren
H(n,n) = 0;
% H = zeros(n,n)

for row=1:n
    for col=1:n
        H(row,col) = 1/(row+col-1);
    end
end

Hilbert matrix: Symmetrie ausnutzen

Es gilt H_(i,j) == H_(j,i)  ==> symmetrische Matrix
clc; clear
n = 5;
% Speicher reservieren
H(n,n) = 0;
% H = zeros(n,n)           % auch moeglich

for row=1:n
    for col=row:n
        H(row,col) = 1/(row+col-1);
        H(col,row) = H(row,col);
    end
end
H
H =

    1.0000    0.5000    0.3333    0.2500    0.2000
    0.5000    0.3333    0.2500    0.2000    0.1667
    0.3333    0.2500    0.2000    0.1667    0.1429
    0.2500    0.2000    0.1667    0.1429    0.1250
    0.2000    0.1667    0.1429    0.1250    0.1111

Vergleich mit Hilbermatrix aus Matlab

beachte Quantifikator:  all()
if all(all( H==hilb(n) ))
    disp('Identisch mit Hilbermatrix aus Matlab');
else
    disp('Da ist etwas falsch mit der Matrix H');
end
Identisch mit Hilbermatrix aus Matlab

Abweisendender Zyklus (WHILE-Loop)

Ziel: Eingabe einer Zahl im Intervall  [3,10] mit dem WHILE-Loop
clc; clear;
disp('abweisender Zyklus')
k = randi([-5,15],1)
% k = input('Zahl aus [3,10]: ');
%while ~( 3<=k && k <=10 )     %  k nicht im Intervall [3,10]
while  k<3 || 10 < k
    k = randi([-5,15],1)
%     k = input('Zahl aus [3,10]: ');
end
abweisender Zyklus

k =

     5