\documentclass[a4paper]{article}
\usepackage{slovene}
\usepackage[latin2]{inputenc}

\title{Šestnajste vaje iz računalništva I}
\author{Simona Peršak}
\date{16.3.1999}

\begin{document}
\maketitle

\section{Računanje determinante}

{\tt
\begin{verbatim}
int: matrika, dimenzija, izpuščena  vrstica
out: rezultat
\end{verbatim}
}
Izračunali jo bomo rekurzivno po prvem stolpcu.


\subsection{Glava funkcije}

{\tt
\begin{verbatim}
int determinanta(int matrika[MAX_VEL][MAX_VEL],
                 int dimenzija, int izpuscena_vrstica)
\end{verbatim}
}
%
Funkcija je celoštevilčnega tipa \texttt{int determinanta}, ker jo
hočemo vrniti kot rezultat.

Potrebujemo podprogram \texttt{Prepisi}, ki iz dane matrike izloči
0-ti (v splošnem $j$-ti) stolpec in $i$-to vrstico. Torej ima
naslednje parametre:
%
{\tt
\begin{verbatim}
in:   matrika, dimenzija, izloceni stolpec, izlocena vrstica
out:  nova_matrika
\end{verbatim}
}
%
Glava te funkcije je tako:
%
{\tt
\begin{verbatim}
void prepisi(int matrika[MAX_VEL][MAX_VEL], int dimenzija,
             int izp_stolpec, int izp_vrstica,
             int nova_matrika[MAX_VEL][MAX_VEL])
\end{verbatim}
}

\subsubsection{Premakanje stolpcev in vrstic v matriki}

V novi matriki imamo 1 vrstico in 1 stolpec manj. Dokler je števec, s
katerim se sprehajamo po vrsticah v stolpcu, manjši od izpuščenega
vrstice, vrstice prepisujemo, ko pa postane večji, jih pomaknemo za
eno navzgor.

Imamo dva kompleta indeksov:
%
\begin{enumerate}
\item za izvorno matriko \texttt{matrika}, iz katere prepisujemo:
%
{\tt
\begin{verbatim}
int i, j;
\end{verbatim}
}
%
in
\item za ciljno matriko \texttt{nova\_matrika}, v katero prepisujemo.
%
{\tt
\begin{verbatim}
int i_ciljni, j_ciljni;
\end{verbatim}
}
%
\end{enumerate}
%
S prvim kompletom se sprehajamo po izvorni matriki in z drugim po
ciljni. Prvi komplet se vedno povečuje za po ena, drugi pa le takrat,
ko elemente prepisujemo (nismo niti na izpuščeni vrstici niti v
izpuščenem stolpcu).

\subsection{Zapis izraza $(-1)^i$ v prog. jeziku c}

V jeziku c ne moremo preprosto zapisati tega izraza, zato pogledamo,
ali je eksponent sod ali lih in odvisno od tega izraz prištejemo ali
odštejemo.
%
{\tt
\begin{verbatim}
if ((i + 0) % 2 = 0) /* sodo */
  rezultat += matrika[i][0] * det(dim - 1, zac_matrika) \\
else                 /* liho */
  rezultat -= matrika[i][0] * det(dim - 1, zac_matrika)
\end{verbatim}
}

\subsection{Koda}

{\tt
\begin{verbatim}
void prepisi(int matrika[max_vel][max_vel], int dimenzija,
             int iz_stolpec, int iz_vrstica,
             int nova_matrika[max_vel][max_vel])
{ int i;  /* vrstica */
  int j;  /* stolpec */
  int i_c;  /* ciljna vrstica */
  int j_c;  /* ciljni stolpec */

  for(i = 0, i_c = 0; i < dimenzija; i++) {
    if (i != iz_vrstica) {
      for(j = 0, j_c = 0; j < dimenzija; j++)
        if (j != iz_stolpec) {
          nova_matrika[i_c][j_c] = matrika[i][j];
          j_c++;
        } /* if */
      i_c++;
    } /* if */
  } /* for */
} /* prepisi */

/* ------------------------------------------------------------------- */

int determinanta(int dimenzija, int matrika[max_vel][max_vel])
{
  int rezultat;
  int i;                              /* vrstica */
  int zac_matrika[max_vel][max_vel];  /* zacasna matrika */

  if (dimenzija == 1)  return  matrika[0][0];
  else {
    rezultat = 0;
    for (i = 0; i < dimenzija; i++) {
      prepisi(matrika, dimenzija, 0, i, zac_matrika);
      if ((i + 0) % 2 == 0)
        rezultat+=
          matrika[i][0] * determinanta(dimenzija - 1, zac_matrika);
      else
        rezultat-=
          matrika[i][0] * determinanta(dimenzija - 1, zac_matrika);
    } /* for */
    return rezultat;
  } /* else */
} /* determinanta */
\end{verbatim}
}
%
Celoten program je objavljen v novičkah.

\section{Pri funkcijah ločimo}

\begin{enumerate}
\item definicijo (opis) funkcije
\item klic funkcije
\end{enumerate}

\subsection{Definicija funkcije}

Definicija funkcije oz. opis je kot recept pri kuhanju. Nima nobenega
dejanja je le opis postopka in seznam sestavin, ki sestavljajo
določeno jed.

\subsection{Primer klica funkcije}

Funkcija za izračun determinante je opisana v funkciji
\texttt{determinanta}.  Takrat, ko je \emph{poklicana}, prične
\emph{obstajati njen primerek}. Podobno, ko po receptu spečemo pico,
prične pica obstajati. Seveda ni razloga, da ne bi po istem receptu
spekli še ene pice, ki s prvo nima nič skupnega.

Tako tudi zadržka, da ne bi funkcija \emph{poklicala} same sebe in
ustvarila še en primerek, ki s prejšnjim nima nič skupnega. Še posebej
spremenljivke (in rezultat) v novem stvarjenju funkcije nimajo nič s
spremenljivkami in rezultatom v prejšnjem ustvarjenju (predhodne
determinante z 0-to vrstico in $j$-tim stolpcem).  Med seboj nimata
nobene povezave, vsakič je nov rezultat in novi parametri. Rezultati
so meds ebojno neodvisni.

Rezultat v \texttt{if} stavku je bistven in je v lasti klicane
funkcije oz.~živeče funkcije.

Pri tem primeru je bila podmatrika seveda definirana kot lokalna
spremenljivka.

Primer matrike prikazan s pripravo palačink:
%
\begin{itemize}
\item matrika $\equiv$ recept
\item poraba prostora v programu $\equiv$ moka
\item nova matrika $\equiv$ za vsako palačinko novo testo
\end{itemize}
%
Nove matrike moramo delati, ker se matrike kličejo in s praznimi vrsticami n
e znamo delati.

Naučiti se moramo matriko obravnavati kot predmet pri kateri bi se
izpuš čala vrstica in stolpec oz. napraviti recept za več palačink
hkrati.

Matriko hočemo obravnavati kot celoto. Pojem matrike dopolnimo z dvema
vektorjema.  Enega imamo v vodoravni smeri, drugega v navpični smeri.
V teh vektorjih imamo zastavice, ki so bodisi dvignjene ali spuščene.
Dvignjena zastavica pomeni, da je dotična vrstica (oz.~stolpec)
izpuščen.

\end{document}
