%% Strutture per la Programmazione
% Table of Contents
% 1. Condizione: if, eleseif, else, end
% 2. Ciclo: for, end
%% 1. Condizione: if, eleseif, else, end
% La struttura if/elseif/else/end permette di valutare espressioni logiche e modificare l'esito del calcolo sulla base che l'espressione logica sia vera o falsa.
% Per costruire le espressioni logiche si usano:
% operatori di confronto: uguale (==), diverso (~=), maggiore (>), minore (<), maggiore o uguale (>=), minore o uguale (<=)
% operatori logici: AND (&&), OR (||)
% Esempio. Per il calcolo del pH di un acido debole monoprotico, si possono usare queste relazoni limite in funzione della concentrazione analitica, C_0, e la costante acida, k_a:
% [\textrm{H}_3\textrm{O}^+]=\left(C_0+\sqrt{C_0+4 \,k_\textrm{w}}\right)/2           se C_0<10^{-6}
% [\textrm{H}_3\textrm{O}^+]=C_0                                        se 10^{-6}<C_0<0.1\,k_\textrm{a}
% [\textrm{H}_3\textrm{O}^+]=\left(-k_\textrm{a}+\sqrt{k_\textrm{a}^2+4\, C_0\, k_\textrm{a}}\right)/2    se 0.1\,k_\textrm{a}<C_0<100\,k_\textrm{a}
% [\textrm{H}_3\textrm{O}^+]=\sqrt{C_0\, k_\textrm{a}}                                se C_0>100\,k_\textrm{a}
% dove k_\textrm{w}=1.0^{-14}.
% Programmare un semplice algoritmo che, dati i valori di C_0 e k_\textrm{a} restituista il pH.

C0 = 1.0e-2;
ka = 1.0e-5;

kw = 1.0e-14;

if (C0 < 1.0e-6)
    H = 0.5 * (C0 + sqrt(C0 + 4*kw));
elseif (C0 >= 1.0e-6 && C0 < 0.1*ka)
    H = C0;
elseif (C0 >= 0.1*ka && C0 < 100*ka)
    H = 0.5 * (-ka + sqrt(ka^2 + 4*ka*C0));
else
    H = sqrt(C0*ka);
end

pH = -log10(H);

disp(['pH = ' num2str(pH)])

%%
%% 2. Ciclo: for, end
% Per reiterare le stesse operazioni su un set di dati che (eventualmente) cambia in funzione di una variabile che a sua volta cambia a ogni iterazione si usa la struttura "for".
% A seguiro della parola chiave "for" si indica il nome della variabile e come essa varia: for i = first value [ : step] : last value. Lo step non è obbligatorio e di default vale +1.
% Esempio. Calcolare la media degli elementi di un array.

a = [1.3 1.2 1.4 1.2 1.5 1.1 1.3];
na = size(a, 2);

m = 0.0;
for i = 1:na
    m = m + a(i);
end

m = m / na;

disp(['Media degli elementi = ' num2str(m)])