\documentclass[a4paper,12pt]{article}
\usepackage{slovene}
\title{Osme vaje iz ra\v{c}unalni\v{s}tva I}
\author{David Bokav\v{s}ek}
\date{1. 12. 1998}
\begin{document}
\maketitle

\begin{abstract}
  Na osmih vajah so Alen, Aleksij in Vili dobili slede\v{c}o
  doma\v{c}o nalogo: Alen je moral v prej\v{s}njem zaporedju izpisati
  ve\v{c} zaporedij, ne da bi pri tem morali znova zagnati program.
  Aleksij je moral ustaviti ponavljanje \v{s}tevil v zaporedju.  To je
  naredil na dva na\v{c}ina: Prvi na\v{c}in: z pomo\v{c}jo
  \emph{\texttt{for} zanke}.  Drugi na\v{c}in: \emph{z rekurzijo} --
  najprej izpi\v{s}emo prvi \v{c}len zaporedja, nato pokli\v{c}emo
  funkcijo, ki bo izpisala \v{s}e ostale \v{c}lene zaporedja.
\end{abstract}

\section{Dopolnitev programa \texttt{zaporedje.c}}

Kot je bilo povedano v povzetku, je moral Alen v prej\v{s}njem
zaporedju izpisati ve\v{c} zaporedij, ne da bi ponovno morali zagnati
program.  To smo pri programih \texttt{kvadrat.c} in
\texttt{pravokotnik.c} naredili s pomo\v{c}jo \texttt{while do} zanke.
Sedaj si bomo pogledali program \texttt{pravokotnik.c} in v njem
poiskali zanko \texttt{while do}. V tem primeru za\v{c}nemo z
\texttt{do}; najprej \texttt{preberi\_velikost} nato
\texttt{izrisi\_pravokotnik}, ko pa pride do \texttt{while}, se to
izvede pri pogoju, da je \texttt{sirina $>$ najvecje sirine}.  Kaj
naredimo? Najprej pogledamo, kaj se dogaja:

Za\v{c}etni \v{c}len se prebere, nato se prebere \v{s}tevilo
\v{c}lenov in korak. Sedaj moramo zaporedje ve\v{c}krat izpisati.
Dodali bomo zanko od \texttt{zacetni\_clen = ...} do
\texttt{/* izpisi vsoto clenov */.} \texttt{do} zanka oklepa tisto kar
ho\v{c}emo ponavljati. \texttt{do} zanko dodamo v program
\texttt{zaporedje.c} in sicer v $64$ vrstico in v tretji do
vklju\v{c}no peti stolpec. Sedaj se vrnemo v $60$ vrstico in tretji
stolpec in vpi\v{s}emo \texttt{while (zacetni\_clen $>$ 0);}.
Upo\v{s}tevati moramo \v{s}e ustavljalni pogoj, ker se takrat zanka
ustavi. Ko je za\v{c}etni \v{c}len $0$ se program zaustavi, oziroma se
ni\v{c} ne naredi.

\section{Zaustavitev ponavljanja \v{s}tevil v \texttt{zaporedju.c}}

\begin{enumerate}
\item Na\v{c}in: z \texttt{for} zanko
\item Na\v{c}in izpisovanja zaporedja: Najprej se izpi\v{s}e
  za\v{c}etni \v{c}len zaporedja, nato pa \v{s}e ostali. Preostali
  \v{c}leni zaporedja, razen prvega, so neko novo zaporedje, ki se
  za\v{c}ne pri prvemu \v{c}lenu + korak. Ker je to novo
  zaporedje tudi zaporedje, ga lahko izpi\v{s}emo z isto funkcijo.
  Na\v{s}a funkcija izpi\v{s}e prvi \v{c}len zaporedja in preostalo
  zaporedje po\v{s}lje v neko novo funkcijo in ga izpi\v{s}e.
  Zaporedje zapi\v{s}emo z funkcijo \texttt{izpisi\_zaporedje}.
  Komentar v $58$ vrstici in v osmem stolpcu izbri\v{s}emo.

  Ker se program ne zaklju\v{c}i, moramo iz glavnega programa
  \v{s}tevilo \v{c}lenov, ki naj se izpi\v{s}ejo, spraviti v funkcijo.
  To storimo tako, da v definicijo funkcije
  \texttt{void izpisi\_zaporedje1(int clen, int korak)} dodamo \v{s}e
  parameter \texttt{stevilo\_clenov}, ki naj se izpi\v{s}ejo.

  \texttt{izpisi\_zaporedje1} naredi: izpi\v{s}e se
  \texttt{stevilo\_clenov} zaporedja, ki ima za\v{c}etni \v{c}len
  \texttt{clen}, korak med \v{c}leni \texttt{korak}.  \v{C}e je
  \v{s}tevilo \v{c}lenov ve\v{c}je, ki naj se ispi\v{s}ejo, ve\v{c}je
  od $0$, zaporedje izpi\v{s}emo, in \v{c}e je enako $0$ ga ne
  izpi\v{s}emo. To preverimo z \texttt{if} stavkom.
\end{enumerate}

\section{Se\v{s}tevanje \v{c}lenov zaporedja}

\subsection{Z rekurzijo}

Uporabili bomo nove funkcije. Definirali bomo eno samo funkcijo, ki bo
izra\v{c}unala vsoto -- vrnila celo \v{s}tevilo. Glava definicije
funkcije bo tako \texttt{int sestej\_zaporedje1}.

Kako bomo to naredili? \v{C}e znamo se\v{s}teti preostanek (\v{c}lene
od drugega naprej) zaporedja, znamo se\v{s}teti zaporedje. Preostanek
zaporedja je neko novo zaporedje. Se\v{s}tejemo ga z isto funkcijo a z
novimi parametri.

Zaradi bolj\v{s}e preglednosti damo konec in za\v{c}etek definicij
funkcij \v{s}e \v{c}rto: \texttt{/* ------------------ */}.

V komentarjih smo napisali vse, \emph{kar smo naredili}.

Ostale \v{c}lene zaporedja se\v{s}tejemo tako, da kli\v{c}emo funkcijo
%
\[
\texttt{sestej\_zaporedje1(zacetni clen + korak, korak, stevilo\_clenov - 1)}
\]
%
ki stoji v $48$ vrstici in enaindvajsetem stolpcu. Rezultat dobimo kot
vrednost funkcije, moramo ga shraniti v spremenljivko: \texttt{int
  vsota;} v $47$ vrstico in drugi stolpec. Vsoti pri\v{s}tejemo \v{s}e
prvi \v{c}len in dobimo vsoto zaporedja. To vsoto vrnemo kot rezultat.

Podobno kot v podprogramu, tudi v glavnem programu definiramo vsoto:
%
{\tt
\begin{verbatim}
int main(void) {
  int vsota;
  ...
  vsota = sestej_zaporedje1( ... );
  ...
} /* main */
\end{verbatim}
}
%
Spremenljivko \texttt{vsota} potrebujemo (kot v podprogramu), da v njo
shranimo vrednost, ki jo vrne funkcija.

V primeru, da se program ne izvaja, uporabimo \emph{debug}. Pogledamo
za\v{c}etni \v{c}len in parametre ter tako ugotovimo, zakaj ne dela,
kakor bi moral.

\end{document}

