Elektrotehnički Fakultet Univerziteta u Beogradu                     Beograd, 26.01.2009.

Ispit iz Programiranja 2

Ispit traje: 150 minuta

Napomene:

a) Pažljivo proučite Uputstvo pre popunjavanja Obrasca za odgovore.

b) Vrednost odgovora: tačan = 5; netačan = -1.25; nevažeći (nula ili više zacrnjenih kružića) = 0.

c) Na pitanjima se može osvojiti najviše 25 poena.

d) Svaki zadatak nosi 20 poena.

I. ZADACI

1)Napisati program na programskom jeziku C za formiranje rezervacije sala potrebnih za održavanje ispita. Podaci o raspoloživim salama i njihovom kapacitetu nalaze se u tekst datoteci sale.txt, prema sledećem formatu: svaki red datoteke sadrži oznaku sale (znakovni niz od najviše 4 znaka) i kapacitet sale za održavanje ispita (pozitivan ceo broj). Šifre svih sala su jedinstvene. Smatrati da nema više od 50 raspoloživih sala. Program treba da učita broj prijavljenih kandidata sa standardnog ulaza (ako broj kandidata nije pozitivan, program treba prekinuti) a zatim da na standardnom izlazu ispiše oznake sala koje je potrebno rezervisati i, u nastavku reda, za svaku salu opseg rednih brojeva prijavljenih kandidata koji su raspoređeni u datu salu. Napomena: program treba da rezerviše sale redom, odnosno nije potrebno realizovati optimalno zauzimanje sala. Primer:

Sadržaj datoteke sale.txt

Unet broj prijavljenih kandidata

Ispis na standardnom izlazu

AAMF 42

0055 15

0056 46

TVA 92

M208 60

125

AAMF 1-42

0055 43-57

0056 58-103

TVA 104-125

 

2)Napisati program na programskom jeziku C za slučajan odabir poreskih obveznika koji se podvrgavaju rutinskoj kontroli Poreske uprave. Za svakog poreskog obveznika se pamti ime i prezime (znakovni niz proizvoljne dužine), identifikacioni kod (pozitivan ceo broj) i bruto zarada na godišnjem nivou (realan broj). Napisati funkciju za formiranje jednostruko ulančane liste poreskih obveznika na osnovu podataka koji se pročitaju sa standardnog ulaza. Funkcija kao rezultat vraća pokazivač na prvi element liste. Napisati funkciju koja ispiše imena i identifikacione kodove 10 poreskih obveznika koje bira na slučajan način iz liste koja se prosleđuje kao argument. Na raspolaganju je funkcija
int sluc_br(int n); koja vraća slučajan broj u opsegu od 1 do n. Smatrati da funkcija u n uzastopnih poziva (sa istom vrednošću argumenta) vraća n različitih vrednosti. Napisati glavni program koji, korišćenjem opisanih funkcija, ispiše tražene podatke za 10 poreskih obveznika. Napomena: program treba da ispravno oslobodi alociranu memoriju.

II. PITANJA

1) Šta ispisuje priloženi segment programa na programskom jeziku C?

#include <stdio.h>

void main() {

int d = 0;

char c='z';

  do {

     switch(d%5) {

        case 1:  d++;

        case 0:  printf("%d", ++d); break;      

   case 2:  for(d=d<<1, c='a'; d<=10;)

            { d++; break;  }

   case 3: d--; break;

   case 4: printf("%c%d", c, d=0 ); break;

   default: c='b';

  }

 } while(d > 0);

 printf("%c",c);

}

 

 A)     13z0z

(B)     13a0a

 C)     13ba0a

2) Šta ispisuje sledeći program na programskom jeziku C?

#include <stdio.h>

int P1(int *a) { return *a++;}

int P2(int *b) { while(--*b); return *b+2; }

int P3(int *c) { return *c+1; }

typedef int (*f)(int*);

void main() {

f niz[]={P1, P2, P3, P3, P2, P1}; int i;

  for(i=0; i<6; i++) printf("%d", i=niz[i%6](&i));

}

(A)    0245

 B) 1350

 C) 024150

3) Koja od sledećih tvrđenja su tačna na programskom jeziku C?

 A)     Pokazivačke promenljive služe za evidentiranje broja indirektnih pristupa pokazanim podacima.

 B) Operator sizeof služi za dohvatanje količine slobodne memorije koja je na raspolaganju.

(C)     U naredbi if (a=b) c++; promenljiva c će biti inkrementirana samo ako je b različito od 0.

4) Šta ispisuje sledeći program na programskom jeziku C?

#include<stdio.h>

#include<math.h>

int a[4][4] = { {1,2,3,4}, {5,6,7,8},{9,10,11,12},{13,14,15,16} };

int f(int x, int y){

  if (a[x][y]%4 == 1) return a[y][x];       else return a[y][x] + f((y+1)%4,x);

}

main () { printf("%d",f(1,2)); }

 

 A)     36

(B)     46

 C) 49

5) Šta ispisuje sledeći program na programskom jeziku C, ako je sadržaj komandne linije: 5  1a 21  xy?

#include <stdio.h>

void main(int argc, char *argv[]) {

int i, j;

      for(j=0;j<2;j++)

        for(i=1; i<argc;i++) {

              char c = argv[i][j];

              printf("%c", c ? c : '-');

        }                

}

 

(A)    512x-a1y

 B) 51a-21xy

 C) 5121-axy

6) Šta treba da stoji umesto #### da bi sledeća funkcija ispravno premestila poslednji element jednostruko ulančane liste na njen početak, uz pretpostavku da alokacija memorije uvek uspeva?

typedef struct lst { int br;  struct lst *sled; } elem;

#include <stdio.h>

#include <stdlib.h>

elem *pitanje(elem *e) {

elem *jedan, *dva;

      if( !e ) return NULL;

      for(jedan=e, dva=NULL; jedan->sled; dva=jedan, jedan=jedan->sled);

      ####

      return e;

}

 

 A)     if(jedan) jedan->sled=NULL,dva->sled=e,e=dva;

(B)     if(dva) dva->sled=NULL,jedan->sled=e,e=jedan;

 C) if(e->sled) e->sled=jedan->sled,e=dva;