zbirka riješenih ispitnih zadataka iz programiranja jezikom...
TRANSCRIPT
Zbirka riješenih ispitnih zadataka iz programiranja jezikom
C
Autor:
Marjan Sikora
SPLIT, 2013.
2
Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija Programiranje, koji se predaje
na FESB-u, smjer 110. U ovom kolegiju se uči programiranje u jeziku C, tako da zbirka može
poslužiti i svima drugim koji uče programirati tim jezikom.
Zbirka je podijeljena u dva dijela. U prvom dijelu su zadatci, a u drugom rješenja zadataka.
Zadaci i rješenja zadataka podijeljeni su na one sa kolokvija, te one sa ispita. Redoslijed
zadataka prati redoslijed kojim se oni pojavljuju na kolokvijima i ispitima, a slaže se i sa
redoslijedom gradiva koje se uči na ovom kolegiju. Zbirka je predviđena kao popratno
sredstvo uz knjigu prof. Ive Mateljana „Programiranje C jezikom“, koja je udžbenik za ovaj
kolegij.
Onima koji koriste ovu zbirku preporučam zadatke rješavati na računalu, te što više koristiti
izvršenje koda liniju po liniju i praćenje varijabli. Ukoliko zadatak podrazumijeva izradu
samo dijela koda, jedne funkcije ili klase, preporučam da se potrude i naprave cijeli kod,
zajedno sa main funkcijom kako bi mogli u potpunosti ispitati i shvatiti rad koda.
Zadaci u zbirci testirani su u razvojnoj okolini Microsoft Visual Studio 2008. Ukoliko u zbirci
naiđete na kakovu grešku, molim vas da na email [email protected] pošaljete poruku sa opisom
o čemu je riječ, kako bih to mogao ispraviti. Na taj način ćete pomoći budućim generacijama
studenata.
Marjan Sikora
U Splitu, 30.09.2010.
3
SADRŽAJ:
1. ZADACI ................................................................................................................................. 4
1.1 ZADACI SA KOLOKVIJA ........................................................................................ 4 1.2 ZADACI SA ISPITA ................................................................................................. 16
2. RJEŠENJA ........................................................................................................................... 26 2.1 RJEŠENJA ZADATAKA SA KOLOKVIJA ................................................................ 26 2.2 RJEŠENJA ZADATAKA SA ISPITA .......................................................................... 42
4
1. ZADACI
1.1 ZADACI SA KOLOKVIJA
1) Napišite koju vrijednost u C jeziku imaju sljedeći izrazi:
a) 2 + 8 * 3
b) 8 * (3 + 2)
c) 8 / 3 + 2
d) 8 % 3 + 2
2) Napišite koju vrijednost u C jeziku imaju sljedeći izrazi:
a) 2 + 7 * 0
b) 7 * (3 + 2)
c) 7 / 3 +2
d) 7 % 3 + 2
3) Napišite koju vrijednost u C jeziku imaju sljedeći izrazi:
a) 5 + 9 * 3
b) !( 5 / ( 2 + 2 ))
c) 9 / 4.0 + 2
d) 9 % 7 + 2
4) Koju vrijednost u C jeziku imaju sljedeći izrazi:
a) 31 % 4 + 9 * 2
b) 9 * (2) + 2
c) 9 / ( 4 >= 2 + 2)
d) 9 * !3 + 2
5) Koji tip imaju sljedeći izrazi:
char c; int i; double d;
a) c + 2.1
b) d + c
c) 3.14 * d
d) i * 3
6) Koji tip imaju sljedeći izrazi:
char c; int i; double d;
a) c + '2'
b) d + c
c) '2' * d
d) i * '2'
5
7) Koji tip imaju sljedeći izrazi:
char c; int i; double d;
a) c + 1.4
b) i + c * d
c) 3 * i
d) d * 3
8) Koliku će vrijednost imati varijabla c nakon izvršenja sljedećeg koda:
int a=10, b=3;
double c;
c = a / b;
9) Koliku maksimalnu vrijednost ima varijabla koja je tipa:
a) unsigned char c;
b) short int i;
10) Koliku minimalnu vrijednost ima varijabla koja je tipa:
a) signed char c;
b) unsigned int i;
11) Odgovorite:
a) Koliku maksimalnu vrijednost ima varijabla koja je tipa: signed short c;
b) Koliku maksimalni eksponent može pohraniti varijabla koja je tipa: float f;
12) Koliku maksimalnu vrijednost ima varijabla koja je tipa:
a) char c;
b) unsigned short int i;
13) Napišite cijeli broj -13, u binarnom obliku, kodiran u 8-bitnoj notaciji komplementa
dvojke.
14) Deklariran je niz u sljedećem obliku:
a) float a[11];
b) char b[11];
Napišite koliko bajta memorije zauzimaju ovi nizovi.
6
15) Napišite koliko bajta memorije zauzimaju ovi nizovi:
a) double a[11];
b) short int b[22];
16) Napišite ispis sljedećeg programa:
#include <stdio.h>
int a=10;
void funkcija() { int a = 5; printf("%d", a); }
int main() { int a=7; printf("%d", a); funkcija(); return 0; }
17) Napišite ispis sljedećeg dijela koda:
char c = 127;
printf("%d", c++);
18) Zadana je for petlja kojom se računa produkt elemenata niza od N brojeva:
int i, produkt, a[N];
for(i=0, produkt = 1; i < N; i++)
produkt *= a[i];
Napišite ekvivalentni program u kojem se umjesto for petlje koristi while petlja.
19) Zadana je for petlja kojom se inicijalizira niz od N brojeva. Program treba izvršavati
sljedeće: počevši od posljednjeg člana niza, do početnog člana niza, sve članove niza treba
inicijalizirati na vrijednost nula.
int i, a[N];
for( i = N ; i >= 0 ; i-- )
a[i] = 0;
Nađite grešku u programu.
20) Zadana je while petlja kojom se računa produkt niza od N brojeva:
int a[N];
int i = 0, produkt = 1;
while(i < N) {
produkt *= a[i];
i++;
}
Napišite ekvivalentni program u kojem se umjesto while-petlje koristi for-petlja.
7
21) Zadana je while petlja kojom se računa suma niza a od N brojeva:
int i=-1, sum = 0;
while(i < N-1) {
sum += a[++i];
}
Napišite ekvivalentni program u kojem se umjesto while-petlje koristi for-petlja.
22) Zadan je dio programa:
int i;
scanf("%d", &i);
switch( i ){
case 0: printf("FALSE\n");
break;
case 1: printf("TRUE\n");
break;
default: printf("Ponovi upis!\n");
}
Promijenite program tako da umjesto switch-case grananja koristi if-else grananje.
23) Zadan je dio programa:
int i;
scanf("%d", &i);
switch( i ) {
case 1: printf("ZLATO\n");
break;
case 2: printf("SREBRO\n");
break;
case 3: printf("BRONCA\n");
break;
default: printf("Ponovi upis!\n");
}
Promijenite program tako da umjesto switch-case grananja koristi if-else grananje.
24) Pretpostavite da je u programu deklariran niz imena A sa deset članova tipa int, čije su
vrijednosti već upisane. Napišite dio koda koji petljom prolazi kroz niz i ispisuje sve
članove koji su djeljivi sa 2 i koji su djeljivi sa 3. Provjeru članova napravite pomoću if-
else if-else naredbi.
25) Napišite program koji sa konzole učitava tri varijable imena a, b i c tipa int. Program
neka ispiše one varijable koje su parne.
8
26) Napišite program koji sa konzole učitava dvije varijable imena a i b tipa double. Program
neka računa zbroj kvadrata a i b prema izrazu:
o = a * a + b * b;
i neka ga spremi u varijablu imena o tipa double. Nakon toga neka program ispiše vrijednost
varijable o.
27) Napišite program u kojem se sa tipkovnice učitava radijus kruga u varijablu imena r, tipa
int. Program zatim računa površinu kruga prema izrazu:
p = r * r * 3.14;
i sprema u varijablu imena p tipa double. Nakon toga neka program ispiše vrijednost
varijable p.
28) Pretpostavimo da je u programu deklariran niz od 10 članova tipa int:
int N[10] = {3, 6, 78, 56, 34, 67, 89, 11, 2, 7};
čije su vrijednosti već inicijalizirane. Napišite kod sa petljom tipa for koja izračunava
srednju vrijednost niza. Srednja vrijednost niza se dobiva tako da se suma niza podjeli sa
brojem članova niza. Srednju vrijednost niza smjestiti u varijablu sv tipa double. U kodu
napišite i deklaracije svih varijabli koje koristite u proračunu.
29) Napišite program u kojem je deklariran niz b od 17 članova tipa int. Potom, neka se
vrijednost svih članova niza postavi na kvadrat vrijednosti indeksa pojedinoga člana niza,
prema izrazu:
b[j] = j * j;
30) Napišite funkciju imena duplo tipa int koja ima jedan argument imena x tipa int.
Funkcija neka vraća dvostruku vrijednost broja koji je argument funkcije.
31) Napišite funkciju imena ispis tipa void koja ima jedan argument imena y, tipa double.
Funkcija neka ispisuje na standardni izlaz argument funkcije.
32) Napišite funkciju imena ucitaj tipa int koja nema argumenata. Funkcija neka pomoću
funkcije scanf sa konzole učita varijablu tipa int i neka vraća kvadrat te vrijednosti.
Prototip funkcije je:
int ucitaj();
9
33) Napišite funkciju imena ucitaj_int tipa int koja nema argumenata. Funkcija neka
pomoću funkcije scanf sa konzole učita varijablu tipa int i neka tu vrijednost vraća,
ukoliko je veća od nule. Ukoliko je manja od nule neka vrati nulu.
34) Deklariran je cjelobrojni niz imena x, varijabla v, te pokazivači imena px i pv;
int x[6], v;
int* px = &x[0];
int* pv = &v;
Napišite naredbu kojom se pomoću pokazivača pv i px, ostvari isti učinak kao u sljedećoj
naredbi: v = x[3];
35) Deklariran je niz imena x i pokazivač imena p:
int x[6];
int* p = x;
Napišite naredbe:
kojom se pomoću pokazivača p, svim elementima niza x pridjeljuje vrijednost 0.
zatim se, pomoću pokazivača p, vrijednost 5 upisuje u element x[2]
36) Deklariran je niz imena x i pokazivač imena p:
int x[8];
int* p = &x[1];
Napišite naredbe:
kojom se pomoću pokazivača p, posljednjem elementu niza x pridjeljuje vrijednost 0
zatim se pokazivač p, postavlja da pokazuje na element x[5]
37) Napravite sljedeće:
a) Napišite deklaraciju kojom se inicijalizira string imena str na sadržaj "Alo", ali uz
uvjet da se string može proširiti do maksimalno 128 znakova.
b) Napišite naredbu kojom se dinamički alocira memorija za string koji će sadržavati 128
znakova.
38) Odgovorite:
a) Objasnite zašto posljednji element stringa mora biti nul znak?
b) Napišite deklaraciju stringa imena str1, nakon koje taj string sadrži znakove "Hello"
c) Napišite naredbe kojima se deklarira drugi niz imena str2, kojem se pridjeljuje prva
tri znaka iz stringa str1.
39) Napišite funkciju koja vraća broj velikih slova u nekom stringu. Prototip funkcije je:
10
int BrojVelikihSlova(char* str);
40) Napišite funkciju tipa void, imena predznak koja neka ima dva argumenta:
prvi argument neka bude tipa double, imena x
drugi neka bude pokazivač na varijablu tipa integer, imena ps
Funkcija neka izračuna predznak varijable x. Predznak neka vraća preko pokazivača s,
tako da ukoliko je x veći ili jednak nuli, neka vraća 1, a ukoliko je manji od nule neka
vraća -1.
41) Napišite funkciju tipa void, imena fun koja neka ima tri argumenta: void fun(double x, double* py, double* pz)
x - prvi argument tipa double
py - drugi argument je pokazivač na varijablu tipa double
pz - treći argument je pokazivač na varijablu tipa double
Funkcija treba preko pokazivača py vratiti vrijednost x*x+1, a preko pokazivača pz treba
vratiti vrijednost x*x-1.
42) Zadan je dio programa kojim se učitava niz imena TEMP i kreira niz imena P, s članovima
niza TEMP koji imaju parni indeks:
#define MAXSIZE 14
int TEMP[MAXSIZE];
int P[MAXSIZE/2];
int i;
for(i=0; i<MAXSIZE; i++) {
scanf("%d\n", &TEMP[i]);
if( i%2 == 0 )
P[i/2] = TEMP[i];
}
Preradite ga tako da niz TEMP alocirate dinamički, te dealocirate na kraju koda.
43) Zadan je dio programa, kojim se učitava niz X i računa njegova sumu s:
#define SIZE 10
int X[SIZE], i=0, s=0;
while ( i<SIZE) {
scanf("%d\n", & X[i]);
s += X[i++];
}
printf("Suma je %d", s);
Preradite program tako da SIZE bude varijabla koju unosi korisnik, a niz X alocirajte
dinamički koristeći funkciju malloc(). (X deklarirajte kao pokazivač)
11
44) Napravite sljedeće:
a) Napišite naredbu (jednu) kojom se dinamički alocira memorija za matricu koja će u 3
retka i 3 stupca sadržava 9 realnih brojeva tipa float, svi početne vrijednosti nula.
b) Napišite naredbe kojom se svi elementi dijagonale matrice postavljaju na vrijednost 1.
45) Definirana je struktura:
struct radnik {int broj; char ime[30]; char prezime[50];};
a) Dodajte ovoj strukturi član u kojem će se bilježiti plaća radnika.
b) Deklarirajte niz koji može sadržavati 40 elemenata tipa struct radnik i napišite naredbe
kojima se trećem element niza upisuje: broj: 3, ime : "Jure", prezime "Novak", plaća:
5690.70
46) Napišite program sljedećeg sadržaja:
deklarirajte strukturu koja opisuje dvodimenzionalnu točku: struct tocka {int x,y;}
definirajte strukturu imena struct trokut, koja sadrži tri člana tipa struct tocka
sa konzole učitajte koordinate varijable Tr koja je tipa struct trokut.
47) Zadana je formatirana tekstualna datoteka "brojevi.txt". U datoteci je formatirano
tekstualno zapisano 13 cijelih brojeva. Napišite program koji iz datoteke učitava prvih 7
brojeva, te ispisuje sve brojeve manje od nule na monitor.
48) Napišite program kojim korisnik sa tipkovnice unosi niz pozitivnih brojeva, a program ih
sprema u formatiranu tekstualnu datoteku imena "brojevi.txt". Unos prestaje kada se
otkuca negativni broj.
49) Produkt prvih n prirodnih brojeva može se definirati rekurzivno :
produkt(n) = 1 - ako je n = 1
produkt(n) = n * produkt(n-1) - inače
Napišite rekurzivnu funkciju, prototipa int produkt(int n), u kojoj se koja obavlja
prethodni postupak.
50) Napišite funkciju int Fibonacci(int n); koja vraća vrijednost n-tog Fibonacci-jevog
broja. Fibonacci-jevi brojevi su definirani rekurzivno:
F(n) = 1 - ako je n <= 1
F(n) = F(n-1)+F(n-2) - ako je n > 1
12
51) Napišite rekurzivnu funkciju prototipa:
int F(int n);
koja vraća vrijednost funkcije F(n) koja je definirana rekurzivno:
F(n) = 0 - ako je n <= 0
F(n) = F(n-1)+n - ako je n > 0
Procijenite vrijednost F(2).
52) Napišite program koji vrši sljedeće radnje:
a) korisnik unosi 10 brojeva u niz double x[10];
b) nakon unosa vrši se sortiranje elemenata niza x.
c) nakon sortiranja vrši se ispis elemenata niza
Sami odaberite metodu sortiranja.
53) Zadan je niz stringova:
char* strings[] = {"Jure", "Ante", ...,"Doris", NULL} ;
Kraj niza označen je s NULL pokazivačem. Napišite funkciju kojom se može
leksikografski sortirati ovakav niz stringova. Deklaracija funkcije je:
void sortirajNizStringova( char* instr[] );
54) Zadan je niz brojeva:
float brojevi[] = {3.1, 22, ..., 31.2} ;
Napišite naredbu kojom se sortira ovaj niz koristeći funkciju biblioteke qsort. Uočite da
se veličina niza može dobiti pomoću sizeof operatora.
55) Zadan je niz brojeva:
double brojevi[] = {3.1, 22, 55, 5.6, 0.1, 31.2};
Napišite funkciju prototipa:
void Sort(double* A, int n);
u kojoj je A niz koji treba sortirati, a n broj članova niza koji se funkcijom sortira.
Napisati i naredbu kojom se sortira cijeli niz brojevi.
13
56) Napravite sljedeće:
a) Definirajte strukturu kojom se može formirati lista cijelih brojeva
b) Definirajte strukturu kojom se može formirati stablo koje sadrži aritmetičke izraza
c) Definirajte strukturu kojom se može formirati porodično stablo tako da svaki čvor
stabla sadrži vezu s roditeljem i proizvoljnim brojem djece. U čvoru se upisuje: ime,
spol, godina rođenja.
57) Zadana je samoreferentna struktura kojom se može realizirati lista stringova:
typedef struct _node node;
typedef struct _node* LIST;
struct _node { char* str; node* next; };
Napišite dvije funkcije:
node* NewListNode(char* str);
/*stvara i alocira čvor liste koji sadrži kopiju stringa str */
LIST AddToStringList(LIST L, node* N);
/* stavlja čvor N na glavu liste L. Vraća pokazivač na glavu liste*/
58) Zadana je samoreferentna struktura kojom se može realizirati lista brojeva:
typedef struct _node node;
typedef struct _node* LIST;
struct _node { double broj; node* next; };
Napišite dvije funkcije:
LIST AddToFront(double x, LIST L);
/*stvara čvor liste koji sadrži kopiju broja x i stavlja ga na glavu
liste, vraća pokazivač glave liste*/
LIST RemoveFront(LIST L);
/* odstranjuje čvor na glavi liste L. Vraća pokazivač na glavu
liste.*/
59) Zadana je samoreferentna struktura kojom se može realizirati lista brojeva, pomoću
dvostruko vezane liste:
typedef struct _node node;
typedef struct _node* DLIST;
struct _node { double broj; node* next; node* prev; };
Napišite funkciju za umetanje čvora na kraju liste.
DLIST AddToBack(double x, DLIST L);
/*stvara čvor liste koji sadrži kopiju broja x i stavlja ga na kraj
liste L, vraća pokazivač glave liste*/
14
60) Zadana je samoreferentna struktura kojom se može realizirati sortirano binarno stablo koje
sadrži stringove:
typedef struct _node node;
typedef struct _node* NODE;
struct _node { char* str; NODE left; NODE right; };
Napišite dvije funkcije:
node* NewTreeNode(char* str);
/*stvara i alocira čvor koji sadrži kopiju stringa str */
NODE AddToStringTree(NODE T, node* N);
/* stavlja čvor N u sortirano binarno stablo kojem je korijen T.
Vraća pokazivač na korijen stabla*/
61) Zadana je samoreferentna struktura kojom se realizira sortirano binarno stablo koje sadrži
stringove:
typedef struct _node node;
typedef struct _node* NODE;
struct _node { char* str; NODE left; NODE right; };
Napišite funkciju:
NODE FindInStringTree(NODE T, char* str);
/* pronalazi i vraća čvor stabla u kojem je string str. Ako ne može
naći string str vraća NULL*/
62) Zadana je samoreferentna struktura kojom se realizira binarno stablo koje sadrži
aritmetičke izraze:
typedef struct _node node;
struct _node { int elem; node* left; node* right; };
U unutarnjim čvorovima stabla elem sadrži operatore (+,-,*,/), a u listovima elem
sadrži brojeve. Napišite funkciju kojom se iz formiranog stabla ispisuje aritmetički izraz
u prefiksnoj notaciji.
void PrintPrefiks(node* T);
/* ispisuje aritmetički izraz u prefiksnoj notaciji. Izraz je zapisan
u binarnom stablu kojem je korijen T. */
63) Napišite implementaciju ADT imena TORBA koji služi kao kolekcija cijelih brojeva.
Za ADT TORBA definiraj samo tri operacije:
void Stavi(TORBA T, int broj); /* stavlja broj u kolekciju */
int Dobavi(TORBA T) /* vraća i briše broj iz kolekcije*/
int Prazno(TORBA T) /* vraća 1 ako je kolekcija prazna */
15
64) Koristite specifikaciju ADT BST (binarno stablo traženja) iz knjige. Odgovorite sljedeće:
a) Kako je postignut polimorfizam, tj. mogućnost da se u stablu upisuju različiti tipovi
podataka
b) Kako bi inicirali stablo koje treba sadržavati: ime i prezime (jedan string) kao
vrijednost i matični broj (integer) kao ključ
65) Napišite program kojim se s tipkovnice unosi niz parova vrijednosti ocjena i ime u
binarno stablo, u sortiranom redoslijedu prema ocjeni.
Kao stablo koristite ADT strukturu BST iz knjige, tako da ključ bude ocjena tipa int, a
vrijednost ime tipa char[50].
Kada se izvrši unos praznog stringa, treba izvršiti ispis imena, sortiran prema ocjenama,
od najmanje prema najvećoj.
66) Zadana je hash tablica prema sljedećoj specifikaciji:
typedef struct _symbol {
struct _symbol* next;
void* key;
void* val;
}Symbol;
typedef struct _table {
unsigned M;
unsigned N;
Symbol** bucket;
CompareFuncT compare;
HashFuncT hash;
CopyFuncT copy_key;
CopyFuncT copy_val;
FreeFuncT free_key;
FreeFuncT free_val;
} Table, * TABLE;
static int compareInternal(void* a, void* b) {
if( (int)a > (int)b ) return 1;
else if( (int)a < (int)b ) return -1;
else return 0;
}
static unsigned hashInternal(void* p, unsigned M) {
int k = (int)p;
return k > 0? k % M : - k % M;
}
TABLE table_new(unsigned M, CompareFuncT compare, HashFuncT hash) {
TABLE T = (TABLE) malloc(sizeof(Table));
if (T == NULL) return NULL;
T->M = M;
T->N = 0;
T->bucket = (Symbol**) calloc(M, sizeof(Symbol*) );
T->hash = hash ? hash : hashInternal;
T->compare = compare? compare : compareInternal;
16
T->free_key = T->free_val = NULL;
T->copy_key = T->copy_val = NULL;
return T;
}
…
Hash tablica je inicirana naredbom:
TABLE T = new_table(17, 0, 0);
Ako je tablica inicirana na ovaj način, odgovorite na sljedeća pitanja:
a) Koliko buketa će imati tablica?
b) Kojeg tipa su ključevi tablice?
c) Kojeg tipa su vrijednosti tablice?
67) Zadana je hash tablica prema specifikaciji iz prethodnog zadatka. Hash tablica, koja sadrži
cjelobrojne vrijednosti i ključeve je inicirana naredbom:
TABLE T = new_table(127, 0, 0);
Napišite:
a) Koliko buketa će imati tablica?
b) Napišite naredbu kojom se u tablicu umeće, vrijednost 1056, kojoj je ključ 22.
1.2 ZADACI SA ISPITA
68) Potrebno je oformiti niz od 10 elemenata? Koje su od navedenih deklaracija pogrešne?
#define BUF_SIZE 10
int buf_size = 10;
a) int N[buf_size];
b) int N[BUF_SIZE];
c) int* N = (int*)malloc(buf_size*sizeof(int));
d) int* N = (int*)malloc(buf_size);
Objasnite zašto!
69) Definiran je pokazivač i alocirana memorija naredbom
int* A = (int)malloc(10*sizeof(int));
Koja od sljedećih naredbi može uzrokovati ozbiljnu grešku u izvršenju programa:
a) A[1] = 0;
b) *A = 1;
c) A[10] = 10;
17
Objasnite zašto!
70) Dvije ugnježdene while petlje transformirajte u dvije ugnježdene for petlje
int i, j =4;
while (j >= 0) {
i = 3;
while (i <= 10)
printf("%d\n", i++);
j--;
}
71) Odgovorite:
a) Koju će vrijednost imati varijabla x nakon završetka sljedećih petlji:
i) x=1; while(x<100) {x *= 10; x++;}
ii) x=1; while(x<100) {x++; x *= 10;}
b) Za oba slučaja napišite ekvivalentni iskaz pomoću for petlje.
72) Odgovorite:
a) Što će biti ispisano na ekranu nakon izvršenja sljedećeg programskog segmenta:
for(int x=0; x<4; x++)
for(int y=0; y<4; y++)
if(x & 1)
putchar('C') ;
else if(x & 2)
putchar('B') ;
else
putchar('A') ;
b) Napišite prethodni segment programa na način da se umjesto for petlje koristi while
petlja.
73) Odgovorite:
a) Što će biti ispisano nakon izvršenja sljedećeg programskog segmenta:
int x,y;
for(x=0; x<5; x+=2)
for(y =x; y>0; y--)
printf("%d,", x);
b) Transformirajte prethodni programski odsječak tako da umjesto for petlji koristite
while petlje.
18
74) Koju će vrijednost imati varijabla x nakon završetka sljedećih petlji:
a) for (x=0; x<100; x += 17) {} b) for (x=0; x<100; x *= 7) {++x;} c) for (x=0; x<100; ) {x++; x += 17;}
75) Odgovorite:
a) Koju će vrijednost imati varijabla x nakon završetka sljedećih petlji:
i) x=1; while(x<100) {x *= 6; x++;}
ii) x=1; while(x<100) {x++; x *= 6;}
b) Za oba slučaja napišite ekvivalentni iskaz pomoću for petlje.
76) Što će biti ispisano nakon izvršenja programa:
#include <stdio.h>
int A(int x) {return 2*x;}
void B(int x, int* py) {*py = 2*x;}
int main() {
int a=1, b=2, c;
a = A(b); printf ("a=%d\n", a);
B(a, &b); printf ("b=%d\n", b);
B(A(b), &c); printf ("c=%d\n", c);
return 0;
}
77) Napišite program kojim se računa PDV (22%), sljedećim postupkom:
1. Upoznaj korisnika da napiše ime proizvoda i cijenu
2. Od korisnika dobavi vrijednosti:
a) ime proizvoda (string)
b) cijenu proizvoda (float)
3. Izračunaj PDV i ukupnu cijenu (cijena * 1.22)
4. Ispiši: ime proizvoda i ukupnu cijenu
78) Napišite funkciju čija je deklaracija:
int BrojParnihElemenata(int* X, int N);
Prvi parametar funkcije je niz cijelih brojeva X, a drugi parametar N sadrži broj elemenata
niza. Funkcija vraća cijeli broj koji treba biti jednak broju parnih brojeva u nizu X
(primjerice ako niz X sadrži brojeve 8,8,1,5,4,4,7 i 7, funkcija treba vratiti vrijednost 4 jer u
nizu postoje 4 parna broja:8,8,4,4).
79) Napišite funkciju koja računa volumen prostorije i površinu zidova prostorije, ako su x, y i
z dimenzije pravokutne prostorije. Funkcija neka ima pet argumenata:
19
- tri ulazna: x, y i z - tipa float, kojima se u funkciju prenose duljine stranica
- dva izlazna: v i p - tipa float, kojima se iz funkcije vraća volumen i površina
Volumen i površinu računati prema formulama:
V = x*y*z
P = 2*x*y + 2*y*z + 2*x*z
Prototip funkcije:
void IzracunajProstoriju(float x, float y, float z, float* v, float* p)
80) Napišite funkciju kojoj je specifikacija :
void ZamijeniSlova(char* str)
/* Argument str je pokazivač stringa.
* Funkcija mijenja sadržaj stringa tako da se
* mala slova pretvaraju u velika slova. */
primjerice nakon programskog odsječka
char str[] = "Hello World!";
ZamijeniSlova(str);
printf("%s",str);
bit će ispisano: HELLO WORLD!
81) Napišite funkcije:
a) int BrojSuglasnika(char* str)
koja vraća broj suglasnika u ulaznom stringu
b) void OdstraniSamoglasnike(char* str)
kojom s izbacuju samoglasnici iz ulaznog stringa. (Naprimjer: Dobar postaje Dbr)
82) Napišite funkciju kojoj je specifikacija :
char* RimskiBroj(int n)
/* argument: n je cijeli broj
* PRE: 1 <= n <= 10
* funkcija vraća: pokazivač dinamički alociranog stringa koji
* sadrži rimski zapis broja n */
Primjer korištenja:
printf("%s\n", RimskiBroj(7));
dat će ispis:
VII
20
Da biste za string sa rimskim brojem alocirali potrebnu veličinu, koristite dinamičko
alociranje, odnosno funkciju malloc. Napišite program u kojem se testira ova funkcija.
83) Napišite program kojim se s tipkovnice unosi niz od 10 kompleksnih brojeva u strukturu
imena Complex. Program zatim računa apsolutnu vrijednost svih kompleksnih brojeva.
Na kraju ispisuje se realni i imaginarni dio, te apsolutna vrijednost svih unesenih brojeva.
Apsolutna vrijednost od a+jb = (a2+b
2). Kostur programa je:
int main() {
struct Complex {float real; float imag;};
struct Complex cniz[10]; /* niz u kojem pamtimo unesene brojeve*/
float x;
/* 1. Ponavljaj za i=0..9: Dobavi realni i imag. dio u cniz[i]
2. Ponavljaj za i=0..9
Za i-ti kompleksni broj cniz[i] izračunaj aps. vrijednost x.
Ispiši realni i imag. dio od cniz[i] te aps. vrijednost x.
*/
}
84) Što ispisuje sljedeći program?
#include <stdio.h>
int main(void) {
float r = 12.0 + (float)'r';
printf("%s=%f\n", "r", r );
return 0;
}
85) Napišite rezultat koji će biti ispisan nakon izvršenja sljedećeg programa:
int main() {
int x,y;
for(x=3; x>-1; x--)
for(y =x-1; y>0; y--)
printf("%d, ", y-x);
return 0;
}
86) Napišite program kojim se s tipkovnice unosi niz brojeva tipa long i zapisuje u datoteku
imena “brojevi.txt”. Unos završava kada se umjesto broja otkuca slovo. Nakon toga treba
zatvoriti datoteku i izvijestiti korisnika koliko je brojeva zapisano u datoteci.
87) U memoriji su podaci spremljeni u nizu deklariranom s:
21
float A[700];
Napišite programski odsječak u kojem prvo otvara binarna datoteka imena "brojevi.bin",
zatim se podaci iz niza A[] spremaju u tu datoteku u binarnom obliku i na kraju se zatvara
datoteka.
88) Napišite program kojim se ispituje koliko je znakova i redaka teksta zapisano u
tekstualnoj datoteci imena "dat.txt". Obrazac programa je:
int main() {
int brojredaka, brojznakova;
/* otvori datoteku "dat.txt" */
/* čitaj znak po znak i odredi: brojredaka i brojznakova */
/* zatvori datoteku */
printf("\n%d redaka, %d znakova %d\n", brojredaka, brojznakova);
return 0;
}
89) Napišite program kojim se ispituje koliko je riječi zapisano u tekstualnoj datoteci imena
"dat.txt".
Napomena: riječi su nizovi znakova koji su razdvojeni znakovima: razmak ' ', zarez ',',
točka '.', tab '\t' i nova linija,'\n'.
Obrazac programa je:
int main() {
int brojrijeci;
/* otvori datoteku "dat.txt" */
/* iniciraj brojrijeci = 0; " */
/* ponavljaj - dok nije detektiran kraj datoteke */
/* čitaj znak po znak i povećavaj brojrijeci,
ako je ucitan jedan ili više separatora riječi */
/* zatvori datoteku */
printf("Broj rijeci = %d, brojrijeci);
return 0;
}
90) Napišite program koji iz datoteke "dat.txt“ učitava niz pozitivnih cijelih brojeva. Unos
završava kada se iz datoteke učita prvi negativni broj. Tada treba ispisati učitane brojeve
obrnutim redoslijedom u odnosu na red učitavanja iz datoteke, odnosno prvo treba ispisati
broj koji je učitan posljednji. Kostur programa je:
int main() {
/* Deklaracije varijabli */
int i; /* broj koji se učitava */
int niz[100]; /* niz u kojem pamtimo unesene brojeve*/
int brojunesenih=0; /* ukupan broj unesenih brojeva = 0*/
/* Otvori datoteku "dat.txt“ za čitanje*/
/* Ponavljaj:
22
1. Učitaj broj x iz datoteke
2. Ako je broj x negativan ili se došlo do kraja datoteke
ispiši dotad unesene vrijednosti obrnutim
redoslijedom i prekini program,
a ako je pozitivan
zapamti njegovu vrijednost u nizu.
i povećaj brojunesenih
3. Ako brojunesenih bude jednak ili veći od veličine niza
prekini program */
/* Zatvori datoteku "dat.txt“ */
}
91) Napišite program kojim se s tipkovnice unosi niz imena. Imena se unose u niz stringova.
Unos prestaje kada korisnik kao unos upiše string "kraj“. Kada se završi unos treba izvršiti
ispis imena u datoteku "imena.txt“. Ispis treba izvršiti obrnutim redoslijedom u odnosu na
red unošenja s tipkovnice (prvo treba ispisati ime koje je posljednje uneseno).
92) Napišite funkciju koja će rekurzivnim putem računati sljedeću funkciju f(n):
a) Ako je vrijednost n jednaka nuli, tada vraća vrijednost nula
b) Ako je vrijednost n jednaka jedan, tada vraća vrijednost jedan
c) Inače vraća vrijednost f(n-1)/n
Deklaracija funkcije je:
double f(unsigned int n);
93) U tekstualnoj datoteci imena "studenti.txt" u svakoj liniji je zapisano ime, prezime i
ocjena:
Ante Anic 4
Jure Radic 4
Ivona Maric 7
...
Potrebno je podatke iz ove datoteke učitati u listu SLIST koja je definirana samo-
referentnom strukturom:
struct slist {
char ime[30];
char prezime[30];
int ocjena;
struct slist* next;
};
struct slist* SLIST = NULL;
Nakon što su pročitani svi podaci treba ispisati sadržaj liste SLIST. Za učitavanje iz
datoteke koristite funkciju fscanf, koja vraća EOF ako je dosegnut kraj datoteke.
94) Zadana je struktura koja opisuje čvor dvostruko vezane liste:
typedef struct dlist* DLIST;
23
struct dlist {
int data;
DLIST next;
DLIST prev;
};
Napišite funkciju kojom se briše element liste koji ima vrijednost x.
int delete_element(DLIST* pL, int x);
Argumenti: pL - pokazivač na glavu liste
x - element koji se briše
funkcija vraća 1 ako je element pronađen inače vraća 0
95) Napišite funkciju kojom se umeće element na glavu liste kojoj je čvor definiran
strukturom:
typedef struct _node* LIST;
struct _node {
char ime[31];
char prezime [31];
struct _node* next;
};
Deklaracija funkcije je:
LIST List_Umetni(LIST L, char* ime, char* prezime);
funkcija prima i vraća pokazivač na glavu liste L. Argumenti ime i prezime su stringovi
maksimalne duljine 30 znakova.
96) Zadana je struktura MOJSTOG:
typedef struct stog MOJSTOG;
struct stog {
char ime[30];
struct stog* next;
};
Napišite funkcije dodaj i izbaci kojima se na stog dodaje, odnosno izbacuje jedan string.
String se dodaje odnosno izbacuje sa kraja stoga:
void dodaj(MOJSTOG* pS, char* x);
//Argumenti: pS - pokazivač na glavu liste
// x - string koji se dodaje na stog
char* izbaci(MOJSTOG* pS);
//Argumenti: pS - pokazivač na glavu stoga
//Funkcija vraća string koji je izbačen.
24
Napišite program iz zadatka 92), tako da umjesto niza stringova za pohranu imena
koristite strukturu MOJSTOG, sa pripadajućim funkcijama.
97) Napišite funkciju kojom se umeće element u binarno sortirano stablo kojem je čvor
definiran strukturom:
typedef struct _node* TREE;
struct _node {
int key;
char ime[31];
struct _node* left;
struct _node* right;
};
Deklaracija funkcije je:
TREE BST_Umetni(TREE T, int key, char* ime);
funkcija prima i vraća pokazivač na korijen stabla T. Argumenti su ključ key i string ime
(maksimalne duljine 30 znakova).
98) Napišite program kojim se s tipkovnice unose imena, sve dok se ne upiše "kraj“. Kada se
završi unos treba izvršiti ispis imena obrnutim redoslijedom u odnosu na red unošenja s
tipkovnice, odnosno prvo treba ispisati ime koje je posljednje uneseno.
Za privremeni smještaj imena u memoriji koristiti vezanu listu kojoj je čvor opisan
strukturom node:
struct node {
char ime[31];
struct node* next;
};
99) Riješite zadatak 91) tako da za pohranjivanje brojeva iz datoteke umjesto polja koristite
ADT strukturu STACK (iz udžbenika).
100) Napišite program kojim se s tipkovnice unosi niz realnih brojeva i zapisuje u ADT
strukturu QUEUE (iz udžbenika). Nakon učitavanja i pohranjivanja brojeva u red, ispišite
sadržaj reda.
101) Napišite program koji će raditi sljedeće:
- deklarirati binarno stablo imena stablo, za pohranu aritmetičkog izraza
- u stablo upisati sljedeći izraz
25
/
*
21
-
15
infiksna notacija = (5 – 1) / (1 * 2)
prefiksna notacija = ( / (- 5 1) (* 1 2))
- izračunati vrijednost izraza (pomoću funkcije evaluate) i ispisati ga
Napomena: koristite ADT strukturu PREFIX TREE iz udžbenika.
26
2. RJEŠENJA
2.1 RJEŠENJA ZADATAKA SA KOLOKVIJA
1)
a) 26
b) 40
c) 4
d) 4
2)
a) 2
b) 35
c) 4
d) 3
3)
a) 32
b) 0
c) 4.25
d) 4
4)
a) 21
b) 20
c) 9
d) 2
5)
a) double
b) double
c) double
d) int
6)
a) char
b) double
c) double
d) int
7)
a) double
b) double
27
c) int
d) double
8) 3.0
9) a) 2 na 8 - 1 b) 2 na 15 - 1
10)
a) -128
b) 0
11)
a) 32767
b) 38
12)
a) 2 na 7 – 1 (127)
b) 2 na 16 - 1 (65535)
13) 11110011
14)
a) 11 * 4
b) 11 * 1
15)
a) 88
b) 44
16) 75
17) 127
18) int i, produkt, a[N];
28
i=0;
produkt =1;
while(i<N) {
produkt *= a[i];
i++;
}
19) Greška je u početnoj vrijednosti brojača petlje. Postavlja se na N, a posljednji član niza
ima indeks N-1.
20) int a[N];
int i, prd = 1;
for( i = 0 ; i<N ; i++)
prd *= a[i];
21) int i, sum = 0;
for( i = 0 ; i < N ; i++ ) {
sum += a[i];
}
22) if( i == 0 ) printf("FALSE\n");
else if( i == 1 ) printf("TRUE\n");
else printf("Ponovi upis!\n");
23) int i;
scanf("%d", &i);
if( i == 1 )
printf("ZLATO\n");
else if( i == 2 )
printf("SREBRO\n");
else if( i == 3 )
printf("BRONCA\n");
else
printf("Ponovi upis!\n");
24) int i;
for( i = 0 ; i < 10 ; i++ ) {
if( A[i]%2 == 0 || A[i]%3 == 0 ) {
printf("%d", A[i]);
}
}
29
25) int a, b, c;
scanf("%d %d %d", &a, &b, &c);
if( a%2==0 )
printf("%d\n", a);
if( b%2==0 )
printf("%d\n", b);
if( c%2==0 )
printf("%d\n", c);
26) double a, b;
double o;
scanf("%lg %lg", &a, &b);
o = a * a + b * b;
printf("\n%lg\n", o);
27) int r;
double p;
scanf("%d", &r);
p = r * r * 3.14;
printf("vrijednost od p je %lf", p);
28) int i;
double sv=0;
for( i=0; i<10; i++ )
sv+=N[i];
sv=sv/10;
29) int b[17];
int i;
for( i = 0 ; i < 17 ; i++ )
b[i] = i * i;
30) int duplo(int x) {
return x * 2;
}
31) void ispis(double y) {
printf("%lf\n", y);
}
30
32) int ucitaj() {
int a;
scanf("%d", &a);
return a * a;
}
33) int ucitaj_int() {
int i;
scanf("%d", &i);
if( i>0 )
return i;
else
return 0;
}
34) *pv = *(px+3);
35) a)int i;
for(i=0;i<6;i++)
*(p+i)=0;
b) *(p+2)=5;
36)
a) *(p+6) = 0;
b) p = &x[5];
37)
a) char str[129] = "Alo";
b) pStr = (char*) malloc( 129 * sizeof( char ) );
38) a) Posljednji element stringa mora biti nul znak da bi funkcije koje rade sa stringom
znale koliko je od ukupno deklariranih znakova koji tvore string iskorišteno, odnosno
dokle seže tekst koji je upisan u string.
b) char str1[6]="Hello";
c) char str2[6]; strncpy(str2, str1, 3);
str2[3] = '\0';
31
39) int BrojVelikihSlova(char* str) {
int i, j=0;
for( i=0 ; i < strlen(str) ; i++ )
if( str[i] >= 65 && str[i] <= 90 )
j++;
return j;
}
40) void predznak( double x, int* ps ) {
if( x < 0 )
*ps = -1;
else
*ps = 1;
}
41) void fun( double x, double* py, double* pz ) {
*py = x*x+1;
*pz = x*x-1;
}
42) #define MAXSIZE 14
int* pTEMP;
int P[MAXSIZE/2];
int i;
pTEMP = (int*)malloc( MAXSIZE * sizeof( int ) );
for(i=0; i<MAXSIZE; i++) {
scanf("%d\n", &pTEMP[i]);
if( i%2 == 0 )
P[i/2] = pTEMP[i];
}
free(pTEMP);
43) int* X, SIZE, i=0, s=0;
scanf("%d", &SIZE );
X = (int*) malloc( SIZE * sizeof( int ) );
while ( i<SIZE) {
scanf("%d\n", & X[i]);
s += X[i++] ;
}
printf("Suma je %d", s);
32
free(X);
44)
a) pf = (float*) calloc( 3*3, sizeof(float) );
b) for( i=0 ; i<3 ; i++ ) *(pf + i*3 + i) = 1;
45)
a) struct radnik { int broj;
char ime[30];
char prezime[50];
double placa;
};
b) struct radnik r[40]; r[2].broj = 3;
strcpy(r[2].ime, "Jure");
strcpy(r[2].prezime, "Novak");
r[2].placa = 5690.70;
46) #include <stdio.h>
struct tocka { int x, y; };
struct trokut { struct tocka t1, t2, t3; };
int main() {
struct trokut tr;
scanf("%d", &tr.t1.x);
scanf("%d", &tr.t1.y);
scanf("%d", &tr.t2.x);
scanf("%d", &tr.t2.y);
scanf("%d", &tr.t3.x);
scanf("%d", &tr.t3.y);
return 0;
}
47) int i;
int N[13];
FILE* fp;
fp = fopen("brojevi.txt", "r");
for(i=0; i<7; i++) {
fscanf(fp, "%d", &N[i]);
if( N[i] < 0 )
printf("%d\n", N[i]);
}
fclose(fp);
return (0);
33
48) FILE* fp;
int i;
fp = fopen( "brojevi.txt.", "w" );
scanf("%d", &i);
while( i >= 0 ) {
fprintf(fp, "%d\n", i);
scanf("%d", &i);
}
fclose(fp);
49) int produkt(int n) {
if( n == 1 ) // granični uvjet
return 1; // prekid rekurzije
else
return n * produkt( n-1 ); // rekurzivni poziv
}
50) int Fibonacci(int n) {
if( n <= 1 ) // granični uvjet
return(1);
else // rekurzivni poziv
return( Fibonacci( n - 1 ) + Fibonacci( n - 2 ) );
}
51) int F(int n) {
if( n <= 0 ) { // granini uvjet
return 0;
} else { // rekurzivni poziv
return F(n-1) + n;
}
}
Vrijednost F(2) iznosi 3.
52) #include <stdio.h>
void swap(float* a, float* b) {
float t = *a;
*a = *b;
*b = t;
}
int main() {
34
float x[10];
int n=10;
int i, j, imin;
for( i=0 ; i<n ; i++ ) // a) unos
scanf("%f", &x[i]);
for (i = 0; i < n-1; i++) { // b) selekcijsko sortiranje
imin = i;
for (j = i+1; j < n; j++)
if (x[j] < x[imin])
imin = j;
swap(&x[i], &x[imin]); // zamjena vrijednosti
}
for( i=0 ; i<n ; i++ ) // c) ispis
printf("%g\n", x[i]);
return (0);
}
53) void sortirajNizStringova ( char* instr[ ] ) {
int i, j, imin;
char *temp ;
// kraj niza detektira se sa NULL stringom
for ( i = 0; instr[i] != NULL; i++ ) {
imin = i;
// kraj niza detektira se sa NULL stringom
for ( j = i+1; instr[j] != NULL; j++) {
// stringovi se uspoređuju pomoću finkcije strcmp
if ( strcmp ( instr[ j], instr[ imin] ) < 0 )
imin = j;
}
// zamjena stringova se vrši zamjenom pokazivača
temp = instr[ i];
instr[ i] = instr[ imin];
instr[ imin] = temp;
}
}
54) // funkcija za usporedbu, koja se koristi prilikom poziva qsort
int Cmp(const void* p1, const void* p2) {
float f1 = *( (float*)p1 );
float f2 = *( (float*)p2 );
if( f1 == f2)
return 0;
else if( f1 > f2)
return 1;
else
return -1;
}
35
...
// naredba za sortiranje
qsort(brojevi, sizeof(brojevi)/sizeof(brojevi[0]),
sizeof(brojevi[0]), Cmp);
...
55) // selection sort
void Sort(double* A, int n) {
int i, j, imin; // imin je indeks najmanjeg elementa
double t; // t koristimo prilikom zamjene elemenata
for (i = 0; i < n-1; i++) {
// Odredi najmanji element u x[i..n-1].
imin = i; // pretpostavi da je to x[i]
for (j = i+1; j < n; j++)
if (A[j] < A[imin]) // ako je x[j] manji
imin = j; // zapamti njegov indeks
// zamjeni namjanji element sa i x[i]
t = A[i];
A[i] = A[imin];
A[imin] = t;
}
}
...
Sort( brojevi, 6 );
56) a)
struct node {
int elem;
struct node* next;
};
b) typedef char elemT;
typedef struct tnode {
elemT elem;
struct tnode* left;
struct tnode* right;
} Tnode;
c) typedef struct elemT {
char* ime;
char spol;
int god_rod;
};
typedef struct _node {
elemT elem; // element liste
36
int num_child; // broj alociranih čvorova
struct _node** child; // pokazivač na niz pokazivača na dicu
} Node;
57) node* newNode(char* x) {
// alociraj memoriju za jedan čvor liste
node* n = (node*) malloc(sizeof(node));
// ako je alokacija prošla u redu…
if(n != NULL) {
// alociraj memoriju za string u čvoru
n->str = (char*) malloc( strlen(x) + 1 );
// kopiraj x u string u čvoru
strcpy( n->str, x);
// poništi da je pokazivač na idući čvor
n->next = NULL;
}
// vrati novi čvor
return n;
}
LIST AddToStringList(LIST L, node* N) {
// provjera je li čvor ispravan
if(N != NULL)
// postavljam čvor na početak liste, tako da pokazivač
// na sljedeći čvor od N postavljam na adresu od L
// odnosno na adresu početka liste
N->next = L;
// vrati sebe kao novi početak liste
return N;
}
58) LIST AddToFront(double x, LIST L) {
// alociranje memorije za novi čvor
node* noviCvor = (node*) malloc( sizeof( node ) );
// ako memorija nije alocirana izađi i vrati NULL pokazivač
if( noviCvor == NULL )
return NULL;
else {
// ako je lista prazna onda novi čvor nije vezan dalje
if( L == NULL ) {
noviCvor->broj = x;
noviCvor->next = NULL;
L = noviCvor;
// ako lista nije prazna onda se novi čvor vezuje na
// početak liste
} else {
noviCvor->broj = x;
noviCvor->next = L;
L = noviCvor;
}
return L;
}
37
}
LIST RemoveFront(LIST L) {
// ako je lista prazna onda ne radi ništa
if( L == NULL )
return NULL;
// ako lista nije prazna
else {
// privremeno spremi drugi član liste, prije dealokacije
LIST tempL = L->next;
// dealociraj čvor na glavi liste
free( L );
// vrati privremeno spremljeni drugi član liste kao glavu
return tempL;
}
}
59) DLIST AddToBack(double x, DLIST L) {
// pomočni čvor - služi za šetanje po listi
node* temp;
// alocira memoriju za novi čvor
node* n = (node*) malloc(sizeof(node));
// podešava sadržaj čvora
if(n != NULL) {
n->broj = x;
n->next = NULL;
n->prev = NULL;
}
// ako je lista prazna vraćam novi čvor kao glavu liste
if( L == NULL ) {
return n;
} else {
// ako lista nije prazna sa while petljom šetam do kraja liste
temp = L;
while( temp->next != NULL ) {
temp = temp->next;
}
// na kraj liste ubacujem novi čvor
temp->next = n;
n->prev = temp;
return L;
}
}
60) node* NewTreeNode(char* str) {
// alociranje memorije za novi čvor
node* n = (node*) malloc(sizeof(node));
// ako je memorija alocirana
if( n != NULL ) {
// alociraj memoriju za string u čvoru
n->str = (char*) malloc( strlen(str) );
// kopiraj str u string u čvoru
38
strcpy( n->str, str);
// poništi pokazivač na lijevu i desnu granu
n->left = NULL;
n->right = NULL;
}
// vrati novonastali čvor
return n;
}
NODE AddToStringTree(NODE T, node* N) {
// pomočni čvor - služi za šetanje po stablu
NODE temp = T;
// ako je stablo prazno vrati čvor kao novo stablo
if( T == NULL ) {
T = N;
return T;
}
// ponavljaj
while(1) {
// ako je string čvora N manji od stringa čvora temp
// onda uđi u lijevu granu čvora temp
if( strcmp( N->str, temp->str ) < 0 ) {
// ako je grana prazna
if( temp->left == NULL ) {
// stavi čvor N kao lijevu granu
temp->left = N;
return T;
// ako grana nije prazna
} else {
// postavi lijevu granu kao privremeni čvor
// i ponovi petlju
temp = temp->left;
}
// ako string čvora N nije manji od stringa čvora temp
// onda uđi u desnu granu čvora temp
} else if( strcmp( N->str, temp->str ) > 0 ) {
// ako je grana prazna
if( temp->right == NULL ) {
// stavi čvor N kao desnu granu
temp->right = N;
return T;
// ako grana nije prazna
} else {
// postavi lijevu granu kao privremeni čvor
// i ponovi petlju
temp = temp->right;
}
}
}
}
61) NODE FindInStringTree(NODE T, char* str) {
// n je priručni čvor koji služi za šetanje po stablu
node* n;
39
// postavi n na korijen stabla
n = T;
// petlja koja se ponavlja sve dok se ne dođe do lista stabla
while(n != NULL) {
// provjera je li string iz priručnog čvor stabla n onaj
// string koji tražimo
int cmp = strcmp(str, n->str);
// ako jest isti onda vrati n kao pronađeni čvor
if(cmp == 0)
return n;
// ako je veći onda uđi u desnu granu priručnog čvora i ponovi
// petlju
else if(cmp > 0)
n = n->right;
// ako je manji onda uđi u livu granu priručnog čvora i ponovi
// petlju
else /*(cmp < 0)*/
n = n->left;
}
// ako se dođe do ovdje znači da nismo našli string, pa vraćamo NULL
return NULL;
}
62) void PrintPrefiks(node *T) {
// ako je čvor koji ispisujem prazan onda ispiši prazne zagrade
if(T == NULL) {
printf(" () "); return;
}
// ako su i liva i desna grana prazni onda ovaj čvor sadrži broj
if( T->left == NULL && T->right == NULL ) {
printf("%d ",T->elem);
return;
}
// inače čvor sadrži aritmetičku operaciju pa je ispiši
printf("( %c ",T->elem);
// rekurzivni poziv funkcije za livu i desnu granu čvora
PrintPrefiks(T->left);
PrintPrefiks(T->right);
printf(" )");
}
63) struct node {
int elem;
struct node* next;
};
struct torba {
struct node* top;
40
};
typedef struct torba* TORBA;
int Prazno(TORBA T) {
return ( T->top==NULL ); // ako lista nema nijedan član vraća true
}
int Dobavi(TORBA T) {
int el;
struct node* n;
if (Prazno(T))
return 0; // ako je lista prazna izlazi i vraća nulu
n = T->top; // uzima pokazivač na posljednjeg člana
el = n->elem; // uzima vrijednost člana
T->top = n->next; // mjenja da je posljednji član u stvari
// predposljednji
free(n); // briše-oslobađa memoriju posljednjeg člana
return el;
}
void Stavi(TORBA T, int el) {
struct node* n;
n = (node*)malloc(sizeof(struct node)); // alocira memoriju za
// jednog člana
if (n != NULL) {
n->elem = el; // postavlja vrijednost člana
n->next = T->top; // postavlja da je član vezan sa vrhom
// kolecije
T->top = n;
} else
printf(" Nema dovoljno memorije!\n");
}
64) a) korištenjem void pokazivača, te prijenosom funkcija za kopiranje i oslobađanje ključa
i vrijednosti prilikom deklaracije stabla
b) BSTREE T = bst_new(0);
65) #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "bst.h"
int main() {
// deklaracija jednog čvora stabla
SYMBOL s;
char* ime;
int ocjena;
41
// deklaracija i alokacija stabla
BSTREE T = bst_new(0);
// punjenje stabla
while( 1 ) {
fflush(stdin);
ime = (char*) malloc( 50 * sizeof( char ) );
gets(ime);
if( strcmp( ime, "" ) == 0 ) {
break;
}
scanf("%d", &ocjena);
bst_insert(T, ocjena, ime);
}
printf("\nU stablu ima %d simbola.\n", bst_size(T));
// tražim čvor sa najmanjim ključem
s = bst_minimum(T);
while(s) {
// ispisujem
printf("Kljuc: %d Vrijednost: %s\n", (int)bst_symbol_key(s),
(char*)bst_symbol_value(s) );
s = bst_succesor(s);
}
// dealokacija stabla
bst_free(T);
return 0;
}
66) a) Tablica će imati 17 buketa.
b) Ključevi tablice su tipa int.
c) Vrijednosti tablice su proizvoljnog tipa - zbog void pokazivača.
67) a) Tablica će imati 127 buketa.
b) table_insert(T, 22, 1056);
42
2.2 RJEŠENJA ZADATAKA SA ISPITA
68) Pogrešne su:
a) jer za veličinu niza ima varijablu
d) jer ne alocira dovoljno memorije
69) Problem je sa izborom c) jer se njime pristupa nepostojećem članu niza, odnosno
memoriji koja ne pripada nizu.
70) int i , j;
for( j = 4 ; j >= 0 ; j-- )
for( i = 3 ; i <= 10 ; )
printf("%d\n", i++);
71) a)
i) 111
ii) 210
b)
i) for(x=1; x<100; x++)
x *= 10;
ii) for(x=1; x<100; x *= 10) x++;
72)
a) AAAACCCCBBBBCCCC
b) int x=0;
while( x<4 ) {
int y=0;
while( y<4 ) {
if(x & 1)
putchar('C') ;
else if(x & 2)
putchar('B') ;
else
putchar('A') ;
y++;
}
x++;
}
73)
43
a) 2,2,4,4,4,4,
b) int x,y;
x=0;
while(x<5) {
y = x;
while(y > 0) {
printf("%d,", x);
y--;
}
x+=2;
}
74) a) 102
b) 399
c) 108
75) a)
i) 259
ii) 474
b)
i) for( x=1; x<100; x++ ) {x *= 6;}
ii) for( x=2 ; x<101 ; x++ ) {x *= 6;} x--;
76) a=4
b=8
c=32
77) #include <stdio.h>
int main() {
float cijena;
float pdv, ukupno;
char ime[50];
printf("Upisite ime proizvoda i cijenu!\n");
scanf("%s %f", ime, &cijena);
pdv = 0.22 * cijena;
ukupno = cijena + pdv;
printf("Ime: %s UKUPNA CIJENA: %f\n", ime, ukupno);
return(0);
}
44
78) int BrojParnihElemenata(int* x, int N) {
int brP = 0;
for(int i = 0; i < N ; i++ )
if( x[i] % 2 == 0 )
brP++;
return brP;
}
79) void IzracunajProstoriju(float x, float y, float z, float* v, float* p) {
*v = x*y*z;
*p = 2*x*y + 2*y*z + 2*x*z;
}
80) #include <ctype.h>
...
void ZamjeniSlova(char* str) {
int i=0;
while(str[i] != '\0') {
str[i] = toupper(str[i]);
i++;
}
}
81)
a) int BrojSuglasnika(char* str) {
int i = 0, iBr = 0;
while( str[i] != '\0' ) {
if( isalpha (str[i])
&& str[i] != 'a' && str[i] != 'A'
&& str[i] != 'e' && str[i] != 'E'
&& str[i] != 'i' && str[i] != 'I'
&& str[i] != 'o' && str[i] != 'O'
&& str[i] != 'u' && str[i] != 'U' )
iBr++;
i++;
}
return iBr;
}
b) void OdstraniSamoglasnike(char* str) {
int i = 0;
int j;
while( str[i] != '\0' ) {
if( str[i] == 'a' || str[i] == 'A'
|| str[i] == 'e' || str[i] == 'E'
|| str[i] == 'i' || str[i] == 'I'
45
|| str[i] == 'o' || str[i] == 'O'
|| str[i] == 'u'|| str[i] == 'U' ) {
j=i;
while( str[j] != '\0' ) {
str[j] = str[j+1];
j++;
}
}
i++;
}
}
82) char* RimskiBroj(int n) {
char* rb;
switch (n) {
case 1: rb = (char*)malloc(2 * sizeof(char) );
strcpy(rb, "I");
break;
case 2: rb = (char*)malloc(3 * sizeof(char) );
strcpy(rb, "II");
break;
case 3: rb = (char*)malloc(4 * sizeof(char) );
strcpy(rb, "III");
break;
case 4: rb = (char*)malloc(3 * sizeof(char) );
strcpy(rb, "IV");
break;
case 5: rb = (char*)malloc(2 * sizeof(char) );
strcpy(rb, "V");
break;
case 6: rb = (char*)malloc(3 * sizeof(char) );
strcpy(rb, "VI");
break;
case 7: rb = (char*)malloc(4 * sizeof(char) );
strcpy(rb, "VII");
break;
case 8: rb = (char*)malloc(5 * sizeof(char) );
strcpy(rb, "VIII");
break;
case 9: rb = (char*)malloc(3 * sizeof(char) );
strcpy(rb, "IX");
break;
case 10: rb = (char*)malloc(2 * sizeof(char) );
strcpy(rb, "X");
break;
default: rb = NULL;
};
return rb;
}
83) #include <stdio.h>
#include <math.h>
int main() {
46
struct Complex {float real; float imag;};
struct Complex cniz[10];
float x;
int i;
for(i=0;i<10;i++) {
printf("Upišite kompleksni broj broj %d", i);
scanf("%f %f", &(cniz[i].real), &(cniz[i].imag));
}
for(i=0;i<10;i++) {
x = sqrt( cniz[i].real * cniz[i].real +
cniz[i].imag * cniz[i].imag );
printf("Kompleksni broj %d: real = %f imag = %f abs = %f",
i, cniz[i].real, cniz[i].imag, x);
}
return 0;
}
84) r=126.000000
85) -1, -2, -1,
86) #include <stdlib.h>
#include <stdio.h>
int main() {
FILE* fp;
long data;
int i, j;
int br = 0;
// otvaranje datoteke za pisanje, uz provjeru ispravnosti
if ( (fp = fopen("brojevi.txt", "w")) == NULL) {
printf("Greska pri otvaranju datoteke.");
exit(1);
}
// ispis vrijednosti u datoteku
printf("Ispisujem brojeve u datoteku brojevi.txt.\n");
for (i = 0; i < 100; i++) {
if(scanf("%d", &data)) {
fprintf(fp, "%d\n", data);
br++;
} else
break;
}
// zatvaranje datoteke
fclose(fp);
printf("\nBroj brojeva u datoteci: %d", br);
47
return 0;
}
87) FILE* fp;
// otvaranje datoteke
fp = fopen("brojevi.bin", "wb");
// binarni ispis niza u datoteku
fwrite(A, sizeof(float), 700, fp);
// zatvaranje datoteke
fclose(fp);
88) #include <stdio.h>
#include <stdlib.h>
int main() {
FILE* fp;
int brZ = 0;
int brR = 0;
char c;
// otvaranje datoteke uz detekciju greške
if( ( fp = fopen( "dat.txt", "r") ) == NULL ) {
printf("Greška kod otvaranja datoteke!\n");
exit(1);
}
// čitanje iz datoteke se ponavlja do kraja datoteke (feof)
while(!feof(fp)) {
// pročitaj jedan znak i povećaj brojač znakova
c=fgetc(fp);
brZ++;
// ako je kraj reda povećaj brojač redaka
if( c == '\n' )
brR++;
}
printf("broj znakova %d\n", brZ);
printf("broj redaka %d\n", brR);
// zatvaranje datoteke
fclose(fp);
return (0);
}
89) #include <stdio.h>
#include <stdlib.h>
int main() {
FILE* fp;
48
int brojrjeci;
char c;
int prekid;
// otvaranje datoteke uz provjeru greške
if( ( fp = fopen( "dat.txt", "r") ) == NULL ) {
printf("Greška kod otvaranja datoteke!\n");
exit(1);
}
brojrjeci = 0;
// varijabla prekid služi da se premosti višekratno uzastopno
// ponavljanje znakova prekida riječi
prekid = 1;
// čitanje iz datoteke sve dok nije dosegnut kraj datoteke (feof)
while(!feof(fp)) {
c=fgetc(fp);
if( c == ' ' || c == '.' || c == ',' || c == '\n' ||
c == '\t' || c == EOF ) {
if( !prekid ) {
brojrjeci++;
prekid = 1;
}
} else {
prekid = 0;
}
}
printf("broj rjeci je %d\n", brojrjeci);
// zatvaranje datoteke
fclose(fp);
return (0);
}
90) #include <stdlib.h>
#include <stdio.h>
int main() {
FILE* fp;
int data[5];
int niz[100];
int i, j;
int brojunesenih;
// otvaranje datoteke za čitanje uz provjeru ispravnosti
printf("Otvaram datoteku za citanje.\n");
if ( (fp = fopen("dat.txt", "r")) == NULL) {
printf("Greska pri otvaranju datoteke.");
exit(1);
}
// čitanje vrjednosti iz datoteke
// prekida se ukoliko se dođe do kraja datoteke
// ili ukoliko se učitao negativan broj
printf("Učitavam brojeve iz datoteke:\n");
i=0;
49
brojunesenih=0;
while( !feof(fp) ) {
fscanf(fp, "%d", &niz[brojunesenih]);
if(niz[brojunesenih]<0)
break;
brojunesenih++;
// ukoliko se premaši veličina niza prekida se program
if( brojunesenih > 99 )
return 0;
}
// ispis obratnim redosljedom
printf("Ispisujem obrnutim redosljedom:\n");
for(i=brojunesenih-1;i>=0;i--)
printf("%d\n", niz[i]);
// zatvaranje datoteke
fclose(fp);
return 0;
}
91) #include "stdio.h"
#include "stdlib.h"
#include "string.h"
int main () {
int i=0;
int j;
char* str[100];
FILE* fp;
// unos stringova sve dok se ne upiše "kraj"
// ili dok se ne popuni niz
str[0] = "";
do {
str[i] = (char*) malloc( 100*sizeof(char));
scanf("%s", str[i]);
i++;
} while( i<101 && strcmp(str[i-1], "kraj") );
// otvaranje datoteke za pisanje
fp = fopen("imena.txt", "w");
// ispis stringova obrnutim redoslijedom
for( j=i-2 ; j >= 0 ; j--)
fprintf(fp, "%s\n", str[j]);
// zatvaranje datoteke
fclose(fp);
return (0);
}
92) double f(unsigned int n) {
50
if( n == 0)
return 0;
else if( n == 1 )
return 1;
else
return f(n-1)/n;
}
93) #include <stdlib.h>
#include <stdio.h>
#include <string.h>
struct slist {
char ime[30];
char prezime[30];
int ocjena;
struct slist* next;
};
int main() {
FILE* fp;
char ime[50], prezime[50];
int ocjena;
int ret=0;
// SLIST je glava liste koju čitamo
struct slist* SLIST = NULL;
// tmplist i currlist su pomoćne pokazivačke varijable
struct slist* tmplist = NULL;
struct slist* currlist = NULL;
// otvaranje datoteke uz provjeru uspješnosti
if ( (fp = fopen("studenti.txt", "r")) == NULL) {
printf("Greska pri otvaranju datoteke.");
exit(1);
}
// čitanje vrijednosti završava na kraju datoteke
while(ret != EOF) {
// čitanje jednog retka iz datoteke
ret = fscanf(fp, "%s %s %d", ime, prezime, &ocjena);
// upisivanje u listu
if(ret != EOF) {
// alokacija memorije za novog člana liste - tmplist
tmplist = (struct slist*) malloc(sizeof(struct
slist));
// postavljanje sadržaja novog člana liste
strcpy( tmplist->ime, ime);
strcpy( tmplist->prezime, prezime);
tmplist->ocjena = ocjena;
// postavljanje pokazivača na sljedeći član liste
tmplist->next = NULL;
51
// postavljanje novog člana liste na kraj postojeće liste
if(SLIST == NULL) {
SLIST = tmplist;
currlist = SLIST;
} else {
currlist->next = tmplist;
currlist = tmplist;
}
}
}
// zatvaranje datoteke
fclose(fp);
// ispisivanje pročitane listeliste
// currlist nam služi za šetanje po listi
currlist = SLIST;
while( currlist != NULL ) {
printf("%s %s %d\n", currlist->ime, currlist->prezime,
currlist->ocjena);
currlist = currlist->next;
}
return 0;
}
94) int delete_element(DLIST* pL, int x) {
DLIST tempList;
tempList = *pL;
// provjera je li pL glava liste
if( tempList->prev != NULL )
return 0;
// provjera je li x u glavi liste
if( tempList->data == x ) {
// postavljanje nove glave liste
*pL = tempList->next;
// dealociranje memorije stare glave liste
free( tempList);
return 1;
}
// petlja se ponavlja do kraja liste
while(tempList->next != NULL) {
tempList = tempList->next;
// je li x u ovom članu liste
if ( tempList->data == x ) {
// podešavanje pokazivača na prethodni i sljedeći član
if( tempList->prev != NULL )
(tempList->prev)->next = tempList->next;
if( tempList->next != NULL )
(tempList->next)->prev = tempList->prev;
52
// dealokacija memorije člana
free( tempList );
return 1 ;
}
}
return 0;
}
95) LIST List_Umetni(LIST L, char* ime, char* prezime) {
struct _node* cvor;
// alokacija memorije za novi čvor uz provjeru uspješnosti
cvor = (struct _node*) malloc( sizeof( struct _node) );
if( cvor == NULL )
return L;
else {
// postavljanje sadržaja čvora
strcpy( cvor->ime, ime );
strcpy( cvor->prezime, prezime );
// postavljanje čvora na glavu liste
cvor->next = L;
return cvor;
}
}
96) #include "stdio.h"
#include "stdlib.h"
#include "string.h"
typedef struct stog MOJSTOG;
struct stog {
char ime[30];
struct stog* next;
};
void dodaj(MOJSTOG* pL, char* x) {
MOJSTOG* tmpL;
// alokacija memorije za novi član stoga
MOJSTOG* novi = (MOJSTOG*) malloc( sizeof( MOJSTOG ) );
// upisivanje imena u novi član stoga
strcpy(novi->ime, x);
// novi član stoga treba biti ujedno i zadnji
novi->next = NULL;
// vezivanje novog člana sa postojećim stogom
// ako stog ima samo jednog člana
if( pL->next == NULL ) {
pL->next = novi;
53
// ako stog ima više članova onda pomoću tmpL
// prošetaj do kraja stoga
} else {
tmpL = pL;
while( tmpL->next->next != NULL )
tmpL = tmpL->next;
tmpL->next->next = novi;
}
}
char* izbaci(MOJSTOG* pL) {
MOJSTOG* tmpL;
// alokacija stringa putem kojeg će se vratiti
// tekst iz izbrisanog čvora
char* tmp = (char*) malloc( 30*sizeof( char ) );
// lista ne smije imati samo glavu
if( pL->next != NULL ) {
// pomoću tmpL se šeta do kraja liste
tmpL = pL;
while( tmpL->next->next != NULL )
tmpL = tmpL->next;
// tekst se kopira u string tmp
strcpy(tmp, tmpL->next->ime);
// dealokacija zadnjeg člana
free(tmpL->next);
// predzadnji član je sada zadnji
tmpL->next = NULL;
// vraćanje teksta iz izbrisanog stoga
return tmp;
}
// inače vrati NULL
return NULL;
}
int main () {
char str[30];
FILE* fp;
// alokacija memorije za glavu liste
MOJSTOG* pL = (MOJSTOG*) malloc(sizeof(MOJSTOG));
// čitam prvo ime i spremam ga u glavu liste
scanf("%s", pL->ime);
pL->next = NULL;
if(strcmp(pL->ime,"kraj") == NULL ) {
printf("Nista nije uneseno.\n");
exit(1);
}
// čitam ostala imena sve dok se ne upiše "kraj"
do {
scanf("%s", &str);
54
// ubacivanje stringa u listu pomoću funkcije dodaj
dodaj(pL, str);
} while( strcmp(str, "kraj") );
// otvaranje datoteke za pisanje
fp = fopen("imena.txt", "w");
// izbacujem član sa tekstom "kraj"
izbaci(pL);
// ispisujem i izbacujem članove
while( pL->next != NULL ) {
fprintf(fp, "%s\n", izbaci(pL));
}
// ispisujem zadnji član
fprintf(fp, "%s\n", pL->ime);
// zatvaranje datoteke
fclose(fp);
return 0;
}
97) TREE BST_Umetni(TREE T, int key, char* ime) {
struct _node* x;
struct _node* y;
struct _node* parent;
char smjer;
// ako je stablo je prazno
// novi čvor se stvara kao korijen stabla
if( T == NULL ) {
// alokacija memorije za novi čvor
y = (struct _node*) malloc( sizeof( struct _node ) );
// postavljanje ključa i vrijednosti čvora
y->key = key;
strcpy(y->ime, ime);
// poništavanje pokazivače na listove
y->left = NULL;
y->right = NULL;
// vraćanje korijena stabla
return y;
}
// x je privremeni čvor za šetanje po stablu
x = T;
// parent je roditelj od x, služi za povezivanje
parent = NULL;
// šetam stablom sve dok ne dođem do mista za ubacit čvor
while(1) {
55
// našao sam misto za ubaciti čvor
if( x == NULL ) {
// alociram memoriju za novi čvor y
y = (struct _node*) malloc( sizeof( struct _node )
);
// postavljam ključ i vrijednost
y->key = key;
strcpy(y->ime, ime);
// poništavam pokazivače na listove
y->left = NULL;
y->right = NULL;
// postavljam pokazivač roditelja
if( smjer )
parent->right = y;
else
parent->left = y;
return T;
// ako je ključ manji od ključa x idem u livu granu
} else if( key < x->key ) {
parent = x;
x = x->left;
smjer = 0;
// ako je ključ veći od ključa x idem u desnu granu
} else if( key > x->key ) {
parent = x;
x = x->right;
smjer = 1;
// ako je ključ isti, onda već postoji što je greška
} else if( key == x->key ) {
return T;
}
}
}
98) #include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node {
char ime[31];
struct node* next;
};
int main() {
char temp[31];
struct node* glava;
struct node* cvor;
// čitanje prvog stringa
scanf("%s", temp);
56
// ako je string "kraj" onda izlazak iz programa
if( strcmp( temp, "kraj" ) == 0 )
return 0;
// stvaranje glave liste i ubacivanje prvog stringa u glavu
glava = (struct node*) malloc( sizeof( struct node ) );
strcpy(glava->ime, temp);
glava->next=NULL;
// čitanje idućeg stringa
scanf("%s", temp);
// ponavlja se sve dok string nije "kraj"
while( strcmp( temp, "kraj" ) != 0 ) {
cvor = glava;
// novi strign stavljam na glavu liste, zbog obratnog redosljeda
glava = (struct node*) malloc( sizeof( struct node ) );
strcpy(glava->ime, temp);
glava->next = cvor;
// čitam idući string
scanf("%s", temp);
}
// obilazak liste od glave i ispis vrijednosti
cvor = glava;
while( cvor != NULL ) {
printf( "%s\n", cvor->ime );
cvor = cvor->next;
}
return 0;
}
99) #include <stdlib.h>
#include <stdio.h>
#include "stack.h"
int main() {
FILE* fp;
int brojunesenih;
int val;
// stvaranje novog stoga
STACK stog = stack_new();
// otvaranje datoteke
fp = fopen( "dat.txt", "r");
// broj učitanih brojeva
brojunesenih=0;
// čitanje se prekida ako je kraj datoteke
while( !feof(fp) ) {
// čitanje jednog broja
fscanf(fp, "%d", &val);
// čitanje se prekida ako je učitan negativni broj
if(val<0)
57
break;
brojunesenih++;
// smještam učitani broj na stog
stack_push(stog, val);
// čitanje se prekida ako je učitano više od sto brojeva
if( brojunesenih > 99 )
break;
}
// ispis vrijednosti izbacivanjem iz stoga
while(!stack_empty(stog)) {
val = stack_pop(stog);
printf("%d\n", val);
}
// zatvaranje datoteke
fclose(fp);
return 0;
}
100) #include <stdio.h>
#include "queue.h"
int main() {
float br;
// stvaranje novog reda imena Q
QUEUE Q = queue_new();
// ubacivanje u red
while( scanf( "%f", &br ) ) {
queue_put(Q, br);
}
// ispis svih vrijednosti iz reda
while( !queue_empty(Q) ) {
br = queue_get(Q);
printf("%f\n", br);
}
return 0 ;
}
101) #include <stdio.h>
#include "prefix_tree.h"
int main() {
TREE stablo = make_opnode('/',
make_opnode('-', make_numnode(5), make_numnode(1)),
make_opnode('*', make_numnode(1), make_numnode(2)) );
printf("\nVrijednost izraza je: %f\n",evaluate(stablo));
return 0;
}