Contents

CompMath-Vorlesung 28.10.2022

Einfuehrung in die strukturierte Programmierung: Alternative, Zaehlzyklus

close all; clear; clc;

Sequenz

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.';
else
    if  fb > 5
        s = 'naja';
    else
        if  fb >= 0
            s = 'sauber';
        else
            s = 'Messfehler';
        end
    end
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}    % if m==4 || m==6 || ...
        tage = 30;
    case {1,3,5,7,8,10,12} % elseif m==1 || m==3 ...
        tage = 31;
    case 2             % elseif m==2
        tage = 28;          % Achtung: Schaltjahr muss noch beruecksichtigt werden!!
    otherwise          % else
        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 = 9.6342
Sum  5 = 9.6342

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 =

     3