%% CompMath-Vorlesung 27.10.2023
% 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;
%% 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);

%% 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]);
%% 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 " + tage+ " days.");
else
    disp('Eingabefehler!!');
end

%% 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)]);

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

%% 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)]);

%% 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)]);

%% 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) )]);


%% geschachtelte Zyklen: <https://de.wikipedia.org/wiki/Hilbert-Matrix 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
%% 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

%% 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
