\documentclass[a4paper,12pt]{article}

\usepackage[latin2]{inputenc}

\title{Programski jezik c -- nadaljevanje}
\author{}
\date{21.10.1997}

\begin{document}

\maketitle

\section*{\emph{While} zanka}

While zanko zapišemo v obliki:
%
{\tt
\begin{verbatim}
  while (pogoj)
  stavek;
\end{verbatim}
}

Če je stavek v while zanki sestavljen iz večih stavkov, le te navedemo
v zavitih oklepajih:
%
{\tt
\begin{verbatim}
  while(pogoj) {
    stavek1;
    stavek2;
  }
\end{verbatim}
}

Pri zaključku zanke (\}) je priporočljivo pripisati komentar,
posebej v primerih, ko je stavkov oziroma vrstic v zanki več kot 20
ali pa ko so v zanki vsebovane še druge \texttt{while} oziroma
\texttt{for} zanke. Tako označimo kje se konča kakšna zanka.

Pozorni moramo biti na to, da za \texttt{while} (pogoj) ne pišemo
podpičja, saj lahko s tem ustvarimo neskončno zanko (v primeru ko je
pogoj izpolnjen) ali pa se zanka šteje kot nepotrebna, saj jo
računalnik preskoči v primeru ko pogoj ni izpolnjen).


\subsection*{Primer programa z while zanko}

Napiši program, ki bo šeštel števila od 1 do n.  Pred zanko moramo
zapisati, da začnemo s številom n=1 in je začetna vsota enaka 0.

Program:
%
{\tt
\begin{verbatim}
#include <stdio.h>
#include <conio.h>
void main (void) {
  clrscr();
  int n,np,sum ;

  n= 1;
  sum= 0;
  printf("Vsoto koliko stevil zelimo izracunati?\n");
  scanf("%d", &np);
  while (n<=np) {
    sum = sum + n;      /* pisemo lahko tudi sum += n */
    n = n + 1;          /* ali n += 1 ali n++ */
  }                     /* ali sum += n++; kot en stavek   */
  printf("Vsota %d stevil je %d \n",np,sum);
}
\end{verbatim}
}

\section*{\emph{For} stavek}

For stavek ima obliko:
%
{\tt
\begin{verbatim}
  for (izraz 1 ; izraz 2 ; izraz 3)
    stavek;
\end{verbatim}
}
%
Če pa so stavki sestavljeni:
%
{\tt
\begin{verbatim}
  for (izraz1: izraz2: izraz3) {
    stavek 1;
    stavek 2;
    ...
   }
\end{verbatim}
}

\emph{Izraze med sabo ločimo z podpičji.} V njih pa navajamo naslednje
stvari:
%
\begin{itemize}
\item V \emph{izrazu 1} navedemo, kaj mora računalnik narediti na
  začetku (inicializacija).
\item V \emph{izrazu 2} povemo, do kdaj naj ponavlja.
\item V \emph{izrazu 3} pa povemo, kaj naj v zanki izračuna oz.
  spremeni.
\end{itemize}


\subsection*{Prejšnji program sestavljen s for stavkom}

{\tt
\begin{verbatim}
  ...
  sum=0;
  for (n=1; n<=np; n++)
    sum+=n
  ...
\end{verbatim}
}
%
S tem smo prejšnjo while zanko nadomestili s stavkom for.

Izrazi v for stavku so lahko tudi nizi izrazov. Takšne izraze ločimo
med seboj z vejicami.


\subsection*{Prejšnji program s sestavljenimi izrazi}

{\tt
\begin{verbatim}
  ...
  for (n=1,sum=0; n<=np; sum+=n,n++);
                    /* for (n=1,sum=0; n<=np; sum += n++ */
  ...
\end{verbatim}
}
%
V tem \texttt{for} stavku smo zapisali vse začetne podatke, pogoj za
ponavljanje in celotno računanje v zanki. S podpičjem povemo, da ni
zunaj te for zanke nobene dodatne operacije.

Tu moramo paziti kaj pomeni \texttt{n++} in kaj \texttt{++n}. Če
pišemo:
%
\begin{itemize}
\item \texttt{n++} pomeni, da najprej velja vrednost \texttt{n}, potem
  pa se \texttt{n} poveča.
\item \texttt{++n} pa pomeni, da se \texttt{n} najprej poveča potem pa
  se začnejo izvajati ostali stavki.
\end{itemize}


\subsection*{Računanje $I_n = e\int_0^1 x^ne^{-x}dx$}
%
{\tt
\begin{verbatim}
            /* e je oznaka za stevilo 2.71828...*/
#define e 2.71828183
{
  int np,n;
  float I;

  n= 0;
  I= e-1;

  while (n<=np) {
    printf("%d %f \n", n, I);
    n++;
    I=n*I-1;
 }
}
\end{verbatim}
}

\vskip 0.5cm

\noindent {\bf Prejšnji program napisan s for stavkom:}
\begin{verbatim}
  ...
  I=e-1;
   for(n=0; n<=np, n++)
     {
     printf("%d %f \n",n,I);
     I = (n+1)*I - 1;
     }
 ...
\end{verbatim}


\subsection*{Enostavnejša oblika prejšnjega for stavka}

{\tt
\begin{verbatim}
 ...
 for(n=0, I=e-1; n<=np; printf(...), I=(n+1)*I-1, n++);
 ...
\end{verbatim}
}
%
Še druga oblika
%
{\tt
\begin{verbatim}
 ...
 for(......; n<=np; printf(...), I=++n*I-1);
 ...
\end{verbatim}
}
%
Opozorilo: \emph{Podpičje za stavkom for pomeni, da ni v zanki nobene
  dodatne operacije več.}

Kadar v izrazu zanke \texttt{for} nastopa več izrazov, je vprašanje
vrstnega reda izvajanja odvisno od prevajalnika.

\section*{Pogojni stavek}

Pogojni stavek izgleda takole:
%
{\tt
\begin{verbatim}
  if(pogoj)
    stavek 1;
  else
    stavek 2;
\end{verbatim}
}
%
Če je pogoj izpolnjen se izvede stavek 1, drugače pa se izvede stavek
2.


\subsection*{Primer}

{\tt
\begin{verbatim}
  int a, b, max;
  if (a>b)
    max=a;
  else
    max=b;
\end{verbatim}
}

V primeru, da znotraj pogojnega stavka nastopa še kakšen pogojni
stavek, je priporočljivo označiti tiste, ki spadajo skupaj s
komentarjem.


\subsection*{Primer programa s pogojnim stavkom}

Računanje rešitev kvadratne enačbe $ax^2+bx+c=0$. Podatki so a, b, c.
%
{\tt
\begin{verbatim}
  ...
  if (a==0) {                          /* linearna enacba */
    if(b==0) {
      if (c==0)
        printf("Neskoncno resitev\n");
      else                             /* c ni enak 0 */
        printf("Ni resitve \n");
      }
    else                               /* b ni enak 0 */
      printf("Resitev=%f \n", -c/b);
    }
  else {                               /* a ni enak 0 */
    d= b*b - 4*a*c;
    if (d >= 0)
      printf("x1= %f, x2= %f \n",
             -b+sqrt(d)/(2*a), -b-sqrt(d)/(2*a));
    else                               /* d < 0 */
      printf("x1,2= %f +- %fi \n",
             -b/(2*a), sqrt(-d)/(2*a));
  }
\end{verbatim}
}

\end{document}


