% Vytvoøí matici, jejíž každý prvek je prùmìrnou hodnotou z prvkù, 
% které leží nad ním ve dvou pøedchozích øádcích ve stejném sloupci.
% První dva øádky matice jsou zadány uživatelem nebo jsou to náhodná  
% èísla nebo jsou naèteny ze souboru. Matice mùže mít maximálnì  
% 50 radek a minimálnì 3 radky. Uzivateli povoleny 3 chyby pri zadavani.

% Matice je v matematice schématické uspoøádání matematických objektù
% - prvkù matice (též elementù matice) - do r øádkù a s sloupcù.
% Prvky matice jsou oznaèeny indexy udávajícími øádek a sloupec,
% v nichž se prvek nalézá.
clear
disp('Zadejte pocet radku matice (matice muze mit velikost maximalne 50 radek a minimálnì 3 radky):') % výpis na obrazovku bez názvu promìnné
ch=0;   % do promìnné ch je pøiøazena 0 (bude se poèítat poèet chyb pøi zadávání)
while (1) % cyklus s podmínkou na zaèátku, nekoneèný cyklus, 1 vždy pravda
    r=input('Zadej pocet radku matice: r = '); % uživatel zadá v pøíkazovém øádku poèet øádku, uloží se do promìnné r
    if ((ch<3)&((r>50)|(r<3)))% podmínìný pøíkaz - podmínka: udìlá-li uživatel ménì než 3 chyby pøi zadávání a promìnná r není zvoleno od 3 do 50
                              % znak & znaèí logický operátor AND(a zároveò), znak | znaèí logický operátor OR(nebo)
        ch=ch+1; % uživatel udìlal chybu pøi zadávání, promìnná ch se zvýší o 1
        hlaseni = sprintf('Pocet chyb pri zadavani: %d', ch); % zápis do øetìzce
        msgbox(hlaseni,'Upozorneni','help'); % vytvoøí okno se zprávou
        disp('Stiskni libovolnou klavesu ...') % výpis na obrazovku bez názvu promìnné
        pause % zastavi provadeni posloupnosti prikazu a ceka na stisk libovolne klavesy
        continue % pøeskoèí zbývající pøíkazy ve smyèce a pøejde k další iteraci smyèky
    elseif ((ch>=3)&((r>50)|(r<3))) % podmínka: udìlá-li uživatel více než 3 chyby pøi zadávání a promìnná r není zvoleno od 3 do 50
            disp('Konec oprav zadavani - moc chyb') % výpis na obrazovku bez názvu promìnné
            hlaseni = sprintf('Smula, nezadaval jsi dobre.'); % zápis do øetìzce
            msgbox(hlaseni,'Upozorneni','error'); % vytvoøí okno se zprávou
            return % ukonèí provádìní funkce, která tento pøíkaz obsahuje
    else
        hlaseni = sprintf('Spoluprace je vyborna,\npocet chyb pri zadavani: %d.',ch); % zápis do øetìzce
        msgbox(hlaseni,'Upozorneni','warn'); % vytvoøí okno se zprávou
        disp('Stiskni libovolnou klavesu ...') % výpis na obrazovku bez názvu promìnné
        pause % zastavi provadeni posloupnosti prikazu a ceka na stisk libovolne klavesy
        break % ukonèuje smyèku, opouští cyklus
    end % ukonèení podmínìného pøíkazu if
end % ukonceni cyklu while

v=input('Zadej volbu: [U]zivatel/[Soubor]/Nahodne [C]islo\nTvoje volba: v = ','s'); % uživatel zadá písmeno, øetìzec (parametr 's')
v=upper(v); % pøevod na velká písmena, pro pøípad, že by uživatel zadal malé písmeno
switch (v) % pøepínaè
    case 'U' % je- li výsledkem výrazu v písmeno U provedou se následující pøíkazy
            disp('Zadej prvky v prvnich 2 radcich matice:') % výpis na obrazovku bez názvu promìnné
            for m=1:2 % cyklus s pevným poètem opakování, m urèuje øádky matice (cykus do 2- uživatel zadá první 2 øádky )
                for n=1:5 % cyklus s pevným poètem opakování, n urèuje sloupce matice
                    fprintf('\n prvek [%d,%d]: ',m,n); % formátovaný textový výstup
                           % øídící znak \n – nová øádka
                           % v apostrofech je textový øetìzec
                           % formátovací sekvence – zaèíná znakem %
                           % d - desítkové èíslo
                           % m,n - prvek matice bude v m-tém øádku a n-tém sloupci
                    A(m,n)=input(''); % uživatel zadá v pøíkazovém øádku prvek matice v m-tém øádku a n-tém sloupci
                                  % v apostrofech není potøeba již psát výzvu pro uživatele
                                  % zpráva je napsána pomocí fprintf
                end % ukonèení cyklu for
            end % ukonèení cyklu for
        case 'S' % je- li výsledkem výrazu v písmeno S provedou se následující pøíkazy
            f=fopen('data.txt', 'r');  % otevøení souboru pro ètení (parametr 'r')
            A = fscanf(f,'%g',[2 5])   % ze souboru jsou naèteny prvky matice, 2 øádky, 5 sloupcù
            fclose(f);                 % uzavøení souboru
        case 'C' % je- li výsledkem výrazu v písmeno C provedou se následující pøíkazy
            A=round(rand(2,5).*10);   % vygenerována matice náhodných èísel s 2 øádky a 5 sloupci
        otherwise % není-li výsledkem výrazu v ani U, ani S, ani C provedou se pøíkazy
            disp('Neznama volba, do matice budou vygenerovaná nahodna cisla') % výpis na obrazovku bez názvu promìnné
            A=round(rand(2,5).*10);  % vygenerována matice náhodných èísel s 2 øádky a 5 sloupci
end
disp('2 radky matice: ') % výpis na obrazovku bez názvu promìnné
disp(A) % výpis na obrazovku bez názvu promìnné    
for m = 3:r % cyklus s pevným poètem opakování, m urèuje øádky matice
                % cyklus pro tvorbu matice zaèíná od 3 (první 2 øádky zadá uživatel)
        P=A((m-2):(m-1),:); % do promìnné P se pøiøadí (m-2)-tý a (m-1)-tý øádek matice A
                            % matice P má tedy 2 øádky a s sloupcù
        A(m,:) = mean(P); % do m-tého øádku matice A se pøiøadí prùmìry ze sloupcù matice P
end % ukonèení cyklu for
disp('Vytvorena matice:') % výpis na obrazovku bez názvu promìnné
disp(A) % výpis na obrazovku bez názvu promìnné