Upload
jevrej
View
22
Download
0
Embed Size (px)
DESCRIPTION
asdfg
Citation preview
Zbirka rijeenih ispitnih zadataka iz programiranja jezikom
C
Autor:
Marjan Sikora
SPLIT, 2013.
2
Ova zbirka sadri rijeene zadatke sa kolokvija i ispita kolegija Programiranje, koji se predaje na FESB-u, smjer 110. U ovom kolegiju se ui programiranje u jeziku C, tako da zbirka moe posluiti i svima drugim koji ue programirati tim jezikom. Zbirka je podijeljena u dva dijela. U prvom dijelu su zadatci, a u drugom rjeenja zadataka. Zadaci i rjeenja zadataka podijeljeni su na one sa kolokvija, te one sa ispita. Redoslijed zadataka prati redoslijed kojim se oni pojavljuju na kolokvijima i ispitima, a slae se i sa redoslijedom gradiva koje se ui na ovom kolegiju. Zbirka je predviena kao popratno sredstvo uz knjigu prof. Ive Mateljana Programiranje C jezikom, koja je udbenik za ovaj kolegij.
Onima koji koriste ovu zbirku preporuam zadatke rjeavati na raunalu, te to vie koristiti izvrenje koda liniju po liniju i praenje varijabli. Ukoliko zadatak podrazumijeva izradu samo dijela koda, jedne funkcije ili klase, preporuam 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
naiete na kakovu greku, molim vas da na email [email protected] poaljete poruku sa opisom o emu je rije, kako bih to mogao ispraviti. Na taj nain ete pomoi buduim generacijama studenata.
Marjan Sikora
U Splitu, 30.09.2010.
3
SADRAJ:
1. ZADACI ................................................................................................................................. 4
1.1 ZADACI SA KOLOKVIJA ........................................................................................ 4 1.2 ZADACI SA ISPITA ................................................................................................. 16
2. RJEENJA ........................................................................................................................... 26 2.1 RJEENJA ZADATAKA SA KOLOKVIJA ................................................................ 26 2.2 RJEENJA ZADATAKA SA ISPITA .......................................................................... 42
4
1. ZADACI
1.1 ZADACI SA KOLOKVIJA
1) Napiite koju vrijednost u C jeziku imaju sljedei izrazi:
a) 2 + 8 * 3
b) 8 * (3 + 2)
c) 8 / 3 + 2
d) 8 % 3 + 2
2) Napiite koju vrijednost u C jeziku imaju sljedei izrazi:
a) 2 + 7 * 0
b) 7 * (3 + 2)
c) 7 / 3 +2
d) 7 % 3 + 2
3) Napiite koju vrijednost u C jeziku imaju sljedei 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 sljedei izrazi:
a) 31 % 4 + 9 * 2
b) 9 * (2) + 2
c) 9 / ( 4 >= 2 + 2)
d) 9 * !3 + 2
5) Koji tip imaju sljedei 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 sljedei izrazi:
char c; int i; double d;
a) c + '2'
b) d + c
c) '2' * d
d) i * '2'
5
7) Koji tip imaju sljedei 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 izvrenja sljedeeg 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 moe 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) Napiite cijeli broj -13, u binarnom obliku, kodiran u 8-bitnoj notaciji komplementa dvojke.
14) Deklariran je niz u sljedeem obliku:
a) float a[11]; b) char b[11];
Napiite koliko bajta memorije zauzimaju ovi nizovi.
6
15) Napiite koliko bajta memorije zauzimaju ovi nizovi:
a) double a[11]; b) short int b[22];
16) Napiite ispis sljedeeg programa:
#include
int a=10;
void funkcija() { int a = 5; printf("%d", a); }
int main() { int a=7; printf("%d", a); funkcija(); return 0; }
17) Napiite ispis sljedeeg dijela koda:
char c = 127;
printf("%d", c++);
18) Zadana je for petlja kojom se rauna produkt elemenata niza od N brojeva:
int i, produkt, a[N];
for(i=0, produkt = 1; i < N; i++)
produkt *= a[i];
Napiite 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 izvravati sljedee: poevi od posljednjeg lana niza, do poetnog lana niza, sve lanove niza treba inicijalizirati na vrijednost nula.
int i, a[N];
for( i = N ; i >= 0 ; i-- )
a[i] = 0;
Naite greku u programu.
20) Zadana je while petlja kojom se rauna produkt niza od N brojeva:
int a[N];
int i = 0, produkt = 1;
while(i < N) {
produkt *= a[i];
i++;
}
Napiite ekvivalentni program u kojem se umjesto while-petlje koristi for-petlja.
7
21) Zadana je while petlja kojom se rauna suma niza a od N brojeva:
int i=-1, sum = 0;
while(i < N-1) {
sum += a[++i];
}
Napiite 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. Napiite 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 pomou if-
else if-else naredbi.
25) Napiite program koji sa konzole uitava tri varijable imena a, b i c tipa int. Program neka ispie one varijable koje su parne.
8
26) Napiite program koji sa konzole uitava dvije varijable imena a i b tipa double. Program
neka rauna 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 ispie vrijednost
varijable o.
27) Napiite program u kojem se sa tipkovnice uitava radijus kruga u varijablu imena r, tipa
int. Program zatim rauna povrinu kruga prema izrazu:
p = r * r * 3.14;
i sprema u varijablu imena p tipa double. Nakon toga neka program ispie 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. Napiite kod sa petljom tipa for koja izraunava 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 napiite i deklaracije svih varijabli koje koristite u proraunu.
29) Napiite 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) Napiite funkciju imena duplo tipa int koja ima jedan argument imena x tipa int. Funkcija neka vraa dvostruku vrijednost broja koji je argument funkcije.
31) Napiite funkciju imena ispis tipa void koja ima jedan argument imena y, tipa double. Funkcija neka ispisuje na standardni izlaz argument funkcije.
32) Napiite funkciju imena ucitaj tipa int koja nema argumenata. Funkcija neka pomou
funkcije scanf sa konzole uita varijablu tipa int i neka vraa kvadrat te vrijednosti. Prototip funkcije je:
int ucitaj();
9
33) Napiite funkciju imena ucitaj_int tipa int koja nema argumenata. Funkcija neka
pomou funkcije scanf sa konzole uita varijablu tipa int i neka tu vrijednost vraa, ukoliko je vea od nule. Ukoliko je manja od nule neka vrati nulu.
34) Deklariran je cjelobrojni niz imena x, varijabla v, te pokazivai imena px i pv; int x[6], v;
int* px = &x[0];
int* pv = &v;
Napiite naredbu kojom se pomou pokazivaa pv i px, ostvari isti uinak kao u sljedeoj naredbi:
v = x[3];
35) Deklariran je niz imena x i pokaziva imena p:
int x[6];
int* p = x;
Napiite naredbe:
kojom se pomou pokazivaa p, svim elementima niza x pridjeljuje vrijednost 0.
zatim se, pomou pokazivaa 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];
Napiite naredbe: kojom se pomou pokazivaa p, posljednjem elementu niza x pridjeljuje vrijednost 0 zatim se pokaziva p, postavlja da pokazuje na element x[5]
37) Napravite sljedee:
a) Napiite deklaraciju kojom se inicijalizira string imena str na sadraj "Alo", ali uz uvjet da se string moe proiriti do maksimalno 128 znakova.
b) Napiite naredbu kojom se dinamiki alocira memorija za string koji e sadravati 128 znakova.
38) Odgovorite: a) Objasnite zato posljednji element stringa mora biti nul znak?
b) Napiite deklaraciju stringa imena str1, nakon koje taj string sadri znakove "Hello"
c) Napiite naredbe kojima se deklarira drugi niz imena str2, kojem se pridjeljuje prva
tri znaka iz stringa str1.
39) Napiite funkciju koja vraa broj velikih slova u nekom stringu. Prototip funkcije je:
10
int BrojVelikihSlova(char* str);
40) Napiite 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 izrauna predznak varijable x. Predznak neka vraa preko pokazivaa s,
tako da ukoliko je x vei ili jednak nuli, neka vraa 1, a ukoliko je manji od nule neka
vraa -1.
41) Napiite 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 - trei argument je pokaziva na varijablu tipa double
Funkcija treba preko pokazivaa py vratiti vrijednost x*x+1, a preko pokazivaa pz treba
vratiti vrijednost x*x-1.
42) Zadan je dio programa kojim se uitava 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
11
44) Napravite sljedee: a) Napiite naredbu (jednu) kojom se dinamiki alocira memorija za matricu koja e u 3
retka i 3 stupca sadrava 9 realnih brojeva tipa float, svi poetne vrijednosti nula. b) Napiite 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 biljeiti plaa radnika. b) Deklarirajte niz koji moe sadravati 40 elemenata tipa struct radnik i napiite naredbe
kojima se treem element niza upisuje: broj: 3, ime : "Jure", prezime "Novak", plaa: 5690.70
46) Napiite program sljedeeg sadraja:
deklarirajte strukturu koja opisuje dvodimenzionalnu toku: struct tocka {int x,y;}
definirajte strukturu imena struct trokut, koja sadri tri lana tipa struct tocka
sa konzole uitajte 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. Napiite program koji iz datoteke uitava prvih 7 brojeva, te ispisuje sve brojeve manje od nule na monitor.
48) Napiite 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 moe se definirati rekurzivno :
produkt(n) = 1 - ako je n = 1
produkt(n) = n * produkt(n-1) - inae
Napiite rekurzivnu funkciju, prototipa int produkt(int n), u kojoj se koja obavlja prethodni postupak.
50) Napiite funkciju int Fibonacci(int n); koja vraa vrijednost n-tog Fibonacci-jevog broja. Fibonacci-jevi brojevi su definirani rekurzivno:
F(n) = 1 - ako je n 1
12
51) Napiite rekurzivnu funkciju prototipa:
int F(int n);
koja vraa vrijednost funkcije F(n) koja je definirana rekurzivno:
F(n) = 0 - ako je n 0
Procijenite vrijednost F(2).
52) Napiite program koji vri sljedee radnje:
a) korisnik unosi 10 brojeva u niz double x[10];
b) nakon unosa vri se sortiranje elemenata niza x. c) nakon sortiranja vri se ispis elemenata niza
Sami odaberite metodu sortiranja.
53) Zadan je niz stringova:
char* strings[] = {"Jure", "Ante", ...,"Doris", NULL} ;
Kraj niza oznaen je s NULL pokazivaem. Napiite funkciju kojom se moe leksikografski sortirati ovakav niz stringova. Deklaracija funkcije je:
void sortirajNizStringova( char* instr[] );
54) Zadan je niz brojeva:
float brojevi[] = {3.1, 22, ..., 31.2} ;
Napiite naredbu kojom se sortira ovaj niz koristei funkciju biblioteke qsort. Uoite da
se veliina niza moe dobiti pomou sizeof operatora.
55) Zadan je niz brojeva:
double brojevi[] = {3.1, 22, 55, 5.6, 0.1, 31.2};
Napiite 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 sljedee: a) Definirajte strukturu kojom se moe formirati lista cijelih brojeva b) Definirajte strukturu kojom se moe formirati stablo koje sadri aritmetike izraza c) Definirajte strukturu kojom se moe formirati porodino stablo tako da svaki vor
stabla sadri vezu s roditeljem i proizvoljnim brojem djece. U voru se upisuje: ime, spol, godina roenja.
57) Zadana je samoreferentna struktura kojom se moe realizirati lista stringova:
typedef struct _node node;
typedef struct _node* LIST;
struct _node { char* str; node* next; };
Napiite dvije funkcije:
node* NewListNode(char* str);
/*stvara i alocira vor liste koji sadri kopiju stringa str */
LIST AddToStringList(LIST L, node* N);
/* stavlja vor N na glavu liste L. Vraa pokaziva na glavu liste*/
58) Zadana je samoreferentna struktura kojom se moe realizirati lista brojeva:
typedef struct _node node;
typedef struct _node* LIST;
struct _node { double broj; node* next; };
Napiite dvije funkcije:
LIST AddToFront(double x, LIST L);
/*stvara vor liste koji sadri kopiju broja x i stavlja ga na glavu
liste, vraa pokaziva glave liste*/
LIST RemoveFront(LIST L);
/* odstranjuje vor na glavi liste L. Vraa pokaziva na glavu
liste.*/
59) Zadana je samoreferentna struktura kojom se moe realizirati lista brojeva, pomou dvostruko vezane liste:
typedef struct _node node;
typedef struct _node* DLIST;
struct _node { double broj; node* next; node* prev; };
Napiite funkciju za umetanje vora na kraju liste.
DLIST AddToBack(double x, DLIST L);
/*stvara vor liste koji sadri kopiju broja x i stavlja ga na kraj
liste L, vraa pokaziva glave liste*/
14
60) Zadana je samoreferentna struktura kojom se moe realizirati sortirano binarno stablo koje sadri stringove:
typedef struct _node node;
typedef struct _node* NODE;
struct _node { char* str; NODE left; NODE right; };
Napiite dvije funkcije:
node* NewTreeNode(char* str);
/*stvara i alocira vor koji sadri kopiju stringa str */
NODE AddToStringTree(NODE T, node* N);
/* stavlja vor N u sortirano binarno stablo kojem je korijen T.
Vraa pokaziva na korijen stabla*/
61) Zadana je samoreferentna struktura kojom se realizira sortirano binarno stablo koje sadri stringove:
typedef struct _node node;
typedef struct _node* NODE;
struct _node { char* str; NODE left; NODE right; };
Napiite funkciju:
NODE FindInStringTree(NODE T, char* str);
/* pronalazi i vraa vor stabla u kojem je string str. Ako ne moe
nai string str vraa NULL*/
62) Zadana je samoreferentna struktura kojom se realizira binarno stablo koje sadri aritmetike izraze:
typedef struct _node node;
struct _node { int elem; node* left; node* right; };
U unutarnjim vorovima stabla elem sadri operatore (+,-,*,/), a u listovima elem sadri brojeve. Napiite funkciju kojom se iz formiranog stabla ispisuje aritmetiki izraz u prefiksnoj notaciji.
void PrintPrefiks(node* T);
/* ispisuje aritmetiki izraz u prefiksnoj notaciji. Izraz je zapisan
u binarnom stablu kojem je korijen T. */
63) Napiite implementaciju ADT imena TORBA koji slui 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) /* vraa i brie broj iz kolekcije*/
int Prazno(TORBA T) /* vraa 1 ako je kolekcija prazna */
15
64) Koristite specifikaciju ADT BST (binarno stablo traenja) iz knjige. Odgovorite sljedee:
a) Kako je postignut polimorfizam, tj. mogunost da se u stablu upisuju razliiti tipovi podataka
b) Kako bi inicirali stablo koje treba sadravati: ime i prezime (jedan string) kao
vrijednost i matini broj (integer) kao klju
65) Napiite 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 izvri unos praznog stringa, treba izvriti ispis imena, sortiran prema ocjenama, od najmanje prema najveoj.
66) Zadana je hash tablica prema sljedeoj specifikaciji:
typedef struct _symbol {
struct _symbol* next;
void* key;
void* val;
}Symbol;
typedef struct _table {
unsigned M;
unsigned N;
Symbol** bucket;
CompareFuncT compare;
HashFuncT hash;
CopyFuncT copy_key;
CopyFuncT copy_val;
FreeFuncT free_key;
FreeFuncT free_val;
} Table, * TABLE;
static int compareInternal(void* a, void* b) {
if( (int)a > (int)b ) return 1;
else if( (int)a < (int)b ) return -1;
else return 0;
}
static unsigned hashInternal(void* p, unsigned M) {
int k = (int)p;
return k > 0? k % M : - k % M;
}
TABLE table_new(unsigned M, CompareFuncT compare, HashFuncT hash) {
TABLE T = (TABLE) malloc(sizeof(Table));
if (T == NULL) return NULL;
T->M = M;
T->N = 0;
T->bucket = (Symbol**) calloc(M, sizeof(Symbol*) );
T->hash = hash ? hash : hashInternal;
T->compare = compare? compare : compareInternal;
16
T->free_key = T->free_val = NULL;
T->copy_key = T->copy_val = NULL;
return T;
}
Hash tablica je inicirana naredbom:
TABLE T = new_table(17, 0, 0);
Ako je tablica inicirana na ovaj nain, odgovorite na sljedea pitanja: a) Koliko buketa e imati tablica? b) Kojeg tipa su kljuevi tablice? c) Kojeg tipa su vrijednosti tablice?
67) Zadana je hash tablica prema specifikaciji iz prethodnog zadatka. Hash tablica, koja sadri cjelobrojne vrijednosti i kljueve je inicirana naredbom:
TABLE T = new_table(127, 0, 0);
Napiite: a) Koliko buketa e imati tablica? b) Napiite naredbu kojom se u tablicu umee, vrijednost 1056, kojoj je klju 22.
1.2 ZADACI SA ISPITA
68) Potrebno je oformiti niz od 10 elemenata? Koje su od navedenih deklaracija pogrene?
#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 zato!
69) Definiran je pokaziva i alocirana memorija naredbom
int* A = (int)malloc(10*sizeof(int));
Koja od sljedeih naredbi moe uzrokovati ozbiljnu greku u izvrenju programa:
a) A[1] = 0;
b) *A = 1;
c) A[10] = 10;
17
Objasnite zato!
70) Dvije ugnjedene while petlje transformirajte u dvije ugnjedene for petlje
int i, j =4;
while (j >= 0) {
i = 3;
while (i
18
74) Koju e vrijednost imati varijabla x nakon zavretka sljedeih petlji:
a) for (x=0; x
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 vraa volumen i povrina
Volumen i povrinu raunati 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) Napiite funkciju kojoj je specifikacija :
void ZamijeniSlova(char* str)
/* Argument str je pokaziva stringa.
* Funkcija mijenja sadraj stringa tako da se
* mala slova pretvaraju u velika slova. */
primjerice nakon programskog odsjeka
char str[] = "Hello World!";
ZamijeniSlova(str);
printf("%s",str);
bit e ispisano: HELLO WORLD!
81) Napiite funkcije:
a) int BrojSuglasnika(char* str) koja vraa broj suglasnika u ulaznom stringu
b) void OdstraniSamoglasnike(char* str)
kojom s izbacuju samoglasnici iz ulaznog stringa. (Naprimjer: Dobar postaje Dbr)
82) Napiite funkciju kojoj je specifikacija :
char* RimskiBroj(int n)
/* argument: n je cijeli broj
* PRE: 1
20
Da biste za string sa rimskim brojem alocirali potrebnu veliinu, koristite dinamiko
alociranje, odnosno funkciju malloc. Napiite program u kojem se testira ova funkcija.
83) Napiite program kojim se s tipkovnice unosi niz od 10 kompleksnih brojeva u strukturu
imena Complex. Program zatim rauna 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] izraunaj aps. vrijednost x.
Ispii realni i imag. dio od cniz[i] te aps. vrijednost x.
*/
}
84) to ispisuje sljedei program?
#include
int main(void) {
float r = 12.0 + (float)'r';
printf("%s=%f\n", "r", r );
return 0;
}
85) Napiite rezultat koji e biti ispisan nakon izvrenja sljedeeg 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) Napiite program kojim se s tipkovnice unosi niz brojeva tipa long i zapisuje u datoteku imena brojevi.txt. Unos zavrava kada se umjesto broja otkuca slovo. Nakon toga treba zatvoriti datoteku i izvijestiti korisnika koliko je brojeva zapisano u datoteci.
87) U memoriji su podaci spremljeni u nizu deklariranom s:
21
float A[700];
Napiite programski odsjeak 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) Napiite 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) Napiite program kojim se ispituje koliko je rijei zapisano u tekstualnoj datoteci imena "dat.txt".
Napomena: rijei su nizovi znakova koji su razdvojeni znakovima: razmak ' ', zarez ',', toka '.', 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 poveavaj brojrijeci,
ako je ucitan jedan ili vie separatora rijei */
/* zatvori datoteku */
printf("Broj rijeci = %d, brojrijeci);
return 0;
}
90) Napiite program koji iz datoteke "dat.txt uitava niz pozitivnih cijelih brojeva. Unos zavrava kada se iz datoteke uita prvi negativni broj. Tada treba ispisati uitane brojeve obrnutim redoslijedom u odnosu na red uitavanja iz datoteke, odnosno prvo treba ispisati broj koji je uitan posljednji. Kostur programa je:
int main() {
/* Deklaracije varijabli */
int i; /* broj koji se uitava */
int niz[100]; /* niz u kojem pamtimo unesene brojeve*/
int brojunesenih=0; /* ukupan broj unesenih brojeva = 0*/
/* Otvori datoteku "dat.txt za itanje*/
/* Ponavljaj:
22
1. Uitaj broj x iz datoteke
2. Ako je broj x negativan ili se dolo do kraja datoteke
ispii dotad unesene vrijednosti obrnutim
redoslijedom i prekini program,
a ako je pozitivan
zapamti njegovu vrijednost u nizu.
i poveaj brojunesenih
3. Ako brojunesenih bude jednak ili vei od veliine niza
prekini program */
/* Zatvori datoteku "dat.txt */
}
91) Napiite program kojim se s tipkovnice unosi niz imena. Imena se unose u niz stringova. Unos prestaje kada korisnik kao unos upie string "kraj. Kada se zavri unos treba izvriti ispis imena u datoteku "imena.txt. Ispis treba izvriti obrnutim redoslijedom u odnosu na red unoenja s tipkovnice (prvo treba ispisati ime koje je posljednje uneseno).
92) Napiite funkciju koja e rekurzivnim putem raunati sljedeu funkciju f(n):
a) Ako je vrijednost n jednaka nuli, tada vraa vrijednost nula b) Ako je vrijednost n jednaka jedan, tada vraa vrijednost jedan c) Inae vraa 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 uitati 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 proitani svi podaci treba ispisati sadraj liste SLIST. Za uitavanje iz
datoteke koristite funkciju fscanf, koja vraa 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;
};
Napiite funkciju kojom se brie element liste koji ima vrijednost x.
int delete_element(DLIST* pL, int x);
Argumenti: pL - pokaziva na glavu liste
x - element koji se brie
funkcija vraa 1 ako je element pronaen inae vraa 0
95) Napiite funkciju kojom se umee 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 vraa 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;
};
Napiite 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 vraa string koji je izbaen.
24
Napiite program iz zadatka 92), tako da umjesto niza stringova za pohranu imena
koristite strukturu MOJSTOG, sa pripadajuim funkcijama.
97) Napiite funkciju kojom se umee 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 vraa pokaziva na korijen stabla T. Argumenti su klju key i string ime (maksimalne duljine 30 znakova).
98) Napiite program kojim se s tipkovnice unose imena, sve dok se ne upie "kraj. Kada se zavri unos treba izvriti ispis imena obrnutim redoslijedom u odnosu na red unoenja s tipkovnice, odnosno prvo treba ispisati ime koje je posljednje uneseno.
Za privremeni smjetaj imena u memoriji koristiti vezanu listu kojoj je vor opisan strukturom node:
struct node {
char ime[31];
struct node* next;
};
99) Rijeite zadatak 91) tako da za pohranjivanje brojeva iz datoteke umjesto polja koristite
ADT strukturu STACK (iz udbenika).
100) Napiite program kojim se s tipkovnice unosi niz realnih brojeva i zapisuje u ADT
strukturu QUEUE (iz udbenika). Nakon uitavanja i pohranjivanja brojeva u red, ispiite sadraj reda.
101) Napiite program koji e raditi sljedee:
- deklarirati binarno stablo imena stablo, za pohranu aritmetikog izraza - u stablo upisati sljedei izraz
25
/
*
21
-
15
infiksna notacija = (5 1) / (1 * 2) prefiksna notacija = ( / (- 5 1) (* 1 2))
- izraunati vrijednost izraza (pomou funkcije evaluate) i ispisati ga
Napomena: koristite ADT strukturu PREFIX TREE iz udbenika.
26
2. RJEENJA
2.1 RJEENJA 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
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
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
31
39) int BrojVelikihSlova(char* str) {
int i, j=0;
for( i=0 ; i < strlen(str) ; i++ )
if( str[i] >= 65 && str[i]
32
free(X);
44)
a) pf = (float*) calloc( 3*3, sizeof(float) );
b) for( i=0 ; i
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 ) // granini uvjet
return 1; // prekid rekurzije
else
return n * produkt( n-1 ); // rekurzivni poziv
}
50) int Fibonacci(int n) {
if( n
34
float x[10];
int n=10;
int i, j, imin;
for( i=0 ; i
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 pokazivaa na dicu
} Node;
57) node* newNode(char* x) {
// alociraj memoriju za jedan vor liste
node* n = (node*) malloc(sizeof(node));
// ako je alokacija prola 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);
// poniti da je pokaziva na idui 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 poetak liste, tako da pokaziva
// na sljedei vor od N postavljam na adresu od L
// odnosno na adresu poetka liste
N->next = L;
// vrati sebe kao novi poetak 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 izai 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
// poetak liste
} else {
noviCvor->broj = x;
noviCvor->next = L;
L = noviCvor;
}
return L;
}
37
}
LIST RemoveFront(LIST L) {
// ako je lista prazna onda ne radi nita
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) {
// pomoni vor - slui za etanje po listi
node* temp;
// alocira memoriju za novi vor
node* n = (node*) malloc(sizeof(node));
// podeava sadraj vora
if(n != NULL) {
n->broj = x;
n->next = NULL;
n->prev = NULL;
}
// ako je lista prazna vraam 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);
// poniti pokaziva na lijevu i desnu granu
n->left = NULL;
n->right = NULL;
}
// vrati novonastali vor
return n;
}
NODE AddToStringTree(NODE T, node* N) {
// pomoni vor - slui 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 ui 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 ui 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 priruni vor koji slui za etanje po stablu
node* n;
39
// postavi n na korijen stabla
n = T;
// petlja koja se ponavlja sve dok se ne doe do lista stabla
while(n != NULL) {
// provjera je li string iz prirunog vor stabla n onaj
// string koji traimo
int cmp = strcmp(str, n->str);
// ako jest isti onda vrati n kao pronaeni vor
if(cmp == 0)
return n;
// ako je vei onda ui u desnu granu prirunog vora i ponovi
// petlju
else if(cmp > 0)
n = n->right;
// ako je manji onda ui u livu granu prirunog vora i ponovi
// petlju
else /*(cmp < 0)*/
n = n->left;
}
// ako se doe do ovdje znai da nismo nali string, pa vraamo NULL
return NULL;
}
62) void PrintPrefiks(node *T) {
// ako je vor koji ispisujem prazan onda ispii prazne zagrade
if(T == NULL) {
printf(" () "); return;
}
// ako su i liva i desna grana prazni onda ovaj vor sadri broj
if( T->left == NULL && T->right == NULL ) {
printf("%d ",T->elem);
return;
}
// inae vor sadri aritmetiku operaciju pa je ispii
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 vraa true
}
int Dobavi(TORBA T) {
int el;
struct node* n;
if (Prazno(T))
return 0; // ako je lista prazna izlazi i vraa 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); // brie-oslobaa 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) koritenjem void pokazivaa, te prijenosom funkcija za kopiranje i oslobaanje kljua
i vrijednosti prilikom deklaracije stabla
b) BSTREE T = bst_new(0);
65) #include
#include
#include
#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));
// traim vor sa najmanjim kljuem
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) Kljuevi tablice su tipa int. c) Vrijednosti tablice su proizvoljnog tipa - zbog void pokazivaa.
67) a) Tablica e imati 127 buketa. b)
table_insert(T, 22, 1056);
42
2.2 RJEENJA ZADATAKA SA ISPITA
68) Pogrene su: a) jer za veliinu niza ima varijablu d) jer ne alocira dovoljno memorije
69) Problem je sa izborom c) jer se njime pristupa nepostojeem lanu niza, odnosno memoriji koja ne pripada nizu.
70) int i , j;
for( j = 4 ; j >= 0 ; j-- )
for( i = 3 ; i
43
a) 2,2,4,4,4,4,
b) int x,y;
x=0;
while(x 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
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
...
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
#include
int main() {
46
struct Complex {float real; float imag;};
struct Complex cniz[10];
float x;
int i;
for(i=0;i
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
#include
int main() {
FILE* fp;
int brZ = 0;
int brR = 0;
char c;
// otvaranje datoteke uz detekciju greke
if( ( fp = fopen( "dat.txt", "r") ) == NULL ) {
printf("Greka kod otvaranja datoteke!\n");
exit(1);
}
// itanje iz datoteke se ponavlja do kraja datoteke (feof)
while(!feof(fp)) {
// proitaj jedan znak i poveaj broja znakova
c=fgetc(fp);
brZ++;
// ako je kraj reda poveaj 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
#include
int main() {
FILE* fp;
48
int brojrjeci;
char c;
int prekid;
// otvaranje datoteke uz provjeru greke
if( ( fp = fopen( "dat.txt", "r") ) == NULL ) {
printf("Greka kod otvaranja datoteke!\n");
exit(1);
}
brojrjeci = 0;
// varijabla prekid slui da se premosti viekratno uzastopno
// ponavljanje znakova prekida rijei
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
#include
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 doe do kraja datoteke
// ili ukoliko se uitao negativan broj
printf("Uitavam brojeve iz datoteke:\n");
i=0;
49
brojunesenih=0;
while( !feof(fp) ) {
fscanf(fp, "%d", &niz[brojunesenih]);
if(niz[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 upie "kraj"
// ili dok se ne popuni niz
str[0] = "";
do {
str[i] = (char*) malloc( 100*sizeof(char));
scanf("%s", str[i]);
i++;
} while( i= 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
#include
#include
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 pomone pokazivake varijable
struct slist* tmplist = NULL;
struct slist* currlist = NULL;
// otvaranje datoteke uz provjeru uspjenosti
if ( (fp = fopen("studenti.txt", "r")) == NULL) {
printf("Greska pri otvaranju datoteke.");
exit(1);
}
// itanje vrijednosti zavrava 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 sadraja novog lana liste
strcpy( tmplist->ime, ime);
strcpy( tmplist->prezime, prezime);
tmplist->ocjena = ocjena;
// postavljanje pokazivaa na sljedei lan liste
tmplist->next = NULL;
51
// postavljanje novog lana liste na kraj postojee liste
if(SLIST == NULL) {
SLIST = tmplist;
currlist = SLIST;
} else {
currlist->next = tmplist;
currlist = tmplist;
}
}
}
// zatvaranje datoteke
fclose(fp);
// ispisivanje proitane listeliste
// currlist nam slui 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 ) {
// podeavanje pokazivaa na prethodni i sljedei 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 uspjenosti
cvor = (struct _node*) malloc( sizeof( struct _node) );
if( cvor == NULL )
return L;
else {
// postavljanje sadraja 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 postojeim stogom
// ako stog ima samo jednog lana
if( pL->next == NULL ) {
pL->next = novi;
53
// ako stog ima vie lanova onda pomou tmpL
// proetaj 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 ) {
// pomou 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;
// vraanje teksta iz izbrisanog stoga
return tmp;
}
// inae 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 upie "kraj"
do {
scanf("%s", &str);
54
// ubacivanje stringa u listu pomou 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 kljua i vrijednosti vora
y->key = key;
strcpy(y->ime, ime);
// ponitavanje pokazivae na listove
y->left = NULL;
y->right = NULL;
// vraanje korijena stabla
return y;
}
// x je privremeni vor za etanje po stablu
x = T;
// parent je roditelj od x, slui za povezivanje
parent = NULL;
// etam stablom sve dok ne doem do mista za ubacit vor
while(1) {
55
// naao 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);
// ponitavam pokazivae 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 kljua x idem u livu granu
} else if( key < x->key ) {
parent = x;
x = x->left;
smjer = 0;
// ako je klju vei od kljua 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 greka
} else if( key == x->key ) {
return T;
}
}
}
98) #include
#include
#include
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 idueg 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 idui 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
#include
#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 uitanih 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 uitan negativni broj
if(val
57
break;
brojunesenih++;
// smjetam uitani broj na stog
stack_push(stog, val);
// itanje se prekida ako je uitano vie 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
#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
#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;
}
SADRAJ:1. ZADACI1.1 ZADACI SA KOLOKVIJA1.2 ZADACI SA ISPITA
2. RJEENJA2.1 RJEENJA ZADATAKA SA KOLOKVIJA2.2 RJEENJA ZADATAKA SA ISPITA