c - fesb

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

Upload: bozapub

Post on 05-Aug-2015

294 views

Category:

Documents


4 download

DESCRIPTION

Zbirka, programiranje

TRANSCRIPT

 

 

 

Zbirka riješenih ispitnih zadataka 

iz programiranja jezikom 

 

 

Autor:

Marjan Sikora

SPLIT, 2010.

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. 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: a) kojom se pomoću pokazivača p, svim elementima niza x pridjeljuje vrijednost 0. b) 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: a) kojom se pomoću pokazivača p, posljednjem elementu niza x pridjeljuje vrijednost

0 b) 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.

10

39) Napišite funkciju koja vraća broj velikih slova u nekom stringu. Prototip funkcije je:

int BrojVelikihSlova(char* str); 40) 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

41) 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.

42) 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.

43) 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. 44) 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;

11

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.

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

46) 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.

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; LIST* 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; T->free_key = T->free_val = NULL;

16

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. 74) Koju će vrijednost imati varijabla x nakon završetka sljedećih petlji:

18

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+b2). 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:

float A[700];

21

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: 1. Učitaj broj x iz datoteke

22

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

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 %f", 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("%f\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+7) = 0; b) p = &x[5];

37)

a) char str[128] = "Alo"; b) pStr = (char*) malloc( 128 * 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)

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;

41)

#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; }

42)

void predznak( double x, int* ps ) { if( x < 0 ) *ps = -1; else *ps = 1; }

43)

32

void fun( double x, double* py, double* pz ) { *py = x*x+1; *pz = x*x-1; }

44)

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

45)

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

46)

a) pf = (float*) calloc( 3*3, sizeof(float) ); b) for( i=0 ; i<3 ; i++ )

*(pf + i*3 + i) = 1; 47) int i; int N[13]; FILE* fp; fp = fopen("brojevi.txt", "r"); for(i=0; i<7; i++) { fscanf(fp, "%d\n", &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; }