% CVICENI - 1

% napiste reseni kvadraticke rovnice: Ax^2 + Bx + C = 0
% vyuzijte podminku if
% disp

% Nacteni koeficientu ze skripu:
A = 5;
B = 30;
C = 10;
% Nebo nacteni koeficientu z command-line:
disp('Nacteni promenych z command-line');
A = input('Nacti koeficient A:')
B = input('Nacti koeficient B:')
C = input('Nacti koeficient C:')

% vypocet diskriminantu:
D = B^2 - 4*A*C;

% reseni kvadraticke rovnice bez pouziti funkce:
fprintf('Reseni kvadraticke rovnice: %.0fx^2 + %.0fx + %.0f = 0\n',A,B,C)
% vypocet diskriminantu
D = B^2 - 4*A*C;
if (A == 0)
    disp('Rovnice neni kvadraticka');
    x = -C/B;
    fprintf('Rovnice ma jedine reseni: x = %f\n',x);
elseif (D < 0)
    disp('Diskriminant je zaporny => rovnice nema realne reseni')
elseif (D == 0)
    x = -B/2/A;
    fprintf('Rovnice ma jedine reseni: x = %f\n',x);
elseif (D > 0)
    x1 = (-B - sqrt(D))/(2*A);
    x2 = (-B + sqrt(D))/(2*A);
    fprintf('Rovnice ma reseni: x1 = %f, x2 = %f\n',x1,x2);
end

% Zde promennym X1,X2 priradime hodnoty na zaklade
% kodu ve funkci 'kvadraticka_rovnice_01'
% Funkci volame s 'rucne' zadanymi vstupy: a = 5, b = 30, c = 10
[X1,X2] = kvadraticka_rovnice_01(5,30,10);
%disp(X1)
%disp(X2)

% Zde volame funkci 'kvadraticka_rovnice_02' s parametry a = A, b = B, c = C,
% kde A,B,C mame nactene bud z command-line, nebo prirazene na zacatku skriptu
kvadraticka_rovnice_02(A,B,C);


% Definice funkce 'kvadraticka_rovnice_01', ktera dostane 3 parametry: a,b,c
% Tyto parametry jsou predavany 'hodnotou', tedy funkce dostane napr.
% A,B,C, ktere jsou definovany na zacatku skriptu, nebo nactenim z
% command-line:
% [X1,X2] = kvadraticka_rovnice_01(A,B,C);
% lze take zadat hodnotu a,b,c primo:
% [X1,X2] = kvadraticka_rovnice_01(5,30,10);
% Funkce pote provede cast sveho kodu (promenne a,b,c 
% jsou definovany pouze uvnitr funkce), a priradi vystupnim promennym
% [X1,X2] (matice 1x2, alias radkovy vektor delky 2) vypocitane hodnoty
% Pro uspesne provedeni teto funkce je potreba mit vzdy prirazene hodnoty
% promennym x1, x2 a to i v pripade, ze je resenim pouze 1 koren.
% V tomto pripade budeme prirazovat hodnotu pouze x1 a do x2 priradime
% pomocnou hodnotu, napr. x2 = 0

function [x1,x2] = kvadraticka_rovnice_01(a,b,c)
  fprintf('Reseni kvadraticke rovnice: %.0fx^2 + %.0fx + %.0f = 0\n',a,b,c)
  d = b^2 - 4*a*c;
  if (a == 0)
    disp('Rovnice neni kvadraticka');
    x1 = -c/b;
    x2 = 0;
    fprintf('Rovnice ma jedine reseni: x = %f\n',x1);
  elseif (d < 0)
    disp('Diskriminant je zaporny => rovnice nema realne reseni')
  elseif (d == 0)
    x1 = -b/2/a;
    x2 = 0;
    fprintf('Rovnice ma jedine reseni: x = %f\n',x1);
  elseif (d > 0)
    x1 = (-b - sqrt(d))/(2*a);
    x2 = (-b + sqrt(d))/(2*a);
    fprintf('Rovnice ma reseni: x1 = %f, x2 = %f\n',x1,x2);
  end
end

% Funkci lze napsat i bez prirazeni vystupu X1 a X2 takto:
% V tomto pripade funkce: kvadraticka_rovnice_02(a,b,c)
% pouze provede svuj kod a do vystupu se nic neulozi
% (nemame X1 a X2)

function kvadraticka_rovnice_02(a,b,c)
  fprintf('Reseni kvadraticke rovnice: %.0fx^2 + %.0fx + %.0f = 0\n',a,b,c)
  d = b^2 - 4*a*c;
  if (a == 0)
    disp('Rovnice neni kvadraticka');
    x = -c/b;
    fprintf('Rovnice ma jedine reseni: x = %f\n',x);
  elseif (d < 0)
    disp('Diskriminant je zaporny => rovnice nema realne reseni')
  elseif (d == 0)
    x = -b/2/a;
    fprintf('Rovnice ma jedine reseni: x = %f\n',x);
  elseif (d > 0)
    x1 = (-b - sqrt(d))/(2*a);
    x2 = (-b + sqrt(d))/(2*a);
    fprintf('Rovnice ma reseni: x1 = %f, x2 = %f\n',x1,x2);
  end
end

% v Matlabu je nutne definovat pouzite funkce vzdy az na konci skriptu !!!
