Professional Documents
Culture Documents
Rok 10.02.2017
1. Što je alfabet brojnog sistema?
Brojevni sustav jest sustav s kojim se predstavljaju brojevi. Najpoznatiji je decimalni(10),
hex(16), bin(2), okt(8).
2. Neka je dat razlomljeni broj S u brojevnom sistemu sa bazom b. Navesti formulu za
izračunavanje dekadskog ekvivalenta broja Sb.
𝑆𝑛 𝑏𝑛 + 𝑆𝑛−1 𝑏𝑛−1 + ⋯ + 𝑆0 𝑏0 + 𝑆−1 𝑏−1 + ⋯ + 𝑆−𝑘 𝑏−𝑘 = 𝑆𝑏𝑖𝑛𝑎𝑟𝑦
3. Šta ispisuje sljedeći kôd?
printf("%o",-1>>1);
Ispis: 37777777777
Int je vrijednosti 4 byte-a, broj -1 kad se šiftuje u desno, pošto je negativan, neće promijeniti
njegovu vrijednost. 1 byte ima 8 bita, 4*8=32, dakle -1 u ovom slučaju ima 32 jedinice.
Konverzijom u oktalni (uzimanjem po tri bita od desna), konvertira se u oktalni i dobije se
ispis.
4. Šta ispisuje sljedeći kôd (koristi se LE konvencija)?
union _u {float f; int i;} u={8};
printf("%d", (u.i>>23)-127);
Ispis: 3
Unija: Posebna vrsta podatka u C-u koja omogućava skladištenje više različitih varijabli na istu
memorijsku lokaciju. Može se definirati unija sa više različitih članova, međutim samo jedan od tih
članova može imati vrijednost u datom trenutku.
Primjer:
union Data {
int i;
float f;
char str[20];
} data;
Sada, varijabla Data može pohraniti jedan cijeli broj, razl. podatak float ili niz charova.
Memorija koju unija zauzme bit će dovoljno velika da pohrani najveći element koji se nalazi u istoj. U
ovom slučaju Data tip zauzet će 20 byte-a, zato što je to najveći prostor koji može da bude zauzeto
od karakter stringa. Pri pristupu podacima iz unije, koristi se točka.
Primjer ispisa kodova:
data.i = 10;
data.f = 220.5;
strcpy( data.str, "C Programming");
data.i : 1917853763
data.f : 4122360580327794860452759994368.000000
data.str : C Programming
Vrijednosti i i f su se pokvarile iz razloga što posljednja vrijednost koja je dodjeljena varijabli je
okupirala memorijsku lokaciju i iz tog razloga ispis str-a je ispravan.
Sljedeći primjer:
data.i = 10;
printf( "data.i : %d\n", data.i);
data.f = 220.5;
printf( "data.f : %f\n", data.f);
Enum varijable uvijek ima jednu vrijednost, od svih koje su moguće. Dokaz:
card = club;
printf("Size of enum variable = %d bytes", sizeof(card));
Izlaz:
Ispis: -3
U varijabli *p nalazi se memorijska adresa trećeg člana datog niza. Budući da niz označava
početnu adresu tog niza, onda slijedi: POČETNA ADRESA NIZA (niz) minus ADRESA
TREĆEG ELEMENTA jednako je minus 3.
1b 1b
1b
1b 1b
1b Dodatni 1b
Pod pretpostavkom da je sizeof(&int)=4 potrebno je dodati padding byte, pošto
procesor na taj način smješta podatke kod struktura.
else
rezultat = neispunjeno;
12. Koliko ima varijabli sa dinamičkim životnim vijekom u sljedećem programu? int
x,*p;
int main() { extern int x,*p; } //0 varijabli
Životni vijek varijable je dio vremena izvršavanja programa u kojem se garantira da je za tu
varijablu rezerviran dio memorije i da se ta varijabla može koristiti. Postojanje varijabli koje
postoje samo pojedinačno tijekom izvršavanja neke funkcije znatno štedi memoriju, a
postojanje varijabli tijekom čitavog izvršavanja programa omogućava da se preko njih vrši
komunikacija između različitih funkcija. U C-u, postoje sljedeće vrste životnog vijeka:
● Statički (static) životni vijek koji znači da objekt dostupan tijekom cijelog izvršavanja
programa
● Automatski (automatic) najčešće imaju varijable koje se automatski stvaraju i
uklanjaju prilikom pozivanja funkcija
● Dinamički (dynamic) imaju varijable koje se alociraju i dealociraju na eksplicitan
zahtjev programera
Životni vijek se određuje na osnovu pozicije u kodu na kojoj je objekt uveden i na osnovu
eksplicitnog korištenja nekog od kvalifikatora auto (automatski životni vijek) ili static
(statički životni vijek).
Lokalne varijable podrazumijevano su automatskog životnog vijeka (osim ako je na njih
primjenjen kvalifikator static ili kvalifikator extern). Početna vrijednost lokalnih
automatskih varijabli nije određena.
Na lokalne automatske varijable i parametre funkcija moguće je primjeniti i kvalifikator
register.
Globalne varijable deklarirane su van svih funkcija i njihov doseg je razine (nivoa) datoteke,
tj. mogu se koristiti od točke uvođenja, u svim funkcijama datoteke.
Životni vijek ovih varijabli je UVIJEK statički, tj. prostor za ove varijable rezerviran je od
samog početka izvršavanja, sve do kraja. Prostor za ove varijable osigurava se u DATA
SEGMENT-u. Podrazumijevano se inicijaliziraju na vrijednost 0, ukoliko se ne izvrši
eksplicitna inicijalizacija.
U nekim slučajevima poželjno je čuvati informaciju između različitih poziva funkcije (npr
brojati koliko puta je pozvana neka funkcija). Jedno rješenje bilo ni uvođenje globalne
varijable, statičkog životnog vijeka, međutim, zbog globalnog dosega tu varijablu bilo bi
moguće koristiti i promijeniti iz drugih funkcija, što je nepoželjno.
PROGRAMIRANJE I – USMENI ISPIT
Zato je poželjna mogućnost definiranja varijabli koje bi bile statičkog životnog vijeka (da bi
čuvale vrijednost tijekom cijelog izvršavanja programa), ali i lokalnog dosega (da bi se mogle
koristiti i mijenjati samo u jednoj funkciji). U deklaraciji lokalne varijable može se primjeniti i
kvalifikator static i u tom slučaju ona ima statički životni vijek - kreira se na početku
izvršavanja programa, i oslobađa se prilikom završetka rada programa. Tako modificirana
varijabla NE čuva se u stack okviru svoje funkcije, već u Data Segmentu.
Ukoliko se vrijednost statičke lokalne varijable promijeni tijekom izvršavanja funkcije, ta
vrijednost ostaje sačuvana i za sljedeći poziv iste. Ukoliko inicijalna vrijednost statičke
varijable nije navedena, podrazumijevana je 0.
Statičke varijable se inicijaliziraju samo jednom, konstantnim izrazom, na početku izvršavanja
programa tj. prilikom njegovog učitavanja u memoriju. Doseg ovih varijabli i dalje je razine
bloka, tj. varijable su i dalje lokalne, što daje željene osobine.
Example:
void f() {
int a=0; printf(“f: %d “, a); a++;}
void g() {
static int a=0; printf(“g: %d “, a); a++;}
int main() {
f(); f(); g(); g(); }
Ispis: f: 0 f: 0 g: 0 g: 0
Kvalifikator extern najčešće se koristi isključivo kod programa koji se sastoje od više
jedinica prevođenja i služi da naglasi da se neki identifikator ima neku vanjsku povezanost.
Jedino deklaracije mogu biti okvalificirane kvalifikatorom extern.
Samim tim, nakon njegovog navođenja nije moguće navoditi inicijalizaciju varijabli niti tijelo
funkcije (što ima smisla samo prilikom definiranja).
Pošto extern deklaracije nisu definicije, njima se ne rezervira nikakva memorija u
programu već se samo naglašava da se očekuje negdje (najčešće u drugim jedinicama
prevođenja) postoji definicija objekta koji se sa extern deklaracijom deklariše (i time
uvodi u odgovarajući doseg).
Ipak, postoje slučajevi kada se vanjska povezanost podrazumijeva i nije neophodno
eksplicitno upotrijebiti deklaraciju extern.
Sve globalne varijable i funkcije podrazumijevano imaju vanjsku povezanost (osim ako na njih
nije primjenjen kvalifikator static kada je povezanost unutarnja).
13. Koliko ima varijabli sa dosegom nivoa bloka u programu iz prethodnog zadatka?
Odgovor je 0, zato što su externalni povezani s globalnim varijablama.
case constant2:
// code to be executed if n is equal to constant2;
break;
.
.
.
default:
// code to be executed if n doesn't match any constant
}
PROGRAMIRANJE I – USMENI ISPIT
U zadatku, ispis će biti po defaultu zato što se unutar switch naredbe nalazi int, međutim
konstante case-ove su charovi (case ‘0’:, case ‘1’:...), zbog toga se neće ispisati
onako kako je očekivano.
(NA PAPIRU)
U računarskoj tehnologiji, curenje memorije je tip curenja resursa koji se dogodi kada
program neispravno upravlja memorijskim alokacijama, na taj način da memorija koja više
nije potrebna nije oslobođena. U objektno orjentiranom programiranju , curenje memorije
može se dogoditi kad je objekt sačuvan u memoriji, ali mu se ne može pristupiti pokretnim
kodom.
U sljedećem kodu predstavljeno je curenje memorije, u kojoj nakon alokacije memorije,
program ne oslobađa preostali prostor.
void function_which_allocates(void) {
/* alokacija niza od 45 podataka tipa float */
float *a = malloc(sizeof(float) * 45);
PROGRAMIRANJE I – USMENI ISPIT
int main(void) {
function_which_allocates();
Ispis: 3435
Svaki karakter u charu nosi svoju ASCII vrijednost. Budući da je u ovom slučaju pokazivač na
char kastovan na pokazivač na short, short* je nositelj njegove ASCII vrijednosti.
U ASCII tabeli, poželjno je znati sljedeće:
Brojevi se nalaze u intervalu od 3016-3916 , u dekadskom sistemu od 48-57;
Velika slova su u intervalu od 4116 - 5A16 , odnosno 65-90;
Velika slova su u intervalu od 6116-7A16, odnosno 97-122;
PROGRAMIRANJE I – USMENI ISPIT
K&R C. Brian Kerninghan i Dennis Ritchie objavili su 1978. godine prvo izdanje knjige
Programski jezik C (The C Programming Language). Ova knjiga, među programerima poznata
je kao K&R ili kao white book, godinama je služila kao neformalna specifikacija jezika. Čak i
poslije pojave novih standarda, K&R je dugo vremena služio kao “najmanji zajednički
nazivnik”, koji je korišten kada je bilo potrebno postići visok stupanj prenosivosti.
ANSI C i ISO C. - tijekom 1980.-ih javila se potreba za standardizacijom. Godine 1989.
američki institut za standardizaciju (ANSI), objavio je standard pod nazivom ANSI X3.159-
1989 “Programming Language C”. Međunarodna organizacija za standardizaciju (ISO) 1990.
usvaja ovaj dokument.
C99 - usvojen je 1999. Uvodi sitne izmjene, uglavnom se proširuje.
C11 (nekada C1X) - 2007. god započet je rad na novom standardu koji je dovšen 2011.god.
Ispis: BLOK4
PROGRAMIRANJE I – USMENI ISPIT
Printf kao funkcija vraća broj elemenata koje ispisuje, tako da će se u ovom slučaju prvo
izvršiti podfunkcija, te će ispisati BLOK, bez navodnika. Ispis bi bio isti da smo deklarisali
na sljedeći način:
printf(“%d”, printf(“BLOK”));
Nakon ispisa stringa, funkcija također ispisuje i broj elemenata koliko je ispisala.
A;
while(B)
A;
Potrebno je naglasiti da će se naredbe do-while petlje UVIJEK izvršiti barem jednom.
TRANSFORMACIJA while U do-while
while(A)
B;
→
if(A) {
do {
B; }while(A);
}
10.(prošli rok)
Nan). Npr. vrijednost izraza 1.0/0.0 je +inf za razliku od cjelobrojnog izraza 1/0
čije izračunavanje dovodi do greške. Obično se pri cjelobrojnom dijeljenju sa nulom
prijavljuje samo upozorenje od strane kompajlera, a ukoliko dođe to izvršavanja dijeljenja,
prekida se program.
Vrijednost izraza 0.0/0.0 je NaN i ta vrijednost se koristi da označi matematički
nedefinirane vrijednosti. Na primjer, ako se na izraz čija je vrijednost +beskonačno doda
neka konstantna vrijednost, ponovno se dobiva vrijednost +beskonačno, ali vrijednost izraza
1.0/+beskonačno jednaka je 0.0. S druge strane, svi izrazi u kojima sudjeluje
vrijednost NaN ponovno imaju istu vrijednost NaN.
7 F
8 0
0 0
0 0
13. Ako je kao argument u pozivu funkcije navedeno ime niza, šta se prenosi u
funkciju?
14. Za koliko se mijenja vrijednost varijable p tipa T*, nakon izvršavanja naredbe
p+=sizeof(T)?
Mijenja se za sizeof(t)+sizeof(t)
Rok 12.05.2017.
7. Ako je niz dniz tipa double inicijalizovan u okviru deklaracije i njegova dimenzija
nije navedena, kako se ona može izračunati?
Rješenje: Dimenzija se računa na osnovu broja inicijaliziranih elemenata u inicijalizatoru.
dimension=sizeofniz/nizeof(niz[0]
8. Šta ispisuje sljedeći kôd, uz uobičajene postavke programskog prevodioca?
struct s { int i; char c; } niz[10]; printf("%d",
sizeof(niz));
Rješenje: Po 64/32-bitnoj arhitekturi (koju koristi većina online kompajlera) rezultat je 80.
Poslije se porede operatorom &. Taj operator radi na način da moraju oba uvjeta biti
ispunjena da bi izlaz bio jedan.
15. Šematski prikazati Von Neumannovu arhitekturu i navesti njen značaj za razvoj
programiranja.
‚
Kontrolna ALJ
jedinica
registri
magistrala
0.510 = 0,12
E=1.0 * E-1 = 127-1= 126= 0111 1110
S=0
M=000 *E20→0011 1111 0000 0000 0000 0000 0000 0000→3F00 0000
c) životni vijek?
Rješenje: Doseg ove lokalne varijable je nivoa bloka, nije okarakterisana nikakvim vanjskim
identifikatorom, dakle nepovezana je, kako nije naglašeno ima automatski životni vijek.
11. Modifikovati sljedeći kôd tako da pokazivač x ima vrijednost nula nakon poziva
funkcije reset.
void reset(T *p) { p=0; } int main() { T *x; reset(x); return
0; }
Rješenje:
a) Varijabla će biti smještena u stacku.
b) 050.00
c) Kastuje se adresa varijable tipa float u adresu unsigned int*-a
5010 = 1100102
E = 1,10010 * E5 = 127+5=132
132 = 1000 0100
Rezultat: 0100 0010 0100 1000 0000 0000 0000 0000 = 42480000
d) LE i BE konvencija - respektivno
28ff20
00 28ff1f
00 28ff1e
48 28ff1d
42 42 28ff1c
48 28ff1b
00 28ff1a
00 28ff19
PROGRAMIRANJE I – USMENI ISPIT
Rješenje:
a) Tijekom izvršavanja programa, gdje će se navedene varijable smjestiti ovisi o tipu
kompajlera. GCC ih smješta u .text sekciju, ukoliko se ne naredi drugačije. Oblično
se pohranjuju na read-only data sekciju.
b) Prva definicija je pokazivač na konstantan short, a druga je konstantan pokazivač na
short.
c) Nema greške. Dodjela je moguča.
d) Nije moguće dodijeliti *p1 na *p2, iz razloga što se pokazivač na konstantan short
nalazi samo u read-only sekciji, i njegovu vrijednost NIJE moguće prepisivati.
e) Svaki pokazivač ima vlastitu adresu, i oni između sebe ne mogu razmijenjivati adrese.
Rješenje:
a) 2
b) 1: ++ 2: <
c) ++ → zdesna na lijevo, < → slijeva na desno
huseinagicrahmo@gmail.com