57
Zbirka riješenih ispitnih zadataka iz programiranja jezikom C Autor: Marjan Sikora SPLIT, 2013.

Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

Embed Size (px)

Citation preview

Page 1: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

Zbirka riješenih ispitnih zadataka iz programiranja jezikom

C

Autor:

Marjan Sikora

SPLIT, 2013.

Page 2: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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.

Page 3: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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

Page 4: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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'

Page 5: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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.

Page 6: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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.

Page 7: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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.

Page 8: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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();

Page 9: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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:

Page 10: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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č)

Page 11: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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

Page 12: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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.

Page 13: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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*/

Page 14: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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 */

Page 15: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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;

Page 16: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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;

Page 17: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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.

Page 18: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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:

Page 19: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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

Page 20: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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:

Page 21: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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:

Page 22: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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;

Page 23: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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.

Page 24: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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

Page 25: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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.

Page 26: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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

Page 27: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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];

Page 28: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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]);

}

}

Page 29: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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);

}

Page 30: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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';

Page 31: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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);

Page 32: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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);

Page 33: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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() {

Page 34: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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;

}

Page 35: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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

Page 36: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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;

}

Page 37: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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

Page 38: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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;

Page 39: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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;

Page 40: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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;

Page 41: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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);

Page 42: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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)

Page 43: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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);

}

Page 44: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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'

Page 45: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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() {

Page 46: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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);

Page 47: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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;

Page 48: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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;

Page 49: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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) {

Page 50: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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;

Page 51: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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;

Page 52: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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;

Page 53: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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);

Page 54: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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) {

Page 55: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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);

Page 56: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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)

Page 57: Zbirka riješenih ispitnih zadataka iz programiranja jezikom Cmarjan.fesb.hr/~sikora/files/zbirka_p_13.pdf · 2 Ova zbirka sadrži riješene zadatke sa kolokvija i ispita kolegija

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;

}