\documentclass[a4paper]{article}

\usepackage[latin2]{inputenc}
\usepackage{times}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Dodatna okolja itd.
%---
                                          %% GLAVA in SPLOSNO:
\pagestyle{myheadings}
\markright{%
  \textsc{Računalništvo} I (1998/99):
  Kolokvij 9.~rožnika~1999
}

%----------------------------------------------------[ Ocenjevanje: ]
\newcommand{\Ocena}[1]{\dotfill \_\_~/~\makebox[1.5em][r]{#1}}


%--------------------------------------------------------[ Podpisi: ]
\newlength{\PolStrani}                 % ``pol strani'' za stavljenje
\setlength{\PolStrani}{0.4\textwidth}  % dveh vzporednih stolpcev
\newlength{\VisinaPodpisa}             % visina skatle podpisa
\setlength{\VisinaPodpisa}{1.5cm}
\newlength{\DolzinaPodpisa}            % dolzina crte za podpis
\setlength{\DolzinaPodpisa}{0.80\PolStrani}

\newcommand{\vPodpis}[2]{              % kdo bo podpisal dokument
  \begin{minipage}[c]{\PolStrani}
    \begin{center}
      #1
    \end{center}

    \vspace{\VisinaPodpisa}

    \begin{center}
       \rule{\DolzinaPodpisa}{0.5pt}     % crta za podpis
    \\ \parbox{\DolzinaPodpisa}{#2}
    \end{center}
  \end{minipage}
} % \vPodpis
\makeatother

\newlength{\DolzinaDatuma}             % dolzina crte za datum
\setlength{\DolzinaDatuma}{0.75\PolStrani}

%-------------------------------------------------------------------
%------------------------------------------------------[ Vprasanja ]
%-------------------------------------------------------------------

\newif\ifResitve
\Resitvetrue
%\Resitvefalse

%-------------------------------------------------------------------
\newcommand{\Kupljivo}{%
  \\ \mbox{} \hfill \textsc{Kupljivo:}~\rule{1.5cm}{0.5pt} \par
} % \Kupljivo

%-------------------------------------------------------------------
\newenvironment{Naloga}[1]{

  \clearpage

  \item \textsc{Naloga:} \Ocena{#1}

}{
} % Naloga

%-------------------------------------------------------------------
\newenvironment{Vprasanje}[1]{%

\noindent
\textsc{Vprašanje:} \Ocena{#1}

}{
} % Vprasanje

%-------------------------------------------------------------------
\newenvironment{Odgovor}[1]{%

  \ifResitve
    \noindent
    \begin{minipage}[t][#1][t]{\textwidth}
  \else
    \vspace{#1}
  \fi
}{
  \ifResitve
    \end{minipage}
  \fi
} % Odgovor

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\title{
   RAČUNALNIŠTVO I
\\ 1998/99
}
\author{Kolokvij}
\date{9.~rožnika~1999}

\begin{document}

\maketitle
\thispagestyle{empty}

Kolokvij sestoji iz petih nalog, katerih skupno število točk je
\textbf{100} in \textbf{20} za dodatno nalogo. Vrednosti posameznih
nalog so naznačne v spodnji tabeli.

\begin{center}
  \begin{minipage}{0.8\textwidth}
    \begin{enumerate}
    \item naloga: zapisi študentov v polju               \Ocena{ 20}
    \item naloga: urejanje -- prvič                      \Ocena{ 20}
    \item naloga: zapisi študentov v seznamu             \Ocena{ 24}
    \item naloga: urejanje -- drugič                     \Ocena{ 16}
    \item naloga: zapisi študentov kot predmeti          \Ocena{ 20}
      \\  dodatno vprašanje                              \Ocena{+20}
    \item[\textsc{Skupno}]                               \Ocena{100}
      \\  dodatno vprašanje                              \Ocena{+20}
    \end{enumerate}
  \end{minipage}
\end{center}

\noindent
\textsc{Opomba:} Nekatere naloge so posebej označene. Pri teh nalogah
lahko ,,kupite`` odgovor. Cena odgovora so vse možne točke pri tistem
vprašanju, oziroma podvprašanju. Zato se za nakup odločajte preudarno
in le po potrebi!

\noindent
Čas pisanja je 2 uri (120 minut).

\noindent
Na kolokviju je dovoljena uporaba zapiskov a nikakor ,,dobrososedske``
pomoči.

\noindent
Predno pričnete pisati, spodaj vpišite svoje ime in priimek ter se
podpišite.

\vfill

\vPodpis{Ime in Priimek}{(tiskano)}
%
\hfill
%
\vPodpis{Podpis}{(študent)}

\vfil

\begin{center}
  \emph{Veliko uspeha!}
\end{center}

%--------------------------------------------------------------------
\clearpage %---------------------------------------------------------
%--------------------------------------------------------------------

\begin{enumerate}

%--------------------------------------------------------------------
\begin{Naloga}{20} %-------------------------------------------------
%
  Rdeča nit tega kolokvija so zapisi s podatki študentov in
  obdelovanje le-teh. Podatki študentov, ki nas zanimajo so:
%
  \begin{itemize}
  \item ime študenta: do 10 znakov dolg niz črk, med katerimi katerimi
    \emph{ni šumnikov}.
  \item priimek študenta: do 20 znakov dolg niz črk, med katerimi
    \emph{ni šumnikov}.
  \item letnik, v katerem je študent: celo število.
  \end{itemize}

  %------------------------------------------------------------------
  \begin{Vprasanje}{7} %---------------------------------------------
    Napišite definicijo tipa \texttt{tStudent}, ki popisuje enega
    študenta!
%
    \Kupljivo

    \begin{Odgovor}{6cm}
{\tt
\begin{verbatim}
typedef struct {
  char ime[10];
  char priimek[20];
  int  letnik;
} tStudent;
\end{verbatim}
}
    \end{Odgovor}

  \end{Vprasanje}

  %------------------------------------------------------------------
  \begin{Vprasanje}{6} %---------------------------------------------
    Napišite definicijo spremenljivke \texttt{letnik}, ki popisuje 100
    študentov v letniku. Spremenljivka naj bo vektor ustreznega tipa
    in ustrezne velikosti.
    \begin{Odgovor}{2cm}
{\tt
\begin{verbatim}
#define maxLetnik 100

tStudent letnik[maxLetnik];
\end{verbatim}
}
    \end{Odgovor}
  \end{Vprasanje}

  %------------------------------------------------------------------
  \begin{Vprasanje}{7} %---------------------------------------------
    Kakšna je razlika med \emph{tipom} in \emph{spremenljivko}?
    \begin{Odgovor}{3cm}
      Spremenljivka je določen predstavnik danega tipa, tip pa je
      množica vseh možnih spremenljivk -- opisuje lastnosti vseh
      spremenljivk. S tipom ne moremo ničesar početi, spremenljivki pa
      lahko priredimo vrednost ali jo preberemo.
    \end{Odgovor}
  \end{Vprasanje}

\end{Naloga}

%--------------------------------------------------------------------
\begin{Naloga}{20} %-------------------------------------------------
%
  Eno od opravil v uporabnikovem programu je izpis študentov v letniku
  po abecednem redu; no ja, skoraj v abecednem redu, saj morajo biti
  najprej izpisani vsi tisti, katerih priimek se prična na ,,A``, nato
  oni na ,,B``, sledijo na ,,C``, na ,,D`` itd. Pozor, ker ni
  šumnikov, ni nikogar na ,,Č``!

  Napišite podprogram, ki bo \emph{uredil} (\emph{ne} izpisal)
  študente v letniku. Za opis po\-sa\-mez\-nega študenta in letnika
  uporabite rešitev prejšnje naloge.

  %------------------------------------------------------------------
  \begin{Vprasanje}{4} %---------------------------------------------
    Kateri so vhodni in kateri izhodni parametri?

    \begin{Odgovor}{2cm}
      Vhodni parameter je letnik. Izhodni parameter je tudi letnik.
    \end{Odgovor}
  \end{Vprasanje}

  %------------------------------------------------------------------
  \begin{Vprasanje}{4} %---------------------------------------------
    Kakšen je podpis funkcije?
%
    \Kupljivo
\mbox{} \hfill {\small (skupaj s prejšnjim vprašanjem)}

    \begin{Odgovor}{2cm}
{\tt
\begin{verbatim}
void Uredi (tStudent * letnik);
                                /* ali */
void Uredi (tStudent letnik[maxLetnik]);
\end{verbatim}
}
    \end{Odgovor}
  \end{Vprasanje}

  %------------------------------------------------------------------
  \begin{Vprasanje}{12} %--------------------------------------------
    Napišite samo funkcijo!

    \begin{Odgovor}{8cm}
{\tt
\begin{verbatim}
void Uredi (tStudent letnik[maxLetnik])
{ int i, j;                     /* stevca */
  tStudent zac;                 /* zacasna sprem. */

  for (i= 0; i < maxLetnik; i++)
    for (j= 0; j < i; j++)
      if (letnik[i].priimek[0] < letnik[j].priimek[0]) {
        zac= letnik[i];         /* zamenjamo */
        letnik[i]= letnik[j]; letnik[j]= zac;
      }
} /* Uredi */
\end{verbatim}
}
    \end{Odgovor}
  \end{Vprasanje}

\end{Naloga}

%--------------------------------------------------------------------
\begin{Naloga}{24} %-------------------------------------------------
%
  V prejšnjih nalogah smo predstavili letnik kot vektor študentov. V
  tej nalogi pa ga bomo predstavili kot \emph{seznam študentov}.

  %------------------------------------------------------------------
  \begin{Vprasanje}{6} %---------------------------------------------
    Napišite definicijo glave (elementa) seznama in samega seznama
    študentov kot rekurzivne podatkovne strukture!
    \Kupljivo

    \begin{Odgovor}{9cm}
{\tt
\begin{verbatim}
typedef struct pod {
  tStudent    glava;
  struct pod* podSeznam;
} t_ElementSeznama;

typedef t_ElementSeznama* tSeznam;
\end{verbatim}
}
    \end{Odgovor}
  \end{Vprasanje}

  Na vajah smo se srečali s seznamom celih števil. Od tam uporabite
  naslednje funkcije ter jih ustrezno predelajte, da bodo uporabne za
  delo s seznamom študentov:

  %------------------------------------------------------------------
  \begin{Vprasanje}{6} %---------------------------------------------
    \texttt{vrednost\_glave}:
%
    \Kupljivo

    \begin{Odgovor}{5cm}
{\tt
\begin{verbatim}
tStudent vrednost_glave(tSeznam letnik)
{ return seznam->glava; }
\end{verbatim}
}
    \end{Odgovor}
  \end{Vprasanje}

  %------------------------------------------------------------------
  \begin{Vprasanje}{6} %---------------------------------------------
    \texttt{naredi\_seznam}:
%
    \Kupljivo

    \begin{Odgovor}{10cm}
{\tt
\begin{verbatim}
tSeznam naredi_seznam(tStudent student)
{ tSeznam seznam;

  seznam = (tSeznam)malloc(sizeof(t_ElementSeznama));
  seznam->glava = student;
  seznam->podSeznam = NULL;
  return seznam;
} /* naredi_seznam */
\end{verbatim}
  }
    \end{Odgovor}
  \end{Vprasanje}

  %------------------------------------------------------------------
  \begin{Vprasanje}{6} %---------------------------------------------
    \texttt{Dodaj\_zacetek}:
%
    \Kupljivo

    \begin{Odgovor}{5cm}
{\tt
\begin{verbatim}
tSeznam Dodaj_zacetek(tStudent student, tSeznam seznam)
{ tSeznam seznam1;

  seznam1 = naredi_seznam(student);
  seznam1->podSeznam = seznam;
  return seznam1;
} /* Dodaj_zacetek */
\end{verbatim}
}
    \end{Odgovor}
  \end{Vprasanje}
\end{Naloga}

%--------------------------------------------------------------------
\begin{Naloga}{16} %-------------------------------------------------
%
  Sedaj, ko imamo letnik predstavljen kot seznam študentov, bomo še za
  takšno predstavitev napisali funkcijo, ki bo ustrezno preuredila
  seznam študentov, da bodo na začetku študenti, katerih priimek se
  prična na ,,A``, nato na ,,B`` itd.

  %------------------------------------------------------------------
  \begin{Vprasanje}{4} %---------------------------------------------
    Kakšen je podpis funkcije?

    \begin{Odgovor}{2cm}
{\tt
\begin{verbatim}
tSeznam Uredi (tSeznam letnik);
\end{verbatim}
}
    \end{Odgovor}
  \end{Vprasanje}

  %------------------------------------------------------------------
  \begin{Vprasanje}{12} %--------------------------------------------
    Napišite samo funkcijo!

    \noindent {\small
%
      \textsc{Namig:} Poglejte si, katere funkcije smo napisali na
      vajah za delo s seznamom celih števil in morda kakšno od njih
      ustrezno priredite, da bo počela, kar zahteva vprašanje. Pri
      pisanju uporabite tudi funkcije, ki ste jih napisali pri
      prejšnjem vprašanju.
    }

    \begin{Odgovor}{10cm}
{\tt
\begin{verbatim}
tSeznam izloci_glavo(tStudent * student, tSeznam seznam)
{ tSeznam novi_seznam;

  *student = seznam->glava;
  novi_seznam = seznam->podSeznam;
  (void) free(seznam);
  return novi_seznam;
} /* izloci_glavo */

tSeznam vrini(tSeznam letnik, tStudent student)
{ tStudent glava;               /* prvi v seznamu */

  if (seznam == NULL)           /* ce je seznam prazen */
    return naredi_seznam(student);

  glava= vrednost_glave(letnik);
  if(glava.priimek[0] >= student.priimek[0]){
    letnik = Dodaj_zacetek(student, letnik);
    return letnik;
  } else {
    letnik->podSeznam = vrini(letnik->podSeznam, student);
    return letnik;
  }
} /* vrini */

tSeznam Uredi (tSeznam letnik)
{ tSeznam urLetnik= NULL;       /* urejeni letnik je prazen */
  tStudent student;             /* obdelovani student */

  while (letnik != NULL) {
    letnik= izloci_glavo(&student, letnik);
    urLetnik= vrini(urLetnik, student);
  }
  return urLetnik;
} /* Uredi */
\end{verbatim}
}
    \end{Odgovor}
  \end{Vprasanje}

\end{Naloga}

%--------------------------------------------------------------------
\begin{Naloga}{20} %-------------------------------------------------
%
  V zadnji nalogi si bomo ogledali še kako rokovati s študenti in
  letnikom, ki je predstavljen v predmetni obliki. V tej nalogi bomo
  definirali razred študetov in nato, za dodatno nalogo, še razred
  letnikov.

  %------------------------------------------------------------------
  \begin{Vprasanje}{9} %---------------------------------------------
    Napišite definicijo razreda študentov, od katerih ima vsak vse
    lastnosti kot prej (ime, priimek in letnik) ter dodatno lastnost
    (funkcijo), da se zna izpisati v obliki:
%
    \begin{quote}
      Priimek, Ime: letnik
    \end{quote}

    \begin{Odgovor}{0.75\textheight}
{\tt
\begin{verbatim}
class cStudent {
public:
  tStudent podatki;

  void Izpisi()
  { printf("%s, %s: %d\n",
           podatki.priimek, podatki.ime, podatki.letnik);
  } // Izpisi
}; // cStudent
\end{verbatim}
}
    \end{Odgovor}
  \end{Vprasanje}

  %------------------------------------------------------------------
  \begin{Vprasanje}{4} %---------------------------------------------
    Za kateri lastnosti (funkciji) smo rekli na vajah, da ju ima vsak
    razred predmetov? Napišite ju še za razred študentov!

    \begin{Odgovor}{0.95\textheight}
      To sta funkciji, ki ustvarita in uničita predmet iz razreda --
      \emph{kreator}, \emph{destruktor}. Primera za razred
      \texttt{cStudent} sta:

{\tt
\begin{verbatim}
cStudent()
{ strcpy(podatki.priimek, "");
  strcpy(podatki.ime, "");
  podatki.letnik= 0;
} // cStudent

~cStudent() { }
\end{verbatim}
}
    \end{Odgovor}
  \end{Vprasanje}

  %------------------------------------------------------------------
  \begin{Vprasanje}{7} %---------------------------------------------
    Kakšna je razlika med predmetom in razredom?

    \begin{Odgovor}{3cm}
      Razred popisuje množico predmetov, oziroma definira lastnosti,
      ki jih imajo predmeti. Predmet pa je udejanjen predstavnik
      razreda, ki ,,živi``, hrani resnične podatke in zna nekaj
      narediti.
    \end{Odgovor}
  \end{Vprasanje}

  %------------------------------------------------------------------
  \begin{Vprasanje}{+20} %-------------------------------------------
    \textsc{Dodatna:} Napišite definicijo razreda letnik. Vsak letnik
    sestoji iz do 100 študentov (predmetov iz razreda študentov).
    Poleg tega:
%
    \begin{itemize}
    \item si zna dodati novega študenta v letnik s funkcijo
      (lastnostjo) \texttt{DodajSi};
    \item se zna urediti po že prej opisanem abecednem vrstnem redu s
      funkcijo (lastnostjo) \texttt{UrediSe}.
    \item se zna izpisati s funkcijo (lastnostjo) \texttt{IzpisiSe}.
    \end{itemize}
%
    Napišite vsaj glave funkcij v razredu!

    \begin{Odgovor}{0.95\textheight}
{\tt
\begin{verbatim}
class cLetnik {
public:
  cStudent studenti[maxLetnik];
  int vLetniku;                 // studentov v letniku

  cLetnik() { vLetniku= 0 }

  void DodajSi(tStudent student)
  { if (vLetniku < maxLetnik) {
      studenti[vLetniku].podatki= student;
      vLetniku++;
    }
  } // DodajSi

  void UrediSe()
  { int i, j;                   // stevca
    cStudent zac;               // zacasna sprem.

    for (i= 0; i < vLetniku; i++)
      for (j= 0; j < i; j++)
        if (studenti[i].podatki.priimek[0] <
            studenti[j].podatki.priimek[0]) {
          zac= studenti[i];     // zamenjamo
          studenti[i]= studenti[j]; studenti[j]= zac;
        }
  } // UrediSe

  void IzpisiSe()
  { int i;                      // stevec
    for (i= 0; i < vLetniku; i++)
      studenti[i].Izpisi();
  } // IzpisiSe

} // cLetnik
\end{verbatim}
}
    \end{Odgovor}
  \end{Vprasanje}

\end{Naloga}

\end{enumerate}

\end{document}
