next up previous
Next: About this document ...

RAČUNALNIŠTVO I
1998/99

Kolokvij

4. sušca. 1999

Kolokvij sestoji iz devetih nalog, katerih skupno število točk je 100. Vrednosti posameznih nalog so naznačne v spodnji tabeli.



1.
naloga: definicija funkcije __ /  6
2.
naloga: parametri funkcije __ /  12
3.
naloga: Črni Jaka __ /  12
4.
naloga: nepridiprav pri kartah __ /  9
5.
naloga: izpisovanje kart __ /  5
6.
naloga: in še enkrat izpisovanje kart __ /  15
7.
naloga: razvrščanje kart __ /  14
8.
naloga: niso samo karte skrivnostne, ampak tudi programi __ /  7
9.
naloga: pa poglejmo, kdo je zmagal pri kartah __ /  20
SKUPNO
__ / 100



Čas pisanja je 1 ura in pol (90 minut).

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

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



Ime in Priimek



$\textstyle \parbox{\DolzinaPodpisa}{(tiskano)}$





Podpis



$\textstyle \parbox{\DolzinaPodpisa}{(študent)}$



Veliko uspeha!

1.
Definicija funkcije sestoji iz glave, pogodbe in telesa.

NALOGA:

(a)
Iz česa sestoji glava definicije funkcije? Napišite primer glave.

(b)
Iz česa sestoji pogodba funkcije? Na kratko opišite pomen posameznih členov pogodbe.

2.
Vsaka funkcija ima vhodne in izhodne parametre. Sicer prenašamo parametre v funkcijo bodisi po referenci (naslovu) ali po vrednosti.

NALOGA:

(a)
Katera je najbolj bistvena razlika med prenosom parametrov po referenci in po vrednosti?

(b)
Kakšen prenos se uporablja za vhodne parametre?

(c)
Kakšen prenos se uporablja za izhodne parametre?

(d)
Za vsakega od parametrov v spodnji glavi funkcije določite ali je prenešen po vrednosti ali po referenci.
void NekajNaredi (in par1, int par2[100]);

3.
  Pri igri s kartami imenovani ,,Črni Jaka`` lahko vzemamo karte z vrha kupa, dokler njihova vsota ne preseže vrednosti 21. Zmaga tisti igralec, katerega vsota je najbližja vrednosti 21 a je ne presega. V tej nalogi malce spremenimo pravila in vlečemo karte dokler njihova vsota ne preseže vrednosti 21. Kot rezultat funkcija vrne razliko med vsoto izvlečenih kart in vrednsotjo 21.

NALOGA: Spodaj je napisano telo funkcije, ki skrbi za vlečenje kart. V telesu funkcije je napisano le kaj počne, vi pa dopišite kako to naredi - t.j. napišite kodo funkcije. Pri tem upoštevajte, da je na vrhu kupa kart karte[0], naslednja karta je karta[1] itd. Karta i ima vrednost karta[i].

int VleciKarte(int karte[52])
{




                     /* nastavi zacetno vsoto na 0 */




                     /* dokler vsota kart ne preseze 21 */




                        /* izvleci karto */




                        /* in pristej njeno vrednost vsoti */




                     /* vrni vsoto zmanjsano za 21 */




} /* VleciKarte */

4.
Sosedov Miha bi rad malce goljufal pri igri ,,Črni Jaka``. Nepridiprav jo kani goljufati tako, da bo sem ter tja pokukal na poljubno mesto v kup kart, ki je predstavljen kot tabela 52-ih celih števil (glej nalogo [*]), ter se tako lažje odločil, ali naj še vleče karte ali ne. Zato potrebuje funkcijo (podprogram) Kukaj, ki bo prebrala s tipkovnice mesto, na katero bo Miha pokukal in bo nato vrnila vrednost karte na tem mestu.

NALOGA:

(a)
Kakšne vhodne in kakšne izhodne parametre ima funkcija Kukaj?

(b)
Napišite glavo funkcije Kukaj.

5.
  Pri naši igri s kartami potrebujemo tudi funkcijo, ki bo smiselno izpisovala karte, glede na njihovo vrednost. Zato definiramo naslednjo funkcijo:
void IzpisiKarto(int karta) {
/* Desc:   Funkcija izpise na stdout opis slike na karti, ki ima dano
           vrednost.
   Parms:  karta - vrednost karte (po vrednosti)
   Result: -
   Pre:    -
   Post:   opis karte je izpisan na stdout
*/

  if (karta == 14)      printf("as");
  else if (karta == 13) printf("kralj");
  else if (karta == 12) printf("dama");
  else if (karta == 11) printf("fant");
  else if (karta == 10) printf("desetica");
  else if (karta == 9)  printf("devetica");
  else if (karta == 8)  printf("osmica");
  else if (karta == 7)  printf("sedmica");
  else if (karta == 6)  printf("sestica");
  else if (karta == 5)  printf("petica");
  else if (karta == 4)  printf("stirica");
  else if (karta == 3)  printf("trojka");
  else                  printf("dvojka");

} /* IzpisiKarto */

NALOGA: Prepišite zgornjo funkcijo z uporabo stavka switch.

6.
Nepridiprav Miha želi pri svojem nečednem poslu uporabiti našo funkcijo IzpisiKarto iz naloge [*]. Toda Miha bi rad najprej preveril kako program deluje. Pričakuje, da bo naslednji testni program:
int main(void) {

  int karta;

  for (karta= 2; karta < 20; karta++) {
    IzpisiKarto(karta);
    printf("\n");
  }

  return 1;
} /* main */
izpisal:
dvojka
trojka
stirica
petica
sestica
sedmica
osmica
devetica
desetica
fant
dama
kralj
as
dvojka
trojka
stirica
petica
sestica
saj meni, da se najprej izpise prvi niz kart, nato drugi in tako naprej. Toda izpiše se:
dvojka
trojka
stirica
petica
sestica
sedmica
osmica
devetica
desetica
fant
dama
kralj
as
dvojka
dvojka
dvojka
dvojka
dvojka

NALOGA:

(a)
Zakaj, opišite, je prišlo do razlike med obema izpisoma?

(b)
Kdo je ,,kriv`` za napako (obkrožite pravilen odgovor):
  • mi, ki smo programirali IzpisiKarto;
  • Miha, ki je uporabil našo funkcijo.

(c)
Kako popraviti napako - odpraviti razliko? Navedite dve bistveno različni možnosti.

7.
Če imamo n kart jih lahko razvrstimo v vrsto na n! načinov, kjer je funkcija n! definirana kot $1 \cdot 2 \cdot \cdot \cdot n$.

NALOGA: Napišite funkcijo Fakulteta, ki bo izračunala n! s pomočjo rekurzije.

8.
Imamo program:
#include <stdio.h>

int Nekaj (int a, int b) {

  if (b == 0)  return a;
  else         return Nekaj(b, a % b);

} /* Nekaj */

int main (void) {

  printf("%d \n", Nekaj(77, 22));
  return 0;

} /* main */

NALOGA: Kaj izpiše program?

DODATNA NALOGA: Znate opisati bolj splošno, kaj dela program?

9.
Igra kart je zaključena in čas je, da vidimo, kdo je največkrat zmagal. Za to bomo uporabili tračni diagram. Tračni diagram sestoji iz trakov, katerih dolžina je sorazmerna velikosti količino, ki jo predstavljajo. Včasih pa so lahko količine, ki jih želimo predstaviti s tračnim diagramom prevelike in moramo omejiti dolžino trakov. V naslednjem primeru so v prvem stolpcu zapisane velikosti količin, ki jim sledijo tračni diagrami, ki so omejeni na 7 znakov. Pri tem je trak, ki smo ga morali ,,odrezati``, označen z znakom X na zadnjem mestu.
   4 OOOO
   9 OOOOOOX
   7 OOOOOOO
   0
   2 OO

NALOGA: Napišite podprogram TracniDiagram, ki bo izrisal tašen tračni diagram.

void TracniDiagram (int stKolicin, int kolicine[MAX_KOLICIN],
                    int najvecjaDolzina) {
/* Desc:    Funkcija izrise tracni diagram za stKolicin kolicin, ki so
            shranjene v tabeli kolicine. Pri tem uposteva, da je
            najdaljsi trak diagrama lahko dolg najvecjaDolzina znakov.
            i-ta vrstica diagrama predstavlja i-to kolicino iz tabele
            kolicin kolicine (0 <= i < stKolicin). Vrstica se pricne s
            stevilsko vrednostjo i-te kolicine, ki jo izpisana na 5
            mest natancno. Sledi presledek in nato trak sestojec iz
            znakov O in dolzine enake velikosti i-te kolicine. Ce je
            ta kolicina vecja od najvecjaDolzina, je trak dolg
            najvecjaKolicina znakov, od katerih je zadnji znak X.
   Parms:   stKolicin - stevilo kolicin v tabeli kolicine (po vrednosti)
            kolicine - tabela kolicin (po referenci)
            najvecjaDolzina - najvecja dolzina traku (po vrednosti)
   Result:  -
   Pre:     (0 <= stKolicin < MAX_KOLICIN) AND
            (0 < najvecjaKolicina) AND
            (FOR 0 <= i < stKolicin: kolicine[i] >= 0)
   Post:    (tracni diagram je izpisan) AND
            (kolicine' = kolicine)
*/

} /* TracniDiagram */



 
next up previous
Next: About this document ...
Andrej Brodnik (Andy)
1999-03-06