You are on page 1of 23

Sistemsko programiranje

skripta za ispit

25.01.2022. Uroš Đerić 46/19 IT


SISTEMSKO PROGRAMIRANJE, ODGOVORI ZA USMENI DEO ISPITA. FEBRUAR 2022. 46/19 IT

I grupa

1. Promenljive, tipovi podataka, operatori


- U programskom jeziku c postoje 4 osnovna tipa podataka:
● char
● int
● float
● double

- Neki od ovih tipova mogu da imaju i modifikatore:


● int (short,long,unsigned)
● char (usigned)
● double (long)

- Svaki od ovih modifikatora smanjuju ili povećavaju opseg koji pružaju


ovi tipovi podataka.
- Ostali tipovi su konstante, koje se definisu pomoću #define i nabrojivi
tipovi, koji se definišu ključnom rečju enum.
- Moguća je konverzija tipova korišćenjem kastovanja - int i = (int)3.14 + 5;

#define PI 3.14
enum dan {Ponedeljak = 1};

- Promenljive predstavljaju instancu nekih od navedenih tipova


podataka

int a;
long double b;

- U programskom jeziku C postoje osnovni aritmetički operatori


(+,-,*,/) međutim mi možemo da “izmislimo” naše operatore i da im

1
SISTEMSKO PROGRAMIRANJE, ODGOVORI ZA USMENI DEO ISPITA. FEBRUAR 2022. 46/19 IT

odredimo funkciju. Ta pojava korišćenja redefinisanja nekih od


osnovnih operatora se naziva preotperećenje operatora.
- Logički operatori daju kao rezultat >= 1 ukoliko je nešto logički tačno,
logički ekvivalentno ukoliko kao rezultat daju nešto što je == 0, a
logički netačno ukoliko je rezultat < 1. Logički operatori su &&(i), ||(ili),
!(ne).
- Tip boolean kao takav ne postoji u c-u.
- Postoje i bit operatori koji služe za aritmetičko pomeranje (a>>b, a<<b)
- Poslednja grupa operatora su relacioni operatori, operatori kod kojih
se upoređuju dveju vrednosti( <, >, <=, >=, ==, != ).

2. Funkcije printf() i scanf()

- Obe metode se nalaze u biblioteci stdio.h


- Metoda printf() se koristi za štampanje na ekran koja prima kao
parametar specifikator formata ispisa(%d, %s, %f, %.2f, %+6d, %6.2e, ...)
i varijable čija se vrednost štampa.
- Metoda scanf() se koristi za učitavanje vrednosti sa tastature gde je
prvi parametar specifikator formata unosa(%d, %f, %c, %d:%f, ...), a
dok su ostali parametri adrese varijabli(Ampersend & označava adresu) u
koje se smešta vrednost.

#include<stdio.h>
int main() {

int a;
char b;

printf(“Unesite vrednost za broj a i karakter b: \n“);


scanf(“%d %c”,&a, &b);
printf(“\nVrednost unesenog broja \’a \’je: %d, a vrednost ucitanog karaktera \’b\’ je: %c”,a,b);

return 0;
}
● Pojasniti kako printf iz uočenog primera može da ima escape karaktere (\n - Novi red) i
specijalne karaktere koji su generalno zauzeti (poput tih jednostrukih apostrofa), ukoliko
se koristi \. Takođe, pojasniti šta je šta unutar printf-a i scanf-a.

2
SISTEMSKO PROGRAMIRANJE, ODGOVORI ZA USMENI DEO ISPITA. FEBRUAR 2022. 46/19 IT

3. Naredbe
- U programskom jeziku C postoje brojne naredbe koje omogućavaju
kontrolu toka podataka.
● if else grananja
● switch (s case-ovima, default-om)
● for, while, do-while petlje
● break i continue

if (neki uslov) {
obavlja_se_nesto;
}else {
obavlja_se_nesto_drugo;
}

switch(1) {

case 1:
obavlja_se_nesto;
break;

/* Jako je bitan break kako ne bismo automatski nastavili da obrađujemo i


naredne slučajeve, što onda uništava svrhu switch-a */

case 2:
obavlja_se_nesto;
break;

default:
obavlja_se_nesto_u_svakom_drugom_slucaju;
//Ovde ne mora da ide break

3
SISTEMSKO PROGRAMIRANJE, ODGOVORI ZA USMENI DEO ISPITA. FEBRUAR 2022. 46/19 IT

for(int i=0;i<10;i++) {
obavlja_se_nesto_dok_i_ne_postane_9;
}
while( uslov ) {
obavlja_se_nesto_dokle_god_se_ispunjava_uslov;
}

do {
obavlja_se_nesto_makar_jednom_i_zatim_dokle_god_se_ispunjava_uslov;
}while(uslov);

for(int i=0;i<10;i++) {
obavlja_se_nesto;
if( uslov ) {
break; // Ukoliko je uslov ispunjen iskače se iz trenutnog bloka i prelazi na sledeći
}
} sledeci_blok_koda;

for(int i=0;i<10;i++) {
obavlja_se_nesto;
if( uslov ) {
continue; // Ukoliko je uslov ispunjen,obavlja se još jedna iteracija petlje
}
}

4
SISTEMSKO PROGRAMIRANJE, ODGOVORI ZA USMENI DEO ISPITA. FEBRUAR 2022. 46/19 IT

4. Nizovi i stringovi

- Nizovi su iterativne strukture koje sadrže kolekciju elemenata


određenog tipa u sebi.
- U programskom jeziku C moguće je napraviti višedimenzionalne
nizove.
- Kroz niz je moguće iterirati indeksiranjem (prvi element niza ima
indeks [0] a poslednji [veličina - 1])
- Niz ima velicinu, a ne duzinu!
- String kao tip podatka u C-u ne postoji, ostvaren je kao jedan
specijalni niz koji se sastoji od karaktera.

int a[]; //Pri inicijalizaciji niza nije potrebno zadati dimenzije


int a[][];
char b[] = “Milovan”;
printf(“%c”,b[0]); //Stampa slovo M

5. Funkcije

- Funkcije(metode) se u C-u sastoje od zaglavlja i tela. U zaglavlju


funkcije se nalaze modifkator pristupa(ako postoji), povratni tip f–je,
ime i parametre koje prima(ako ih prima).
- F-ja kao parametar može da primi i drugu f-ju
- Parametri f-je se prenose ili po vrednosti ili po referenci
- F-ja može da, unutar svog tela, poziva samu sebe. Tada je to
rekurzivna f-ja i u svom telu mora da ima uslov za izlaz iz rekurzije

public void stampaj(char imeFajla) {


neki_kod;
}

5
SISTEMSKO PROGRAMIRANJE, ODGOVORI ZA USMENI DEO ISPITA. FEBRUAR 2022. 46/19 IT

int main() {
neki_kod;
stampaj(nekiFajl);
return 0;
}
public void stampaj(); /* Ako koristimo f-ju pre nego što je definisana
moramo da je deklarišemo */

int main () {
neki_kod;
stampaj(nekiFajl);
return 0;
}

public void stampaj(char imeFajla) {


neki_kod;
}
- Unutar standardnih biblioteka, koje dolaze uz programski jezik,
nalaze se brojne korisne f-je.

● stdio.h, kao što samo ime nalaže(standard input,output), sadrži


u sebi brojne metode za obradu izlaznih i ulaznih podataka - a
to su:
○ fopen/fclose - otvaranje i zatvaranje fajla za
čitanje/pisanje, ili oba
○ fprintf/fscanf - čitanje i pisanje iz/ u fajl
○ printf/scanf - čitanje i pisanje podataka
○ putc/getc - štampanje/ učitavanje jednog znaka
○ puts/gets - štampanje/ učitavanje stringa

● math.h - U sebi sadrži brojne metode za matematičke radnje,


formule i druge matematičke obrade podataka, to su:
○ sin,cos,tan - računanje sinusa, cosinusa, tangensa
○ log(x) - računanje logaritma

6
SISTEMSKO PROGRAMIRANJE, ODGOVORI ZA USMENI DEO ISPITA. FEBRUAR 2022. 46/19 IT

○ exp(x) - stavljanje u eksponent


○ pow(x,y) - kvadriranje
○ sqrt - kvadratni koren

● stdlib.h - U sebi sadrži brojne jako korisne metode koje se


koriste za manipulaciju podacima, alokaciju i oslobađanje
memorije i druge - Neke od njih su:
○ atof - konverzije stringa u float
○ atoi - konverzije stringa u int
○ atol - konverzije stringa u long
○ rand/ random - pseudonasumični broj
○ malloc/ free - alokacija i oslobađanje memorije
○ exit - završavanje rada programa
○ qsort - quick sort
○ abs - apsolutna vrednost
○ div - celobrojno deljenje

● string.h - U sebi sadrži metode za manipulaciju stringova, neke


od njih su:
○ strcpy - kopira vrednost jednog stringa u drugi
○ strcmp - poredi dva stringa i vraća broj u skladu s
rezultatom
○ strlen - vraća dužinu prosleđenog stringa

● ctype.h - Sadrži metode za rad s karaketrima


○ isdigit - da li je broj
○ isalpha - da li je slovo
○ islower/ isupper - da li je malo ili veliko slovo
○ isxdigit - da li je heksadecimalan broj

7
SISTEMSKO PROGRAMIRANJE, ODGOVORI ZA USMENI DEO ISPITA. FEBRUAR 2022. 46/19 IT

II grupa
1. Pokazivači

- Pokazivač predstavlja adresu u memoriji, broj koji ukazuje na lokaciju


u memoriji.
- Pokazivačke promenljive pokazuju na druge promenljive ili na
početak(prvi bajt) memorijskog bloka alocirane memorije (pokazivač
na tip int, float, … int *a, float*b, …)
- Dodelom vrednosti dobijamo da oba pokazivača ukazuju na isto:

int a = 5; (&a = 11000)


int *p1, *p2;
p1 = &a; p2 = p1;
p1 -> 11000
p2 -> 11000

- Svaki niz je zapravo pokazivač na prvi elem. u memoriji:

int a[20];
int *pa;

pa = a; <==> pa = &a[0];

- Pokazivači mogu da pokazuju i na druge pokazivače:


int a = 5; (&a = 10000)
int *p1 = &a; (&p1 = 10002)
int **p2 = &p1;
p1 -> 10000
p2 -> 10002

8
SISTEMSKO PROGRAMIRANJE, ODGOVORI ZA USMENI DEO ISPITA. FEBRUAR 2022. 46/19 IT

- Pokazivačke promenljive pokazuju na prvi bajt bloka alocirane


memorije koji u zavisnosti od tipa pokazivača može da se tretira
kao blok int-ova, char-ova, float-ova, …
- Alokacija same memorije se koristi kada ne znamo koliko će
nam biti potrebno memorije tokom pisanja programa
- Alokacija se vrši pomoću malloc(br_bajtova) metodom i alocira
se sa heap-a (blok memorije dodeljen svakom programu)
- Sva alocirana memorija se mora dealocirati koristeći se
free(pokazivac) metodom.

9
SISTEMSKO PROGRAMIRANJE, ODGOVORI ZA USMENI DEO ISPITA. FEBRUAR 2022. 46/19 IT

10
SISTEMSKO PROGRAMIRANJE, ODGOVORI ZA USMENI DEO ISPITA. FEBRUAR 2022. 46/19 IT

2. Strukture i typedef operator

- Strukture su podaci koji se sastoje iz više elemenata koji mogu


biti različite složenosti
- Promenljiva tipa definisane strukture zauzima onoliko memorije
koliko svi njeni elementi zajedno

Struct osnovneInfo {
int starost;
char pol[20];
} osnovneInfo;

// Struct unutar sebe može da ima i drugi struct


// Takođe može da ima element tipa iste strukture
struct osoba {
char ime[50];
char adresa[150];
struct osnovneInfo infoOosobi;
struct osoba *sledeci;
} osoba;

struct osoba osoba2;


//Ceo sadržaj strukture osoba se kopira u osoba2
osoba2 = osoba;

// Struct može da se sastoji iz nizova struktura


struct osoba osobe[3] = {
{ "Petar Petrovic", "Petrova ulica 3", 15},
{ "Mika Mikic", "Mikina ulica 4", 25},
{ "Djura Djuric", "Djurina ulica br. 3", 35} };

11
SISTEMSKO PROGRAMIRANJE, ODGOVORI ZA USMENI DEO ISPITA. FEBRUAR 2022. 46/19 IT

- typedef operator se koristi za definiciju novog tipa podataka na


osnovu već postojećeg tipa

typedef char string [50];



string a;
/* Ovde smo “izmislili” tip podataka “string”, koji ne postoji po default-u
u programskom jeziku C */

typedef struct osoba{


string ime;
string prezime;
int starost; } osoba;

3. Unije i polja bitova

- Unije(ključna reč union) su slične strukturama, s tim što svi


elementi unije zauzimaju isti memorijski prostor i u jednom
trenutku može da se koristi samo jedan element.

struct pravougaonik {
float a,b;
} pravougaonik;

struct figura {
int tip;
float obim;
union podaci {
struct pravougaonik p;
} podaci;
} figura;

12
SISTEMSKO PROGRAMIRANJE, ODGOVORI ZA USMENI DEO ISPITA. FEBRUAR 2022. 46/19 IT

- Polja bitova omogućavaju definisanje struktura koje imaju zadati


broj bitova

struct boja {
unsigned int boja : 3;
unsigned int jacina : 1;
unsigned int pozadina : 3;
}boja;

4. Datoteke

- U programskom jeziku C, rad s datotekama se obično obavlja


pomoću FILE struktura(unutar stdio.h biblioteke) gde:
● Datoteka se otvara i dobija pokazivač na FILE strukturu
● Sve f-je za rad s datotekama primaju kao parametar i
pokazivač na FILE strukturu
● Datoteka se zatvara s pokazivačem kao parametrom

FILE *f;
f = fopen(“imefajla.txt”, “r”);

- Ova funckija kao parametar prima ime datoteke i mod pristupa,


on može da bude ‘r’ - čitanje iz fajla, ‘w’ - kreira fajl za pisanje
(ukoliko on ne postoji), ‘a’ - dodavanje na kraj(kreira fajl ukoliko
on ne postoji), ‘r+’ - otvara fajl za čitanje i pisanje, ‘w+’ - kreira
fajl(ukoliko on ne postoji) za čitanje i pisanje.
- Takođe postoje modifkatori za binarne fajlove koji imaju oznake:
rb, wb, ab, r+b(rb+), w+b(wb+). Oni obavljaju iste funkcionalnosti
kao prethodno navedeni modifikatori, samo nad binarnim
fajlovima.

13
SISTEMSKO PROGRAMIRANJE, ODGOVORI ZA USMENI DEO ISPITA. FEBRUAR 2022. 46/19 IT

- Otvorenu datoteku obavezno je i zatvoriti koristeći se metodom


flose(FILE *f)

- Ostale metode za rad s datotekama su:


● getc(FILE *f), putc(charc, FILE *f) - učitavanje/ pisanje
jednog karaktera u datoteku

● fprintf(FILE *f), fscanf(FILE *f) - citanje/ pisanje u datoteke

● fgets(char *s, int maxL, FILE *f), fputs(char *s, FILE *f) -
učitavanje/ snimanje jednog stringa iz datoteke

● feof(FILE *f) - vraća 1 ako smo stigli do kraja datoteke u


toku čitanja

● ferror(FILE *f) - vraća 1 ako je bilo greške tokom rada sa


datotekom

// Čitanje/ pisanje blokova memorije


● fread(void *ptr, size_t size, size_t n, FILE *stream);

● fwrite(const void *ptr, size_t size, size_t n, FILE*stream)

14
SISTEMSKO PROGRAMIRANJE, ODGOVORI ZA USMENI DEO ISPITA. FEBRUAR 2022. 46/19 IT

5. Liste

- Liste spadaju u dinamičke strukture podataka(menjaju svoju


veličinu tokom vremena), pa samim tim i koriste memoriju koja
se dinamički alocira i oslobađa (malloc i free)

typedef struct cvor {


char INF[50];
struct cvor *sledeci; <- Pokazivač na sledeći elem. u listi
}cvor;

15
SISTEMSKO PROGRAMIRANJE, ODGOVORI ZA USMENI DEO ISPITA. FEBRUAR 2022. 46/19 IT

// Konsultovati se s slajdovima s prezentacija za detaljnije objašnjenje


- Glavne operacije nad listama su:

1. Dodavanje na početak
2. Dodavanje na kraj
3. Pronalaženje čvora
4. Brisanje čvora
5. Brisanje liste

● Dodavanje na početak

novi = (cvor *) malloc (sizeof(cvor));


novi->sledeci = pocetakListe;
pocetakListe = novi;

● Dodavanje na kraj liste

novi = (cvor *) malloc (sizeof(cvor));


//Ide se od pocetka liste (for petlja)
//Kada tekuci postane NULL, ukazuje na poslednji cvor
while(tekuci!=NULL) {
prethodni = tekuci;
tekuci = tekuci->sledeci;
}

16
SISTEMSKO PROGRAMIRANJE, ODGOVORI ZA USMENI DEO ISPITA. FEBRUAR 2022. 46/19 IT

● Pronalazenje cvorova

// Ide se od početka liste


for…
while(tekuci!=NULL) { //Ako ne nadje do kraja, vraca NULL
if(tekuci->INF == trazeniINF) {
return tekuci;
}else{
tekuci=tekuci->sledeci;
}

● Brisanje cvora

while(tekuci != NULL) {
if(tekuci->INF == trazeniINF) {
if (tekuci == *pocetak_liste) {
*pocetak_liste = tekuci->sledeci;
}
else {
prethodni->sledeci = tekuci->sledeci;
}
}
prethodni = tekuci;
tekuci = tekuci->sledeci;
}

17
SISTEMSKO PROGRAMIRANJE, ODGOVORI ZA USMENI DEO ISPITA. FEBRUAR 2022. 46/19 IT

● Brisanje liste

cvor *tekuci, *tmp;


tekuci = *pocetak_liste;
while (tekuci != NULL)
{
tmp = tekuci;
tekuci = tekuci->sledeci;
free(tmp);
}*pocetak_liste= NULL;

6. Stabla

- Stabla su struktuirana tako da svaki čvor sadrži datu informaciju


kao i dva pokazivača gde levi pokazuje na podstablo koje se
satoji od čvorova manjih od tekućeg a desni na podstablo od
čvorova većih od tekućeg
- Takođe, postoji osnovni čvor koji predstavlja koren stabla
- Čvor koji nema nijedan podčvor naziva se list

typedef int TIP;


typedef struct cvor_st
{
TIP inf;
struct cvor_st *desni;
struct cvor_st *levi;
} BCVOR;

18
SISTEMSKO PROGRAMIRANJE, ODGOVORI ZA USMENI DEO ISPITA. FEBRUAR 2022. 46/19 IT

Primer jednog binarnog stabla

// Konsultovati se s slajdovima s prezentacija za detaljnije objašnjenje


- Glavne operacije koje se obavljaju nad stablom:

● Ubacivanje u stablo
● Pronalaženje čvora
● Brisanje čvora
● Brisanje stabla

19
SISTEMSKO PROGRAMIRANJE, ODGOVORI ZA USMENI DEO ISPITA. FEBRUAR 2022. 46/19 IT

● Ubacivanje u stablo

if (*pkoren == NULL)
{
*pkoren = novi;
novi->levi = NULL;
novi->desni = NULL;
}
else {
if (novi->inf < (*pkoren)->inf) {
dodaj(novi, &(*pkoren)->levi);
}
else {
dodaj(novi, &(*pkoren)->desni);
}
}

● Pronalaženje čvora

if (koren == NULL)
return NULL;
if (inf < koren->inf) {
return pronadji(inf, koren->levi);
}
else if (inf > koren->inf) {
return pronadji(inf, koren->desni);
}
else {
return koren;

20
SISTEMSKO PROGRAMIRANJE, ODGOVORI ZA USMENI DEO ISPITA. FEBRUAR 2022. 46/19 IT

● Brisanje čvora

if (*koren == NULL)
return;

if (inf < (*koren)->inf){


brisi(inf, &(*koren)->levi);
}
else if (inf > (*koren)->inf){
brisi(inf, &(*koren)->desni);
}
else {
if ((*koren)->levi == NULL && (*koren)->desni == NULL) {
free(*koren);
*koren = NULL;
}
else if ((*koren)->levi != NULL ^ (*koren)->desni != NULL) {
tmp = *koren;
*koren = (*koren)->levi != NULL?(*koren)->levi:(*koren)->desni;
free(tmp);
}
else {
najm = najmanji((*koren)->desni);
printf("nasao najmanji ispod %i i to je: %i\n", (*koren)->inf, najm->inf);
}
}

21
SISTEMSKO PROGRAMIRANJE, ODGOVORI ZA USMENI DEO ISPITA. FEBRUAR 2022. 46/19 IT

● Brisanje stabla

if (koren != NULL)
{
obrisi_stablo(koren->levi);
obrisi_stablo(koren->desni);
printf("brisem: %i\n", koren->inf);
free(koren);
}

Skripta završena 01.02.2022. Uroš Đerić 46/19 IT

22

You might also like