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


\title{Enajste vaje iz ra\v{c}unalni\v{s}tva}
\author{Mirnesa Klisura}
\date{5.1.1999}

\begin{document}

\maketitle

\begin{abstract}
  Na dana\v{s}njih vajah smo si ogledali kriterij za ocenjevanje
  doma\v{c}ih nalog, pojasnili prenos parametrov po vrednosti in po
  referenci, nau\v{c}ili smo se izvajanja programa po korakih z
  uporabo funkcije \texttt{printf}, nazadnje pa smo se \v{s}e nekaj
  nau\v{c}ili o matrikah in za\v{c}eli z izdelavo programa
  \texttt{matrika.c}.
\end{abstract}

\section{Ocenjevanje doma\v{c}ih nalog}

Pri ocenjevanju doma\v{c}ih nalog se upo\v{s}tevajo 3 bistvene stvari,
in sicer pra\-vi\-lno\-st, dokumentacija in izvedba programa.
%
\begin{description}
\item[pravilnost:] Sem spadajo opis delovanja funkcij, funkcije,
  podprogrami, ...
\item[dokumentacija:] To so pogodbe; komentarji; kak\v{s}na imena
  uporabljamo za spre\-me\-nlji\-vke, funkcije ...
\item[izvedba programa:] Tu je mi\v{s}ljeno to, \v{c}e program lahko
  prevedemo in \v{c}e dela.
\end{description}

Podrobnej\v{s}i kriterij za ocenjevanje doma\v{c}ih nalog pa si lahko
ogledate na spletni strani (kjer so tudi zapiski z vaj):
%
\[
\texttt{http://valjhun.fmf.uni-lj.si/\~{}brodnik/Andrej/RacunalnistvoI}
\]

\v{C}isto na koncu strani kjer pi\v{s}e \emph{Ostalo} kliknete na
povezavo \emph{WWW sestavek za \v{s}olsko leto 1997/98}, nato pa pod
\emph{Obveznosti \v{s}tudentov} kliknete na povezavo \emph{doma\v{c}e
  naloge}.

\section{Prenos parametrov po vrednosti in referenci}

Prenos parametrov po vrednosti pomeni, da se vrednost prekopira in
nato lahko z njo poljubno po\v{c}nemo kar ho\v{c}emo (npr.: beremo,
bri\v{s}emo, popravljamo, ...), zunaj funkcije pa se te spremembe ne
poznajo.

Pri prenosu parametrov po referenci pa se vsaka sprememba, ki jo naredimo v
notranjosti funkcije pozna tudi zunaj (izven te funkcije) -- prenesemo
le referenco na spremenljivko.

Primer za klic \emph{po vrednosti}:
%
{\tt
\begin{verbatim}
... Funkcija(int spremenljivka)
{
  spremenljivka = 10;
} /* Funkcija */
\end{verbatim}
}
%
in za klic \emph{po referenci}:
%
{\tt
\begin{verbatim}
... Funkcija(int *spremenljivka)
{
 *spremenljivka = 10;
} /* Funkcija */
\end{verbatim}
}

Razlika med prenosom parametrov po vrednosti in prenosom parametrov po
referenci je v tem, da pri prenosu po referenci imamo zvezdico pred
parametrom pri vrednosti pa ne.

Ko uporabljamo funkcijo, ki uporablja prenos po vrednosti, spremembe
vrednosti spremenljivk znotraj te funkcije, ki smo jih podali kot
parametre funkcije, \textbf{niso} vidne navzven -- proti klico\v{c}emu
programu.

Ko pa uporabljamo funkcijo, ki uporablja prenos po referenci, lahko
znotraj te funkcije spreminjamo vrednosti spremenljivk, ki smo jih
podali kot parametre funkcij in te spremembe \textbf{so} vidne v
klico\v{c}em programu.

Ko prena\v{s}amo nize, tabele, matrike je vedno uporabljen prenos po
referenci, vendar zvezdice v tem primeru \textbf{ne} pi\v{s}emo.  Ko
prena\v{s}amo realna \v{s}tevila, cela \v{s}tevila, znake, logi\v{c}ne
spremenljivke itd. po referenci, pa zvezdica \textbf{je}.


Omenili smo \v{s}e en pojem, in sicer \textbf{kazalec}, ki ga bomo
podrobneje spoznali na predavanjih. Kazalec je v bistvu referenca na
nekaj.

\section{Testno izpisovanje -- namesto \textit{debug}}

Na prej\v{s}njih vajah smo se pogovarjali o semaforju. Za\v{c}eli smo
delati program, ki naj bi obra\v{c}al tablice na semaforju. David in
Voranc pa sta za doma\v{c}o nalogo morala ta program dopolniti.

Pri Vorancu je nastopil problem, da ko smo mi vpisali znak, ki je
trenutno na semaforju in znak, ki naj bi bil na semaforju, ter bi se
kole\v{s}\v{c}ek moral zavrteti od znaka, ki se trenutno nahaja pa do
znaka, ki naj bi se nahajal in to izpisati (recimo, kole\v{s}\v{c}ek
bi se moral zavrteti od F do S.), se je kole\v{s}\v{c}ek vrtel kar v
nedogled in se ni hotel ustaviti.

Da bi ugotovili v \v{c}em je problem, smo hoteli posamezne vrednosti
spremenljivk pogledati z \textit{debug}-om. Ker pa \textit{debug} ni
delal, smo si pomagali tako, da smo izpisovali na zaslon posamezne
vrednosti kole\v{s}\v{c}kov od tistega znaka, ki se trenutno nahaja pa
vse do tistega znaka, ki naj bi se nahajal.  To pa smo naredili
uporabljajo\v{c} funkcijo \texttt{printf}:
%
{\tt
\begin{verbatim}
  printf("i = %d, kolescek[i] = %c, znak2 = %c\n",
         i, kolescek[i], znak2);
\end{verbatim}
}

Napaka je bila v tem, da smo mi vpisovali male \v{c}rke, katerih sploh
ni na kole\v{s}\v{c}ku, namesto velikih.

\section{Matrike}

Naredili bomo program, ki prebere s tipkovnice kvadratno matriko celih
\v{s}tevil in jo tudi izpi\v{s}e, potem pa \v{s}e izra\v{c}una
determinanto te matrike.

Naloge smo se lotili tako, da smo najprej v glavnem programu napisali
kaj bomo naredili:
%
{\tt
\begin{verbatim}
int main(void)
{
  /* preberi matriko */

  /* izpisi matriko */
} /* main */
\end{verbatim}
}

Nato pa smo naredili funkcijo, ki nam bo prebrala matriko
\texttt{preberi\_matriko} in jo uporabili v glavnem programu.

Da smo prebrali dimenzijo matrike in jo zapisali v spremenljivko
\texttt{dimenzija} smo za to uporabili funkcijo
%
\[
\texttt{dimenzija = preberi\_vrednost("dimenzija matrike");}
\]
%
katera ima kot parameter besedilo (niz), ki se uporabi kot pojasnilo
uporabniku kaj beremo. V na\v{s}em primeru zahteva od uporabnika, da
vpi\v{s}e di\-me\-nzi\-jo matrike in potem ta funkcja vrne prebrano
vrednost, ki se potem zapi\v{s}e v spremenljivko \texttt{dimenzija}.
%
{\tt
\begin{verbatim}
int preberi_matriko(int matrika[max_vel][max_vel])
{
  int dimenzija;

               /* preberi dimenzijo matrike */
  dimenzija = preberi_vrednost("dimenzija matrike");
               /* preberi elemente matrike */
  return dimenzija;
} /* preberi_matriko */
\end{verbatim}
}

Za branje vrstic matrike smo uporabili \texttt{for} zanko (pri
\v{c}emer gre \v{s}tevec i od za\v{c}etne vrednosti 0 pa do dimenzije
matrike), ki deluje tako, da vsaki\v{c} ko se \v{s}tevec pove\v{c}a za
ena preberemo eno vrstico:
%
{\tt
\begin{verbatim}
               /* preberi i - to vrstico matrike */
  for(i = 0; i < dimenzija; i++)
  {
    preberi_vrstico(i, matrika[i])
  }
\end{verbatim}
}

Funkcija \texttt{preberi\_matriko} na koncu vrne velikost dimenzije,
(ki smo jo prebrali z uporabo funkcije \texttt{preberi\_vrednost}, ki
se nato uporabi v glavnem delu programa zato, da vemo kolik\v{s}na je
dimenzija matrike, ki jo bomo nato izpisali -- zopet v glavnem
programu.
{\tt
\begin{verbatim}
int main(void)
{
  int matrika[max_vel][max_vel];
  int dimenzija;

  /* preberi matriko */
  dimenzija = preberi_matriko(matrika)
} /* main */
\end{verbatim}
}

\end{document}
