programiranje 2 - vježbe

169
Programiranje 2 - vježbe Programiranje 2 - vježbe (neslužbeni materijali) (neslužbeni materijali)

Upload: bonner

Post on 12-Jan-2016

117 views

Category:

Documents


7 download

DESCRIPTION

Programiranje 2 - vježbe. (neslužbeni materijali). Osnovne informacije. Kontakt : [email protected] FER, D zgrada, soba D374 (Zavod za primijenjeno računarstvo) Konzultacije : nakon vježbi ili po dogovoru Stranica kolegija: http://degiorgi.math.hr/prog2/. Osnovni programi. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Programiranje 2 - vježbe

Programiranje 2 - vježbeProgramiranje 2 - vježbe

(neslužbeni materijali)(neslužbeni materijali)

Page 2: Programiranje 2 - vježbe

2

Osnovne informacijeOsnovne informacije

Kontakt : Kontakt : [email protected]@fer.hr FER, D zgrada, soba D374 (Zavod za primijenjeno FER, D zgrada, soba D374 (Zavod za primijenjeno

računarstvo)računarstvo)

Konzultacije : nakon vježbi ili po dogovoruKonzultacije : nakon vježbi ili po dogovoru

Stranica kolegija:Stranica kolegija: http://degiorgi.math.hr/prog2/http://degiorgi.math.hr/prog2/

Page 3: Programiranje 2 - vježbe

3

Osnovni programiOsnovni programi

Zadatak 1.1. :Zadatak 1.1. : Što ispisuju sljedeći isječci kôda (poštujte eventualne razmake, skokove u novi red i slično) te koje će vrijednosti varijable poprimiti nakon što se taj kôd izvrši?

a) int a = 1, b = 2, c = 3, d = 4;printf("%d\n%d", ((a /= 2) ? b++ : d++), --c);

b) int a = 4, b = 3, c = 2, d = 1;printf("%d\n%d", b++, ((c /= 6) ? --d : --a));

c) int a = 4, b = 3, c = 2, d = 1;printf("%d\n%d", ((b /= 6) ? a++ : d++), --c);

d) int a = 1, b = 2, c = 3, d = 4;printf("%d\n%d", ++a, ((d /= 8) ? c-- : b--));

4

2

3

3

1

1

2

2

Page 4: Programiranje 2 - vježbe

4

Osnovni programiOsnovni programi

Zadatak 1.2. :Zadatak 1.2. : Napišite program koji:

a) učitava dva cijela broja i, ako su oba parna ispisuje njihovu sumu; inače treba ispisati produkt

b) učitava tri realna broja i ispisuje najvećeg među njima

c) Učitava tri cijela broja i ispisuje najbližeg nuli (najmanjeg po apsolutnoj vrijednosti)

Page 5: Programiranje 2 - vježbe

5

Osnovni programiOsnovni programi

Zadatak 1.2. a) :Zadatak 1.2. a) : Napišite program koji učitava dva cijela broja i, ako su oba parna ispisuje njihovu sumu; inače treba ispisati produkt

#include <stdio.h>

int main (void) {int prvibroj , drugibroj ;

printf(""Unesite prvi broj:"") ;scanf(""%d"", &prvibroj ) ;printf(""Unesite drugi broj :"" ) ;scanf(""%d"" , &drugibroj ) ;

if ( ( prvibroj % 2 == 0) && ( drugibroj % 2 == 0 ) )printf (""%d\n"" , prvibroj + drugibroj ) ;

elseprintf(""%d\n"" , prvibroj * drugibroj ) ;

return 0 ;}

Page 6: Programiranje 2 - vježbe

6

PetljePetlje

Zadatak 1.3. :Zadatak 1.3. : Napišite dio programa koji učitava cijele brojeve dok ne učita nulu. Program treba ispisati:

a) koliko je neparnih brojeva učitano

b) sumu svih prostih učitanih brojeva

c) koliko je učitanih brojeva strogo veće od prvog

d) sumu svih znamenaka svih učitanih brojeva

Page 7: Programiranje 2 - vježbe

7

Petlje : Petlje : Zadatak 1.3. a) i b)Zadatak 1.3. a) i b)

scanf("%d", &x);scanf("%d", &x);

while (x != 0) {while (x != 0) {

napravi što vec treba s x;napravi što vec treba s x;

scanf("%d", &x);scanf("%d", &x);

}}

while (1) {while (1) {

scanf("%d", &x);scanf("%d", &x);

if (x == 0) break;if (x == 0) break;

napravi što vec treba s x;napravi što vec treba s x;

}}

prost = 1;prost = 1;

aps_vr_od_x = (x < 0 ? –x : x) ;aps_vr_od_x = (x < 0 ? –x : x) ;

for (i=2 ; i< aps_vr_od_x ; i++)for (i=2 ; i< aps_vr_od_x ; i++)

if (x % i == 0){if (x % i == 0){

prost = 0; break;prost = 0; break;

}}

Page 8: Programiranje 2 - vježbe

8

Petlje : Petlje : Zadatak 1.3. a) i b)Zadatak 1.3. a) i b)

int x, i, br_nep int x, i, br_nep = 0= 0 , suma_prostih , suma_prostih = 0= 0 , prost, aps_vr_od_x ; , prost, aps_vr_od_x ;

while ( 1 ) {while ( 1 ) {scanf ("%d" , &x ) ;scanf ("%d" , &x ) ;if ( x == 0) break ;if ( x == 0) break ;

if ( x % 2 == 1) br_nep++;if ( x % 2 == 1) br_nep++;

aps_vr_od_x = ( x < 0 ? -x : x ) ;aps_vr_od_x = ( x < 0 ? -x : x ) ;prost = 1;prost = 1;if ( prost )if ( prost ) for ( i = 2 ; i < aps_vr_od_x ; i++)for ( i = 2 ; i < aps_vr_od_x ; i++)

if ( x % i == 0) {if ( x % i == 0) {prost = 0 ;prost = 0 ;break ;break ;

}}

if ( prost ) suma_prostih += x ;if ( prost ) suma_prostih += x ;}}printf("Broj neparnih : %d\n" , br nep ) ;printf("Broj neparnih : %d\n" , br nep ) ;printf("Suma prostih : %d\n" , suma_prostih ) ;printf("Suma prostih : %d\n" , suma_prostih ) ;

prost = ( aps_vr_od_x <= 1 ? 0 : 1 ) ;prost = ( aps_vr_od_x <= 1 ? 0 : 1 ) ;

Page 9: Programiranje 2 - vježbe

9

PetljePetlje

Zadatak 1.3. :Zadatak 1.3. : Napišite dio programa koji učitava cijele brojeve dok ne učita nulu. Program treba ispisati:

d) sumu svih znamenaka svih učitanih brojeva

Isječak rješenja (zbroj znamenki pojedinog broja):

scanf("%d", &x);scanf("%d", &x);

while (x != 0) {while (x != 0) {

znam = x % 10;znam = x % 10;

suma = suma + znam;suma = suma + znam;

x = x / 10 ; /* ili x /= 10 ; */x = x / 10 ; /* ili x /= 10 ; */

}}

Varijacije na temu:► Ispisati znamenke, ali s lijeva na desno► Stvoriti broj koji bi nastao okretanjem broja (npr. 15678 -> 87651)

Page 10: Programiranje 2 - vježbe

10

NizoviNizovi

Zadatak 1.4. :Zadatak 1.4. : Napišite programski isječak koji učitava prirodni broj n ≤ 17 te n cijelih brojeva i zatim:

a) sortira i ispisuje brojeve uzlazno po vrijednosti zadnje znamenke

b) ispisuje sve brojeve koji su veći ili jednaki zadnjem učitanom

c) ispisuje produkt svih brojeva koji su veći ili jednaki predzadnjem učitanom (pretpostavite da je n > 1)

d) pomoću Hornerovog algoritma izračunava i ispisuje vrijednost p(a1) gdje su ai (i = 0 .. n-1) učitani brojevi i

1

0

2)(n

i

ii xaxp

Page 11: Programiranje 2 - vježbe

11

Nizovi : Nizovi : Zadatak 1.4. a) i b)Zadatak 1.4. a) i b)

int n, i, j, a[17] ;int n, i, j, a[17] ;

scanf ("%d" , &n ) ;scanf ("%d" , &n ) ;for(i = 0 ; i < n ; i++) scanf ("%d" , &a[i] ); for(i = 0 ; i < n ; i++) scanf ("%d" , &a[i] );

printf("Svi brojevi veci ili jednaki %d:\n" , a[n-1]);printf("Svi brojevi veci ili jednaki %d:\n" , a[n-1]);for ( i = 0 ; i < n-1 ; i++)for ( i = 0 ; i < n-1 ; i++)

if ( a[i] >= a[n-1] )if ( a[i] >= a[n-1] ) printf("%d\n", a[i]);printf("%d\n", a[i]);

for ( i = 0 ; i < n - 1 ; i++)for ( i = 0 ; i < n - 1 ; i++)for ( j = i + 1 ; j < n ; j++)for ( j = i + 1 ; j < n ; j++) if ( a[i]%10 >= a[j]%10 ) {if ( a[i]%10 >= a[j]%10 ) {

int temp = a[i];int temp = a[i];a[i] = a[j];a[i] = a[j];a[j] = temp;a[j] = temp;

}}printf("Sortirani niz: \n" );printf("Sortirani niz: \n" );for ( i = 0 ; i < n; i++)for ( i = 0 ; i < n; i++)

printf("%d\n", a[i]);printf("%d\n", a[i]);

Page 12: Programiranje 2 - vježbe

12

FunkcijeFunkcije

tip_povratne_vrijednosti ime_funkcije(argumenti){tip_povratne_vrijednosti ime_funkcije(argumenti){tijelo funkcijetijelo funkcije

}}

Vrijednost se vraća s return:Vrijednost se vraća s return:return vrijednost_koja_se_vraca;return vrijednost_koja_se_vraca;

double max(double x, double y){double max(double x, double y){double veci;double veci;veci = x > y ? x : y;veci = x > y ? x : y;return veci;return veci;

}} void funkcijevoid funkcije

void ispisi(int a, float b, char c){void ispisi(int a, float b, char c){......return;return;

Page 13: Programiranje 2 - vježbe

13

FunkcijeFunkcije

Zadatak 1.5. :Zadatak 1.5. : Napišite funkciju koja kao argumente uzima dva realna broja te vraća većeg od njih. Dodatno napišite program koji prikazuje kako se funkcija upotrebljava

#include <stdio.h>

double max(double x, double y) {return (x > y ? x : y);

}

int main(void){double a,b;printf(""a=""); scanf(""%lf"", &a);printf(""b=""); scanf(""%lf"", &b);

printf("Veci je %g.\n", max(a,b));return 0;

}

Page 14: Programiranje 2 - vježbe

14

FunkcijeFunkcije

Napomena 1.2. :Napomena 1.2. : Argumenti u funkciji su kopije onih s kojima je funkcija pozvana. Promjene vrijednosti argumenata unutar funkcije ne odražavaju se na varijable koje su zadane kao parametri prilikom poziva funkcije.

int f(int a){a++;return a;

}

int main(void){int x=17;printf("1: %d"1: %d=" , x" , x);printf("2: %d"2: %d=" , f(x)" , f(x));printf("3: %d"3: %d=" , x" , x);return 0;

}

Svojevrsna iznimka: nizovi

171817

Page 15: Programiranje 2 - vježbe

15

FunkcijeFunkcije

Zadatak 1.6. :Zadatak 1.6. : Napišite funkciju koja kao argumente uzima niz realnih brojeva i cijeli broj n (koji označava duljinu niza). Funkcija treba uzlazno sortirati niz. Napišite i kako se funkcija poziva (pretpostavite da imate učitani niz s n elemenata)

#include <stdio.h>

void sort(double x[] , int n) {int i,j;for ( i = 0 ; i < n - 1 ; i++)for ( i = 0 ; i < n - 1 ; i++)

for ( j = i + 1 ; j < n ; j++)for ( j = i + 1 ; j < n ; j++) if ( x[i] >= x[j] ) {if ( x[i] >= x[j] ) {

double temp = x[i];double temp = x[i];x[i] = x[j];x[i] = x[j];x[j] = temp;x[j] = temp;

}}}

int main(void){double a[50];int n;...sort(a, n);

}

Page 16: Programiranje 2 - vježbe

16

FunkcijeFunkcije

Zadatak 1.6. :Zadatak 1.6. : Napišite funkciju koja kao argumente uzima niz realnih brojeva i cijeli broj n (koji označava duljinu niza). Funkcija treba uzlazno sortirati niz. Napišite i kako se funkcija poziva (pretpostavite da imate učitani niz s n elemenata)

int main(void){

double a[50];int n;

...

sort(a, n);

}

Česte greške:sort(a[], n);

sort(a[n], n);

sort(a[0], n);

Page 17: Programiranje 2 - vježbe

17

FunkcijeFunkcije

Zadatak 1.7. :Zadatak 1.7. : Napišite funkciju koja kao parametre prima prirodne brojeve a i b, a,b > 1 , a kao rezultat ne vraća ništa. Funkcija treba "nacrtati" graf za sve brojeve k takve da je b < k ≤ a + b, koji u svakom retku ispisuje broj k, te f(k) znakova # pri čemu se s f(k) označava broj brojeva x takvih da je a ≤x ≤ b i k djeljiv s x (f(k) služi za opis zadatka te ga ne morate definirati kao posebnu funkciju), te preko trećeg parametra vratiti najveći broj znakova # ispisanih u jednom retku (ako nije ispisan niti jedan znak, treba vratiti nulu).

Npr. za a=3 , b=9, funkcija treba ispisati 10: # (od brojeva iz skupa {3,4,…,9} broj 10 je djeljiv samo s

brojem 5)11: (broj 11 nije djeljiv s niti jednim brojem iz skupa {3,4,…,9}) 12: ### (od brojeva iz skupa {3,4,…,9} broj 12 je djeljiv samo s 3,4 i

6)Te preko trećeg parametra vratiti vrijednost 3 ( = max{1,0,3} )

Napomena: Nije dozvoljeno korištenje funkcija iz math.h i nizova!

Page 18: Programiranje 2 - vježbe

18

Funkcije – Zadatak 1.6Funkcije – Zadatak 1.6int f ( int k , int a , int b) {

int cnt = 0 , x ;for ( x = a ; x <= b ; x++) if ( k % x == 0) cnt++;return cnt ;

}void zad ( int a , int b , int *br ) {

int k , i ;*br = 0 ;for ( k = b + 1 ; k <= a + b ; k++) {

int fk = f (k , a , b ) ;if ( fk > *br ) *br = fk ;printf ( "%d : " , k ) ;for ( i = 0 ; i < fk ; i++) printf("#");printf( "\n" ) ;

}}int main(void) {

int res;zad(3, 9, &res);printf("Rezultat: %d\n", res);return 0;

}

Page 19: Programiranje 2 - vježbe

19

Zadaci za samostalnu vježbuZadaci za samostalnu vježbu

Zadatak 1.8. Napišite program (ne samo dio programa!) koji učitava niz cijelih brojeva x dok ne učita broj 17 ili ukupno 314 brojeva. Program treba niz x sortirati silazno prema sumi druge (s lijeva) i zadnje znamenke (ako broj nema neku od traženih znamenaka, za njenu vrijednost se uzima nula), te ispisati tako dobiveni niz.

Page 20: Programiranje 2 - vježbe

20

Rekurzije - uvodRekurzije - uvod#include <stdio.h>int a=1 , b=2 , c=3 ,d=4;

void f ( int a ) {int b = 12 ;printf(" a=%d , b=%d , c=%d , d=%d\n" , a , b , c , d ) ;a++; b++; c++;printf(" a=%d , b=%d , c=%d , d=%d\n" , a , b , c , d ) ;

}

int main ( void) {int a = 21 , b = 22 , d = 24 ;

printf("main() 1.put :") ;printf("a=%d , b=%d , c=%d , d=%d\n" , a , b , c , d ) ;printf("Funkcija 1.put : \n") ;f(c) ;printf("Funkcija 2.put : \n") ;f(c) ;printf("main() 2.put :") ;printf("a=%d , b=%d , c=%d , d=%d\n" , a , b , c , d ) ;

return 0 ;}

main() 1.put : a=21 , b=22 , c=3 , d=24Funkcija 1.put : a=3 , b=12 , c=3 , d=4 a=4 , b=13 , c=4 , d=4Funkcija 2.put : a=4 , b=12 , c=4 , d=4 a=5 , b=13 , c=5 , d=4main() 2.put : a=21 , b=22 , c=5 , d=24

Page 21: Programiranje 2 - vježbe

21

Rekurzije - uvodRekurzije - uvod#include <stdio.h>int glob_a = 1 , glob_b = 2 , glob_c = 3 , glob_d = 4 ;

void f (int f_a) {int f_b = 12 ;printf("a=%d , b=%d , c=%d , d=%d\n",f_a, f_b, glob_c, glob_d ); f_a++; f_b++; glob_c++;printf("a=%d , b=%d , c=%d , d=%d\n",f_a, f_b, glob_c, glob_d );

}

int main ( void) {int main_a = 21 , main_b = 22 , main_d = 24 ;printf( "main() 1.put :" ) ;printf( " a=%d , b=%d , c=%d , d=%d\n" ,

main_a, main_b, glob_c, main_d );printf( "Funkcija 1. put : \n" ) ;f(glob_c) ;printf( "Funkcija 2. put : \n" ) ;f(glob_c) ;printf( "main ( ) 2. put : \n" ) ;printf( " a=%d , b=%d , c=%d , d=%d\n" ,

main_a, main_b, glob_c, main_d );return 0 ;

}

Page 22: Programiranje 2 - vježbe

22

RekurzijeRekurzije Zadatak :Zadatak : Napišite rekurzivnu funkciju:

int suma(int niz[],int n) koja će izračunati sumu elemenata u nizu.

int suma(int niz[], int n){

if (n==0)

return 0;

else

return niz[n-1] + suma(niz, n-1);

}

int main(void) {

int niz[] = {1,2,7,12,15};

printf("%d", suma(niz, 5));

return 0;

}

Page 23: Programiranje 2 - vježbe

23

RekurzijeRekurzije Primjer 2.1. :Primjer 2.1. : Fibonaccijeve brojeve definiramo sljedećom

formulom:

Funkcija za računanje n-tog Fibonaccijevog broja direktno prema definiciji (rekurzivno)long int fib(long int n) {

if (n <= 1) return n ;

return fib(n-1) + fib(n-2);

}

Page 24: Programiranje 2 - vježbe

24

Evaluacija rekurzijaEvaluacija rekurzija

Zadatak 2.1. : Koju vrijednost vraća poziv funkcije fib(5), pri čemu je funkcija fib() ona koju smo definirali u primjeru 2.1?

Crtamo tijek izvođenja:Crtamo tijek izvođenja: + ulazak u funkciju+ ulazak u funkciju \ kraj funkcijskog poziva\ kraj funkcijskog poziva | tijek funkcijskog poziva| tijek funkcijskog poziva

Page 25: Programiranje 2 - vježbe

26

RekurzijeRekurzije Napomena 2.2. :Napomena 2.2. : Fibonaccijeve brojeve definiramo sljedećom

formulom:

Nerekurzivno rješenje:long int fib ( int n) {

long int fib1 = 0 , fib2 = 1 , f i b 3 ;

int i ;

if (n <= 1) return n ;

for ( i = 2 ; i <= n ; i++) {

fib3 = fib1 + fib2 ;

fib1 = fib2 ;

fib2 = fib3 ;

}

return fib2 ;

}

Page 26: Programiranje 2 - vježbe

27

Kreiranje rekurzijaKreiranje rekurzija

Napomena 2.3. : Svaka rekurzija mora imati i terminalne uvjete, tj. način izvršavanja koji nema rekurzivnih poziva!

long int fib(long int n) {

if (n <= 1) return n ;

return fib(n-1) + fib(n-2);

}

Što bi bilo da je pisalo if (n==0) return 0; ?

fib(2) = fib(1) + fib(0) = fib(0) + fib(-1) + fib(0) = 0 + fib(-2) + fib(-3) + fib(0)

= . . .

Page 27: Programiranje 2 - vježbe

28

Kreiranje rekurzijaKreiranje rekurzija Zadatak 2.2. :Zadatak 2.2. : Napišite rekurzivnu funkciju f(a,b) koja je

definirana sljedećom formulom:

int f ( int a , int b) {

if ( a == 0 && b == 0) return 1 ;

else if ( a < 0 && b >= 0) return −f (−a , b ) ; else if ( a >= 0 && b < 0) return −f ( a, −b ) ; else if ( a < 0 && b < 0) return f (−a, −b ) ; else return f (b , a − 1) + 2 ;

}

Page 28: Programiranje 2 - vježbe

29

Kreiranje rekurzijaKreiranje rekurzija Zadatak 2.4:Zadatak 2.4: Napišite rekurzivnu funkciju koja za skup cijelih brojeva

(zadan pomoću niza) vraća broj podskupova čija je suma djeljiva sa 17. Uz niz i njegovu duljinu, funkcija smije primati i druge argumente.

Na primjer, za skup {5,7,12}, funkcija treba vratiti 2, jer traženi uvjet zadovoljavaju podskupovi Ø (suma elemenata je nula) i {5,12}.Obavezno napišite i kako se funkcija poziva.

5 je u podskupu 7 je u podskupu

12 je u podskupu => suma = 5 + 7 + 1212 nije u podskupu => suma = 5 + 7

7 nije u podskupu12 je u podskupu => suma = 5 + 1212 nije u podskupu => suma = 5

5 nije u podskupu7 je u podskupu

12 je u podskupu => suma = 7 + 1212 nije u podskupu => suma = 7

7 nije u podskupu12 je u podskupu => suma = 1212 nije u podskupu => suma = 0

Page 29: Programiranje 2 - vježbe

30

Kreiranje rekurzija – zadatak 2.4.Kreiranje rekurzija – zadatak 2.4.int rek ( int niz[ ] , int n , int suma ) {

if (n) return

rek (niz , n-1, suma + niz[n-1]) +

rek (niz , n-1, suma ) ;

return ( suma % 17 ? 0 : 1 ) ;

}

int main(void){

int niz[] = {-12, -11, -5, -2, 1, 3, 5, 8};

int duljina_niza = 8;

printf("Takvih podskupova ima %d.\n",

rek(niz, duljina_niza, 0));

return 0;

}

Page 30: Programiranje 2 - vježbe

31

Kreiranje rekurzija – zadatak 2.4.Kreiranje rekurzija – zadatak 2.4.int rek ( int niz[ ] , int n , int suma, int podskup[], int br_elem ) {

if (n){int rez = 0;podskup[n-1] = 1;rez += rek (niz , n-1, suma + niz[n-1], podskup, br_elem);podskup[n-1] = 0;rez += rek (niz , n-1, suma, podskup, br_elem ) ;return rez;

}if (suma%17) return 0;else{

int i;for(i=0; i<br_elem ; i++)

if (podskup[i]) printf("%d ", niz[i]);printf("\n");return 1;

}}int main(void){

int niz[] = {-12, -11, -5, -2, 1, 3, 5, 8}; int podskup[8] = {0};int duljina_niza = 8;printf("Takvih podskupova ima %d.\n",

rek(niz, duljina_niza, 0, podskup, duljina_niza));return 0;

}

Page 31: Programiranje 2 - vježbe

32

Kreiranje rekurzijaKreiranje rekurzija Zadatak 2.5:Zadatak 2.5: (pismeni ispit 28.11.2005.)(pismeni ispit 28.11.2005.) Napišite rekurzivnu funkciju koja

uzima barem jedan argument x (iz N). Funkcija treba vratiti broj na koliko različitih načina se x može prikazati kao suma brojeva 2,3 i 5, neovisno o redoslijedu sumanada (tj. 2+3+3 je isto što i 3+2+3 i 3+3+2, pa se to broji kao jedan način). Napišite i program kojim se testira funkcija (treba samo učitati broj, pozvati funkciju i ispisati rezultat.Napomena: Uz argument x, funkcija smije primati dodatne pomoćne argumente, ali nije dozvoljeno korištenje polja, lista te globalnih i static varijabli!

Prvo rješavamo varijantu u kojoj brojimo sve mogućnosti (i one redundantne)

17 = 2 + 15 ili 17 = 3 + 14 ili 17 = 5 + 12

part(17) = part(15) + part(14) + part(12) = part(13) + part(12) + part(10) + ...

općenito x = 2 + (x-2) ili x = 3 + (x-3) ili x = 5 + (x-5) part(x) = part(x-2) + part(x-3) + part(x-5)

Page 32: Programiranje 2 - vježbe

33

Kreiranje rekurzija – zadatak 2.5.Kreiranje rekurzija – zadatak 2.5.part(5) = part(3) + part(2) + part(0)

= part(1) + part(0) + part(-2)+ part(0) + part(-1)+ part(-3)+ part(0) = part(-1) + part(-2) + part(-4) + part(0) + part(-2) + part(0) + part(-1) + part(-3) + part(0)= 0 + 0 + 0 + 1 + 0 + 1 + 0 + 0 + 1

#include <stdio.h>int part (int x) {

if ( x < 0) return 0 ; /* ovaj rastav nije moguc */if ( x == 0) return 1 ; /* rastav uspjesan */return part(x-2) + part(x-3) + part(x-5) ;

}

int main (void) { int n ; printf ("Upisite broj n:"); scanf ( "%d" , &n ) ; printf ("Takvih rastava ima %d.\n" , part(n) ) ; return 0 ;}

Page 33: Programiranje 2 - vježbe

34

Kreiranje rekurzija – zadatak 2.5.Kreiranje rekurzija – zadatak 2.5. Brojeve u rastavu ćemo složiti uzlazno. Prenosimo varijablu koja

označava najmanji broj koji možemo upotrijebiti

#include <stdio.h>int part (int x, int prvi) {

int cnt=0;if ( x < 0) return 0 ; /* ovaj rastav nije moguc */if ( x == 0) return 1 ; /* rastav uspjesan */if (prvi<=2) cnt += part(x-2, 2);if (prvi<=3) cnt += part(x-3, 3);if (prvi<=5) cnt += part(x-5, 5);return cnt;

}

int main ( void) { int n ; printf ("Upisite broj n:"); scanf ( "%d" , &n ) ; printf ("Takvih rastava ima %d.\n" , part(n,2) ) ; return 0 ;}

Page 34: Programiranje 2 - vježbe

35

Kreiranje rekurzijaKreiranje rekurzija Zadatak 2.6:Zadatak 2.6: (sličan 2.5.)(sličan 2.5.) Napišite rekurzivnu funkciju koja uzima

barem jedan argument x (iz N). Funkcija treba ispisati sve različite načine na koje se x može prikazati kao suma brojeva 2,3 i 5, neovisno o redoslijedu sumanada (tj. 2+3+3 je isto što i 3+2+3 i 3+3+2, pa se to broji kao jedan način). Napišite i program kojim se testira funkcija (treba samo učitati broj, pozvati funkciju i ispisati rezultat.Napomena: Uz argument x, funkcija smije primati dodatne pomoćne argumente, ali nije dozvoljeno korištenje globalnih i static varijabli!

Uputa: uvesti dodatni niz u koji će se spremati sumandi + pratiti duljinu tog niza.

► Bolja varijanta : u niz spremati broj pojavljivanja svakog od sumanada.

Page 35: Programiranje 2 - vježbe

36

Kreiranje rekurzija – zadatak 2.6. Kreiranje rekurzija – zadatak 2.6. void part (int x, int prvi, int sumandi[], int duljina) {

if ( x < 0) return; /* ovaj rastav nije moguc */if ( x == 0){

int i;for(i=0; i<duljina ; i++) printf("%d ",

sumandi[i]);printf("\n");return;

}if (prvi<=2){

sumandi[duljina]=2;part(x-2, 2, sumandi, duljina+1);

}if (prvi<=3){

sumandi[duljina]=3;part(x-3, 3, sumandi, duljina+1);

}if (prvi<=5){

sumandi[duljina]=5;part(x-5, 5, sumandi, duljina+1);

}}

Page 36: Programiranje 2 - vježbe

37

Kreiranje rekurzija – zadatak 2.6. – varijanta 2Kreiranje rekurzija – zadatak 2.6. – varijanta 2void part (int x, int prvi, int sumandi[]) {

if ( x < 0) return; /* ovaj rastav nije moguc */if ( x == 0){

int i;for(i=0; i<sumandi[0] ; i++) printf("%d ", 2);for(i=0; i<sumandi[1] ; i++) printf("%d ", 3);for(i=0; i<sumandi[2] ; i++) printf("%d ", 5);printf("\n");return;

}if (prvi<=2){

sumandi[0]++; part(x-2, 2, sumandi); sumandi[0]--;}if (prvi<=3){

sumandi[1]++; part(x-3, 3, sumandi); sumandi[1]--;}if (prvi<=5){

sumandi[2]++; part(x-5, 5, sumandi); sumandi[2]--;}

}

Page 37: Programiranje 2 - vježbe

38

Kreiranje rekurzijaKreiranje rekurzija Zadatak 2.7:Zadatak 2.7: Napišite rekurzivnu verziju Euklidovog algoritma za

računanje najvećeg zajedničkog djelitelja (eng. GCD, greatest common divisor) dva prirodna broja.

int gcd ( int a , int b) {

if (b == 0)

return a ;

else

return gcd (b , a % b ) ;

}

ili kraće:

int gcd ( int a , int b) {

return (b ? gcd (b , a % b) : a ) ;

}

Page 38: Programiranje 2 - vježbe

39

Kreiranje rekurzija – zadatak za DZKreiranje rekurzija – zadatak za DZ Zadatak 2.8Zadatak 2.8 (pismeni ispit 27.6.2005.) (pismeni ispit 27.6.2005.) Napišite rekurzivnu funkciju

koja uzima barem jedan argument x iz N. Funkcija treba vratiti broj na koliko različitih načina se x može prikazati kao umnožak prirodnih brojeva većih od 1. Na primjer, za x = 12, funkcija treba vratiti 4

(2*2*3 , 2*6 , 3*4 , 12)

Napišite i program kojim se testira funkcija (treba samo učitati broj, pozvati funkciju i ispisati rezultat.Napomena: Uz argument x, funkcija smije primati dodatne pomoćne argumente, ali nije dozvoljeno korištenje polja, lista te globalnih i static varijabli!

Page 39: Programiranje 2 - vježbe

40

Kreiranje rekurzijaKreiranje rekurzija Zadatak 2.9Zadatak 2.9 Napišite funkciju koja kao argument prima niz

cijelih brojeva duljine n = 3^k za neki prirodni broj k (ne treba provjeravati da je duljina zaista potencija broja 3) te eventualne pomoćne argumente (koje možete sami odabrati). Funkcija treba srednju trećinu niza ispuniti nulama, a rubne jedinicama. Zatim za rubne trećine treba primijeniti isti postupak (dok te trećine ne postanu jednočlane). Vrijednosti niza koje treba dobiti za neke vrijednosti n su:

Napišite i kako se funkcija poziva

Page 40: Programiranje 2 - vježbe

41

Kreiranje rekurzijaKreiranje rekurzija Zadatak 2.10 : Zadatak 2.10 : Napišite program koji testira funkciju iz prethodnog Napišite program koji testira funkciju iz prethodnog

zadatka za vrijednosti 3, 9, 27, 81, 243zadatka za vrijednosti 3, 9, 27, 81, 243void niz ( int x[], int from, int to ) {void niz ( int x[], int from, int to ) {

int i;int i;

if (from == to ) {if (from == to ) {

x[from] = 1;x[from] = 1;

return;return;

}}

for ( i = from ; i <= to ; i++) x[i] = 0 ;for ( i = from ; i <= to ; i++) x[i] = 0 ;

niz(x , from , (2*from+to)/3 ) ;niz(x , from , (2*from+to)/3 ) ;

niz(x , (from+2*to)/3 + 1 , to ) ;niz(x , (from+2*to)/3 + 1 , to ) ;

}}

int main ( void) {

int x [243] , i , n = 3;

while (n <= 243) {

niz (x , 0 , n - 1 );

printf ("%3d : %d" , n , x[0] ) ;

for ( i = 1 ; i < n ; i++) printf ("%d" , x [i] ) ;

printf("\n");

n*= 3 ;

}

return 0 ;

}

Page 41: Programiranje 2 - vježbe

43

Kreiranje rekurzijaKreiranje rekurzija Zadatak 2.12 : Zadatak 2.12 : Riješite zadatak 2.9 tako da funkcije ne kreira niz, Riješite zadatak 2.9 tako da funkcije ne kreira niz,

nego ispisuje tražene elemente na ekran, bez upotrebe nizovanego ispisuje tražene elemente na ekran, bez upotrebe nizovavoid niz (int from, int to ) {void niz (int from, int to ) {

int i;int i;if (from == to ) {if (from == to ) {

printf("1"); return;printf("1"); return;}}niz(from , (2*from+to)/3 ) ;niz(from , (2*from+to)/3 ) ;for ( i = (2*from+to)/3 + 1 ; i <= (from+2*to)/3 ; i++) for ( i = (2*from+to)/3 + 1 ; i <= (from+2*to)/3 ; i++)

printf("0");printf("0");niz((from+2*to)/3 + 1 , to ) ;niz((from+2*to)/3 + 1 , to ) ;

}}

int main ( void) {int i , n = 3;while (n <= 243) {

printf ("%3d : " , n) ;niz (0 , n - 1 );printf("\n");n*= 3 ;

}return 0 ;

}

Page 42: Programiranje 2 - vježbe

44

Kreiranje rekurzijaKreiranje rekurzija Zadatak 2.13 (pismeni ispit 1.9.2004.) : Zadatak 2.13 (pismeni ispit 1.9.2004.) : Žaba želi prijeći rijeku Žaba želi prijeći rijeku

skačući preko n listova lopoča. To radi u skokovima po dva ili tri skačući preko n listova lopoča. To radi u skokovima po dva ili tri lista prema naprijed ili prema natrag. Povratka na kopno nema lista prema naprijed ili prema natrag. Povratka na kopno nema (dakle, ne može otići “ispred” prvog lista). Također ne može skočiti (dakle, ne može otići “ispred” prvog lista). Također ne može skočiti niti iza zadnjeg lista. Skakutanje je gotovo kad žaba dođe na n-ti niti iza zadnjeg lista. Skakutanje je gotovo kad žaba dođe na n-ti list. Napišite rekurzivnu funkciju koja za zadani n vraća broj načina list. Napišite rekurzivnu funkciju koja za zadani n vraća broj načina kojima žaba može izvesti opisano skakanje u najviše 17 koraka. kojima žaba može izvesti opisano skakanje u najviše 17 koraka. Treba napisati i kako se funkcija poziva.Treba napisati i kako se funkcija poziva.

int zaba (int n, int pozicija, int korak) {int zaba (int n, int pozicija, int korak) {if (korak > 17) return 0;if (korak > 17) return 0;if (pozicija > n || (korak !=1 && pozicija < 1)) if (pozicija > n || (korak !=1 && pozicija < 1))

return 0;return 0;

if (pozicija == n){if (pozicija == n){return 1;return 1;

}}return return

zaba(n, pozicija+2, korak+1)zaba(n, pozicija+2, korak+1)+ zaba(n, pozicija+3, korak+1)+ zaba(n, pozicija+3, korak+1)+ zaba(n, pozicija-2, korak+1)+ zaba(n, pozicija-2, korak+1)+ zaba(n, pozicija-3, korak+1);+ zaba(n, pozicija-3, korak+1);

}}

printf("Broj nacina=%d\n", zaba(n, 0, 1));

Page 43: Programiranje 2 - vježbe

45

Statičke varijableStatičke varijable

Zadržavaju vrijednost prilikom izlaska iz Zadržavaju vrijednost prilikom izlaska iz funkcijefunkcije

void f(){void f(){

static int a=2;int b=2;static int a=2;int b=2;

a++;b++;a++;b++;

printf("%d %d", a, b);printf("%d %d", a, b);

}}

f(); f(); f(); f(); f(); f(); će ispisatiće ispisati 3 3 4 3 5 3 3 3 4 3 5 3

RazlikovatiRazlikovati

static int a=2static int a=2

ii

static int a;static int a;

a=2;a=2;

Page 44: Programiranje 2 - vježbe

46

Višedimenzionalna poljaVišedimenzionalna polja

int x[10];int x[10];

int y[10][20];int y[10][20];

int z[15][25][35];int z[15][25][35];

......

printf("%d", y[7][13]);printf("%d", y[7][13]);

scanf("%d", &y[2][0]);scanf("%d", &y[2][0]);

scanf("%d", &z[6][24][10]);scanf("%d", &z[6][24][10]);

Kod prosljeđivanja višedimenzionalnih polja u funkciju, u Kod prosljeđivanja višedimenzionalnih polja u funkciju, u zaglavlju funkcije se moraju navesti dimenzije polja osim zaglavlju funkcije se moraju navesti dimenzije polja osim prvog.prvog.

void funkcija(int z[][25][35]);void funkcija(int z[][25][35]);

Page 45: Programiranje 2 - vježbe

47

Višedimenzionalna poljaVišedimenzionalna polja

Deklaracija i istovremena inicijalizacija dvodimenzionalnog poljaDeklaracija i istovremena inicijalizacija dvodimenzionalnog polja

int a[3][5];int a[3][5];

int a[3][5] = {{1,2,3,4,5},{6,7,8,9,10},{2,3,4,5,6}};int a[3][5] = {{1,2,3,4,5},{6,7,8,9,10},{2,3,4,5,6}};

int a[][5] = {{1,2,3,4,5},{6,7,8,9,10},{2,3,4,5,6}};int a[][5] = {{1,2,3,4,5},{6,7,8,9,10},{2,3,4,5,6}};

int a[3][5] = {{1,2,3,4,5},{6,7,8,9,10}};int a[3][5] = {{1,2,3,4,5},{6,7,8,9,10}};

int a[3][5] = {{1,2,3},{6,7,8,9}};int a[3][5] = {{1,2,3},{6,7,8,9}};

int a[][5] = {{1,2,3},{6,7,8,9},{10,11}};int a[][5] = {{1,2,3},{6,7,8,9},{10,11}};

int a[3][5] = {1,2,3,4,5,6,7};int a[3][5] = {1,2,3,4,5,6,7};

int a[3][5] = {0};int a[3][5] = {0};

Page 46: Programiranje 2 - vježbe

48

Višedimenzionalna poljaVišedimenzionalna polja Zadatak 3.1.Zadatak 3.1. Napišite program koji učitava dva prirodna broja m, n ≤

10, te matrice a, b . Program treba izračunati sumu matrice c := a+b i ispisati ju (tablično; možete pretpostaviti da će svi učitani brojevi imati najviše 5 znamenaka).

int main(void) {int main(void) { int a[10][10], b[10][10], c[10][10], m, n, i, j;int a[10][10], b[10][10], c[10][10], m, n, i, j;

printf("m = "); scanf("%d", &m); printf("n = "); scanf("%d", &n);printf("m = "); scanf("%d", &m); printf("n = "); scanf("%d", &n);

ucit_mat(a, m, n, 'a'); ucit_mat(b, m, n, 'b');ucit_mat(a, m, n, 'a'); ucit_mat(b, m, n, 'b');

for (i = 0; i < m; i++)for (i = 0; i < m; i++) for (j = 0; j < n; j++)for (j = 0; j < n; j++) c[i][j] = a[i][j] + b[i][j];c[i][j] = a[i][j] + b[i][j];

printf("Rezultat c =\n");printf("Rezultat c =\n"); for (i = 0; i < m; i++) {for (i = 0; i < m; i++) { for (j = 0; j < n; j++)for (j = 0; j < n; j++) printf("%6d", c[i][j]);printf("%6d", c[i][j]); printf("\n");printf("\n"); }} return 0;return 0;}}

Page 47: Programiranje 2 - vježbe

49

Višedimenzionalna poljaVišedimenzionalna polja

Zadatak 3.1.Zadatak 3.1. Napišite program koji učitava dva prirodna broja m, n ≤ 10, te matrice a, b . Program treba izračunati sumu matrice c := a+b i ispisati ju tablično (možete pretpostaviti da će svi učitani brojevi imati najviše 5 znamenaka).

void ucit_mat(int x[][10], int m, int n, char ime) {void ucit_mat(int x[][10], int m, int n, char ime) {

int i, j;int i, j;

for (i = 0; i < m; i++)for (i = 0; i < m; i++)

for (j = 0; j < n; j++) {for (j = 0; j < n; j++) {

printf("%c[%d][%d] = ", ime, i, j);printf("%c[%d][%d] = ", ime, i, j);

scanf("%d", &x[i][j]);scanf("%d", &x[i][j]);

}}

}}

Page 48: Programiranje 2 - vježbe

50

Višedimenzionalna poljaVišedimenzionalna polja Zadatak 3.3.Zadatak 3.3. Neka je u varijablu x učitana kvadratna matrica

realnih brojeve reda n. Napišite dio programa koji računa i ispisuje trag te matrice

int i; double sum = 0;int i; double sum = 0;for (i = 0; i < n; i++) sum += a[i][i];for (i = 0; i < n; i++) sum += a[i][i];printf("tr a = %g\n", sum);printf("tr a = %g\n", sum);

►Točno, ali loše rješenje (kvadratna složenost) bi bilo Točno, ali loše rješenje (kvadratna složenost) bi bilo

sljedeće:sljedeće:

int i, j;double sum = 0;int i, j;double sum = 0;for (i = 0; i < n; i++)for (i = 0; i < n; i++) for (j = 0; j < n; j++)for (j = 0; j < n; j++) if (i == j) sum += a[i][j];if (i == j) sum += a[i][j];printf("tr a = %g\n", sum);printf("tr a = %g\n", sum);

Page 49: Programiranje 2 - vježbe

51

Višedimenzionalna poljaVišedimenzionalna polja Zadatak 3.4.Zadatak 3.4. Napišite program koji učitava n i kvadratnu

matricu reda n te ispisuje produkt elemenata na njenoj sporednoj dijagonali. Pokušajte postići da program ima linearnu složenost.

#include <stdio.h>#include <stdio.h>int main(void) {int main(void) {

int a[10][10], i, m, n, prod=1;int a[10][10], i, m, n, prod=1;

printf("m = "); scanf("%d", &m);printf("m = "); scanf("%d", &m);printf("n = "); scanf("%d", &n);printf("n = "); scanf("%d", &n);

for (i = 0; i < m; i++)for (i = 0; i < m; i++)for (j = 0; j < n; j++) {for (j = 0; j < n; j++) { printf("%a[%d][%d] = ", i, j); scanf("%d", &a[i][j]);printf("%a[%d][%d] = ", i, j); scanf("%d", &a[i][j]);}}

for(i=0; i<n ; i++)for(i=0; i<n ; i++) prod *= a[i][n-1-i];prod *= a[i][n-1-i];

printf("Produkt=%d\n", prod);printf("Produkt=%d\n", prod);

return 0;return 0;}}

Page 50: Programiranje 2 - vježbe

52

Višedimenzionalna poljaVišedimenzionalna polja

Zadatak 3.5.Zadatak 3.5. Zadano je trodimenzionalno polje nula i jedinica Zadano je trodimenzionalno polje nula i jedinica dimenzije n (reprezentacija diskretizirane kocke u dimenzije n (reprezentacija diskretizirane kocke u trodimenzionalnom prostoru). Napišite dio programa koji će trodimenzionalnom prostoru). Napišite dio programa koji će ispisati koliko ima jedinica:ispisati koliko ima jedinica: u vrhovima kockeu vrhovima kocke na bridovima kocke (bez vrhova)na bridovima kocke (bez vrhova) na stranama kocke (bez vrhova i bridova)na stranama kocke (bez vrhova i bridova) u unutrašnjosti kocke (bez vrhova, bridova i strana)u unutrašnjosti kocke (bez vrhova, bridova i strana) na glavnoj dijagonali kockena glavnoj dijagonali kocke

Uputa:Uputa:

Ako je matrica pohranjena u varijablu a, vrhovi kocke se Ako je matrica pohranjena u varijablu a, vrhovi kocke se nalaze unalaze u

a[0][0][0] , a[0][0][n-1] , a[0][n-1][0] , a[0][n-1][n-1], a[0][0][0] , a[0][0][n-1] , a[0][n-1][0] , a[0][n-1][n-1],

a[n-1][0][0],a[n-1][0][n-1],a[n-1][n-1][0],a[n-1][n-1][n-1]a[n-1][0][0],a[n-1][0][n-1],a[n-1][n-1][0],a[n-1][n-1][n-1]

Page 51: Programiranje 2 - vježbe

53

Zadatak 3.5.Zadatak 3.5.

Ako je matrica pohranjena u varijablu a, vrhovi kocke se nalaze uAko je matrica pohranjena u varijablu a, vrhovi kocke se nalaze ua[0][0][0] , a[0][0][n-1] , a[0][n-1][0] , a[0][n-1][n-1], a[0][0][0] , a[0][0][n-1] , a[0][n-1][0] , a[0][n-1][n-1], a[n-1][0][0],a[n-1][0][n-1],a[n-1][n-1][0],a[n-1][n-1][n-1]a[n-1][0][0],a[n-1][0][n-1],a[n-1][n-1][0],a[n-1][n-1][n-1]

int i, j, k;int i, j, k;int cnt_vrhovi = 0;int cnt_vrhovi = 0;for (i = 0; i < n; i += n-1)for (i = 0; i < n; i += n-1) for (j = 0; j < n; j += n-1)for (j = 0; j < n; j += n-1) for (k = 0; k < n; k += n-1)for (k = 0; k < n; k += n-1) cnt_vrhovi += a[i][j][k];cnt_vrhovi += a[i][j][k];

iliili

int i, j, k;int i, j, k;int cnt_vrhovi = 0;int cnt_vrhovi = 0;

for (i = 0; i < 2; i++)for (i = 0; i < 2; i++) for (j = 0; j < 2; j++)for (j = 0; j < 2; j++) for (k = 0; k < 2; k++)for (k = 0; k < 2; k++) cnt_vrhovi += a[i*(n-1)][j*(n-1)][k*(n-1)];cnt_vrhovi += a[i*(n-1)][j*(n-1)][k*(n-1)];

Page 52: Programiranje 2 - vježbe

54

Višedimenzionalna poljaVišedimenzionalna polja

Zadatak 3.5.Zadatak 3.5. Zadano je trodimenzionalno polje nula i jedinica Zadano je trodimenzionalno polje nula i jedinica dimenzije n (reprezentacija diskretizirane kocke u dimenzije n (reprezentacija diskretizirane kocke u trodimenzionalnom prostoru). Napišite dio programa koji će trodimenzionalnom prostoru). Napišite dio programa koji će ispisati koliko ima jedinica:ispisati koliko ima jedinica: na bridovima kocke (bez vrhova)na bridovima kocke (bez vrhova)

for(i=0; i<n ; i+= n-1){for(i=0; i<n ; i+= n-1){

for(j=0; j<n ; j+=n-1){for(j=0; j<n ; j+=n-1){

for(k=1 ; k<n-1 ; k++){for(k=1 ; k<n-1 ; k++){

cnt_bridovi += a[i][j][k];cnt_bridovi += a[i][j][k];

cnt_bridovi += a[i][k][j];cnt_bridovi += a[i][k][j];

cnt_bridovi += a[k][j][i];cnt_bridovi += a[k][j][i];

}}

}}

}}

Page 53: Programiranje 2 - vježbe

55

Višedimenzionalna poljaVišedimenzionalna polja

Zadatak 3.5.Zadatak 3.5. Zadano je trodimenzionalno polje nula i jedinica Zadano je trodimenzionalno polje nula i jedinica dimenzije n (reprezentacija diskretizirane kocke u dimenzije n (reprezentacija diskretizirane kocke u trodimenzionalnom prostoru). Napišite dio programa koji će trodimenzionalnom prostoru). Napišite dio programa koji će ispisati koliko ima jedinica:ispisati koliko ima jedinica: na stranama kocke (bez vrhova i bridova)na stranama kocke (bez vrhova i bridova)

for(i=0; i<n ; i+= n-1){for(i=0; i<n ; i+= n-1){

for(j=1; j<n-1 ; j++){for(j=1; j<n-1 ; j++){

for(k=1 ; k<n-1 ; k++){for(k=1 ; k<n-1 ; k++){

cnt_stranice += a[i][j][k];cnt_stranice += a[i][j][k];

cnt_stranice += a[j][i][k];cnt_stranice += a[j][i][k];

cnt_stranice += a[k][j][i];cnt_stranice += a[k][j][i];

}}

}}

}}

Page 54: Programiranje 2 - vježbe

56

Višedimenzionalna poljaVišedimenzionalna polja

Zadatak 3.5.Zadatak 3.5. Zadano je trodimenzionalno polje nula i jedinica Zadano je trodimenzionalno polje nula i jedinica dimenzije n (reprezentacija diskretizirane kocke u dimenzije n (reprezentacija diskretizirane kocke u trodimenzionalnom prostoru). Napišite dio programa koji će trodimenzionalnom prostoru). Napišite dio programa koji će ispisati koliko ima jedinica:ispisati koliko ima jedinica: u unutrašnjosti kocke (bez vrhova, bridova i strana)u unutrašnjosti kocke (bez vrhova, bridova i strana) na glavnoj dijagonali kockena glavnoj dijagonali kocke

for(i=1; i<n-1 ; i++)for(i=1; i<n-1 ; i++)

for(j=1; j<n-1 ; j++)for(j=1; j<n-1 ; j++)

for(k=1 ; k<n-1 ; k++)for(k=1 ; k<n-1 ; k++)

cnt_unutra += a[i][j][k];cnt_unutra += a[i][j][k];

for(i=0; i<n ; i++)for(i=0; i<n ; i++)

cnt_gl_dij += a[i][i][i]; cnt_gl_dij += a[i][i][i];

Page 55: Programiranje 2 - vježbe

57

Višedimenzionalna poljaVišedimenzionalna polja

Zadatak 3.7.: Zadatak 3.7.: Napišite dio programa koji za učitanu kvadratnu Napišite dio programa koji za učitanu kvadratnu matricu realnih brojeva reda n provjerava je li ona donje matricu realnih brojeva reda n provjerava je li ona donje trokutasta.trokutasta.

int d_trokut = 1, i, j;int d_trokut = 1, i, j;

for (i = 0; i < n; i++)for (i = 0; i < n; i++)

for (j = i + 1; j < n; j++)for (j = i + 1; j < n; j++)

if (a[i][j]) {if (a[i][j]) {

d_trokut = 0;d_trokut = 0;

break;break;

}}

printf("Matrica %sje donje trokutasta.\n",printf("Matrica %sje donje trokutasta.\n",

d_trokut ? "" : "ni");d_trokut ? "" : "ni");

Page 56: Programiranje 2 - vježbe

58

Višedimenzionalna poljaVišedimenzionalna polja

Deklaracija i istovremena inicijalizacija dvodimenzionalnog poljaDeklaracija i istovremena inicijalizacija dvodimenzionalnog polja

int a[3][5];int a[3][5];

int a[3][5] = {{1,2,3,4,5},{6,7,8,9,10},{2,3,4,5,6}};int a[3][5] = {{1,2,3,4,5},{6,7,8,9,10},{2,3,4,5,6}};

int a[][5] = {{1,2,3,4,5},{6,7,8,9,10},{2,3,4,5,6}};int a[][5] = {{1,2,3,4,5},{6,7,8,9,10},{2,3,4,5,6}};

int a[3][5] = {{1,2,3,4,5},{6,7,8,9,10}};int a[3][5] = {{1,2,3,4,5},{6,7,8,9,10}};

int a[3][5] = {{1,2,3},{6,7,8,9}};int a[3][5] = {{1,2,3},{6,7,8,9}};

int a[][5] = {{1,2,3},{6,7,8,9},{10,11}};int a[][5] = {{1,2,3},{6,7,8,9},{10,11}};

int a[3][5] = {1,2,3,4,5,6,7};int a[3][5] = {1,2,3,4,5,6,7};

int a[][5] = {1,2,3,4,5,6,7};int a[][5] = {1,2,3,4,5,6,7};

int a[3][5] = {0};int a[3][5] = {0};

int a[][] = {{1,2,3}, {4,5,6}};int a[][] = {{1,2,3}, {4,5,6}};

Page 57: Programiranje 2 - vježbe

59

Višedimenzionalna poljaVišedimenzionalna polja

Zadatak 3.9.: Zadatak 3.9.: Napišite program koji učitava cijele brojeve Napišite program koji učitava cijele brojeve ii i i jj ((0≤i<10 , 0≤j<100≤i<10 , 0≤j<10) te kreira i ispisuje tablicu M s 10 x 10 ) te kreira i ispisuje tablicu M s 10 x 10 znakova koja na svim mjestima ima točkice, osim na znakova koja na svim mjestima ima točkice, osim na horizontalnoj i vertikalnoj liniji koje prolaze elementom M[i][j] horizontalnoj i vertikalnoj liniji koje prolaze elementom M[i][j] (na te linije treba staviti zvjezdice). Npr. za (na te linije treba staviti zvjezdice). Npr. za i=1i=1,, j=2 j=2, tablica , tablica treba izgledati ovako:treba izgledati ovako:

. . * . . . . . . . . . . * . . . . . . . .

* * * * * * * * * * ** * * * * * * * * * *

. . * . . . . . . . .. . * . . . . . . . .

. . * . . . . . . . .. . * . . . . . . . .

. . * . . . . . . . .. . * . . . . . . . .

. . * . . . . . . . .. . * . . . . . . . .

. . * . . . . . . . .. . * . . . . . . . .

. . * . . . . . . . .. . * . . . . . . . .

. . * . . . . . . . .. . * . . . . . . . .

. . * . . . . . . . .. . * . . . . . . . .

Page 58: Programiranje 2 - vježbe

60

Zadatak 3.9.Zadatak 3.9.#include <stdio.h>#include <stdio.h>int main(void) {int main(void) { char a[10][10];char a[10][10]; int i, j, k, l;int i, j, k, l;

printf("i = "); scanf("%d", &i); printf("j = "); scanf("%d", &j);printf("i = "); scanf("%d", &i); printf("j = "); scanf("%d", &j);

for (k = 0; k < 10; k++)for (k = 0; k < 10; k++) for (l = 0; l < 10; l++)for (l = 0; l < 10; l++) a[k][l] = '.';a[k][l] = '.';

for (k = 0; k < 10; k++) {for (k = 0; k < 10; k++) { a[i][k] = '*';a[i][k] = '*'; a[k][j] = '*';a[k][j] = '*'; }}

for (k = 0; k < 10; k++) {for (k = 0; k < 10; k++) { for (l = 0; l < 10; l++)for (l = 0; l < 10; l++) printf("%2c", a[k][l]);printf("%2c", a[k][l]); printf("\n");printf("\n"); }} return 0;return 0;}}

Page 59: Programiranje 2 - vježbe

61

Višedimenzionalna poljaVišedimenzionalna polja

Zadatak 3.11.: Zadatak 3.11.: Napišite dio programa koji ispisuje koliko se Napišite dio programa koji ispisuje koliko se prostih brojeva nalazi u učitanoj matrici sa m redaka i n prostih brojeva nalazi u učitanoj matrici sa m redaka i n stupaca.stupaca.

int i, j, k, cnt = 0;int i, j, k, cnt = 0;

for (i = 0; i < m; i++)for (i = 0; i < m; i++)

for (j = 0; j < n; j++) {for (j = 0; j < n; j++) {

for (k = 2; k < a[i][j]; k++)for (k = 2; k < a[i][j]; k++)

if (!(a[i][j] % k)) break;if (!(a[i][j] % k)) break;

if (k == a[i][j]) cnt++;if (k == a[i][j]) cnt++;

}}

printf("Broj prostih brojeva u matrici: %d\n", cnt);printf("Broj prostih brojeva u matrici: %d\n", cnt);

Page 60: Programiranje 2 - vježbe

62

Višedimenzionalna poljaVišedimenzionalna polja

Zadatak 3.13.: Zadatak 3.13.: Neka je učitana matrica x sa m redaka i n Neka je učitana matrica x sa m redaka i n stupaca. Napišite dio programa koji ispisuje indeks stupaca. Napišite dio programa koji ispisuje indeks retkaretka s s najvećom sumom elemenata. Ako takvih ima više, dovoljno je najvećom sumom elemenata. Ako takvih ima više, dovoljno je ispisati indeks jednog od njih.ispisati indeks jednog od njih.

int i, j, max, maxi;int i, j, max, maxi;

for (i = 0; i < m; i++) {for (i = 0; i < m; i++) {

int sum = 0;int sum = 0;

for (j = 0; j < n; j++) sum += x[i][j];for (j = 0; j < n; j++) sum += x[i][j];

if (i == 0 || sum > max) {if (i == 0 || sum > max) {

max = sum;max = sum;

maxi = i;maxi = i;

}}

}}

printf("Trazeni redak=%d", maxi);printf("Trazeni redak=%d", maxi);

Page 61: Programiranje 2 - vježbe

63

Višedimenzionalna poljaVišedimenzionalna polja

Zadatak 3.14.: Zadatak 3.14.: Neka je učitana matrica x sa m redaka i n Neka je učitana matrica x sa m redaka i n stupaca. Napišite dio programa koji ispisuje indeks stupaca. Napišite dio programa koji ispisuje indeks stupcastupca s s najvećom sumom elemenata. Ako takvih ima više, dovoljno je najvećom sumom elemenata. Ako takvih ima više, dovoljno je ispisati indeks jednog od njih.ispisati indeks jednog od njih.

int i, j, max, maxj;int i, j, max, maxj;

for (j = 0; j < n; i++) {for (j = 0; j < n; i++) {

int sum = 0;int sum = 0;

for (i = 0; i < m; i++) sum += x[i][j];for (i = 0; i < m; i++) sum += x[i][j];

if (j == 0 || sum > max) {if (j == 0 || sum > max) {

max = sum;max = sum;

maxj = j;maxj = j;

}}

}}

printf("Trazeni stupac=%d", maxj);printf("Trazeni stupac=%d", maxj);

Page 62: Programiranje 2 - vježbe

64

Višedimenzionalna poljaVišedimenzionalna polja

Zadatak 3.15.: Zadatak 3.15.: Neka je učitana matrica x sa m redaka i n Neka je učitana matrica x sa m redaka i n stupaca. Napišite dio programa koji ispisuje stupaca. Napišite dio programa koji ispisuje indekse redakaindekse redaka s najvećom sumom elemenata. s najvećom sumom elemenata.

int i, j, max;int i, j, max;

for (i = 0; i < m; i++) {for (i = 0; i < m; i++) { int sum = 0;int sum = 0; for (j = 0; j < n; j++) sum += x[i][j];for (j = 0; j < n; j++) sum += x[i][j]; if (i == 0 || sum > max) max = sum;if (i == 0 || sum > max) max = sum;}}

printf("indexi redaka s najvecom sumom:\n");printf("indexi redaka s najvecom sumom:\n");

for (i = 0; i < m; i++) {for (i = 0; i < m; i++) { int sum = 0;int sum = 0; for (j = 0; j < n; j++) sum += x[i][j];for (j = 0; j < n; j++) sum += x[i][j]; if (sum == max) printf("%d\n", i);if (sum == max) printf("%d\n", i);}}

Page 63: Programiranje 2 - vježbe

65

Višedimenzionalna poljaVišedimenzionalna polja

Zadatak 3.18.: Zadatak 3.18.: Napišite dio programa koji transponira Napišite dio programa koji transponira elemente matrice m x n (pri tome je potrebno prilagoditi i elemente matrice m x n (pri tome je potrebno prilagoditi i

dimenzije matrice tako da odgovaraju novonastaloj matrici.dimenzije matrice tako da odgovaraju novonastaloj matrici.

Pokušaj rješenja:Pokušaj rješenja:

for (i = 0; i < m; i++) {for (i = 0; i < m; i++) { for (j = 0; j < n; j++) {for (j = 0; j < n; j++) { double tmp = x[i][j];double tmp = x[i][j]; x[i][j] = x[j][i];x[i][j] = x[j][i]; x[j][i] = tmp;x[j][i] = tmp; }}}}tmp = m; m = n; n = tmp;tmp = m; m = n; n = tmp;

Rješenje je krivo! Gdje je greška?Rješenje je krivo! Gdje je greška?

Page 64: Programiranje 2 - vježbe

66

Višedimenzionalna poljaVišedimenzionalna polja

Zadatak 3.18.: Zadatak 3.18.: Napišite dio programa koji transponira Napišite dio programa koji transponira elemente matrice m x n (pri tome je potrebno prilagoditi i elemente matrice m x n (pri tome je potrebno prilagoditi i

dimenzije matrice tako da odgovaraju novonastaloj matrici.dimenzije matrice tako da odgovaraju novonastaloj matrici.

for (i = 0; i < m; i++) {for (i = 0; i < m; i++) {

for (for (j = i + 1j = i + 1; j < n; j++) {; j < n; j++) {

double tmp = x[i][j];double tmp = x[i][j];

x[i][j] = x[j][i];x[i][j] = x[j][i];

x[j][i] = tmp;x[j][i] = tmp;

}}

}}

tmp = m; m = n; n = tmp;tmp = m; m = n; n = tmp;

Rješenje je još uvijek krivo!Rješenje je još uvijek krivo!

Provjerite što se događa kad je m=2 i n=3, a što kad je m=3, a n=2.Provjerite što se događa kad je m=2 i n=3, a što kad je m=3, a n=2.

Page 65: Programiranje 2 - vježbe

67

Višedimenzionalna poljaVišedimenzionalna polja

Zadatak 3.18.: Zadatak 3.18.: Napišite dio programa koji transponira Napišite dio programa koji transponira elemente matrice m x n (pri tome je potrebno prilagoditi i elemente matrice m x n (pri tome je potrebno prilagoditi i

dimenzije matrice tako da odgovaraju novonastaloj matrici.dimenzije matrice tako da odgovaraju novonastaloj matrici.

int max = m>n ? m : nint max = m>n ? m : nfor (i = 0; i < max ; i++) {for (i = 0; i < max ; i++) {

for (j = i + 1; j < max ; j++) {for (j = i + 1; j < max ; j++) {

double tmp = x[i][j];double tmp = x[i][j];

x[i][j] = x[j][i];x[i][j] = x[j][i];

x[j][i] = tmp;x[j][i] = tmp;

}}

}}

tmp = m; m = n; n = tmp;tmp = m; m = n; n = tmp;

Page 66: Programiranje 2 - vježbe

68

Dinamičke varijableDinamičke varijable

int x;int x;

printf("%d", x); /* ispis je neki sasvim slučajni printf("%d", x); /* ispis je neki sasvim slučajni broj koji se u tom trenutku broj koji se u tom trenutku

bio bio na tom memorijskom mjestu */na tom memorijskom mjestu */

int *x;int *x;

*x = 17;*x = 17;

Problem! Koja adresa je pohranjena u x?Problem! Koja adresa je pohranjena u x?

int broj;int broj;

int *pokazivac;int *pokazivac;

pokazivac = &broj;pokazivac = &broj;

*pokazivac = 17; / **pokazivac = 17; / *u ovom slučaju isto kaou ovom slučaju isto kao broj=17 */ broj=17 */

Page 67: Programiranje 2 - vježbe

69

Dinamičke varijableDinamičke varijable Primjer 4.1Primjer 4.1 Svi pokazivači su adrese, pa su jednake veličine! Svi pokazivači su adrese, pa su jednake veličine!

#include <stdio.h>int main(void){

printf("Velicina int: %u\n" , sizeof(int));printf("Velicina pokazivaca na int: %u\n" ,

sizeof(int*));printf("Velicina double: %u\n" , sizeof(double));printf("Velicina pokazivaca na double: %u\n" ,

sizeof(double*));printf("Velicina char: %u\n" , sizeof(char));printf("Velicina pokazivaca na char: %u\n" ,

sizeof(char*));return 0;

} Veličine u byte-ovima:

Na 32-bitnom računalu: int: 4, int*: 4, double: 8, double*: 4, char: 1, char*: 4

Na 64-bitnom računalu: int: 4, int*: 8, double: 8, double*: 8, char: 1, char*: 8

Page 68: Programiranje 2 - vježbe

70

Dinamičke varijableDinamičke varijable Primjer 4.2Primjer 4.2 Alokacija i delokacija memorije Alokacija i delokacija memorije

#include <stdio.h>

#include <stdlib.h>

int main(void){

int *pokazivac;

pokazivac = (int*) malloc(sizeof(int));

*pokazivac = 17;

printf("%d\n" , *pokazivac); /*ispisuje 17*/

(*pokazivac)++; /* nije isto što i *pokazivac++ */

printf("%d\n" , *pokazivac); /*ispisuje 18*/

free(pokazivac);

return 0;

}

Page 69: Programiranje 2 - vježbe

71

Dinamičke varijableDinamičke varijable Zadatak 4.1. Napišite dio programa koji učitava 2 cijela broja Zadatak 4.1. Napišite dio programa koji učitava 2 cijela broja

te ispisuje koji je veći. Jedna varijabla neka bude tipa int, a te ispisuje koji je veći. Jedna varijabla neka bude tipa int, a druga pokazivač na int.druga pokazivač na int.

int *x, y;

x = (int*) malloc(sizeof(int));

scanf("%d", x);

scanf("%d", &y);

printf("Veci je %d\n", *x > y ? *x : y);

free(x);

Page 70: Programiranje 2 - vježbe

72

Dinamička jednodimenzionalna poljaDinamička jednodimenzionalna polja Kako stvoriti prostor za niz od n elemenata određenog tipa?Kako stvoriti prostor za niz od n elemenata određenog tipa?

tip *niz; /* ne može: tip niz[] */niz = (tip*) malloc(n * sizeof(tip));

Kako pristupiti pojedinom elementu? Isto kao da se radi o Kako pristupiti pojedinom elementu? Isto kao da se radi o običnom nizuobičnom nizuniz[i] = ...

Nakon korištenja obrisati dinamički stvoreni niz: Nakon korištenja obrisati dinamički stvoreni niz: free(niz);

Page 71: Programiranje 2 - vježbe

73

Pokazivačka aritmetikaPokazivačka aritmetika Primjer 4.3.Primjer 4.3.

int *x; double *y;x = (int*) malloc(3*sizeof(int));y = (double*) malloc(3*sizeof(double));printf("x=%u; x+1=%u\n", x, x + 1);printf("y=%u; y+1=%u\n", y, y + 1);free(x); free(y);

Mogući ispis na računalu gdje je int velik 4 byte-a, a double 8 byte-ova:Mogući ispis na računalu gdje je int velik 4 byte-a, a double 8 byte-ova:x = 134520840; x+1 = 134520844y = 134520856; y+1 = 134520864

Pokazivačka aritmetikaPokazivačka aritmetikaniz + 1 je adresa koja je od početka niza udaljena za 1 veličinu tipa

podatka koji se nalazi u nizu, a ne za 1 byte!

Veza između pokazivača i nizaVeza između pokazivača i nizaniz[i] *(niz+i)&niz[i] niz+iniz[i][j] *(*(niz+i) + j)

Page 72: Programiranje 2 - vježbe

74

Dinamička alokacija Dinamička alokacija jednodimenzionalnih poljajednodimenzionalnih polja Zadatak 4.4. Napišite program koji učitava prirodni broj n te n realnih brojeva. Zadatak 4.4. Napišite program koji učitava prirodni broj n te n realnih brojeva.

Brojeve treba ispisati unatrag.Brojeve treba ispisati unatrag.

#include <stdio.h>#include <stdlib.h>int main(void){

double *x; int i, n;printf("Upisite n: "); scanf("%d", &n);x = (double*) malloc(n*sizeof(double));if (x == NULL){

printf("Greska: Nema dovoljno memorije");exit(1);}for(i=0; i<n ; i++){

printf("Upisite x[%d]: ", i); scanf("%lg", &x[i]); /* ili scanf("%lg", x+i); */

}printf("Brojevi unatrag: %g", x[n-1]); /* ili printf("Brojevi unatrag: %g", *(x + n-1)); */for(i=n-2; i>=0; i--)

printf(", %g", x[i]); /* ili printf(", %g", *(x+i)); */free(x);return 0;

}

Page 73: Programiranje 2 - vježbe

75

Zadatak 4.26Zadatak 4.26

Da li je sljedeći program ispravan? Ako da, što će se dogoditi prilikom Da li je sljedeći program ispravan? Ako da, što će se dogoditi prilikom njegovog izvršavanja. Ako nije ispravan, zašto nije ispravan?njegovog izvršavanja. Ako nije ispravan, zašto nije ispravan?

#include <stdio.h>#include <stdio.h>

int *f(void) {int *f(void) { int a[3] = {1, 2, 3};int a[3] = {1, 2, 3}; return a;return a;}}

int main(void) {int main(void) { int a[3];int a[3];

a = f();a = f(); printf("%d, %d, %d\n", a[0], a[1], a[2]);printf("%d, %d, %d\n", a[0], a[1], a[2]);

return 0;return 0;}}

a je adresa statičkog niza i to je a je adresa statičkog niza i to je konstanta, a ne pokazivač i ne može konstanta, a ne pokazivač i ne može se promijenitise promijeniti

Page 74: Programiranje 2 - vježbe

76

Zadatak 4.27Zadatak 4.27

Da li je sljedeći program ispravan? Ako da, što će se dogoditi Da li je sljedeći program ispravan? Ako da, što će se dogoditi prilikom njegovog izvršavanja. Ako nije ispravan, zašto nije prilikom njegovog izvršavanja. Ako nije ispravan, zašto nije ispravan?ispravan?

#include <stdio.h>#include <stdio.h>

int *f(void) {int *f(void) { int a[3] = {1, 2, 3};int a[3] = {1, 2, 3}; return a;return a;}}

int main(void) {int main(void) { int int **a;a;

a = f();a = f(); printf("%d, %d, %d\n", a[0], a[1], a[2]);printf("%d, %d, %d\n", a[0], a[1], a[2]);

return 0;return 0;}}

Lokalni niz. “Nestaje” nakon završetka Lokalni niz. “Nestaje” nakon završetka funkcije.funkcije.

Page 75: Programiranje 2 - vježbe

77

Zadatak 4.27 – ispravno rješenjeZadatak 4.27 – ispravno rješenje

#include <stdio.h>#include <stdio.h>

int *f(void) {int *f(void) { int int **a;a;

a = (int*) malloc(3*sizeof(int));a = (int*) malloc(3*sizeof(int));a[0] = 1; a[1] = 2; a[2] = 3;a[0] = 1; a[1] = 2; a[2] = 3;

return a;return a;}}

int main(void) {int main(void) { int int **a;a;

a = f();a = f(); printf("%d, %d, %d\n", a[0], a[1], a[2]);printf("%d, %d, %d\n", a[0], a[1], a[2]);

free(a); free(a); return 0;return 0;}}

Da li se Da li se freefree mogao nalaziti u funkciji ispred returna? mogao nalaziti u funkciji ispred returna?

Page 76: Programiranje 2 - vježbe

78

Dinamička alokacija Dinamička alokacija jednodimenzionalnih poljajednodimenzionalnih polja

Zadatak 4.5. Napišite program koji učitava prirodni broj n te dva niza Zadatak 4.5. Napišite program koji učitava prirodni broj n te dva niza a i b realnih brojeva duljine n. Program treba ispisati nizove na a i b realnih brojeva duljine n. Program treba ispisati nizove na sljedeći način: sljedeći način:

aa00 , b , b00 , a , a11 , b , b11, a, a22 , b , b22, …, a, …, an-1n-1 , b , bn-1n-1. Za ispis nizova definirajte funkciju . Za ispis nizova definirajte funkciju koja će kao argumente primati nizove i duljinu n.koja će kao argumente primati nizove i duljinu n.

#include<stdio.h>#include<stdio.h>

#include<stdlib.h>#include<stdlib.h>

int main(void){int main(void){

double *a, *b;double *a, *b;

int n;int n;

printf("Upisite n: ");printf("Upisite n: ");

scanf("%d", &n);scanf("%d", &n);

a = alociraj_i_ucitaj(n, 'a');a = alociraj_i_ucitaj(n, 'a');

b = alociraj_i_ucitaj(n, 'b');b = alociraj_i_ucitaj(n, 'b');

ispis(a,b,n);ispis(a,b,n);

free(a);free(a);

free(b);free(b);

return 0;return 0;

}}

Page 77: Programiranje 2 - vježbe

79

Zadatak 4.5 (nastavak)Zadatak 4.5 (nastavak)double *alociraj_i_ucitaj(int n, char ime){double *alociraj_i_ucitaj(int n, char ime){

double *x;double *x;

int i;int i;

x = (double*) malloc(n*sizeof(double));x = (double*) malloc(n*sizeof(double));

if (x == NULL){if (x == NULL){

printf("Greska: Nema dovoljno memorije!\n");printf("Greska: Nema dovoljno memorije!\n");

exit(1);exit(1);

}}

for(i=0; i<n ; i++){for(i=0; i<n ; i++){

printf("Upisite %c[%d]: ", ime, i);printf("Upisite %c[%d]: ", ime, i);

scanf("%lg", &x[i]);scanf("%lg", &x[i]);

}}

return x;return x;

}}

Page 78: Programiranje 2 - vježbe

80

Zadatak 4.5 (nastavak)Zadatak 4.5 (nastavak)double *ispis(double *a, double *b, int n){double *ispis(double *a, double *b, int n){

int i;int i;

printf("Ispis: %g, %g", a[0], b[0]);printf("Ispis: %g, %g", a[0], b[0]);

for(i=1; i<n ; i++){for(i=1; i<n ; i++){

printf(", %g, %g", a[i], b[i]);printf(", %g, %g", a[i], b[i]);

}}

printf("\n");printf("\n");

}}

Zaglavlje funkcije je moglo biti i jedno od sljedećih:Zaglavlje funkcije je moglo biti i jedno od sljedećih:

double *ispis(double a[], double *b, int n){double *ispis(double a[], double *b, int n){

double *ispis(double *a, double b[], int n){double *ispis(double *a, double b[], int n){

double *ispis(double a[], double b[], int n){double *ispis(double a[], double b[], int n){

Page 79: Programiranje 2 - vježbe

81

Dinamička višedimenzionalna poljaDinamička višedimenzionalna polja1. Oba niza statička1. Oba niza statička

char x[10][20];char x[10][20];

2. Veliki niz statičan, 2. Veliki niz statičan, mali nizovi dinamičkimali nizovi dinamički

char *(x[10]);char *(x[10]);

char *x[10];char *x[10];

3. Veliki niz dinamičan, 3. Veliki niz dinamičan, mali statičnimali statični

char (*x)[20];char (*x)[20];

4. Oba niza dinamička4. Oba niza dinamička

char **x;char **x;

Page 80: Programiranje 2 - vježbe

82

Dinamička višedimenzionalna poljaDinamička višedimenzionalna polja Zadatak 4.12:Zadatak 4.12: Napišite program koji učitava prirodan broj n i Napišite program koji učitava prirodan broj n i

kvadratnu matricu reda n. Program treba ispisati trag matrice kvadratnu matricu reda n. Program treba ispisati trag matrice (suma elemenata na glavnoj dijagonali)(suma elemenata na glavnoj dijagonali)

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>int main(void) {int main(void) { double **x, tr = 0; int i, j, n;double **x, tr = 0; int i, j, n; printf("n = "); scanf("%d", &n);printf("n = "); scanf("%d", &n);

...dinamički alocirati prostor za matricu......dinamički alocirati prostor za matricu...

for (i = 0; i < n; i++)for (i = 0; i < n; i++) for (j = 0; j < n; j++) {for (j = 0; j < n; j++) { printf("x[%d][%d] = ", i, j);printf("x[%d][%d] = ", i, j); scanf("%lf", &x[i][j]);scanf("%lf", &x[i][j]); }} for (i = 0; i < n; i++)for (i = 0; i < n; i++) tr += x[i][i];tr += x[i][i]; printf("tr(x) = %g\n", tr);printf("tr(x) = %g\n", tr);

...obrisati dinamički alociranu memoriju......obrisati dinamički alociranu memoriju...

return 0;return 0;}}

Page 81: Programiranje 2 - vježbe

83

Dinamička višedimenzionalna poljaDinamička višedimenzionalna polja

Zadatak 4.12 (nastavak):Zadatak 4.12 (nastavak):

matrica je definirana kao matrica je definirana kao double **x; double **x; i ima n redaka i n i ima n redaka i n stupacastupaca

...dinamički alocirati prostor za matricu......dinamički alocirati prostor za matricu...

x = (double**)malloc(n * sizeof(double*));x = (double**)malloc(n * sizeof(double*));for (i = 0; i < n; i++)for (i = 0; i < n; i++) x[i] = (double*)malloc(n * sizeof(double));x[i] = (double*)malloc(n * sizeof(double));

...obrisati dinamički alociranu memoriju... ...obrisati dinamički alociranu memoriju...

for (i = 0; i < n; i++)for (i = 0; i < n; i++) free(x[i]);free(x[i]);free(x);free(x);

Page 82: Programiranje 2 - vježbe

84

Dinamička višedimenzionalna poljaDinamička višedimenzionalna polja

Zadatak 4.13: Napišite program koji učitava prirodne brojeve Zadatak 4.13: Napišite program koji učitava prirodne brojeve a,b,c te matrice x i y te računa i ispisuje njihov a,b,c te matrice x i y te računa i ispisuje njihov umnožak z=x*y.umnožak z=x*y.

int main(void) {int main(void) { double **x, **y, **z;double **x, **y, **z; int a, b, c, i, j, k;int a, b, c, i, j, k; /* Ucitavanje redova matrica *//* Ucitavanje redova matrica */

printf("a = "); scanf("%d", &a);printf("a = "); scanf("%d", &a); printf("b = "); scanf("%d", &b);printf("b = "); scanf("%d", &b); printf("c = "); scanf("%d", &c);printf("c = "); scanf("%d", &c); ... Alokacija memorije za matrice ...... Alokacija memorije za matrice ... ... Ucitavanje matrica ... ... Ucitavanje matrica ... ... Racunanje produkta matrica ...... Racunanje produkta matrica ... ... Ispis matrice z ...... Ispis matrice z ... ... Delokacija memorije ...... Delokacija memorije ...

return 0;return 0;

}}

Page 83: Programiranje 2 - vježbe

85

Dinamička višedimenzionalna polja – Zadatak Dinamička višedimenzionalna polja – Zadatak 4.134.13

Alokacija memorije za matriceAlokacija memorije za matrice

x = (double**)malloc(a * sizeof(double*));x = (double**)malloc(a * sizeof(double*));

for (i = 0; i < a; i++)for (i = 0; i < a; i++)

x[i] = (double*)malloc(b * sizeof(double));x[i] = (double*)malloc(b * sizeof(double));

y = (double**)malloc(b * sizeof(double*));y = (double**)malloc(b * sizeof(double*));

for (i = 0; i < b; i++)for (i = 0; i < b; i++)

y[i] = (double*)malloc(c * sizeof(double));y[i] = (double*)malloc(c * sizeof(double));

z = (double**)malloc(a * sizeof(double*));z = (double**)malloc(a * sizeof(double*));

for (i = 0; i < a; i++)for (i = 0; i < a; i++)

z[i] = (double*)malloc(c * sizeof(double));z[i] = (double*)malloc(c * sizeof(double));

Page 84: Programiranje 2 - vježbe

86

Dinamička višedimenzionalna polja – Zadatak Dinamička višedimenzionalna polja – Zadatak 4.134.13

Učitavanje matricaUčitavanje matrica

for (i = 0; i < a; i++)for (i = 0; i < a; i++)

for (j = 0; j < b; j++) {for (j = 0; j < b; j++) {

printf("x[%d][%d] = ", i, j);printf("x[%d][%d] = ", i, j);

scanf("%lf", &x[i][j]);scanf("%lf", &x[i][j]);

}}

for (i = 0; i < b; i++)for (i = 0; i < b; i++)

for (j = 0; j < c; j++) {for (j = 0; j < c; j++) {

printf("y[%d][%d] = ", i, j);printf("y[%d][%d] = ", i, j);

scanf("%lf", &y[i][j]);scanf("%lf", &y[i][j]);

}} Računanje produkta matricaRačunanje produkta matrica

for (i = 0; i < a; i++)for (i = 0; i < a; i++)

for (k = 0; k < c; k++) {for (k = 0; k < c; k++) {

z[i][k] = 0;z[i][k] = 0;

for (j = 0; j < b; j++)for (j = 0; j < b; j++)

z[i][k] += x[i][j] * y[j][k];z[i][k] += x[i][j] * y[j][k];

}}

Page 85: Programiranje 2 - vježbe

87

Dinamička višedimenzionalna polja – Zadatak Dinamička višedimenzionalna polja – Zadatak 4.134.13

Ispis matriceIspis matrice

printf("z = x*y =\n");printf("z = x*y =\n"); for (i = 0; i < a; i++) {for (i = 0; i < a; i++) { for (j = 0; j < c; j++)for (j = 0; j < c; j++) printf("%10.2g", z[i][j]);printf("%10.2g", z[i][j]); printf("\n");printf("\n"); }}

Delokacija memorijeDelokacija memorije

for (i = 0; i < a; i++) free(x[i]);for (i = 0; i < a; i++) free(x[i]); for (i = 0; i < b; i++) free(y[i]);for (i = 0; i < b; i++) free(y[i]); for (i = 0; i < a; i++) free(z[i]);for (i = 0; i < a; i++) free(z[i]); free(x);free(x); free(y);free(y); free(z);free(z);

Page 86: Programiranje 2 - vježbe

88

Dinamička višedimenzionalna poljaDinamička višedimenzionalna polja

Zadatak 4.16Zadatak 4.16 : Održava se nekakvo natjecanje u kojem su : Održava se nekakvo natjecanje u kojem su igrači označeni brojevima od 0 do n-1. Svaka dva igrača igraju igrači označeni brojevima od 0 do n-1. Svaka dva igrača igraju točno jednom i točno jedan od njih mora pobijediti. Napišite točno jednom i točno jedan od njih mora pobijediti. Napišite program koji učitava prirodni broj n, te za svakog igrača program koji učitava prirodni broj n, te za svakog igrača učitava koje je igrače pobijedio. Program treba provjeriti da li učitava koje je igrače pobijedio. Program treba provjeriti da li su uneseni podaci ispravni (tj. da li za svaki par (i,j), i≠j, su uneseni podaci ispravni (tj. da li za svaki par (i,j), i≠j, postoji točno jedan zapis o pobjedi, te da niti jedan igrač nije postoji točno jedan zapis o pobjedi, te da niti jedan igrač nije pobijedio sam sebe) te ispisati igrače (njihove brojeve) pobijedio sam sebe) te ispisati igrače (njihove brojeve) padajuće prema broju pobjeda. Uz svakog igrača treba padajuće prema broju pobjeda. Uz svakog igrača treba napisati koliko pobjeda ima i koga je sve pobijedio.napisati koliko pobjeda ima i koga je sve pobijedio.

2 rješenja:2 rješenja: pomoću nepravokutnog dvodimenzionalnog poljapomoću nepravokutnog dvodimenzionalnog polja pomoću dvodimenzionalnog bit-poljapomoću dvodimenzionalnog bit-polja

Page 87: Programiranje 2 - vježbe

89

Dinamička višedimenzionalna polja – Zadatak Dinamička višedimenzionalna polja – Zadatak 4.16.4.16.

Igrač 0: Pobijedio igrače 1, 3, 4Igrač 0: Pobijedio igrače 1, 3, 4 Igrač 1: Pobijedio igrače 2 i 4Igrač 1: Pobijedio igrače 2 i 4 Igrač 2: Pobijedio igrače 0, 3, 4Igrač 2: Pobijedio igrače 0, 3, 4 Igrač 3: Pobijedio igrače 1, 4Igrač 3: Pobijedio igrače 1, 4 Igrač 4: Nije pobijedio nikogaIgrač 4: Nije pobijedio nikoga

niz niz igraciigraci sadrži brojeve igrača (inicijalno sadrži brojeve igrača (inicijalno 0,1,2,3,40,1,2,3,4)) polje polje pobpob : : pob[i]pob[i] sadrži brojeve igrača koje je i-ti igrač sadrži brojeve igrača koje je i-ti igrač

pobijediopobijedio

pob[0]pob[0] : : 1 3 41 3 4

pob[1]pob[1] : : 2 42 4

pob[2]pob[2] : : 0 3 40 3 4

pob[3]pob[3] : : 1 41 4

pob[4]pob[4] : : NULLNULL polje polje br_pobbr_pob sadrži broj pobjeda pojedinog igrača ( sadrži broj pobjeda pojedinog igrača (3,2,3,2,03,2,3,2,0))

Page 88: Programiranje 2 - vježbe

90

Dinamička višedimenzionalna polja – Zadatak Dinamička višedimenzionalna polja – Zadatak 4.16.4.16.

#include <stdio.h>#include <stdio.h>

#include <stdlib.h>#include <stdlib.h>

int main(void) {int main(void) {

int *igraci, **pob, *br_pob, n, i, j, k;int *igraci, **pob, *br_pob, n, i, j, k;

printf("Broj igraca: "); scanf("%d", &n);printf("Broj igraca: "); scanf("%d", &n);

...Alokacija memorije i ucitavanje pobjeda ......Alokacija memorije i ucitavanje pobjeda ...

... Provjera ulaza... Provjera ulaza

...... Provjera da nitko nije sam sebe pobijedio Provjera da nitko nije sam sebe pobijedio ......

... Provjera da je svaki par odigrao s tocno jednom pobjedom ...... Provjera da je svaki par odigrao s tocno jednom pobjedom ...

... Sort po broju pobjeda... Sort po broju pobjeda

... Ispis... Ispis

... Delokacija memorije:... Delokacija memorije:

return 0;return 0;

}}

Page 89: Programiranje 2 - vježbe

91

Dinamička višedimenzionalna polja – Zadatak Dinamička višedimenzionalna polja – Zadatak 4.16.4.16.

Alokacija memorije i učitavanje pobjedaAlokacija memorije i učitavanje pobjeda

igraci = (int*)malloc(n * sizeof(int));igraci = (int*)malloc(n * sizeof(int)); for (i = 0; i < n; i++) for (i = 0; i < n; i++)

igraci[i] = i;igraci[i] = i; br_pob = (int*)malloc(n * sizeof(int));br_pob = (int*)malloc(n * sizeof(int)); pob = (int**)malloc(n * sizeof(int*));pob = (int**)malloc(n * sizeof(int*)); for (i = 0; i < n; i++) {for (i = 0; i < n; i++) { printf("Koliko pobjeda ima igrac %d? ", i);printf("Koliko pobjeda ima igrac %d? ", i); scanf("%d", &br_pob[i]);scanf("%d", &br_pob[i]); pob[i] = (int*)malloc(br_pob[i] * sizeof(int));pob[i] = (int*)malloc(br_pob[i] * sizeof(int)); for (j = 0; j < br_pob[i]; j++) {for (j = 0; j < br_pob[i]; j++) { printf("Koji je %d. igrac kojeg je %d pobijedio? ",printf("Koji je %d. igrac kojeg je %d pobijedio? ", j+1, i);j+1, i); scanf("%d", &pob[i][j]);scanf("%d", &pob[i][j]); }} }}

Page 90: Programiranje 2 - vježbe

92

Dinamička višedimenzionalna polja – Zadatak Dinamička višedimenzionalna polja – Zadatak 4.16.4.16.

Provjera da nitko nije sam sebe pobijedioProvjera da nitko nije sam sebe pobijedio

for (i = 0; i < n; i++)for (i = 0; i < n; i++)

for (j = 0; j < br_pob[i]; j++)for (j = 0; j < br_pob[i]; j++)

if (i == pob[i][j]) {if (i == pob[i][j]) {

printf("Greska: igrac %d je pobijedio ", i);printf("Greska: igrac %d je pobijedio ", i);

printf("sam sebe!\n");printf("sam sebe!\n");

exit(1);exit(1);

}}

Page 91: Programiranje 2 - vježbe

93

Dinamička višedimenzionalna polja – Zadatak Dinamička višedimenzionalna polja – Zadatak 4.16.4.16.

Provjera da je svaki par odigrao s točno jednom pobjedomProvjera da je svaki par odigrao s točno jednom pobjedom

for (i = 0; i < n; i++)for (i = 0; i < n; i++) for (j = i + 1; j < n; j++) {for (j = i + 1; j < n; j++) { int pobjeda = 0;int pobjeda = 0; for (k = 0; k < br_pob[i]; k++)for (k = 0; k < br_pob[i]; k++) if (pob[i][k] == j)if (pob[i][k] == j) if (pobjeda) {if (pobjeda) { printf("Greska: barem 2 igre igraca %d i %d!\n ", i, j); printf("Greska: barem 2 igre igraca %d i %d!\n ", i, j);

exit(1);exit(1); } else} else pobjeda = 1;pobjeda = 1; for (k = 0; k < br_pob[j]; k++)for (k = 0; k < br_pob[j]; k++) if (pob[j][k] == i)if (pob[j][k] == i) if (pobjeda) {if (pobjeda) { printf("Greska: barem 2 igre igraca %d i %d!\n ", i, j);printf("Greska: barem 2 igre igraca %d i %d!\n ", i, j);

exit(1);exit(1); } else} else pobjeda = 1;pobjeda = 1; if (!pobjeda) {if (!pobjeda) { printf("Greska: nema nijedne igre igraca %d i %d!\n", i, j);printf("Greska: nema nijedne igre igraca %d i %d!\n", i, j);

exit(1);exit(1); }} }}

Page 92: Programiranje 2 - vježbe

94

Dinamička višedimenzionalna polja – Zadatak Dinamička višedimenzionalna polja – Zadatak 4.16.4.16.

Sortiranje po broju pobjedaSortiranje po broju pobjeda

for (i = 0; i < n; i++)for (i = 0; i < n; i++) for (j = i + 1; j < n; j++)for (j = i + 1; j < n; j++) if (br_pob[i] < br_pob[j]) {if (br_pob[i] < br_pob[j]) { int t, *tp;int t, *tp; t = igraci[i];t = igraci[i]; igraci[i] = igraci[j];igraci[i] = igraci[j]; igraci[j] = t;igraci[j] = t; t = br_pob[i];t = br_pob[i]; br_pob[i] = br_pob[j];br_pob[i] = br_pob[j]; br_pob[j] = t;br_pob[j] = t; tp = pob[i];tp = pob[i]; pob[i] = pob[j];pob[i] = pob[j]; pob[j] = tp;pob[j] = tp; }}

Page 93: Programiranje 2 - vježbe

95

Dinamička višedimenzionalna polja – Zadatak Dinamička višedimenzionalna polja – Zadatak 4.16.4.16.

Ispis i dealokacijaIspis i dealokacija

for (i = 0; i < n; i++) {for (i = 0; i < n; i++) {

printf("Igrac %d ima %d pobjeda", igraci[i], br_pob[i]);printf("Igrac %d ima %d pobjeda", igraci[i], br_pob[i]);

if (br_pob[i]) {if (br_pob[i]) {

printf(": %d", pob[i][0]);printf(": %d", pob[i][0]);

for (j = 1; j < br_pob[i]; j++)for (j = 1; j < br_pob[i]; j++)

printf(", %d", pob[i][j]);printf(", %d", pob[i][j]);

}}

printf("\n");printf("\n");

}}

for (i = 0; i < n; i++) free(pob[i]);for (i = 0; i < n; i++) free(pob[i]);

free(pob);free(pob);

free(igraci);free(igraci);

free(br_pob);free(br_pob);

Page 94: Programiranje 2 - vježbe

96

Dinamička višedimenzionalna polja – Zadatak 4.16. – rješenje 2Dinamička višedimenzionalna polja – Zadatak 4.16. – rješenje 2

Igrač 0: Pobijedio igrače 1, 3, 4Igrač 0: Pobijedio igrače 1, 3, 4 Igrač 1: Pobijedio igrače 2 i 4Igrač 1: Pobijedio igrače 2 i 4 Igrač 2: Pobijedio igrače 0, 3, 4Igrač 2: Pobijedio igrače 0, 3, 4 Igrač 3: Pobijedio igrače 1, 4Igrač 3: Pobijedio igrače 1, 4 Igrač 4: Nije pobijedio nikogaIgrač 4: Nije pobijedio nikoga

niz niz igraciigraci sadrži brojeve igrača (inicijalno sadrži brojeve igrača (inicijalno 0,1,2,3,40,1,2,3,4)) polje polje pob(nxn)pob(nxn) : : pob[i][j] pob[i][j] je 1 ako je igrač i pobijedio igrača je 1 ako je igrač i pobijedio igrača

j , j , inače 0 inače 0 0 1 0 1 10 1 0 1 10 0 1 0 10 0 1 0 11 0 0 1 11 0 0 1 10 1 0 0 10 1 0 0 10 0 0 0 00 0 0 0 0

polje polje br_pobbr_pob sadrži broj pobjeda pojedinog igrača ( sadrži broj pobjeda pojedinog igrača (3,2,3,2,03,2,3,2,0))

Page 95: Programiranje 2 - vježbe

97

Dinamička višedimenzionalna polja – Zadatak 4.16. – rješenje 2Dinamička višedimenzionalna polja – Zadatak 4.16. – rješenje 2

Alokacija memorije i učitavanje pobjedaAlokacija memorije i učitavanje pobjeda

igraci = (int*)malloc(n * sizeof(int));igraci = (int*)malloc(n * sizeof(int)); br_pob = (int*)malloc(n * sizeof(int));br_pob = (int*)malloc(n * sizeof(int)); pob = (int**)malloc(n * sizeof(int*));pob = (int**)malloc(n * sizeof(int*)); for (i = 0; i < n; i++){for (i = 0; i < n; i++){

igraci[i] = i;igraci[i] = i; pob[i] = (int*)malloc(n * sizeof(int));pob[i] = (int*)malloc(n * sizeof(int)); for(j=0; j<n ; j++) pob[i][j] = 0;for(j=0; j<n ; j++) pob[i][j] = 0;

}}

for (i = 0; i < n; i++) {for (i = 0; i < n; i++) { printf("Koliko pobjeda ima igrac %d? ", i);printf("Koliko pobjeda ima igrac %d? ", i); scanf("%d", &br_pob[i]); scanf("%d", &br_pob[i]); for (j = 0; j < br_pob[i]; j++) {for (j = 0; j < br_pob[i]; j++) { printf("Koji je %d. igrac kojeg je %d pobijedio? ", printf("Koji je %d. igrac kojeg je %d pobijedio? ",

j+1, i);j+1, i); scanf("%d", &k); pob[i][k] = 1;scanf("%d", &k); pob[i][k] = 1; }} }}

Page 96: Programiranje 2 - vježbe

98

Dinamička višedimenzionalna polja – Zadatak 4.16. – rješenje 2Dinamička višedimenzionalna polja – Zadatak 4.16. – rješenje 2

Provjera da nitko nije sam sebe pobijedioProvjera da nitko nije sam sebe pobijedio

for (i = 0; i < n; i++)for (i = 0; i < n; i++) if (pob[i][i]){if (pob[i][i]){

printf("Greska: igrac %d je pobijedio sam printf("Greska: igrac %d je pobijedio sam sebe\n", i); sebe\n", i);

exit(1);exit(1); }}

Provjera da je svaki par odigrao s točno jednom pobjedomProvjera da je svaki par odigrao s točno jednom pobjedom

for (i = 0; i < n; i++)for (i = 0; i < n; i++) for (j = i + 1; j < n; j++) {for (j = i + 1; j < n; j++) {

if (pob[i][j] + pob[j][i] != 1){if (pob[i][j] + pob[j][i] != 1){printf("Greska: %d i %d imaju %d printf("Greska: %d i %d imaju %d

medjusobnih susreta" , i, j, medjusobnih susreta" , i, j, pob[i][j] + pob[j][i]); pob[i][j] + pob[j][i]);

exit(1);exit(1);}}

}}

Page 97: Programiranje 2 - vježbe

99

Dinamička višedimenzionalna polja – Zadatak 4.16. – rješenje 2Dinamička višedimenzionalna polja – Zadatak 4.16. – rješenje 2

IspisIspis

for (i = 0; i < n; i++) {for (i = 0; i < n; i++) {

printf("Igrac %d ima %d pobjeda", igraci[i], br_pob[i]);printf("Igrac %d ima %d pobjeda", igraci[i], br_pob[i]);

if (br_pob[i]) { if (br_pob[i]) {

for (j = 0; j < n; j++)for (j = 0; j < n; j++)

if (pob[i][j]) printf(" %d", j);if (pob[i][j]) printf(" %d", j);

}}

printf("\n");printf("\n");

}}

Page 98: Programiranje 2 - vježbe

100

Relokacija memorijeRelokacija memorije Zadatak 4.17.Zadatak 4.17. Napišite dio programa koji učitava prirodni broj n i niz Napišite dio programa koji učitava prirodni broj n i niz

x od n realnih brojeva. Nakon toga program treba učitati broj m te još x od n realnih brojeva. Nakon toga program treba učitati broj m te još m realnih brojeva koje treba dodati na kraj niza x.m realnih brojeva koje treba dodati na kraj niza x.

int i, n, m;int i, n, m;double *x, *y;double *x, *y;printf("n = "); scanf("%d", &n);printf("n = "); scanf("%d", &n);x = (double*)malloc(n * sizeof(double));x = (double*)malloc(n * sizeof(double));for (i = 0; i < n; i++) {for (i = 0; i < n; i++) { printf("x[%d] = ", i);printf("x[%d] = ", i); scanf("%d", &x[i]);scanf("%d", &x[i]);}}printf("m = "); scanf("%d", &m);printf("m = "); scanf("%d", &m);y = (double*)malloc((n + m) * sizeof(double));y = (double*)malloc((n + m) * sizeof(double));for (i = 0; i < n; i++) y[i] = x[i];for (i = 0; i < n; i++) y[i] = x[i];free(x);free(x);x = y;x = y; /* samo priduzivanje pokazivaca – nema kopiranja polja! */ /* samo priduzivanje pokazivaca – nema kopiranja polja! */x = (double*)realloc(x, (n + m) * sizeof(double));x = (double*)realloc(x, (n + m) * sizeof(double));for (i = n; i < n + m; i++) {for (i = n; i < n + m; i++) { printf("x[%d] = ", i);printf("x[%d] = ", i); scanf("%d", &x[i]);scanf("%d", &x[i]);}}

for (i = 0; i < n + m; i++)for (i = 0; i < n + m; i++) printf("%d\n", x[i]);printf("%d\n", x[i]);free(x);free(x);

Page 99: Programiranje 2 - vježbe

101

Relokacija memorijeRelokacija memorije Zadatak 4.18.Zadatak 4.18. Napišite program koji učitava nenegativne Napišite program koji učitava nenegativne

realne brojeve dok ne učita nulu. Program treba ispisati one realne brojeve dok ne učita nulu. Program treba ispisati one učitane brojeve koji su strogo veći od geometrijske sredine učitane brojeve koji su strogo veći od geometrijske sredine učitanih.učitanih.

Napomena:Napomena: realloc(NULL, size)realloc(NULL, size) je ekvivalentno je ekvivalentno malloc(size)malloc(size)

double *niz double *niz = NULL= NULL;;

int n = 0, i;int n = 0, i;

while (1) {while (1) {

double x;double x;

printf("Ucitajte nenegativni broj: ");printf("Ucitajte nenegativni broj: ");

scanf("%lf", &x);scanf("%lf", &x);

if (!x) break;if (!x) break;

nizniz = (double*)realloc(niz, ++n * = (double*)realloc(niz, ++n * sizeof(double));sizeof(double));

niz[n - 1] = x;niz[n - 1] = x;

}}

Page 100: Programiranje 2 - vježbe

102

Relokacija memorije – Zadatak 4.18.Relokacija memorije – Zadatak 4.18. Alocirajmo deset po deset mjesta (umjesto jedno po jedno)Alocirajmo deset po deset mjesta (umjesto jedno po jedno)

double *niz double *niz = NULL= NULL;;int n = 0, i, int n = 0, i, length = 0length = 0;;

while (1) {while (1) { double x;double x; printf("Ucitajte nenegativni broj: ");printf("Ucitajte nenegativni broj: "); scanf("%lf", &x);scanf("%lf", &x); if (!x) break;if (!x) break; nizniz = (double*)realloc(niz, ++n * = (double*)realloc(niz, ++n * sizeof(double));sizeof(double)); if (length < ++n)if (length < ++n) niz = (double*)realloc(niz = (double*)realloc( niz,niz, (length += 10) * sizeof(double)(length += 10) * sizeof(double) );); niz[n - 1] = x;niz[n - 1] = x;}}

Page 101: Programiranje 2 - vježbe

103

Relokacija memorije – Zadatak 4.18.Relokacija memorije – Zadatak 4.18.#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>#include <math.h>#include <math.h>

int main(void) {int main(void) {

double *niz = NULL, gs = 1;double *niz = NULL, gs = 1; int n = 0, length = 0, i;int n = 0, length = 0, i;

while (1) {while (1) { double x;double x; scanf("%lf", &x);scanf("%lf", &x); if (!x) break;if (!x) break; if (length < ++n)if (length < ++n) niz = (double*)realloc(niz = (double*)realloc( niz,niz, (length += 10) * sizeof(double)(length += 10) * sizeof(double) );); niz[n - 1] = x;niz[n - 1] = x; }}

for (i = 0; i < n; i++) gs *= niz[i];for (i = 0; i < n; i++) gs *= niz[i]; gs = pow(gs, 1./n); gs = pow(gs, 1./n); /* 1/n bi bilo krivo-cjelobrojno djeljenje! *//* 1/n bi bilo krivo-cjelobrojno djeljenje! */ printf("Geometrijska sredina: %g\n", gs);printf("Geometrijska sredina: %g\n", gs);

for (i = 0; i < n; i++)for (i = 0; i < n; i++) if (niz[i] > gs)if (niz[i] > gs) printf("%g\n", niz[i]);printf("%g\n", niz[i]);

free(niz);free(niz); return 0;return 0;}}

Page 102: Programiranje 2 - vježbe

104

Relokacija memorijeRelokacija memorije Zadatak 4.24.Zadatak 4.24. Napišite program koji učitava prirodni broj n te Napišite program koji učitava prirodni broj n te

niz od n prirodnih brojeva. Nakon učitavanja, program treba niz od n prirodnih brojeva. Nakon učitavanja, program treba pronaći proste faktore svih učitanih brojeva te, za svaki pronaći proste faktore svih učitanih brojeva te, za svaki učitani broj posebno, treba ispisati one koji su strogo veći od učitani broj posebno, treba ispisati one koji su strogo veći od aritmetičke sredine svih dobivenih prostih faktoraaritmetičke sredine svih dobivenih prostih faktora

Proste faktore ćemo držati u dvodimenzionalnom polju Proste faktore ćemo držati u dvodimenzionalnom polju pfpf.. pf[i]pf[i] će sadržavati proste faktore i-tog učitanog broja će sadržavati proste faktore i-tog učitanog broja Koliko ima prostih faktora pojedinog broja? Pamtiti broj!Koliko ima prostih faktora pojedinog broja? Pamtiti broj! Broj prostih faktora i-tog broja ćemo zapisati u Broj prostih faktora i-tog broja ćemo zapisati u pf[i][0]pf[i][0], a , a

njegove proste faktore u njegove proste faktore u pf[i][1], pf[i][2], …, pf[i]pf[i][1], pf[i][2], …, pf[i][pf[i][0]][pf[i][0]]

Page 103: Programiranje 2 - vježbe

105

Relokacija memorije – zadatak 4.24.Relokacija memorije – zadatak 4.24.#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>int main(void) {int main(void) { int *a, **pf, i, j, n, pf_cnt = 0;int *a, **pf, i, j, n, pf_cnt = 0; double as = 0; double as = 0; //* * Ucitavanje duljine niza:Ucitavanje duljine niza: */ */ printf("n = "); scanf("%d", &n);printf("n = "); scanf("%d", &n); /* Alokacija memorije i ucitavanje niza a: *//* Alokacija memorije i ucitavanje niza a: */ a = (int*)malloc(n * sizeof(int));a = (int*)malloc(n * sizeof(int)); for (i = 0; i < n; i++) {for (i = 0; i < n; i++) { printf("a[%d] = ", i); scanf("%d", &a[i]);printf("a[%d] = ", i); scanf("%d", &a[i]); }} ... Racunanje prostih faktora...... Racunanje prostih faktora... /* Aritmeticka sredina prostih faktora: *//* Aritmeticka sredina prostih faktora: */ for (i = 0; i < n; i++) {for (i = 0; i < n; i++) { pf_cnt += pf[i][0];pf_cnt += pf[i][0]; for (j = 1; j <= pf[i][0]; j++) as += pf[i][j];for (j = 1; j <= pf[i][0]; j++) as += pf[i][j]; }} as /= pf_cnt;as /= pf_cnt; ... Ispis prostih faktora vecih od as ...... Ispis prostih faktora vecih od as ... /* /* Delokacija memorije:Delokacija memorije: */ */ for (i = 0; i < n; i++) free(pf[i]);for (i = 0; i < n; i++) free(pf[i]); free(pf);free(pf); free(a); free(a); return 0;return 0;}}

Page 104: Programiranje 2 - vježbe

106

Relokacija memorije – zadatak 4.24.Relokacija memorije – zadatak 4.24. Računanje prostih faktora (Računanje prostih faktora (int **pfint **pf))

pf = (int**)malloc(n * sizeof(int*));pf = (int**)malloc(n * sizeof(int*)); for (i = 0; i < n; i++) {for (i = 0; i < n; i++) { int x = a[i], k = 2;int x = a[i], k = 2; pf[i] = (int*)malloc(sizeof(int));pf[i] = (int*)malloc(sizeof(int)); pf[i][0] = 0;pf[i][0] = 0; while (x > 1) {while (x > 1) { if (!(x % k)) {if (!(x % k)) { while (!(x % k)) x /= k;while (!(x % k)) x /= k; pf[i][0]++;pf[i][0]++; pf[i] = (int*)realloc(pf[i] = (int*)realloc( pf[i],pf[i], (pf[i][0] + 1) * sizeof(int)(pf[i][0] + 1) * sizeof(int) );); pf[i][pf[i][0]] = k;pf[i][pf[i][0]] = k; }} k++;k++; }} }}

Page 105: Programiranje 2 - vježbe

107

Relokacija memorije – zadatak 4.24.Relokacija memorije – zadatak 4.24. Ispis prostih faktora većih od aritmetičke sredineIspis prostih faktora većih od aritmetičke sredine

for (i = 0; i < n; i++) {for (i = 0; i < n; i++) { int prvi = 1;int prvi = 1; printf("Faktori od %d: ", a[i]);printf("Faktori od %d: ", a[i]); for (j = 1; j <= pf[i][0]; j++)for (j = 1; j <= pf[i][0]; j++) if (pf[i][j] > as) {if (pf[i][j] > as) { if (prvi)if (prvi) prvi = 0;prvi = 0; elseelse printf(", ");printf(", "); printf("%d", pf[i][j]);printf("%d", pf[i][j]); }} if (prvi) printf("nema");if (prvi) printf("nema"); printf("\n");printf("\n"); }}

Page 106: Programiranje 2 - vježbe

108

StringoviStringovi

String je niz znakova koji završava nul znakom '\0' (ASCII kod 0)String je niz znakova koji završava nul znakom '\0' (ASCII kod 0) string.h sadrži skup funkcija za manipulaciju stringovima, npr:string.h sadrži skup funkcija za manipulaciju stringovima, npr:

strlen, strcpy, strcat, strcmpstrlen, strcpy, strcat, strcmp … … Stringovne konstante se navode unutar dvostrukih navodnika:Stringovne konstante se navode unutar dvostrukih navodnika:

"Pero Peric", "A", "" (prazni niz), "23""Pero Peric", "A", "" (prazni niz), "23" String duljine 10 (npr. "Pero Peric") zauzima 11 byteova u String duljine 10 (npr. "Pero Peric") zauzima 11 byteova u

memoriji.memoriji. Primjeri deklaracije: Primjeri deklaracije: char niz[velicina]; char niz[velicina];

char *niz; char *niz; ((uz obvezni malloc kasnijeuz obvezni malloc kasnije)) Ispis stringa : koristi se format %s, npr. Ispis stringa : koristi se format %s, npr. printf("%s", niz)printf("%s", niz) Primjeri učitavanja stringa:Primjeri učitavanja stringa:

gets(niz);gets(niz); scanf("%s", niz);scanf("%s", niz); scanf("%[^\n]", niz);scanf("%[^\n]", niz); scanf("%[^ \t\n]", niz);scanf("%[^ \t\n]", niz); scanf("%[a-z]", niz);scanf("%[a-z]", niz); scanf("%[^dmp-u]", niz);scanf("%[^dmp-u]", niz);

Page 107: Programiranje 2 - vježbe

109

StringoviStringovi

Zadatak 5.1.Zadatak 5.1. Napišite program koji učitava jednu riječ maksimalne Napišite program koji učitava jednu riječ maksimalne duljine 17 znakova te ispisuje:duljine 17 znakova te ispisuje:a) tu riječa) tu riječb) tu riječ bez prvog znakab) tu riječ bez prvog znakac) treće slovo te riječ (pretpostavite da je riječ dovoljno dugačka)c) treće slovo te riječ (pretpostavite da je riječ dovoljno dugačka)

#include <stdio.h>#include <stdio.h>

int main(void) {int main(void) { char rijec[18];char rijec[18];

printf("Upisite rijec: "); scanf("%s", rijec);printf("Upisite rijec: "); scanf("%s", rijec);

printf("a) rijec: %s\n", rijec);printf("a) rijec: %s\n", rijec); printf("b) rijec bez prvog znaka: %s\n", &rijec[1]);printf("b) rijec bez prvog znaka: %s\n", &rijec[1]); printf("c) treci znak: %c\n", rijec[2]);printf("c) treci znak: %c\n", rijec[2]);

return 0;return 0;}}

Page 108: Programiranje 2 - vježbe

110

Dinamički alocirani stringoviDinamički alocirani stringovi

char *string;char *string;

int len;int len;

printf("Duljinja stringa: ");printf("Duljinja stringa: ");

scanf("%d", &len);scanf("%d", &len);

string = (char*)malloc((len+1)*sizeof(char));string = (char*)malloc((len+1)*sizeof(char));

scanf("%s", string);scanf("%s", string);

Ukoliko je string definiran kao pokazivač prije njegova korištenja Ukoliko je string definiran kao pokazivač prije njegova korištenja (scanf, printf) obavezno treba alocirati memoriju za njega(scanf, printf) obavezno treba alocirati memoriju za njega

Napomena:Napomena:char string[20] char string[20] -> -> sizeof(string)sizeof(string) je 20 je 20

char *string char *string -> -> sizeof(string)sizeof(string) je 4 je 4

Page 109: Programiranje 2 - vježbe

111

Direktno baratanje stringovimaDirektno baratanje stringovima Zadatak 5.2.Zadatak 5.2. Napišite funkciju koja kao argument uzima string, te iz njega Napišite funkciju koja kao argument uzima string, te iz njega

briše sve samoglasnike. Dodatno, napišite i program koji pokazuje kako se briše sve samoglasnike. Dodatno, napišite i program koji pokazuje kako se funkcija upotrebljava.funkcija upotrebljava.

void brisi_samoglasnike(char s[]) {void brisi_samoglasnike(char s[]) { int i, j = 0;int i, j = 0; for (i = 0; s[i] != '\0'; i++) {for (i = 0; s[i] != '\0'; i++) { char c = tolower(s[i]);char c = tolower(s[i]); if (!(c == 'a' || c == 'e' || if (!(c == 'a' || c == 'e' ||

c == 'i' ||c == 'i' || c == 'o' || c == 'u'))c == 'o' || c == 'u')) s[j++] = s[i];s[j++] = s[i]; }} s[j] = '\0';s[j] = '\0';}}

int main (void) {int main (void) { char s[17];char s[17]; printf("Upisite string: ");printf("Upisite string: "); scanf("%[^\n]", s);scanf("%[^\n]", s); brisi_samoglasnike(s);brisi_samoglasnike(s); printf("Rez: \"%s\"\n", s);printf("Rez: \"%s\"\n", s);

return 0;return 0;}}

Page 110: Programiranje 2 - vježbe

112

Direktno baratanje stringovimaDirektno baratanje stringovima Zadatak 5.2.Zadatak 5.2. Napišite funkciju koja kao argument uzima string, te iz Napišite funkciju koja kao argument uzima string, te iz

njega briše sve suglasnike. Dodatno, napišite i program koji pokazuje njega briše sve suglasnike. Dodatno, napišite i program koji pokazuje kako se funkcija upotrebljava.kako se funkcija upotrebljava.

Rješenje 2:Rješenje 2:

void brisi_samoglasnike(char s[]) {void brisi_samoglasnike(char s[]) {

char *i = s;char *i = s;

for (; *i; i++) {for (; *i; i++) {

char c = tolower(*i);char c = tolower(*i);

if (c - 'a' && c - 'e' && c - 'i' &&if (c - 'a' && c - 'e' && c - 'i' &&

c - 'o' && c - 'u')c - 'o' && c - 'u')

*(s++) = *i;*(s++) = *i;

}}

*s = 0;*s = 0;

}}

Page 111: Programiranje 2 - vježbe

113

Direktno baratanje stringovimaDirektno baratanje stringovima

int isalnum(int c)int isalnum(int c) ::je li c slovo ili broj?je li c slovo ili broj? int isalpha(int c)int isalpha(int c) : je li c slovo? : je li c slovo? int isblank(int c)int isblank(int c) : je li c razmak ili '\t' (TAB)? : je li c razmak ili '\t' (TAB)? int isdigit(int c)int isdigit(int c) : je li c znamenka? : je li c znamenka? int isgraph(int c)int isgraph(int c) : je li c znak koji se može ispisati na ekranu : je li c znak koji se može ispisati na ekranu

(osim (osim razmaka)?razmaka)? int islower(int c)int islower(int c) : je li c malo slovo? : je li c malo slovo? int isprint(int c)int isprint(int c) : je li c znak koji se može ispisati na ekranu : je li c znak koji se može ispisati na ekranu

(uključujući i (uključujući i razmak)?razmak)?

int ispunct(int c)int ispunct(int c) : je li c znak koji se može ispisati na ekranu, ali : je li c znak koji se može ispisati na ekranu, ali nije nije

slovo?slovo? int isspace(int c)int isspace(int c) : je li c razmak, '\t', '\n' (skok u novi red), '\f', '\ : je li c razmak, '\t', '\n' (skok u novi red), '\f', '\

r' ili r' ili '\v'?'\v'? int isupper(int c)int isupper(int c) : je li c veliko slovo? : je li c veliko slovo? int isxdigit(int c)int isxdigit(int c) : je li c heksadecimalna znamenka (0, 1, 2, 3, : je li c heksadecimalna znamenka (0, 1, 2, 3,

4, 5, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, A, B, c, D, E, 6, 7, 8, 9, a, b, c, d, e, f, A, B, c, D, E, F)?F)?

Page 112: Programiranje 2 - vježbe

114

Direktno baratanje stringovimaDirektno baratanje stringovima

Zadatak 5.4.Zadatak 5.4. Napišite funkciju koja kao argument prima jedan string te iz Napišite funkciju koja kao argument prima jedan string te iz njega briše svako treće slovo. Napišite i program koji pokazuje kako se njega briše svako treće slovo. Napišite i program koji pokazuje kako se funkcija upotrebljava.funkcija upotrebljava.

#include <stdio.h>#include <stdio.h>#include <ctype.h>#include <ctype.h>

void izbaci(char *s){void izbaci(char *s){int i,j,br=0;int i,j,br=0;for(i=0, j=0 ; s[i] != '\0' ; i++){for(i=0, j=0 ; s[i] != '\0' ; i++){

if (! (isalpha(s[i]) && ++br % 3 == 0) )if (! (isalpha(s[i]) && ++br % 3 == 0) )s[j++] = s[i];s[j++] = s[i];

}}s[j] = '\0';s[j] = '\0';

}}

int main ( void) {int main ( void) {char s[] = char s[] = "Ovo je niz iz kojeg treba izbaciti svako 3. slovo.";"Ovo je niz iz kojeg treba izbaciti svako 3. slovo.";

izbaci(s);izbaci(s);printf("%s\n", s);printf("%s\n", s);return 0;return 0;

}}

Page 113: Programiranje 2 - vježbe

115

Direktno baratanje stringovimaDirektno baratanje stringovima

Zadatak 5.4.Zadatak 5.4. Napišite funkciju koja kao argument prima jedan string te iz Napišite funkciju koja kao argument prima jedan string te iz njega briše svako treće slovo. Napišite i program koji pokazuje kako se njega briše svako treće slovo. Napišite i program koji pokazuje kako se funkcija upotrebljava.funkcija upotrebljava.

Rješenje 2: – umjesto indeksa Rješenje 2: – umjesto indeksa ii i i jj koristimo pomoćni pokazivač koristimo pomoćni pokazivač

void izbaci(char *s){void izbaci(char *s){char *p; int br=0;char *p; int br=0;p = s;p = s;for(; *s ; s++){for(; *s ; s++){

if (! (isalpha(*s) && ++br % 3 == 0) ){if (! (isalpha(*s) && ++br % 3 == 0) ){*p = *s;*p = *s;p++;p++;

}}

}}*p = '\0';*p = '\0';

}}

Page 114: Programiranje 2 - vježbe

116

Direktno baratanje stringovimaDirektno baratanje stringovima

Zadatak 5.6. Zadatak 5.6. Napišite funkciju koja kao argument prima jedan string i Napišite funkciju koja kao argument prima jedan string i jedan znak. Funkcija treba duplicirati svako pojavljivanje tog znaka u jedan znak. Funkcija treba duplicirati svako pojavljivanje tog znaka u zadanom stringu. Npr. ako su zadani string “Popokatepetl” i znak ‘p’, zadanom stringu. Npr. ako su zadani string “Popokatepetl” i znak ‘p’, promijenjeni string treba biti “Poppokateppetl”. Napišite i program promijenjeni string treba biti “Poppokateppetl”. Napišite i program kojim testirate funkciju. Možete pretpostaviti da je za string alocirano kojim testirate funkciju. Možete pretpostaviti da je za string alocirano dovoljno memorije da se promjena može izvesti.dovoljno memorije da se promjena može izvesti.

Uputa: ići s desna na lijevo. Inače bi “pregazili” postojeće vrijednostiUputa: ići s desna na lijevo. Inače bi “pregazili” postojeće vrijednosti

Page 115: Programiranje 2 - vježbe

117

Zadatak 5.6.Zadatak 5.6.#include <stdio.h>#include <stdio.h>#include <ctype.h>#include <ctype.h>

void dupliciraj_c(char s[], char c) {void dupliciraj_c(char s[], char c) { int i, j = 0;int i, j = 0; for (i = 0; s[i] != '\0'; i++)for (i = 0; s[i] != '\0'; i++) if (s[i] == c) j++;if (s[i] == c) j++; for (; i >= 0; i--) {for (; i >= 0; i--) { s[i + j] = s[i];s[i + j] = s[i]; if (s[i] == c) s[i + (--j)] = s[i];if (s[i] == c) s[i + (--j)] = s[i]; }}}}

int main (void) {int main (void) { char s[17];char s[17];

printf("Upisite string: ");printf("Upisite string: "); scanf("%[^\n]", s);scanf("%[^\n]", s); dupliciraj_c(s, 'p');dupliciraj_c(s, 'p'); printf("Rezultat: \"%s\"\n", s);printf("Rezultat: \"%s\"\n", s);

return 0;return 0;}}

Page 116: Programiranje 2 - vježbe

118

Direktno baratanje stringovimaDirektno baratanje stringovima

Zadatak 5.9.Zadatak 5.9. Napišite funkciju Napišite funkciju

void tr(char s[], char f[], char t[])void tr(char s[], char f[], char t[])

koja u stringu s zamjenjuje svaki znak iz f s odgovarajućim znakom iz koja u stringu s zamjenjuje svaki znak iz f s odgovarajućim znakom iz t. Npr., ako su dani stringovi “Pero Sapun”, “pas” i “mir”, onda prvi t. Npr., ako su dani stringovi “Pero Sapun”, “pas” i “mir”, onda prvi string treba postati “Pero Simun” (jer ‘p’ prelazim u ‘m’, ‘a’ u ‘i’, ‘s’ u string treba postati “Pero Simun” (jer ‘p’ prelazim u ‘m’, ‘a’ u ‘i’, ‘s’ u ‘r’; pri tome se znakovi ‘S’ i ‘s’ razlikuju). Možete pretpostaviti da su ‘r’; pri tome se znakovi ‘S’ i ‘s’ razlikuju). Možete pretpostaviti da su stringovi f i t jednake duljine.stringovi f i t jednake duljine.

void tr(char s[], char f[], char t[]) {void tr(char s[], char f[], char t[]) {

int i, j = 0;int i, j = 0;

for (i = 0; s[i] != '\0'; i++)for (i = 0; s[i] != '\0'; i++)

for (j = 0; f[j] != '\0'; j++)for (j = 0; f[j] != '\0'; j++)

if (s[i] == f[j]) {if (s[i] == f[j]) {

s[i] = t[j];s[i] = t[j];

break;break;

}}

}}

Page 117: Programiranje 2 - vježbe

119

Direktno baratanje stringovimaDirektno baratanje stringovima Zadatak 5.15. Bez korištenja specifičnih funkcija za rad sa stringovima, napišite funkciju Zadatak 5.15. Bez korištenja specifičnih funkcija za rad sa stringovima, napišite funkciju

koja prima jedan niz znakova i jedan string te vraća 1 ako se string može dobiti koja prima jedan niz znakova i jedan string te vraća 1 ako se string može dobiti permutacijom nekih elemenata niza; u protivnom treba vratiti nulu.permutacijom nekih elemenata niza; u protivnom treba vratiti nulu.

int isperm (const char niz[] , int n , const char rijec[]) {int i ; char *niz2;

niz2 = (char *) malloc (n sizeof (char) );∗for ( i = 0 ; i < n ; i++)

niz2 [i] = niz[i];

while (*rijec) { for ( i = 0 ; i < n ; i++) { if (niz2[i] == rijec) {∗ niz2[i] = ’\0’ ;

rijec++; break ;

} }

if ( i == n) break ;}

free ( niz2 ) ; return rijec == '\0' ;∗}

Page 118: Programiranje 2 - vježbe

120

Direktno baratanje stringovimaDirektno baratanje stringovima Zadatak 5.17. Napišite funkciju Zadatak 5.17. Napišite funkciju

int palindrom(char *s)int palindrom(char *s)koja vraća 1 ako je string s palindrom; inače treba vratiti 0. Funkcije treba biti koja vraća 1 ako je string s palindrom; inače treba vratiti 0. Funkcije treba biti case-insensitive (tj. ne smije raditi razliku između velikih i malih slova) te case-insensitive (tj. ne smije raditi razliku između velikih i malih slova) te mora ignorirati sve znakove koji nisu slovo. Pri tome ne smije mijenjati string mora ignorirati sve znakove koji nisu slovo. Pri tome ne smije mijenjati string s. Npr. string “Ana voli: Milovana!” treba prepoznati kao palindrom.s. Npr. string “Ana voli: Milovana!” treba prepoznati kao palindrom.

int palindrom(char *s){int palindrom(char *s){int i=0,j;int i=0,j;for(j=0 ; s[j]!='\0'; j++);for(j=0 ; s[j]!='\0'; j++);while(i < j){while(i < j){

if (!isalpha(s[i])){if (!isalpha(s[i])){i++; continue;i++; continue;

}}if (!isalpha(s[j])){if (!isalpha(s[j])){

j--; continue;j--; continue;}}if (tolower(s[i]) != tolower(s[j]))if (tolower(s[i]) != tolower(s[j]))

return 0;return 0;else{else{

i++;j--;i++;j--;}}

}}return 1;return 1;

}}

Page 119: Programiranje 2 - vježbe

121

Specifične funkcije za rad sa stringovimaSpecifične funkcije za rad sa stringovima

strlen(s)strlen(s) : vraća duljinu stringa : vraća duljinu stringa

strcpy(dest, src)strcpy(dest, src) : u string : u string destdest kopira sadržaj stringa kopira sadržaj stringa srcsrc

pogrešno: pogrešno: dest = srcdest = src (nije kopiranje sadržaja već pridruživanje adresa) (nije kopiranje sadržaja već pridruživanje adresa)

strcat(dest, src)strcat(dest, src) : nadopisuje sadržaj stringa : nadopisuje sadržaj stringa srcsrc na string na string destdest

strcmp(s1, s2) strcmp(s1, s2) vraćavraća 0 ako su s1 i s2 jednaki0 ako su s1 i s2 jednaki <0 ako je s1 leksikografski ispred s2<0 ako je s1 leksikografski ispred s2 >0 ako je s2 leksikografski ispred s1>0 ako je s2 leksikografski ispred s1

pogrešno:pogrešno: s1 == s2 s1 == s2 (nije usporedba sadržaja već adresa)(nije usporedba sadržaja već adresa) strcasecmp strcasecmp je sličan je sličan strcmpstrcmp ali "case insensitive" ali "case insensitive" (u Visual Studiu (u Visual Studiu

koristiti strcmpi ili stricmp)koristiti strcmpi ili stricmp)

Page 120: Programiranje 2 - vježbe

122

Specifične funkcijeSpecifične funkcije za rad sa stringovimaza rad sa stringovima

Zadatak 5.19.Zadatak 5.19. Napišite program koji učitava jednu riječ Napišite program koji učitava jednu riječ ss duljine duljine najviše 19 znakova i prirodni broj najviše 19 znakova i prirodni broj nn. Program treba u varijabli . Program treba u varijabli s2s2 kreirati najkraću riječ koja se sastoji od kopija riječi kreirati najkraću riječ koja se sastoji od kopija riječi ss “lijepljenih” “lijepljenih” jedne iza druge, tako da duljina stringa jedne iza druge, tako da duljina stringa s2s2 bude barem bude barem nn. Npr. za . Npr. za riječ “Pero” i n=17, s2 treba biti “PeroPeroPeroPeroPero” (string riječ “Pero” i n=17, s2 treba biti “PeroPeroPeroPeroPero” (string duljine 20 znakova), jer s jednom kopijom manje taj string ima samo duljine 20 znakova), jer s jednom kopijom manje taj string ima samo 16 < n znakova)16 < n znakova)

Rješenje: Rješenje: Ukoliko je n djeljiv s duljinom niza, onda imamo n/strlen(s) ponavljanja, tj. Ukoliko je n djeljiv s duljinom niza, onda imamo n/strlen(s) ponavljanja, tj.

ukupna duljina je ukupna duljina je strlen(s)*n/strlen(s)strlen(s)*n/strlen(s) što je n. što je n. Ukoliko n nije djeljiv s duljinom niza (npr. n=17, Ukoliko n nije djeljiv s duljinom niza (npr. n=17, strlen(“Pero”)strlen(“Pero”) je 4), je 4),

onda je broj ponavljanja: onda je broj ponavljanja:

n/strlen(s) + 1n/strlen(s) + 1 ( 17/4 + 1 = 5 ) ( 17/4 + 1 = 5 )

pa je duljina niza pa je duljina niza

strlen(s)*(n/strlen(s)+1)strlen(s)*(n/strlen(s)+1) Pri alociranju memorije za s2 uzeti duljinu + 1 mjesto za nul znakPri alociranju memorije za s2 uzeti duljinu + 1 mjesto za nul znak

Page 121: Programiranje 2 - vježbe

123

Zadatak 5.19.Zadatak 5.19.#include <stdio.h>#include <stdio.h>#include <string.h>#include <string.h>#include <stdlib.h>#include <stdlib.h>

int main (void) {int main (void) { char s[20], *s2; int n;char s[20], *s2; int n; printf("Unesite rijec: "); scanf("%s", s);printf("Unesite rijec: "); scanf("%s", s); printf("Unesite broj: "); scanf("%d", &n);printf("Unesite broj: "); scanf("%d", &n); /* Racunanje duljine stringa s2 i alokacija memorije: *//* Racunanje duljine stringa s2 i alokacija memorije: */ if (n % strlen(s))if (n % strlen(s)) n = (n / strlen(s) + 1) * strlen(s);n = (n / strlen(s) + 1) * strlen(s); s2 = (char*)malloc((n + 1) * sizeof(char));s2 = (char*)malloc((n + 1) * sizeof(char));

/* Kopiranje stringa s u s2: *//* Kopiranje stringa s u s2: */ strcpy(s2, s);strcpy(s2, s);

/* Lijepljenje stringa s na kraj s2: *//* Lijepljenje stringa s na kraj s2: */ while (strlen(s2) < n) strcat(s2, s);while (strlen(s2) < n) strcat(s2, s);

printf("s2 = \"%s\"\n", s2);printf("s2 = \"%s\"\n", s2); free(s2);free(s2); return 0;return 0;}}

Page 122: Programiranje 2 - vježbe

124

Specifične funkcije za rad sa stringovimaSpecifične funkcije za rad sa stringovima

Zadatak 5.18. Zadatak 5.18. Napišite program koji učitava string Napišite program koji učitava string ss (najviše 17 (najviše 17 znakova) te kreira string znakova) te kreira string s2s2 koji se sastoji od kopija dijelova stringa koji se sastoji od kopija dijelova stringa ss. . Prva kopija treba biti cijela, druga bez prvog znaka, treća bez drugog Prva kopija treba biti cijela, druga bez prvog znaka, treća bez drugog znaka, itd… Npr. od stringa znaka, itd… Npr. od stringa “Pero”“Pero” treba proizvesti string treba proizvesti string “Peroeroroo”“Peroeroroo”

Ako je duljina stringa Ako je duljina stringa ss jednaka jednaka dd onda je duljina stringa onda je duljina stringa s2s2

Pripaziti: Pripaziti: n/2 * (n+1)n/2 * (n+1) ne mora biti isto što i ne mora biti isto što i n*(n+1)/2n*(n+1)/2 zbog zbog cjelobrojnog dijeljenjacjelobrojnog dijeljenja

Page 123: Programiranje 2 - vježbe

125

Zadatak 5.18 (odsječak glavnog programa)Zadatak 5.18 (odsječak glavnog programa) char s[18], *s2; int m, n, i;char s[18], *s2; int m, n, i; printf("Unesite string: "); scanf("%[^\n]", s);printf("Unesite string: "); scanf("%[^\n]", s);

/* Racunanje duljine stringa s2: *//* Racunanje duljine stringa s2: */ n = strlen(s); m = n * (n + 1) / 2;n = strlen(s); m = n * (n + 1) / 2; printf("Duljina s2: %d\n", m);printf("Duljina s2: %d\n", m);

/* Alokacija memorije za s2: *//* Alokacija memorije za s2: */ s2 = (char*)malloc((m + 1) * sizeof(char));s2 = (char*)malloc((m + 1) * sizeof(char));

/* Postavljanje vrijednosti stringa s na prazni string: *//* Postavljanje vrijednosti stringa s na prazni string: */ *s2 = '\0'; /* ili s2[0] = '\0'; */*s2 = '\0'; /* ili s2[0] = '\0'; */

/* Lijepljenje stringa s na kraj s2: *//* Lijepljenje stringa s na kraj s2: */ for (i = 0; i < n; i++) strcat(s2, &s[i]);for (i = 0; i < n; i++) strcat(s2, &s[i]);

/* Ispis rezultata: *//* Ispis rezultata: */ printf("s2 = \"%s\"\n", s2);printf("s2 = \"%s\"\n", s2);

/* Oslobadjanje alocirane memorije: *//* Oslobadjanje alocirane memorije: */ free(s2);free(s2);

Page 124: Programiranje 2 - vježbe

126

Specifične funkcije za rad sa stringovimaSpecifične funkcije za rad sa stringovima

Zadatak 5.22.Zadatak 5.22. Napišite program koji učitava riječ Napišite program koji učitava riječ ss od najviše 20 od najviše 20 znakova te stvara novi riječ znakova te stvara novi riječ s2s2 koja se sastoji od invertirane riječi koja se sastoji od invertirane riječi ss iza koje nalijepite originalnu riječ iza koje nalijepite originalnu riječ ss. Npr., od riječi “Pero” treba dobiti . Npr., od riječi “Pero” treba dobiti riječ “orePPero”. Napomena: String riječ “orePPero”. Napomena: String ss na kraju izvršavanja programa na kraju izvršavanja programa mora biti nepromijenjen.mora biti nepromijenjen.

Uputa: Napišite funkciju za invertiranje stringa.Uputa: Napišite funkciju za invertiranje stringa.

Page 125: Programiranje 2 - vježbe

127

Zadatak 5.22Zadatak 5.22#include <stdio.h>#include <stdio.h>#include <string.h>#include <string.h>

void invertiraj(char *s) {void invertiraj(char *s) { int i, n = strlen(s);int i, n = strlen(s); for (i = 0; i < n/2; i++) {for (i = 0; i < n/2; i++) { char c = s[i];char c = s[i]; s[i] = s[n - 1 - i];s[i] = s[n - 1 - i]; s[n - 1 - i] = c;s[n - 1 - i] = c; }}}}

int main (void) {int main (void) { char s[21], s2[41];char s[21], s2[41];

printf("Unesite rijec: "); scanf("%s", s);printf("Unesite rijec: "); scanf("%s", s); strcpy(s2, s);strcpy(s2, s); invertiraj(s2);invertiraj(s2); strcat(s2, s);strcat(s2, s); printf("s2 = \"%s\"\n", s2);printf("s2 = \"%s\"\n", s2); return 0;return 0;}}

Page 126: Programiranje 2 - vježbe

128

Nizovi stringovaNizovi stringova

typedef char moj_string[21]typedef char moj_string[21]

moj_string s moj_string s char s[21] char s[21]

moj_string niz[10] moj_string niz[10] char niz[10][21] char niz[10][21]

typedef char moj_string[21]typedef char moj_string[21]

moj_string *niz; moj_string *niz; char (*niz)[21] char (*niz)[21]

char *niz[10]char *niz[10]

char **niz;char **niz;

Page 127: Programiranje 2 - vježbe

129

Nizovi stringovaNizovi stringova

Zadatak 5.27.Zadatak 5.27. Napišite program koji učitava prirodni broj n te niz od Napišite program koji učitava prirodni broj n te niz od n riječi sa po strogo manje od 17 znakova. Niz treba sortirati silazno n riječi sa po strogo manje od 17 znakova. Niz treba sortirati silazno (poštujući razliku velikih i malih slova), usporedbom stringova bez (poštujući razliku velikih i malih slova), usporedbom stringova bez prvog slova (dakle, string “Pero” dolazi ispred stringa “Ivan” jer je prvog slova (dakle, string “Pero” dolazi ispred stringa “Ivan” jer je “van” leksikografski veće od “ero”, a niz sortiramo silazno). Na kraju “van” leksikografski veće od “ero”, a niz sortiramo silazno). Na kraju je potrebno ispisati sortirani niz.je potrebno ispisati sortirani niz.

Page 128: Programiranje 2 - vježbe

130

Zadatak 5.27Zadatak 5.27#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>#include <string.h>#include <string.h>typedef char moj_string[17];typedef char moj_string[17];

int main (void) {int main (void) { moj_string *s;moj_string *s; int n, i, j; int n, i, j; printf("Koliko rijeci? "); scanf("%d", &n);printf("Koliko rijeci? "); scanf("%d", &n); //** Alociranje memorije za n stringova od Alociranje memorije za n stringova od najvise 16 znakova */ najvise 16 znakova */ s = (moj_string*)malloc(n * sizeof(moj_string));s = (moj_string*)malloc(n * sizeof(moj_string)); for (i = 0; i < n; i++) {for (i = 0; i < n; i++) { printf("Rijec %d: ", i + 1);printf("Rijec %d: ", i + 1); scanf("%s", s[i]);scanf("%s", s[i]); }} for (i = 0; i < n - 1; i++)for (i = 0; i < n - 1; i++) for (j = i + 1; j < n; j++)for (j = i + 1; j < n; j++) if (strcmp(&s[i][1], &s[j][1]) < 0) {if (strcmp(&s[i][1], &s[j][1]) < 0) {//* ili * ili strcmp(s[i]+1, s[j]+1)strcmp(s[i]+1, s[j]+1) */ */ moj_string t;moj_string t; strcpy(t, s[i]);strcpy(t, s[i]); strcpy(s[i], s[j]);strcpy(s[i], s[j]); strcpy(s[j], t);strcpy(s[j], t); }}

for (i = 0; i < n; i++)for (i = 0; i < n; i++) printf("%s ", s[i]);printf("%s ", s[i]); printf("\n");printf("\n"); free(s);free(s); return 0;return 0;}}

Page 129: Programiranje 2 - vježbe

131

StruktureStrukture Kao novi tip, pomoću typedefKao novi tip, pomoću typedef

typedef struct {typedef struct { char ime[20];char ime[20]; char inicijal;char inicijal; int starost;int starost; int br_cipela;int br_cipela;} osoba;} osoba;

Kao nove tipove, ali bez typedefKao nove tipove, ali bez typedefstruct osoba {struct osoba { char ime[20];char ime[20]; char inicijal;char inicijal; int starost;int starost; int br_cipela;int br_cipela;};};

Bez deklaracije tipaBez deklaracije tipastruct {struct { char ime[20];char ime[20]; char inicijal;char inicijal; int starost;int starost; int br_cipela;int br_cipela;} x;} x;

struct {struct { char ime[20];char ime[20]; char inicijal;char inicijal; int starost;int starost; int br_cipela;int br_cipela;} y, z;} y, z;

osoba x, y, z;osoba x, y, z;

struct osoba x, y, z;struct osoba x, y, z;

Deklaracija novih varijabli istog tipaDeklaracija novih varijabli istog tipa

Page 130: Programiranje 2 - vježbe

132

StruktureStrukture

Valjana je i sljedeća konstrukcijaValjana je i sljedeća konstrukcija

typedef struct _osoba {typedef struct _osoba {

char ime[20];char ime[20];

char inicijal;char inicijal;

int starost;int starost;

int br_cipela;int br_cipela;

} osoba;} osoba;

Deklaracija varijabli:Deklaracija varijabli:

struct _osoba x, y;struct _osoba x, y;

osoba z, w;osoba z, w; Učitavanje i ispis:Učitavanje i ispis:

scanf("%d", &z.starost); scanf("%c", &z.inicijal);scanf("%d", &z.starost); scanf("%c", &z.inicijal);

printf("%d", z.starost); printf("%c", z.inicijal);printf("%d", z.starost); printf("%c", z.inicijal);

scanf("%s", z.ime); printf("%s", z.ime);scanf("%s", z.ime); printf("%s", z.ime);

Page 131: Programiranje 2 - vježbe

133

StruktureStrukture Zadatak 6.1.Zadatak 6.1. Napišite program koji učitava podatke o dvije osobe (deklarirane Napišite program koji učitava podatke o dvije osobe (deklarirane

kao u primjeru s početka poglavlja), zamjenjuje te podatke i ispisuje ih. kao u primjeru s početka poglavlja), zamjenjuje te podatke i ispisuje ih. Napomena: Za učitavanje i ispis ćemo koristiti funkcije.Napomena: Za učitavanje i ispis ćemo koristiti funkcije.

#include <stdio.h>#include <stdio.h>

typedef struct _osoba {typedef struct _osoba {

char ime[20];char ime[20];

char inicijal;char inicijal;

int starost;int starost;

int br_cipela;int br_cipela;

} osoba;} osoba;

int main (void) {int main (void) {

osoba osoba1, osoba2, temp;osoba osoba1, osoba2, temp;

printf("Osoba 1:\n"); ucitaj(&osoba1);printf("Osoba 1:\n"); ucitaj(&osoba1);

printf("Osoba 2:\n"); ucitaj(&osoba2);printf("Osoba 2:\n"); ucitaj(&osoba2);

/* zamjena *//* zamjena */

temp = osoba1; osoba1 = osoba2; osoba2 = temp;temp = osoba1; osoba1 = osoba2; osoba2 = temp;

/* Ispis: *//* Ispis: */

printf("Osoba 1:\n"); ispisi(osoba1);printf("Osoba 1:\n"); ispisi(osoba1);

printf("Osoba 2:\n"); ispisi(osoba2);printf("Osoba 2:\n"); ispisi(osoba2);

return 0;return 0;

}}

Page 132: Programiranje 2 - vježbe

134

Strukture – Zadatak 6.1.Strukture – Zadatak 6.1.

void ispisi(osoba o) {void ispisi(osoba o) { printf(" Ime: %s\n", o.ime);printf(" Ime: %s\n", o.ime); printf(" Inicijal prezimena: %c\n", o.inicijal);printf(" Inicijal prezimena: %c\n", o.inicijal); printf(" Starost: %d\n", o.starost);printf(" Starost: %d\n", o.starost); printf(" Broj cipela: %d\n", o.br_cipela);printf(" Broj cipela: %d\n", o.br_cipela);}}

void ucitaj(osoba *o) {void ucitaj(osoba *o) { printf(" Ime: ");printf(" Ime: "); scanf("%s", (*o).ime);scanf("%s", (*o).ime); printf(" Inicijal prezimena: ");printf(" Inicijal prezimena: "); scanf(" %c", &((*o).inicijal));scanf(" %c", &((*o).inicijal)); printf(" Starost: ");printf(" Starost: "); scanf("%d", &((*o).starost));scanf("%d", &((*o).starost)); printf(" Broj cipela: ");printf(" Broj cipela: "); scanf("%d", &((*o).br_cipela));scanf("%d", &((*o).br_cipela));}}

Page 133: Programiranje 2 - vježbe

135

Strukture – Zadatak 6.1Strukture – Zadatak 6.1

(*varijabla).clan (*varijabla).clan varijabla->clan varijabla->clan

void ucitaj(osoba *o) {void ucitaj(osoba *o) {

printf(" Ime: ");printf(" Ime: ");

scanf("%s", o->ime);scanf("%s", o->ime);

printf(" Inicijal prezimena: ");printf(" Inicijal prezimena: ");

scanf(" %c", &o->inicijal);scanf(" %c", &o->inicijal);

printf(" Starost: ");printf(" Starost: ");

scanf("%d", &o->starost);scanf("%d", &o->starost);

printf(" Broj cipela: ");printf(" Broj cipela: ");

scanf("%d", &o->br_cipela);scanf("%d", &o->br_cipela);

}}

Page 134: Programiranje 2 - vježbe

136

StruktureStrukture Zadatak 6.2.Zadatak 6.2. Deklarirajte tip (strukturu) za pohranu jednog kompleksnog broja Deklarirajte tip (strukturu) za pohranu jednog kompleksnog broja

te napišite funkcije za zbrajanje, množenje, konjugiranje i ispis kompleksnih te napišite funkcije za zbrajanje, množenje, konjugiranje i ispis kompleksnih brojeva. Napišite i program za testiranje napisanih funkcija.brojeva. Napišite i program za testiranje napisanih funkcija.

Napomena: Prikazano rješenje sadrži samo množenje i ispis.Napomena: Prikazano rješenje sadrži samo množenje i ispis.#include <stdio.h>#include <stdio.h>

typedef struct {typedef struct { double x, y;double x, y;} complex;} complex;

int main (void) {int main (void) { complex a = {1, 2}, b = {-3.1, 2.7};complex a = {1, 2}, b = {-3.1, 2.7};

printf("(");printf("("); complex_print(a);complex_print(a); printf(") * (");printf(") * ("); complex_print(b);complex_print(b); printf(") = ");printf(") = "); complex_print(complex_multiply(a, b));complex_print(complex_multiply(a, b)); printf("\n");printf("\n");

return 0;return 0;}}

Page 135: Programiranje 2 - vježbe

137

Strukture – Zadatak 6.2Strukture – Zadatak 6.2complex complex_multiply(complex x, complex y) {complex complex_multiply(complex x, complex y) { complex res = {complex res = { x.x * y.x - x.y * y.y,x.x * y.x - x.y * y.y, x.y * y.x + x.x * y.yx.y * y.x + x.x * y.y };}; return res;return res;}}

iliili

complex complex_multiply(complex x, complex y) {complex complex_multiply(complex x, complex y) { complex res;complex res; res.x = x.x * y.x - x.y * y.y;res.x = x.x * y.x - x.y * y.y; res.y = x.y * y.x + x.x * y.y;res.y = x.y * y.x + x.x * y.y; return res;return res;}}

void complex_print(complex x) {void complex_print(complex x) { if (x.y < 0)if (x.y < 0) printf("%g + i * (%g)", x.x, x.y);printf("%g + i * (%g)", x.x, x.y); elseelse printf("%g + i * %g", x.x, x.y);printf("%g + i * %g", x.x, x.y);}}

Page 136: Programiranje 2 - vježbe

138

StruktureStrukture

Ispravno:Ispravno:complex res = {complex res = { x.x * y.x - x.y * y.y,x.x * y.x - x.y * y.y, x.y * y.x + x.x * y.yx.y * y.x + x.x * y.y }; };

Neispravno:Neispravno:

return {x.x * y.x - x.y * y.y, x.y * y.x + x.x * y.y};return {x.x * y.x - x.y * y.y, x.y * y.x + x.x * y.y};

iliili

complex res;complex res;res = {x.x * y.x - x.y * y.y, x.y * y.x + x.x * y.y};res = {x.x * y.x - x.y * y.y, x.y * y.x + x.x * y.y};

Page 137: Programiranje 2 - vježbe

139

StruktureStrukture Zadatak 6.4.Zadatak 6.4. Deklarirajte tip podatka u kojem ćete držati naziv jednog Deklarirajte tip podatka u kojem ćete držati naziv jednog

automobila (najviše 30 znakova) i njegovu cijenu (cijeli broj). Napišite program automobila (najviše 30 znakova) i njegovu cijenu (cijeli broj). Napišite program koji učitava prirodni broj n te podatke o n automobila. Program treba sortirati koji učitava prirodni broj n te podatke o n automobila. Program treba sortirati niz automobila padajuće po cijeni te ispisati tako sortirane automobile i niz automobila padajuće po cijeni te ispisati tako sortirane automobile i njihove cijene.njihove cijene.

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>

typedef struct {typedef struct { char naziv[31];char naziv[31]; int cijena;int cijena;} automobil;} automobil;

int main (void) {int main (void) { automobil *auti; automobil *auti; int n, i, j;int n, i, j;

... Ucitavanje (s alokacijom memorije) ...... Ucitavanje (s alokacijom memorije) ... ... Sort ...... Sort ... ... Ispis ...... Ispis ... free(auti);free(auti); return 0;return 0;}}

Da smo znali veličinu niza unaprijed (npr. 50):Da smo znali veličinu niza unaprijed (npr. 50):

automobil auti[50]; /*bez alokacije i automobil auti[50]; /*bez alokacije i free */free */

Page 138: Programiranje 2 - vježbe

140

Strukture – Zadatak 6.4Strukture – Zadatak 6.4

Učitavanje (s alokacijom memorije):Učitavanje (s alokacijom memorije):

printf("Koliko automobila? ");printf("Koliko automobila? ");

scanf("%d", &n);scanf("%d", &n);

auti = (automobil*)malloc(n * sizeof(automobil));auti = (automobil*)malloc(n * sizeof(automobil));

for (i = 0; i < n; i++) {for (i = 0; i < n; i++) {

printf("Automobil %d:\n Naziv: ", i + 1);printf("Automobil %d:\n Naziv: ", i + 1);

scanf(" %[^\n]", scanf(" %[^\n]", auti[i].nazivauti[i].naziv););

printf(" Cijena: ");printf(" Cijena: ");

scanf("%d", scanf("%d", &auti[i].cijena&auti[i].cijena););

}}

Page 139: Programiranje 2 - vježbe

141

Strukture – Zadatak 6.4Strukture – Zadatak 6.4

SortiranjeSortiranje

for (i = 0; i < n - 1; i++)for (i = 0; i < n - 1; i++)

for (j = i + 1; j < n; j++)for (j = i + 1; j < n; j++)

if (auti[i].cijena < auti[j].cijena) {if (auti[i].cijena < auti[j].cijena) {

automobil temp = auti[i];automobil temp = auti[i];

auti[i] = auti[j];auti[i] = auti[j];

auti[j] = temp;auti[j] = temp;

}}

Pogrešno:Pogrešno:

if (auti[i] < auti[j])if (auti[i] < auti[j])

Page 140: Programiranje 2 - vježbe

142

Strukture – Zadatak 6.4Strukture – Zadatak 6.4

IspisIspis

printf("%-30s Cijena\n", "Naziv");printf("%-30s Cijena\n", "Naziv");

for (i = 0; i < 37; i++) for (i = 0; i < 37; i++)

printf("-");printf("-");

printf("\n");printf("\n");

for (i = 0; i < n; i++)for (i = 0; i < n; i++)

printf("%-30s %6d\n", auti[i].naziv, auti[i].cijena);printf("%-30s %6d\n", auti[i].naziv, auti[i].cijena);

Page 141: Programiranje 2 - vježbe

143

Vezane listeVezane liste

Zadatak 7.1.Zadatak 7.1. Napišite program koji učitava listu automobila (za Napišite program koji učitava listu automobila (za svakog treba učitati naziv (string do 30 znakova) i cijenu (cijeli svakog treba učitati naziv (string do 30 znakova) i cijenu (cijeli broj)). Program treba ispisati one automobile (naziv i cijenu) broj)). Program treba ispisati one automobile (naziv i cijenu) koji su skuplji od prosjeka.koji su skuplji od prosjeka.

typedef struct _automobil {typedef struct _automobil {

int cijena;int cijena;

char naziv[31];char naziv[31];

struct _automobil *next;struct _automobil *next;

} automobil;} automobil;

Page 142: Programiranje 2 - vježbe

144

Vezane liste – Zadatak 7.1.Vezane liste – Zadatak 7.1.int main (void) {int main (void) { automobil *first = NULL, *pom, *pom2; int prosjek = 0, n = 0; automobil *first = NULL, *pom, *pom2; int prosjek = 0, n = 0;

char c;char c;

/* Ucitavanje liste *//* Ucitavanje liste */ do {do { automobil *new;automobil *new; new = (automobil*) malloc(sizeof(automobil));new = (automobil*) malloc(sizeof(automobil)); printf("Naziv automobila: "); scanf(" %[^\n]", new->naziv);printf("Naziv automobila: "); scanf(" %[^\n]", new->naziv); printf("Cijena automobila: "); scanf("%d", &new->cijena);printf("Cijena automobila: "); scanf("%d", &new->cijena); if (first)if (first) pom = pom->next = new;pom = pom->next = new; elseelse pom = first = new;pom = first = new; do {do { printf("Zelite li nastaviti ucitavanje "); printf("(d/n)? ");printf("Zelite li nastaviti ucitavanje "); printf("(d/n)? "); scanf(" %c", &c); c = tolower(c);scanf(" %c", &c); c = tolower(c); } } while (c != 'd' && c != 'n');while (c != 'd' && c != 'n'); } } while (c == 'd');while (c == 'd');

pom->next = NULL;pom->next = NULL;

Page 143: Programiranje 2 - vježbe

145

Vezane liste – Zadatak 7.1.Vezane liste – Zadatak 7.1. /* Racunanje prosjecne cijene i duljine liste *//* Racunanje prosjecne cijene i duljine liste */ for (pom = first; pom; pom = pom->next) {for (pom = first; pom; pom = pom->next) { prosjek += pom->cijena;prosjek += pom->cijena; n++;n++; }} prosjek /= n;prosjek /= n;

/* Pomocni ispis *//* Pomocni ispis */ printf("Ukupno automobila: %d\n", n); printf("Ukupno automobila: %d\n", n); printf("Prosjecna cijena: %d\n", prosjek);printf("Prosjecna cijena: %d\n", prosjek);

/* Ispis auta koji su skuplji od prosjeka *//* Ispis auta koji su skuplji od prosjeka */ printf("Natprosjecno skupi automobili:\n");printf("Natprosjecno skupi automobili:\n"); for (pom = first; pom; pom = pom->next)for (pom = first; pom; pom = pom->next) if (pom->cijena > prosjek)if (pom->cijena > prosjek) printf(" %s (%d)\n", pom->naziv, pom->cijena);printf(" %s (%d)\n", pom->naziv, pom->cijena);

/* Brisanje cijele liste *//* Brisanje cijele liste */ for (pom = first; pom; pom = pom2) {for (pom = first; pom; pom = pom2) { pom2 = pom->next;pom2 = pom->next; free(pom);free(pom); }} return 0;return 0;}}

Page 144: Programiranje 2 - vježbe

146

Vezane listeVezane liste

Pogrešno brisanje liste:Pogrešno brisanje liste:

for (pom = first; pom != NULL; pom = pom->next)for (pom = first; pom != NULL; pom = pom->next)

free(pom);free(pom);

Napomena: Čak i da je broj elemenata liste bio poznat Napomena: Čak i da je broj elemenata liste bio poznat unaprijed (npr. da prvo pitamo koliko će automobila biti), unaprijed (npr. da prvo pitamo koliko će automobila biti), memoriju za vezanu listu moramo alocirati za svaki element memoriju za vezanu listu moramo alocirati za svaki element posebno.posebno.

Page 145: Programiranje 2 - vježbe

147

Vezane listeVezane liste

Zadatak 7.2.Zadatak 7.2. Definirajte tip podatka razlomak za pohranu razlomaka Definirajte tip podatka razlomak za pohranu razlomaka u vezanoj listi (tako da bude moguće deklarirati varijablu u vezanoj listi (tako da bude moguće deklarirati varijablu razlomak razlomak rr) te napišite funkciju koja dodaje jedan razlomak (određen ) te napišite funkciju koja dodaje jedan razlomak (određen parametrima x i y) na početak liste razlomaka. Napišite i kako se parametrima x i y) na početak liste razlomaka. Napišite i kako se funkcija pozivafunkcija pozivatypedef struct _razlomak {typedef struct _razlomak { int br, naz;int br, naz; struct _razlomak *next;struct _razlomak *next;} razlomak;} razlomak;

razlomak *insert(razlomak *first, int x, int y) {razlomak *insert(razlomak *first, int x, int y) { razlomak *new = (razlomak*)malloc(sizeof(razlomak));razlomak *new = (razlomak*)malloc(sizeof(razlomak)); new->br = x;new->br = x; new->naz = y;new->naz = y; new->next = first;new->next = first; return new;return new;}}

Poziv: Poziv: first = insert(first, br, naz);first = insert(first, br, naz); Na početku:Na početku: razlomak *first = NULL; razlomak *first = NULL;

Page 146: Programiranje 2 - vježbe

148

Vezane listeVezane liste Zadatak 7.3.Zadatak 7.3. Napišite funkciju Napišite funkciju deletedelete koja kao argument uzima pokazivač na koja kao argument uzima pokazivač na

početak liste razlomaka (definirane kao u zadatku 7.2.) te brojnik i nazivnik početak liste razlomaka (definirane kao u zadatku 7.2.) te brojnik i nazivnik razlomka. Funkcija treba iz liste obrisati razlomka. Funkcija treba iz liste obrisati prviprvi razlomak koji ima jednaku razlomak koji ima jednaku vrijednost kao razlomak definiran navedenim brojnikom i nazivnikom.vrijednost kao razlomak definiran navedenim brojnikom i nazivnikom.

razlomak *delete(razlomak *first, int x, int y) {razlomak *delete(razlomak *first, int x, int y) { razlomak *t = first;razlomak *t = first; if (!first) return NULL;if (!first) return NULL; if (first->br * y == first->naz * x) {if (first->br * y == first->naz * x) { t = first->next;t = first->next; free(first);free(first); return t;return t; } } else {else { razlomak *del;razlomak *del; while(t->next && t->next->br * y != t->next->naz * x) while(t->next && t->next->br * y != t->next->naz * x)

t = t->next;t = t->next; if (t->next) {if (t->next) { del = t->next;del = t->next; t->next = del->next;t->next = del->next; free(del);free(del); }} return first;return first; }}}}

Page 147: Programiranje 2 - vježbe

149

Vezane listeVezane liste Zadatak 7.4.Zadatak 7.4. Napišite funkciju Napišite funkciju deleteAlldeleteAll koja kao argument uzima pokazivač koja kao argument uzima pokazivač

na početak liste razlomaka (definirane kao u zadatku 7.2.) te brojnik i nazivnik na početak liste razlomaka (definirane kao u zadatku 7.2.) te brojnik i nazivnik razlomka. Funkcija treba iz liste obrisati razlomka. Funkcija treba iz liste obrisati svesve razlomke koji ima jednaku razlomke koji ima jednaku vrijednost kao razlomak definiran navedenim brojnikom i nazivnikom.vrijednost kao razlomak definiran navedenim brojnikom i nazivnikom.

razlomak *deleteAll(razlomak *first, int x, int razlomak *deleteAll(razlomak *first, int x, int y) {y) { razlomak *t, *del;razlomak *t, *del; while (first && first->br * y == first->naz * x) {while (first && first->br * y == first->naz * x) { t = first;t = first; first = t->next;first = t->next; free(t);free(t); }} if (!first) return NULL;if (!first) return NULL; t = first;t = first; while (t->next) {while (t->next) { if (t->next->br * y == t->next->naz * x) {if (t->next->br * y == t->next->naz * x) { del = t->next;del = t->next; t->next = del->next;t->next = del->next; free(del);free(del); } else} else t = t->next;t = t->next; }} return first;return first;}}

Page 148: Programiranje 2 - vježbe

150

Vezane listeVezane liste

Zadatak 7.8.Zadatak 7.8. Napišite funkciju koja kao argument uzima Napišite funkciju koja kao argument uzima pointer na početak liste razlomaka (definirane kao u zadatku pointer na početak liste razlomaka (definirane kao u zadatku 7.2.). te vraća pointer na invertiranu verziju te liste. 7.2.). te vraća pointer na invertiranu verziju te liste. Invertiranje treba postići razmještanjem postojećih Invertiranje treba postići razmještanjem postojećih elemenata, elemenata, bez upotrebebez upotrebe funkcije malloc(). funkcije malloc().

razlomak *invertiraj(razlomak *first){razlomak *invertiraj(razlomak *first){

razlomak *inv_first = NULL, *pom;razlomak *inv_first = NULL, *pom;

while(first){while(first){

pom = first->next;pom = first->next;

first->next = inv_first;first->next = inv_first;

inv_first = first;inv_first = first;

first = pom;first = pom;

}}

return inv_first;return inv_first;

}}

Page 149: Programiranje 2 - vježbe

151

Vezane listeVezane liste

Zadatak 7.9.Zadatak 7.9. Napišite funkciju koja kao argument uzima pokazivač na Napišite funkciju koja kao argument uzima pokazivač na početak liste razlomaka (definirane kao u zadatku 7.2.). Funkcija početak liste razlomaka (definirane kao u zadatku 7.2.). Funkcija treba pokratiti sve elemente listetreba pokratiti sve elemente liste

int gcd(int a, int b) {int gcd(int a, int b) { while (b > 0) {while (b > 0) { int t = a % b;int t = a % b; a = b;a = b; b = t;b = t; }} return a;return a;}}

void skrati(razlomak *first) {void skrati(razlomak *first) { while(first) {while(first) { int g = gcd(first->br, first->naz);int g = gcd(first->br, first->naz); first->br /= g;first->br /= g; first->naz /= g;first->naz /= g; first = first->next;first = first->next; }}}}

Page 150: Programiranje 2 - vježbe

152

Vezane listeVezane liste Zadatak 7.12.Zadatak 7.12. Napišite funkciju koja prima kao argument prirodan broj n. Napišite funkciju koja prima kao argument prirodan broj n.

Funkcija treba kreirati listu razlomaka (definiranih kao u zadatku 8.2.) oblika Funkcija treba kreirati listu razlomaka (definiranih kao u zadatku 8.2.) oblika 1/k, k=1,2,…,n i vratiti pokazivač na početak liste. 1/k, k=1,2,…,n i vratiti pokazivač na početak liste.

razlomak *kreiraj1n(int n) {razlomak *kreiraj1n(int n) { razlomak *first, *last, *new;razlomak *first, *last, *new; first = NULL;first = NULL; int k;int k; for (k = 1; k <= n; k++) {for (k = 1; k <= n; k++) { new = (razlomak*)new = (razlomak*)

malloc(sizeof(razlomak));malloc(sizeof(razlomak)); if (first)if (first) last = last->next = new;last = last->next = new; elseelse last = first = new;last = first = new; new->br = 1;new->br = 1; new->naz = k;new->naz = k; }} if (first) last->next = NULL;if (first) last->next = NULL; return first;return first;}}

razlomak *kreiraj1n(int n) {razlomak *kreiraj1n(int n) { razlomak *first = NULL, *new;razlomak *first = NULL, *new; while (n) {while (n) { new = (razlomak*) new = (razlomak*) malloc(sizeof(razlomak));malloc(sizeof(razlomak)); new->br = 1;new->br = 1; new->naz = n--;new->naz = n--; new->next = first;new->next = first; first = new;first = new; };}; return first;return first;}}

razlomak *kreiraj1n(int n) {razlomak *kreiraj1n(int n) { razlomak *first = NULL;razlomak *first = NULL; while (n) while (n) first=insert(first, 1, n--);first=insert(first, 1, n--);

return first;return first;}}

Page 151: Programiranje 2 - vježbe

153

Vezane listeVezane liste Zadatak:Zadatak: Napišite funkciju koja kao argument uzima cijeli broj n te pokazivač na Napišite funkciju koja kao argument uzima cijeli broj n te pokazivač na

početak liste cijelih brojeva koja je sortirana uzlazno. Funkcija treba ubaciti broj početak liste cijelih brojeva koja je sortirana uzlazno. Funkcija treba ubaciti broj n u listu.n u listu.

typedef struct s{typedef struct s{int x;int x;struct s *next;struct s *next;

} node;} node;

node *insert(node *first, int n){node *insert(node *first, int n){node *new;node *new;new = (node*) malloc(sizeof(node));new = (node*) malloc(sizeof(node));new->x = n;new->x = n;if (first==NULL || n<first->x){if (first==NULL || n<first->x){

new->next = first;new->next = first;return new;return new;

}}else{else{

node *temp = first;node *temp = first;while(temp->next && temp->next->x < n)while(temp->next && temp->next->x < n)temp = temp->next;temp = temp->next;new->next = temp->next;new->next = temp->next;temp->next = new;temp->next = new;return first;return first;

}}}}

Page 152: Programiranje 2 - vježbe

154

Vezane listeVezane listeZadatak 7.15:Zadatak 7.15: Napišite funkciju presjek koja kao argumente uzima pointere na Napišite funkciju presjek koja kao argumente uzima pointere na

početke dvije liste razlomaka (definiranih kao u zadatku 7.2). Liste početke dvije liste razlomaka (definiranih kao u zadatku 7.2). Liste predstavljaju skupove racionalnih brojeva (niti jedan razlomak se ne pojavljuje predstavljaju skupove racionalnih brojeva (niti jedan razlomak se ne pojavljuje više od jednom u istoj listi), a razlomci u njima su sortirani prema veličini više od jednom u istoj listi), a razlomci u njima su sortirani prema veličini (uzlazno). Funkcija treba kreirati novu listu koja sadrži one razlomke koji se (uzlazno). Funkcija treba kreirati novu listu koja sadrži one razlomke koji se nalaze u obje liste, te vratiti pointer na početak nove liste. Pri tome,nalaze u obje liste, te vratiti pointer na početak nove liste. Pri tome,

ulazne liste moraju ostati nepromijenjene!ulazne liste moraju ostati nepromijenjene!

Page 153: Programiranje 2 - vježbe

155

Vezane liste (Zadatak 7.15)Vezane liste (Zadatak 7.15)razlomak *presjek(razlomak *a, razlomak *b) {razlomak *presjek(razlomak *a, razlomak *b) {

razlomak *first = NULL, *new, *last;razlomak *first = NULL, *new, *last;

while (a && b) {while (a && b) {

int exp1 = a->br * b->naz, exp2 = a->naz * b->br;int exp1 = a->br * b->naz, exp2 = a->naz * b->br;

if (exp1 == exp2) {if (exp1 == exp2) {

new = (razlomak*)malloc(sizeof(razlomak));new = (razlomak*)malloc(sizeof(razlomak));

if (first)if (first)

last = last->next = new;last = last->next = new;

elseelse

last = first = new;last = first = new;

new->br = a->br; new->naz = a->naz;new->br = a->br; new->naz = a->naz;

a = a->next;a = a->next;

b = b->next;b = b->next;

} else if (exp1 < exp2)} else if (exp1 < exp2)

a = a->next;a = a->next;

elseelse

b = b->next;b = b->next;

}}

if (first) last->next = NULL;if (first) last->next = NULL;

return first;return first;

}}

Page 154: Programiranje 2 - vježbe

156

Vezane listeVezane listeZadatak 7.15:Zadatak 7.15: Napišite funkciju presjek koja kao argumente uzima pointere na Napišite funkciju presjek koja kao argumente uzima pointere na

početke dvije liste razlomaka (definiranih kao u zadatku 7.2). Liste početke dvije liste razlomaka (definiranih kao u zadatku 7.2). Liste predstavljaju skupove racionalnih brojeva (niti jedan razlomak se ne pojavljuje predstavljaju skupove racionalnih brojeva (niti jedan razlomak se ne pojavljuje više od jednom u istoj listi), a razlomci u njima su sortirani prema veličini više od jednom u istoj listi), a razlomci u njima su sortirani prema veličini (uzlazno). Funkcija treba preslagivanjem elemenata (dakle bez upotrebe (uzlazno). Funkcija treba preslagivanjem elemenata (dakle bez upotrebe funkcije funkcije malloc()malloc()) kreirati novu listu u kojoj se nalaze oni elementi koji se ) kreirati novu listu u kojoj se nalaze oni elementi koji se nalaze u obje liste. Na kraju funkcije treba vratiti pointer na početak nove nalaze u obje liste. Na kraju funkcije treba vratiti pointer na početak nove liste. Višak elemenata (one koji ne završe u novoj listi) treba obrisati iz liste. Višak elemenata (one koji ne završe u novoj listi) treba obrisati iz memorije!memorije!

Page 155: Programiranje 2 - vježbe

157

Vezane liste (Zadatak 7.16)Vezane liste (Zadatak 7.16)razlomak *presjek2(razlomak *a, razlomak *b) {razlomak *presjek2(razlomak *a, razlomak *b) { razlomak *first = NULL, *last;razlomak *first = NULL, *last; while (a && b) {while (a && b) { int exp1 = a->br * b->naz, exp2 = a->naz * b->br;int exp1 = a->br * b->naz, exp2 = a->naz * b->br; if (exp1 == exp2) {if (exp1 == exp2) { razlomak *tmp = b;razlomak *tmp = b; if (first)if (first) last = last->next = a;last = last->next = a; elseelse last = first = a;last = first = a; a = a->next;a = a->next; b = b->next;b = b->next; free(tmp);free(tmp); } else if (exp1 < exp2) {} else if (exp1 < exp2) { razlomak *tmp = a;razlomak *tmp = a; a = a->next;a = a->next; free(tmp);free(tmp); } else {} else { razlomak *tmp = b;razlomak *tmp = b; b = b->next;b = b->next; free(tmp);free(tmp); }} }} last->next = NULL;last->next = NULL; ......

Page 156: Programiranje 2 - vježbe

158

Vezane liste (Zadatak 7.16 - nastavak)Vezane liste (Zadatak 7.16 - nastavak)

while (a) {while (a) {

razlomak *tmp = a;razlomak *tmp = a;

a = a->next;a = a->next;

free(tmp);free(tmp);

}}

while (b) {while (b) {

razlomak *tmp = b;razlomak *tmp = b;

b = b->next;b = b->next;

free(tmp);free(tmp);

}}

return first;return first;

}}

Page 157: Programiranje 2 - vježbe

159

DatotekeDatoteke

Tekstualne i binarne. Promatrat ćemo samo tekstualneTekstualne i binarne. Promatrat ćemo samo tekstualne Veza na datoteku: Veza na datoteku: FILE*FILE* fopen, fclosefopen, fclose fscanf, fprintffscanf, fprintf FILE *f;FILE *f;

f = fopen("imedatoteke", "nacin_otvaranja"); f = fopen("imedatoteke", "nacin_otvaranja"); - vraća NULL - vraća NULL ako ne može otvoriti navedenu datoteku u zadanom načinu ako ne može otvoriti navedenu datoteku u zadanom načinu otvaranja.otvaranja.

načinnačin: : rr r+r+

ww w+w+

aa a+a+

Iza svakog od ovih formata može se dodati ili b (za binarneIza svakog od ovih formata može se dodati ili b (za binarne

datoteke) ili t za tekstualne datoteke. Ako se ne navededatoteke) ili t za tekstualne datoteke. Ako se ne navede

ništa, podrazumijeva se da se radi o tekstualnim datotekama.ništa, podrazumijeva se da se radi o tekstualnim datotekama.

Page 158: Programiranje 2 - vježbe

160

DatotekeDatoteke

Zadatak 8.1.Zadatak 8.1. Napišite program koji učitava nazive dviju tekstualnih Napišite program koji učitava nazive dviju tekstualnih datoteka, te prepisuje sadržaj jedne u drugu, na način da na početak datoteka, te prepisuje sadržaj jedne u drugu, na način da na početak svake linije doda broj linije. Npr.svake linije doda broj linije. Npr.

ulaz.txt: ulaz.txt: izlaz.txt:izlaz.txt:

Iš’o Pero u dućanIš’o Pero u dućan => => 1: Iš’o Pero u dućan1: Iš’o Pero u dućan

Nije rek’o “Dobar dan”Nije rek’o “Dobar dan” 2: Nije rek’o “Dobar 2: Nije rek’o “Dobar dan”dan”

Pretpostavite da su imena datoteka duga najviše 255 znakova.Pretpostavite da su imena datoteka duga najviše 255 znakova.

Page 159: Programiranje 2 - vježbe

161

Datoteke - Zadatak 8.1.Datoteke - Zadatak 8.1.#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>

int main (void) {int main (void) { FILE *in, *out; char iname[256], oname[256], c; int i = 1;FILE *in, *out; char iname[256], oname[256], c; int i = 1; printf("Ime ulazne datoteke: "); scanf("%[^\n]", iname);printf("Ime ulazne datoteke: "); scanf("%[^\n]", iname); scanf("%*c");scanf("%*c"); printf("Ime izlazne datoteke: "); scanf("%[^\n]", oname);printf("Ime izlazne datoteke: "); scanf("%[^\n]", oname); if ((in = fopen(iname, "rt")) == NULL) {if ((in = fopen(iname, "rt")) == NULL) { printf("Greska prilikom otvaranja datoteke \"%s\". “, iname);printf("Greska prilikom otvaranja datoteke \"%s\". “, iname); exit(1);exit(1); }} if ((out = fopen(oname, "wt")) == NULL) {if ((out = fopen(oname, "wt")) == NULL) { fclose(in);fclose(in); printf("Greska prilikom otvaranja datoteke \"%s\". “, oname);printf("Greska prilikom otvaranja datoteke \"%s\". “, oname);

exit(1);exit(1); }} fprintf(out, "1: ");fprintf(out, "1: "); while (fscanf(in, "%c", &c) > 0)while (fscanf(in, "%c", &c) > 0) if (c == '\n')if (c == '\n') fprintf(out, "\n%d: ", ++i);fprintf(out, "\n%d: ", ++i); elseelse fprintf(out, "%c", c);fprintf(out, "%c", c);

fclose(in); fclose(out);fclose(in); fclose(out);

return 0;return 0;}}

Page 160: Programiranje 2 - vježbe

162

DatotekeDatoteke

Zadatak 8.2.Zadatak 8.2. Napišite funkciju koja kao jedini argument prima file-pokazivač, Napišite funkciju koja kao jedini argument prima file-pokazivač, koji pokazuje na datoteku otvorenu za čitanje, te iz nje čita kvadratnu matricu koji pokazuje na datoteku otvorenu za čitanje, te iz nje čita kvadratnu matricu realnih brojeva i vraća trag pročitane matrice. Matrica je zapisana tako da je realnih brojeva i vraća trag pročitane matrice. Matrica je zapisana tako da je prvi broj u datoteci cijeli i označava red matrice. Nakon tog broja pobrojani su prvi broj u datoteci cijeli i označava red matrice. Nakon tog broja pobrojani su svi elementi matrice, redak po redak, odvojeni razmacima i/ili skokovima u svi elementi matrice, redak po redak, odvojeni razmacima i/ili skokovima u novi red.novi red.

double tr(FILE *in) {double tr(FILE *in) { int n, i, j;int n, i, j; double x, tr = 0.0;double x, tr = 0.0;

fscanf(in, "%d", &n);fscanf(in, "%d", &n);

for (i = 0; i < n; i++)for (i = 0; i < n; i++) for (j = 0; j < n; j++) {for (j = 0; j < n; j++) { fscanf(in, "%lf", &x);fscanf(in, "%lf", &x); if (i == j) tr += x;if (i == j) tr += x; }}

return tr;return tr;}}

Page 161: Programiranje 2 - vježbe

163

DatotekeDatoteke Zadatak 8.3.Zadatak 8.3. Napišite funkciju koja kao jedini argument prima file-pokazivač, Napišite funkciju koja kao jedini argument prima file-pokazivač,

koji pokazuje na datoteku otvorenu za čitanje, te iz nje čita kvadratnu matricu koji pokazuje na datoteku otvorenu za čitanje, te iz nje čita kvadratnu matricu realnih brojeva i vraća vrijednost 1 ako je matrica simetrična, a 0 ako nije. realnih brojeva i vraća vrijednost 1 ako je matrica simetrična, a 0 ako nije. Matrica je zapisana kao u zadatku 8.2.Matrica je zapisana kao u zadatku 8.2.int isSymmetric(FILE *in) {int isSymmetric(FILE *in) { int n, i, j, sym = 1; double **m;int n, i, j, sym = 1; double **m;

fscanf(in, "%d", &n);fscanf(in, "%d", &n); m = (double**)malloc(n * sizeof(double*));m = (double**)malloc(n * sizeof(double*)); for (i = 0; i < n; i++)for (i = 0; i < n; i++) m[i] = (double*)malloc(n * sizeof(double));m[i] = (double*)malloc(n * sizeof(double));

for (i = 0; i < n; i++)for (i = 0; i < n; i++) for (j = 0; j < n; j++)for (j = 0; j < n; j++) fscanf(in, "%lf", &m[i][j]);fscanf(in, "%lf", &m[i][j]);

for (i = 0; i < n; i++)for (i = 0; i < n; i++) for (j = i + 1; j < n; j++)for (j = i + 1; j < n; j++) if (m[i][j] - m[j][i]) {if (m[i][j] - m[j][i]) { sym = 0; i = n; break;sym = 0; i = n; break; }}

for (i = 0; i < n; i++) free(m[i]);for (i = 0; i < n; i++) free(m[i]); free(m);free(m);

return sym;return sym;}}

Page 162: Programiranje 2 - vježbe

164

DatotekeDatoteke Rješenja prethodna dva zadatka možemo testirati sljedećim glavnim Rješenja prethodna dva zadatka možemo testirati sljedećim glavnim

programom:programom:

int main (void) {int main (void) { FILE *in;FILE *in;

if ((in = fopen("t.in", "rt")) == NULL) {if ((in = fopen("t.in", "rt")) == NULL) { printf("Greska prilikom otvaranja datoteke!\n");printf("Greska prilikom otvaranja datoteke!\n"); exit(1);exit(1); }}

printf("tr(A) = %g\n", tr(in));printf("tr(A) = %g\n", tr(in)); rewind(in);rewind(in); printf("A %sje simetricna.\n",printf("A %sje simetricna.\n", isSymmetric(in) ? "" : "ni"isSymmetric(in) ? "" : "ni" ););

fclose(in);fclose(in);

return 0;return 0;}}

Page 163: Programiranje 2 - vježbe

165

DatotekeDatoteke Zadatak 8.7.Zadatak 8.7. Napišite funkciju koja kao jedini argument prima file-pokazivač, Napišite funkciju koja kao jedini argument prima file-pokazivač,

koji pokazuje na datoteku otvorenu za čitanje, te iz nje čita kvadratnu matricu koji pokazuje na datoteku otvorenu za čitanje, te iz nje čita kvadratnu matricu realnih brojeva i vraća najveću sumu stupca u matrici. Matrica je zapisana kao realnih brojeva i vraća najveću sumu stupca u matrici. Matrica je zapisana kao u zadatku 9.2.u zadatku 9.2.double colSum(FILE *in) {double colSum(FILE *in) { int n, i, j; double *sum, x, max;int n, i, j; double *sum, x, max;

fscanf(in, "%d", &n);fscanf(in, "%d", &n); sum = (double*)malloc(n * sizeof(double));sum = (double*)malloc(n * sizeof(double));

for (i = 0; i < n; i++) sum[i] = 0;for (i = 0; i < n; i++) sum[i] = 0; for (i = 0; i < n; i++)for (i = 0; i < n; i++) for (j = 0; j < n; j++) {for (j = 0; j < n; j++) { fscanf(in, "%lf", &x);fscanf(in, "%lf", &x); sum[j] += x;sum[j] += x; }}

max = sum[0];max = sum[0]; for (i = 1; i < n; i++)for (i = 1; i < n; i++) if (max < sum[i]) max = sum[i];if (max < sum[i]) max = sum[i];

free(sum);free(sum);

return max;return max;}}

Page 164: Programiranje 2 - vježbe

166

DatotekeDatoteke Zadatak 8.8.Zadatak 8.8. Napišite funkciju koja kao argumente prima sljedeće file- Napišite funkciju koja kao argumente prima sljedeće file-

pokazivače: pokazivače: inin koji pokazuje na datoteku otvorenu za čitanje i koji pokazuje na datoteku otvorenu za čitanje i outout koji koji pokazuje na datoteku otvorenu za pisanje. Funkcija treba iz datoteke pokazuje na datoteku otvorenu za pisanje. Funkcija treba iz datoteke inin čitati čitati kvadratnu matricu realnih brojeva te u datoteku kvadratnu matricu realnih brojeva te u datoteku outout zapisati transponiranu zapisati transponiranu matricu. Matrica je u datoteci matricu. Matrica je u datoteci inin zapisana kao u zadatku 8.2. te na isti način zapisana kao u zadatku 8.2. te na isti način treba biti zapisana i u datoteci treba biti zapisana i u datoteci outout..void transpose(FILE *in, FILE *out) {void transpose(FILE *in, FILE *out) { int n, i, j; double **m;int n, i, j; double **m;

fscanf(in, "%d", &n);fscanf(in, "%d", &n); m = (double**)malloc(n * sizeof(double*));m = (double**)malloc(n * sizeof(double*)); for (i = 0; i < n; i++)for (i = 0; i < n; i++) m[i] = (double*)malloc(n * sizeof(double));m[i] = (double*)malloc(n * sizeof(double));

for (i = 0; i < n; i++)for (i = 0; i < n; i++) for (j = 0; j < n; j++)for (j = 0; j < n; j++) fscanf(in, "%lf", &m[i][j]);fscanf(in, "%lf", &m[i][j]);

fprintf(out, "%d\n", n);fprintf(out, "%d\n", n); for (i = 0; i < n; i++) {for (i = 0; i < n; i++) { for (j = 0; j < n; j++)for (j = 0; j < n; j++) fprintf(out, "%7g", m[j][i]);fprintf(out, "%7g", m[j][i]); fprintf(out, "\n");fprintf(out, "\n"); }}

for (i = 0; i < n; i++) free(m[i]);for (i = 0; i < n; i++) free(m[i]); free(m);free(m);}}

Page 165: Programiranje 2 - vježbe

167

DatotekeDatoteke

Zadatak 8.10. Zadatak 8.10. U datoteci su popisane nogometne utakmice, u svakom retku po jedna i to u sljedećem formatu:

Klub 1:Klub 2=a:b

Brojevi a i b označavaju broj golova koje je dao “Klub 1” odnosno“Klub 2”. Pobjeda donosi 3 boda, neriješeni susret 1 bod, a poraz 0 bodova.Napišite funkciju koja kao argumente prima nazive ulazne i izlazne datoteke, te učitava podatke o utakmicama (snimljene na opisani način) iz ulazne datoteke. U izlaznu datoteku funkcija treba ispisati konačnu rang-listu klubova sortiranu silazno prema broju bodova, u formatu pogodnom za čitanje pomoću tabličnih kalkulatora (OpenOffice.org Calc, Quattro Pro, Microsoft Excel i sl) tako da u prvom stupcu piše redni broj, u drugom naziv momčadi, a u trećem broj bodova. Možete pretpostaviti da je ukupni broj klubova najviše 20, te danaziv svakog kluba ima najviše 50 znakova.

Page 166: Programiranje 2 - vježbe

168

Datoteke – Zadatak 8.10.Datoteke – Zadatak 8.10.

typedef struct {typedef struct { char name[51];char name[51]; int score;int score;} team;} team;

int teamIndex(char name[], team list[], int *n) {int teamIndex(char name[], team list[], int *n) { int i;int i; for (i = 0; i < *n; i++)for (i = 0; i < *n; i++) if (!strcmp(name, list[i].name)) return i;if (!strcmp(name, list[i].name)) return i; strcpy(list[i].name, name);strcpy(list[i].name, name); list[(*n)++].score = 0;list[(*n)++].score = 0; return i;return i;}}

Page 167: Programiranje 2 - vježbe

169

Datoteke – Zadatak 8.10.Datoteke – Zadatak 8.10.void football(char iname[], char oname[]) {void football(char iname[], char oname[]) { FILE *in, *out; team list[20];FILE *in, *out; team list[20]; int n = 0, s1, s2, i1, i2; char t1[51], t2[51];int n = 0, s1, s2, i1, i2; char t1[51], t2[51];

if ((in = fopen(iname, "rt")) == NULL) {if ((in = fopen(iname, "rt")) == NULL) { printf("Greska prilikom otvaranja ");printf("Greska prilikom otvaranja "); printf("datoteke \"%s\".", iname);printf("datoteke \"%s\".", iname); exit(1);exit(1); }} if ((out = fopen(oname, "wt")) == NULL) {if ((out = fopen(oname, "wt")) == NULL) { fclose(in);fclose(in); printf("Greska prilikom otvaranja ");printf("Greska prilikom otvaranja "); printf("datoteke \"%s\".", oname);printf("datoteke \"%s\".", oname); exit(1);exit(1); }}

... učitavanje ulaznih podataka ...... učitavanje ulaznih podataka ...

fclose(in);fclose(in);

... sortiranje i ispis u izlaznu datoteku ...... sortiranje i ispis u izlaznu datoteku ... fclose(out);fclose(out);}}

Page 168: Programiranje 2 - vježbe

170

Datoteke – Zadatak 8.10.Datoteke – Zadatak 8.10. ... učitavanje ulaznih podataka ...... učitavanje ulaznih podataka ...

while (fscanf(in,while (fscanf(in, "%[^:]:%[^=]=%d:%d ", t1, t2, &s1, &s2"%[^:]:%[^=]=%d:%d ", t1, t2, &s1, &s2 ) == 4) {) == 4) { i1 = teamIndex(t1, list, &n);i1 = teamIndex(t1, list, &n); i2 = teamIndex(t2, list, &n);i2 = teamIndex(t2, list, &n); if (s1 < s2)if (s1 < s2) list[i2].score += 3;list[i2].score += 3; else if (s1 > s2)else if (s1 > s2) list[i1].score += 3;list[i1].score += 3; else {else { list[i1].score++;list[i1].score++; list[i2].score++;list[i2].score++; }} }}

Page 169: Programiranje 2 - vježbe

171

Datoteke – Zadatak 8.10.Datoteke – Zadatak 8.10. ... sortiranje i ispis u izlaznu datoteku ...... sortiranje i ispis u izlaznu datoteku ...

for (i1 = 0; i1 < n; i1++)for (i1 = 0; i1 < n; i1++) for (i2 = i1 + 1; i2 < n; i2++)for (i2 = i1 + 1; i2 < n; i2++) if (list[i1].score < list[i2].score) {if (list[i1].score < list[i2].score) { team tmp = list[i1];team tmp = list[i1]; list[i1] = list[i2];list[i1] = list[i2]; list[i2] = tmp;list[i2] = tmp; }}

for (i1 = 0; i1 < n; i1++)for (i1 = 0; i1 < n; i1++) fprintf(out, "%d. %s (%d)\n",fprintf(out, "%d. %s (%d)\n", i1 + 1,i1 + 1, list[i1].name,list[i1].name, list[i1].scorelist[i1].score ););