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

\title{Dvanajste vaje iz ra\v{c}unalni\v{s}tva I}
\author{Jurij Buh}
\date{12.1.1999}

\begin{document}

\maketitle

\section{Arhitektura programske opreme }

Arhitektura programske opreme pomeni samo strukturo programa, v kateri
so vkljuc\v{c}ene posamezne funkcije. Tu moramo toc\v{c}no premisliti
koliko funkcij bo uporabljal glavni program, kak\v{s}no vlogo bodo
imele posamezne funkcije, kak\v{s}ne parametre potrebujejo za
izvajanje, kateri so vhodni in izhodni parametri ter na kak\v{s}en
na\v{c}in so prene\v{s}eni -- ali po vrednosti, ali po referenci.

Za  na\v{c}rtovanje programa  se  uporabljata dva  sistema: Od  zgoraj
navzdol oz.  \textit{top down}, ter od  spodaj navzgor \textit{bottom
  up}. Prvi pomeni, da  za\v{c}nemo na\v{c}rtovamje v glavnem programu
(main), kjer  prvo definiramo funkcije, ki bodo  zastopane v programu,
tako da se bo vsaka stvar  odvijala v svoji funkciji, nato pa preidemo
na  na\v{c}rtovanje posameznih funkcij,  ter njihovih  podfunkcij. Pri
\textit{bottom up}  sistemu pa se na\v{c}rtovanje  za\v{c}ne pri samem
jedru problema,  ter nato po potrebi dodajamo  \v{s}e ostale funkcije,
ko imamo vse, jih \v{s}e samo pove\v{z}emo v glavnem programu.


\section{Na\v{c}rtovanje programa za izra\v{c}un determinante matrike}

\subsection{Grobi opis funkcij, ki jih bomo potrebovali}

Za izracun determinante je potrebno najprej prebrati matriko, jo
izpisati ter nato izra\v{c}unati njeno determinanto. Ker ho\v{c}emo da
se vsaka stvar izvr\v{s}i v svoji funkciji pa\v{c} potrebujemo tri
funkcije. In sicer:
%
\begin{enumerate}
\item \texttt{BeriMatriko}: Funkcija ki prebere matriko;
\item \texttt{IzpisiMatriko}: Funkcija ki jo izpi\v{s}e;
\item \texttt{DeterminantaMatrike}: Funkcija ki izra\v{c}una
  determinanto;
\end{enumerate}

Ker so glavne funkcije definirane, moramo dolociti le \v{s}e vhodne in
izhodne parametre za posamezno funkcijo.

\subsubsection{Parametri funkcije \texttt{BeriMatriko}}

Ker v to funkcijo ne pride ni\v{c} iz programa, je brez vhodnih
parametrov, vrniti pa mora dimenzijo matrike, da se ustvari potreben
prostor v pomnilniku, ter vrednost matrike (ij-te elemente).
Pi\v{s}emo :
%
\[
  \texttt{BeriMatriko(in: -; out: dimenzija, matrika)}
\]

Pri tej funkciji nastopi te\v{z}ava, ker nam mora vrniti dve
vrednosti, in sicer dimenzijo matrike ter vrednost matrike. Zato bomo
rabili \v{s}e dve podfunkciji in sicer:
%
\begin{description}
\item[\texttt{BeriVrednost}:] funkcija, ki dobi kot vhodni parameter
  niz z opisom koli\v{c}ine, ki naj jo prebere, nato zahteva
  \v{z}eljeno koli\v{c}o, jo prebere ter vrne koli\v{c}ino. Vrnjena
  koli\v{c}ina bo uporabljena kot dimenzija.
%
\[
  \texttt{BeriVrednost(in: *opis kolicine; out: vrednost = dim)}
\]

\item[\texttt{BeriVrstico}:] Ta funkcija ima za vhodni podatek
  dimenzijo matrike, ter nato po i-tih stolpcih bere vredost j-te
  vrstice, vrne pa vrstico matrike ($0 \leq i, j < dim$).
%
\[
  \texttt{BeriVrstico(in: dim; out: vrstica matrike)}
\]
\end{description}

\subsubsection{Parametri funkcije \texttt{IzpisiMatriko}}

Funkcija \texttt{IzpisiMatriko}, rabi za izpis matrike dimenzijo ter
vrednost matrike.  Ker v program ni\v{c} ne vrne je brez izhodnih
parametrov.Pi\v{s}emo:
%
\[
  \texttt{IzpisiMatriko(in: dimenzija, matrika; out: -}
\]

\subsubsection{Parametri funkcije \texttt{DeterminantaMatrike}}

Ta funkcija potrebuje za izra\v{c}un determinante dimenzijo matrike,
ter vrednost, vrniti pa nam mora vrednost determinante, ki se mora
tudi izpisati.
%
\begin{quote}
  Podrobnej\v{s}i opis na naslednjih vajah!
\end{quote}

\subsection{Nekaj o parametrih}

Parametri so vhodni in izhodi podatki. Vhodni podatki so tisti, ki v
funkcijo vstopajo, izhodni pa so tisti, ki jih funkcija vrne v
program. Parametri so lahko prene\v{s}eni po vrednosti ali po
referenci:
%
\begin{description}
\item[Po vrednosti:] Sprememba parametrov se ne odra\v{z}a navzven.
  Vsi vhodni parametri so na\v{c}eloma prene\v{s}eni po vrednosti.
\item[Po referenci:] Sprememba parametrov se odra\v{z}a navzven. V
  c-ju poteka prenos izhodnih parametrov po referenci, zato v funkciji
  pred najavo parametra pi\v{s}emo \texttt{*}.

  Zavedati se moramo, da prenos polj, matrik ali vektorjev
  \emph{vedno} poteka po referenci, zato pred najavo \emph{ne}
  pi\v{s}emo \texttt{*}.

  Obstaja \v{s}e dodatna mo\v{z}nost, da iz funkcije kaj dobimo in
  sicer kot rezultat s pomo\v{c}jo \texttt{return}. Vendar nam lahko
  funkcija vrne samo eno preprosto vrednost (npr. \texttt{int},
  \texttt{char}, \texttt{float} ipd.). Pred samo funkcijo, je potrebno
  tudi najaviti tip rezultata funkcije. Torej \v{c}e rezultat ni,
  pi\v{s}emo \texttt{void}.
\end{description}


\subsection{Zapis glav funkcij}

Ker sedaj vemo kak\v{s}ni so vhodni in izhodni parametri \v{z}e lahko
zapi\v{s}emo glave funkcij
%
\begin{enumerate}
\item Glava glavnega programa:
%
{\tt
\begin{verbatim}
int main(void)
\end{verbatim}
}
%
Kot opazimo je pred main oznaka za cela \v{s}tevila \texttt{int},
\v{c}eprav nam program ni\v{c} ne vrne:
%
\[
 \texttt{main(in: -; out:-)}
\]
%
\texttt{int} pi\v{s}emo le zaradi dogovora.

\item Funkcija za branje matrike
%
{\tt
\begin{verbatim}
void BeriMatriko(int *dimenzija, int matrika[max_vel][max_vel])
\end{verbatim}
}
%
Obe vrednosti sta prene\v{s}eni po referenci, vendar pred matriko ni
potrebno postavljati \texttt{*}, ker se matrike vedno prena\v{s}jo po
referenci.

\item Funkcija za branje vrstice:
%
{\tt
\begin{verbatim}
void BeriVrstico(int dimenzija, int vrstica[max_vel])
\end{verbatim}
}
%
Tudi tu je vrstica prene\v{s}ena po referenci, ker je to vektor.

\item Funkcija za branje ene vrednosti:
%
{\tt
\begin{verbatim}
int BeriVrednost(char *opis)
\end{verbatim}
}
%
\texttt{int} pred funkcijo je zato, ker smo se odlo\v{c}ili, da nam
funkcija vrne vrednost kot rezultat. Zvezdica pred opis pa pomeni, da
je opis niz, ki pa je prene\v{s}en po vrednosti.

\item Funkcija za izpis matrike:
%
{\tt
\begin{verbatim}
void IzpisiMatriko (int dimenzija, int matrika[max_vel][max_vel])
\end{verbatim}
}

\end{enumerate}

\end{document}
