zbirka_p_13

  • 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