You are on page 1of 265

++

, 2013.

, ,

(MASSVision)

MST Gaji,

100

ISBN 978-86-7982-161-4
CIP -
,
004.42(075.8)(076)
004.432.2C(075.8)(076)
004.432.2C++(075.8)(076)
, , 1965 "C"
"C++" :

/
, , . - 5.
. - :

, 2013 ( : MST Gaji). - 259
. : . ; 24
100. - : . 259.
ISBN 978-86-7982-161-4
1. , , 1966- [] 2. ,
, 1972- []
a) - b)
"C" - c)
"C++" -
COBISS.SR-ID 201028876


_____________________________________________
C
C++

a
++.
++
,
.
++ ,
, Unix, Linux
Windows
,
.
. ,
, .
-
++, -
++.
.
( )
/ /
.
,
. , ,

.
.
( ) ++.

++.
++ .
/ , ,
, ++ .
++
, ,
- .
- ++,
-
.


.
,
, ++.
:
1. ( ).
,
;
2. ( );
3. . DOS (
DOS )
;
4. .

, 2013.


_____________________________________________
1.

2.

15

3.

35

4.

57

5.

77

6.

101

7.

/ ++

127

8.

, ,
++

143

9.

++

161

10.

++

185

201

249

251

259

1.
/
C


_____________________________________________
primer1_1
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:

/
primer1_1.c
/
/
Brisanje zaostalih karaktera sa standardnog ulaza
/
/
(citanje manje od predvidjenog broja podataka pomocu f-je scanf())
/
#include <stdio.h>
#define MAX1
5
#define MAX2
80

/dozvoljena duzina niza/


/broj korisnih karaktera u stringu/

main()
{
int i, niz[MAX1];
char tekst[MAX2+1], bafer[MAX2+1];
/Citanje manje od predvidjenog broja podataka/
printf("\nUnesite %d celih brojeva: ", MAX12);
for(i=0; i<MAX1; i++)
scanf("%d", &niz[i]);
printf("Procitano samo %d brojeva: ", MAX1);
for(i=0; i<MAX1; i++)
printf("%d ", niz[i]);
/Nema brisanja zaostalih karaktera, greska pri daljem citanju/
printf("\n\nUnesite red teksta: ");
gets(tekst);
printf("\nProcitani red teksta: %s\n", tekst);
/Citanje manje od predvidjenog broja podataka/
printf("\nUnesite %d celih brojeva: ", MAX12);
for(i=0; i<MAX1; i++)
scanf("%d", &niz[i]);
/Brisanje zaostalih karaktera na 1. nacin/
gets(bafer);
printf("Procitano samo %d brojeva: ", MAX1);
for(i=0; i<MAX1; i++)
printf("%d ", niz[i]);
/Nema greske pri daljem citanju/
printf("\n\nUnesite red teksta: ");
gets(tekst);
printf("Procitani red teksta: %s\n", tekst);

44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:

/Citanje manje od predvidjenog broja podataka/


printf("\nUnesite %d celih brojeva: ", MAX12);
for(i=0; i<MAX1; i++)
scanf("%d", &niz[i]);
/Brisanje zaostalih karaktera na 2. nacin/
fflush(stdin);
printf("Procitano samo %d brojeva: ", MAX1);
for(i=0; i<MAX1; i++)
printf("%d ", niz[i]);
/Nema greske pri daljem citanju/
printf("\n\nUnesite red teksta: ");
gets(tekst);
printf("Procitani red teksta: %s\n\n", tekst);
return 0;
}

primer1_1
/, ,
/ (input/output streams).
/ (stdin/stdout),
, / stdio.h.
scanf()
(
). getchar() gets()

, . scanf()
,
.
scanf() getchar(),
,
scanf() getchar()
.
getchar(). getchar()
, .
scanf() gets()
, scanf()
, .
,
.
scanf()
.
,
scanf()
( fflush() gets()).

. ( 14. 25.)
,
.
10 ( 1.1 )), scanf() for
( 15. 16.) 5 .
.
5 ( 1.1 )).
( 28. 42.)

gets(). 10 (
1.1 )), scanf() for ( 29. 30.) 5
. gets()
(bafer).
( 1.1 )).
( 41.) ( 1.1 )).
( 45. 59.)
,
fflush(), stdio.h.
10 ( 1.1 )), scanf() for ( 46.
47.) 5 . fflush()
(stdin)
.
( 1.1 )).
( 58.) ( 1.1 )).

1.1 ) primer1_1 ( )

1.1 ) primer1_1 ( )

1.1 ) primer1_1 ( )

1.1 ) primer1_1 ( )

1.1 ) primer1_1 ( )

1.1 ) primer1_1 ( )

primer1_2
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:

/
primer1_2.c
/
/
Prikaz na ekranu reci, zadatih u komandnoj liniji
/
#include <stdio.h>
#include <stdlib.h>
main(int argc, char argv[])
{
int i;
if(argc < 2)
{
fprintf(stderr, "Za pokretanje programa potrebno je uneti\n");
fprintf(stderr, "reci u komandnoj liniji, posle imena programa\n");
exit(1);
}
for(i=0; i<argc; i++)
printf("\nString na koji pokazuje argv[%d] je %s", i, argv[i]);
printf("\n");
return 0;
}

primer1_2

:
, ,
... .

:
.

.

, .
(
, ),
.

. argc
,
( ). (char argv[])
.
argv[0] ,
argv[1] ... .
.
( 1.2 )). if
10. argc 2.

.
, ,
fprintf() ( 11. 12.).
stdio.h : stdin, stdout
stderr.
(
,
).
, ,

(stderr) . fprintf()
(stderr),

, .
( 13.),
,
exit() stdlib.h.

, for ( 16. 17.)
(
). %s printf()
: argv[0],
argv[1],.., argv[argc-1]. 1.2 )
argv[0] (primer3) argv[1],
argv[2] argv[3]: (prvi, drugi treci).

1.2 a) primer1_2 ( )

1.2 ) primer1_2 ( )

primer1_3
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:

/
primer1_3.c
/
/
Prikaz na ekranu vrednosti celog broja, zadatog u komandnoj liniji,
/
/
u oktalnom, heksadecimalnom i binarnom obliku
/
#include <stdio.h>
#include <stdlib.h>
#define MAX 50

/dozvoljena duzina niza binarnih cifara/

main(int argc, char argv[])


{
int i, n = 0, broj, bin[MAX];
if(argc < 2)
{
fprintf(stderr, "Za pokretanje programa potrebno je uneti ceo\n");
fprintf(stderr, "broj u komandnoj liniji, posle imena programa\n");
exit(1);
}
broj = atoi(argv[1]);
printf("\nOktalna vrednost zadatog broja je:\t\t%o", broj);
printf("\nHeksadecimalna vrednost zadatog broja je:\t%x", broj);
while(broj != 0)
{
bin[n] = broj % 2;
broj /=2;
n++;
}
printf("\nBinarna vrednost zadatog broja je:\t\t");
for(i=n-1;i>=0; i--)
printf("%d", bin[i]);
printf("\n");
return 0;
}

primer1_3
:
,
.

( 12. 17.).
, atoi(),
( argv[1])
broj ( 19.).

(%o %x),
: broj 0
bin[i] broj
2, broj 2
bin ( 24. 28.).

bin, .
(
1.3 )), .
( 1.3 )), 25 n=0, while :
broj = 25 =>
broj != 0
=>
bin[0] = 25%2 = 1, broj = 25/2 = 12, n = 1,
broj = 12 =>
broj != 0
=>
bin[1] = 12%2 = 0, broj = 12/2 = 6, n = 2,
broj = 6
=>
broj != 0
=>
bin[2] = 6%2 = 0, broj = 6/2 = 3, n = 3,
broj = 3
=>
broj != 0
=>
bin[3] = 3%2 = 1, broj = 3/2 = 1, n = 4,
broj = 1
=>
broj != 0
=>
bin[4] = 1%2 = 1, broj = 1/2 = 0, n = 5,
broj = 0.
:
bin[4] bin[3] bin[2] bin[1] bin[0]
1
1
0
0
1

1.3 a) primer1_3 ( )

1.3 ) primer1_3 ( )

primer1_4
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:

/
primer1_4.c
/
/
Izracunavanje sume brojeva, zadatih redom u komandnoj liniji, posle
/
/
imena programa i opcije: i (za cele brojeve) ili f (za realne brojeve)
/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef enum
{NEMA_ARGUMENATA,NEMA_ZNAKA,NEMA_OPCIJE}
Greska;
char poruke_o_greskama[] = {
"Za pokretanje programa potrebno je uneti\n"
"vise reci u komandnoj liniji, posle imena programa!\n",
"Za pokretanje programa potrebno je uneti\n"
"znak - i opciju u komandnoj liniji, posle imena programa!\n",
"Nije uneta dozvoljena opcija\n"
"u komandnoj liniji, posle imena programa!\n"

};

void greska(Greska status);


main(int argc, char argv[])
{
int i, s1 = 0;
double s2 = 0;
if(argc < 2)
greska(NEMA_ARGUMENATA);
if(argv[1] != '-')
greska(NEMA_ZNAKA);
switch((argv[1] + 1))
{
case 'i':
for(i=2; i<argc; i++)
s1 += atoi(argv[i]);
printf("\nSuma celih brojeva iz komandne linije je %d\n", s1);
break;
case 'f':
for(i=2; i<argc; i++)
s2 += atof(argv[i]);
printf("\nSuma realnih brojeva iz komandne linije je %f\n", s2);
break;
default:
greska(NEMA_OPCIJE);

48:
49:
50:
51:
52:
53:
54:
55:
56:

break;
}
return 0;
}
/
Funkcija koja prikazuje na ekranu poruke o greskama
/
void greska(Greska status)
{
fprintf(stderr, poruke_o_greskama[status]);
exit(1);
}

primer1_4

:
,
i f (
),
int float,
(i f).
,
(e 29. 30.).
if ( 32.) ,
(argv[1]), .

( 33.). , .
,
((argv[1] + 1)), switch
( 35. 49.):
i, s1
, :
atoi(argv[2]), atoi(argv[3]), .., atoi(argv[argc-1]),
f, s2
, :
atof(argv[2]), atof(argv[3]), .., atof(argv[argc-1]).

( 47.).
(
1.4 )), , -i -f ,
, ( 1.4 )).

1.4 ) primer1_4 ( )

10

1.4 ) primer1_4 ( )





scanf()
.
scanf()
, scanf()

( fflush() gets()).


 scanf() ,
getchar() o
scanf()
getchar() .
 scanf() ,
gets() ,
scanf() .
 ,

.
 ,

.

11

1.
_____________________________________________
1.
,

( ),
.

12

1.
_____________________________________________

.

1.

) (
, 10 ) ,
)
.

2.
:
) , ,
cpy cat,
n (n5) ,
) (-)
,
) cpy, ,
cat

.

3.

:
.

4.


.

13

14

2.

15


_____________________________________________
primer2_1
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:

16

/
primer2_1.c
/
/
Stampanje na ekranu zadatog reda teksta u okviru zadatih dimenzija
/
#include <stdio.h>
#include <string.h>
#define HLIN
#define VLIN
#define UGAO
#define PRAZNO
#define MAX
#define RAZMAK

'-'
'|'
'+'
''
70
3

/znak horizontalna crta okvira/


/znak vertikalna crta okvira/
/znak za ugao okvira/
/prazan znak/
/dozvoljena duzina teksta/
/dozvoljeni razmak izmedju okvira i teksta/

void hokvir(int l);


void pise_tekst(char bafer[]);
void znakovi(int n, char c);

/Funkcija sa argumentom-adresom niza/

main()
{
int duzina;
char tekst[MAX+1];
printf("\nUnesite red teksta:\n"); gets(tekst);
duzina = strlen(tekst) +2RAZMAK;
hokvir(duzina);
pise_tekst(tekst);
hokvir(duzina);

/Prikaz gornjeg dela okvira/


/Prikaz teksta i bocnih delova okvira/
/Prikaz donjeg dela okvira/

return 0;
}
/
Funkcija koja prikazuje na ekranu horizontalni deo okvira
/
void hokvir(int l)
{
putchar(UGAO);
znakovi(l, HLIN);
putchar(UGAO);
putchar('\n');
}
/
Funkcija koja prikazuje bocne delove okvira, /
/
kao i zadati tekst izmedju bocnih delova okvira
/
void pise_tekst(char bafer[])
{
putchar(VLIN);
znakovi(RAZMAK, PRAZNO);
printf("%s", bafer);
znakovi(RAZMAK, PRAZNO);

44:
45:
46:
47:
48:
49:
50:
51:
52:
53:

putchar(VLIN);
putchar('\n');
}
/
Funkcija koja prikazuje zadati znak zadati broj puta
/
void znakovi(int n, char c)
{
while(n > 0)
{
n--;
putchar(c);
}
}

primer2_1

. (
, )
.
hokvir() znakovi()
.
14. pise_tekst()

(
).

char ( char).
( ).

pise_tekst() :
1. pise_tekst(char bafer) -
char (
char),
2. pise_tekst(char bafer[]) -
char.
39. 46. pise_tekst(), :

( 40.),
znakovi()
( 41.),
( 42.) bafer (
bafer, ),
znakovi()
( 43.),

( 44.) ( 45.).
( 2.1 ))
tekst ( 21.),
(
22.). :
hokvir(),
( 24.),
17

pise_tekst()

. ,
25.,
tekst.
hokvir(),
, ( 26.).
2.1 ).

2.1 ) primer2_1 ( )

2.1 ) primer2_1 ( )

primer2_2
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
18

/
primer2_2.c
/
/
Ciklicko pomeranje zadatog niza,za zadati pomeraj,u zadatom smeru
/
#include <stdio.h>
#define MAX 10

/dozvoljena duzina niza/

void cita_niz(int x[], int n);


void stampa_niz(int x[], int n);
void levo_za_1(int x[], int n);
void desno_za_1(int x[], int n);
main()
{
int i, m, n, smer, greska = 0, niz[MAX];
do
{

printf("\nBroj elemenata niza (n<=%d): ", MAX);


scanf("%d", &n);
}while(n<1 || n>MAX);
cita_niz(niz, n);
printf("\nBroj ciklickih pomeraja elemenata niza: ");
scanf("%d", &m); getchar();
printf("\nSmer pomeranja (L/D): ");
smer = getchar();

26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:

if(smer=='L' || smer=='l')
for(i=0; i<m; i++)
levo_za_1(niz,n);
else if(smer=='D' || smer=='d')
for(i=0; i<m; i++)
desno_za_1(niz,n);
else
{
printf("\nNepoznata oznaka smera!\n");
greska = 1;
}
if(!greska)
stampa_niz(niz, n);
return 0;
}
/
Funkcija koja cita sa tastature elemente niza
/
void cita_niz(int x[], int n)
{
int i;
printf("\nZadati celobrojni niz: ");
for(i=0; i<n; i++)
scanf("%d", &x[i]);
}
/
Funkcija koja prikazuje na ekranu elemente niza
/
void stampa_niz(int x[], int n)
{
int i;
printf("\nNovi niz: ");
for(i=0; i<n; i++)
printf("%d ", x[i]);
printf("\n\n");
}
/
Funkcija koja pomera elemente niza za jedno mesto ulevo
/
void levo_za_1(int x[], int n)
{
int i, pom = x[0];
for(i=0; i<n-1; i++)
x[i] = x[i+1];
x[n-1] = pom;
}
/
Funkcija koja pomera elemente niza za jedno mesto udesno
/
void desno_za_1(int x[], int n)
{
int i, pom = x[n-1];
for(i=n-1; i>0; i--)
x[i] = x[i-1];
x[0] = pom;
}
19

primer2_2

. ,
. :
, ,
.
7. 10.
.
, int (int x[])
int (int n) . :
cita_niz()
,
stampa_niz() ,
levo_za_1() ,
desno_za_1()
.

int ( ).
(
),
(
,
).

, ,
.
44. 50. cita_niz().
, , (int x[])
() :

(&x[i],i=0,..,n-1). :
(int x),
() :
,
(x+i,i=0,..,n-1).
,
.
52. 59. stampa_niz(),
(x[i],i=0,..,n-1).
61. 67. levo_za_1() .
( ),
( ),
.
69. 75. desno_za_1(),
( ),
.

( 2.2 )), cita_niz() ( 2.2 )),
( 2.2 )) ( 2.2 )).
20

, : levo_za_1()
desno_za_1(). .
2.2 ).

2.2 ) primer2_2 ( )

2.2 ) primer2_2 ( )

2.2 ) primer2_2 ( )

2.2 ) primer2_2 ( )

2.2 ) primer2_2 ( )

primer2_3
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:

/
primer2_3.c
/
/
Sortiranje svake od zadatih n m-torki celih brojeva (n<=10,m=10)
/
/
u neopadajuci poredak (sortiranje vrsta matrice dimenzija nxm)
/
#include <stdio.h>
#define MAX 10

/broj nizova, kao i dozvoljena duzina jednog niza/

void citanje(int x[][MAX], int n);


void prikaz(int x[][MAX], int n);
void sortiranje(int x[], int n);
void zamena(int *x, int *y);
main()
{
int i, n, niz[MAX][MAX];

21

15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
22

do
{
printf("\nBroj nizova? "); scanf("%d", &n);
}while(n<1 || n>MAX);
citanje(niz, n);
for(i=0; i<n; i++)
sortiranje(niz[i],MAX);
prikaz(niz, n);
return 0;
}
/
Funkcija koja cita sa tastature elemente dvodimenzionalnog niza
/
void citanje(int x[][MAX], int n)
{
int i, j;
for(i=0; i<n; i++)
{
printf("\nElementi %d. celobrojnog niza: ", i+1);
for(j=0; j<MAX; j++)
scanf("%d", &x[i][j]);
}
}
/
Funkcija koja prikazuje na ekranu elemente dvodimenzionalnog niza
/
void prikaz(int x[][MAX], int n)
{
int i, j;
printf("\nRezultat sortiranja:\n");
for(i=0; i<n; i++)
{
printf("\n");
for(j=0; j<MAX; j++)
printf("%d ", x[i][j]);
}
printf("\n\n");
}
/
Funkcija koja dovodi u neopadajuci poredak jednodimenzionalni niz
/
void sortiranje(int x[], int n)
{
int i, j;
for(i=0; i<n-1; i++)
for(j=i+1; j<n; j++)
if(x[i]>x[j])
zamena(&x[i], &x[j]);
}
/
Funkcija koja zamenjuje vrednosti dvema promenljivama
/
void zamena(int x, int y)
{
int pom;
pom = x; x = y; y = pom;
}

primer2_3

. n<=10 (
MAX=10) .
:
,
,
.
8. 9. citanje() prikaz().

, .
:
,
(int x[][MAX]),
(int n).
citanje() ,
prikaz() .
.
10. sortiranje(),

: (int x[]) (int n).
.

( ). 11.
zamena().
,
(int x,int y).
30. 38. citanje().
, ,
(int x[][MAX]) ()
:
, (&x[i][j],i=0,..,n-1, j=0,..,MAX-1).
40. 50. prikaz(),
(x[i][j],i=0,..,n-1,
j=0,..,MAX-1) .
52. 59. sortiranje(),
.
,
zamena() :
(&x[i], &x[j]).
61. 64. zamena(),

( ) (pom)
(pom = x; x = y; y = pom) ( 63.).
n ( 2.3
)), citanje(). ,
( 2.3 ) 2.3 )). ,
for ( 22. 23.), n sortiranje(),

23

, zamena(). prikaz(),
, , 2.3 ).

2.3 ) primer2_3 ( )

2.3 ) primer2_3 ( )

2.3 ) primer2_3 ( )

2.3 ) primer2_3 ( )

primer2_4
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
24

/
primer2_4.c
/
/
Odredjivanje duzine znakovnog niza i kopiranje
/
/
jednog u drugi znakovni niz (standardne funkcije strlen() i strcpy())
/
#include <stdio.h>
int duzina_stringa(char s);
char kopira_string(char s1, char s2);
main()
{
char bafer[] = "BAFER BAFER BAFER BAFER";
char poruka[] = "Zadati znakovni niz";
printf("\nTESTIRANJE FUNKCIJE: duzina_stringa()\n");
printf("\nSadrzaj znakovnog niza je: %s\n", poruka);
printf("\nBroj znakova je: %d\n", duzina_stringa(poruka));
printf("\n\nTESTIRANJE FUNKCIJE: kopira_string()\n");
printf("\nBafer pre kopiranja: %s\n", bafer);
printf("\nBafer posle kopiranja: %s\n\n", kopira_string(bafer, poruka));

22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:

return 0;
}
/
Funkcija koja odredjuje duzinu zadatog znakovnog niza
/
int duzina_stringa(char s)
{
char ptr;
ptr = s;
while(ptr != '\0')
ptr++;
return (ptr - s);
}
/
Funkcija koja kopira jedan u drugi znakovni niz
/
char kopira_string(char s1, char s2)
{
char ptr1, ptr2;
ptr1 = s1;
ptr2 = s2;
while(ptr2 != '\0')
{
ptr1 = ptr2;
ptr1++;
ptr2++;
}
ptr1 = '\0';
return s1;
}

primer2_4


.
7. duzina_stringa(),
s (char
s), ( int).
8. kopira_string(),
s1 s2,
(char s1, char s2)
( char kopira_string).
:
strlen() strcpy()
string .

: ( ).
25. 33.
duzina_stringa().
ptr
char ( 26.). 28.
(
25

s). ptr ( '\0'),


ptr ,
(while 29. 30.). ,
a (ptr s).
35. 48. kopira_string().
ptr1 ptr2
char ( 36.). 38. 39.
, (
s1 s2). ptr2
('\0'), ptr2
ptr1 ptr1 ptr2 ,
s1 s2, (while
40. 44.). ,
ptr1 ('\0') ,
(s1).

( 11. 12.): bafer poruka.
poruka ( 15.)
duzina_stringa(), poruka ( 16.). 19.
bafer, 20.
, poruka .
2.4 duzina_stringa()
kopira_string()
(bafer) (poruka).

2.4 primer2_4

primer2_5

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:

26

/
primer2_5.c
/
/
Prikaz na ekranu zadatog niza, u originalnom i inverznom poretku
/
#include <stdio.h>
#define MAX 10

/dozvoljena duzina niza/

void cita_niz(int x[], int n);


void stampa_niz(int x[], int n, int broj);
void originalni(int x[], int n);
void inverzni(int x[], int n);

12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:

main()
{
int n, opcija, niz[MAX];
do
{

printf("\nDuzina niza (n<=%d): ", MAX);


scanf("%d", &n);
}while(n<1 || n>MAX);
cita_niz(niz, n);
do
{

printf("\n1. Originalni niz");


printf("\n2. Inverzni niz");
printf("\n\nIzbor: ");
scanf("%d", &opcija);
}while(opcija<1 || opcija>2);
stampa_niz(niz, n, opcija);
return 0;
}
/
Funkcija koja cita sa tastature elemente niza
/
void cita_niz(int x[], int n)
{
int i;
printf("\nUnesite elemente niza: ");
for(i=0; i<n; i++)
scanf("%d", &x[i]);
}
/
Funkcija koja bira nacin prikaza niza: originalni ili inverzni
/
void stampa_niz(int x[], int n, int broj)
{
void (ptr)(int x[], int n);
/ptr je pokazivac na funkciju/
if(broj==1)
ptr = originalni;
else
ptr = inverzni;
ptr(x, n);

/ptr pokazuje na pocetak f-je originalni()/


/ptr pokazuje na pocetak f-je inverzni()/
/poziv odgovarajuce funkcije/

}
/
Funkcija koja prikazuje na ekranu originalni niz
/
void originalni(int x[], int n)
{
int i;
printf("\nZadati niz: ");
for(i=0; i<n; i++)
printf("%d ", x[i]);
printf("\n\n");
}
/
Funkcija koja prikazuje na ekranu inverzni niz
/
void inverzni(int x[], int n)
{
int i;

27

61:
62:
63:
64:
65:

printf("\nInverzni niz: ");


for(i=n-1; i>=0; i--)
printf("%d ", x[i]);
printf("\n\n");
}

primer2_5


( ),
.
.

( , ... .
7. 8. cita_niz()
stampa_niz().
,
.
, (
). .
9. 10. originalni()
inverzni(). : a ,
.
cita_niz() (
34. 39. ).
stampa_niz() ( 41. 49.)
( 42.)
( int int)
(void (ptr)(int x[], int n)).
(broj) stampa_niz(),
(originalni() inverzni()), ptr
(ptr(x, n)).
originalni() ( 51. 57.)
inverzni() ( 59. 65.) :
( )
( ).
( 2.5
)), ( 15. 18.)
cita_niz() ( 2.5 )). do..while (
22. 27.) 1. 2. ( 2.5 )),
stampa_niz() .
originalni() inverzni().
2.5 )
.

2.5 ) primer2_5 ( )

28

2.5 ) primer2_5 ( )

2.5 ) primer2_5 ( )

2.5 ) primer2_5 ( )

primer2_6
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:

/
primer2_6.c
/
/
Prikaz na ekranu vrednosti globalnih i lokalnih promenljivih
/
/
u raznim tackama programa
/
#include <stdio.h>
void stampa(void);
int x = 10, y = 20;
main( )
{
printf("\nPre poziva funkcije: x = %d, y = %d\n", x, y);
stampa( );
printf("\nPosle poziva funkcije: x = %d, y = %d\n\n", x, y);
return 0;
}
/
Funkcija koja prikazuje na ekranu sadrzaje lokalnih promenljivih x i y
/
/
ako postoje deklaracije i inicijalizacije globalnih promenljivih x i y
/
void stampa(void)
{
int x = 100, y = 200;
printf("\nUnutar funkcije: x = %d, y = %d\n", x, y);
}

29

primer2_6

( ) .

.

.
( )
.

.
( 9.)
x y. 12.
( stampa()).
13. stampa().
( 20. 23.)
x y .
,
. a
2.6:
stampa(),
,
stampa(),
,
stampa( ),
,

.

2.6 primer2_6

primer2_7
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:

30

/
primer2_7.c
/
/
Prikaz na ekranu vrednosti staticke i automatske
/
/
promenljive u raznim iteracijama jedne petlje
/
#include <stdio.h>
void stampa(void);
main( )
{
int i;

11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:

printf("\n");
for(i = 0; i < 5; i++)
{
printf("Iteracija %2d. ", i+1);
stampa( );
}
printf("\n");
return 0;
}
/
Funkcija koja stampa i inkrementira vrednosti /
/
staticke promenljive x i automatske promenljive y
/
void stampa(void)
{
static int x = 0;
int y = 0;
printf("x = %d, y = %d\n", x++, y++);
}

primer2_7
,
, ( ).
static .
stampa() ( 23. 28.)
: (x) (y).

, stampa().

stampa().
, ( 2.7).

2.7 primer2_7



.

, .


 .

.
31

2.
1.
?
#include <stdio.h>
void f(int x, int y, int z);
main()
{
int a = 0, b = 0, c = 0;
f(&a, &b, &c);
printf(\n%d %d %d, a, b, c);
}
void f(int x, int y, int z)
x = 2; y = 4; z = 6;
}
{

2.

n (n10) , ,
.

32

2.

, ,
.

1.
n (n10) ,
, ,
.

2.
n (n10) ,
, / ,
.

3.
(
)

.

4.
n (n10) , m (m10)
, ,
:
) ,
) .

5.
nxn (n10)
, :
) ,
) .

33

34

3.

C

35


_____________________________________________
primer3_1
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
36

/
primer3_1.c
/
/
Dinamicka dodela/oslobadjanje memorije za string od 100 karaktera
/
/
za niz od 100 celih brojeva ili za niz od 100 realnih brojeva (opciono)
/
#include <stdio.h>
#include <stdlib.h>
#define MAX
#define GRESKA_STRING
#define GRESKA_CELI
#define GRESKA_REALNI
#define GRESKA_TIP

100
0
1
2
3

/dozvoljena duzina niza/


/status prve poruke greske/
/status druge poruke greske/
/status trece poruke greske/
/status cetvrte poruke greske/

char poruke_o_greskama[] =
{
"\nNije uspela dodela memorije za string!\n",
"\nNije uspela dodela memorije za celobrojni niz!\n",
"\nNije uspela dodela memorije za realni niz!\n",
"\nNedozvoljena oznaka tipa!\n"
};
void greska(int status);
main()
{
char
int
float

string;
celi, tip;
realni;

printf("\n\nIzaberite tip niza: c (char), i (int), ili f (float): ");


tip = getchar(); getchar(); /Tip niza i znak za prelaz u novi red/
switch(tip)
{
case 'c':
/dodela memorije za string/
if((string = malloc(MAX sizeof(char))) == NULL)
greska(GRESKA_STRING);
puts("\nDodeljena je memorija za string.\n");
free(string);
break;
case 'i':
/dodela memorije za celobrojni niz/
if((celi = malloc(MAX sizeof(int))) == NULL)
greska(GRESKA_CELI);
puts("\nDodeljena je memorija za celobrojni niz\n");
free(celi);
break;

43:
44
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:

case 'f':
/dodela memorije za realni niz/
if((realni = malloc(MAX sizeof(float))) == NULL)
greska(GRESKA_REALNI);
puts("\nDodeljena je memorija za realni niz\n");
free(realni);
break;
default:
greska(GRESKA_TIP);
}
return 0;
}
/
Funkcija koja prikazuje na ekranu poruke o greskama
/
void greska(int status)
{
puts(poruke_o_greskama[status]);
exit(1);
}

primer3_1

e.
: ,
... .

, .

: ,
.
. .
,

.
,
. , ,
, .

.
greska()
.
, (
7. 11.)
( 13. 17.) ,
(char poruke_o_greskama[]).
( ),
char char.
, (
14. 17.), ,
poruke_o_greskama[].
poruke_o_greskama[0] "\nNije uspela dodela memorije
za string!\n"... .
37

(
,
,
).
55. 58. greska().
56.
poruke_o_greskama, status (
) (puts(poruke_o_greskama[status]);).
exit() ( 57.) stdlib.h.
1, .
( 22. 24.)
(char, int float)
(string, celi realni). ,
( 26. 27), switch ( 29. 51.)
.

malloc() stdlib.h free()
. (string),
.
malloc(),
( 32.).
(
, sizeof()).
malloc()
void, (
string). if ( 32.
33.), malloc().
NULL (
) (
greska()) (\nNije uspela dodela memorije za
string!\n"). greska() GRESKA_STRING (0),

poruke_o_greskama[0].
(MAXsizeof(char))
( 34.). 35. free()
.
malloc()
sizeof(char) ( 1). ( 38.
41. 44. 47.). 3.1 ) 3.1 )
float.

3.1 ) primer3_1 ( )

3.1 ) primer3_1 ( )

38

primer3_2
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:

/
primer3_2.c
/
/
Sazimanje zadatog niza celih brojeva na niz pozitivnih brojeva
/
/
Verzija1:dinamicka dodela/oslobadjanje memorije za niz iz glavne f-je
/
#include <stdio.h>
#include <stdlib.h>
#define MAX
#define GRESKA_DODELA
#define GRESKA_PROMENA

100
0
1

/dozvoljena duzina niza/


/status prve poruke greske/
/status druge poruke greske/

char poruke_o_greskama[] =
{
"\nNije uspela dinamicka dodela memorije za niz!\n",
"\nNije uspela promena dinamicki dodeljene memorije za niz!\n"

};

void cita_niz(int niz[], int n);


int sazima_niz(int niz[], int n);
void stampa_niz(int niz[], int n);
void greska(int status);
main()
{
int n1, n2, niz;
do
{

printf("\nBroj elemenata niza, n<=%d? ", MAX);


scanf("%d", &n1);
}while(n1<1 || n1>MAX);
if((niz = malloc(n1 sizeof(int))) == NULL)
greska(GRESKA_DODELA);
cita_niz(niz, n1);
n2 = sazima_niz(niz, n1);
if(n2<n1)
if((niz = realloc(niz,n2 sizeof(int))) == NULL)
greska(GRESKA_PROMENA);
stampa_niz(niz, n2);
free(niz);
return 0;
}
/
Funkcija koja cita sa tastature niz
/
void cita_niz(int niz[], int n)
{
int i;
printf("\nElementi niza:\t");

39

48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:

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


scanf("%d", &niz[i]);
}
/
Funkcija koja sazima zadati niz na niz pozitivnih brojeva
/
int sazima_niz(int niz[], int n)
{
int i, ptr1, ptr2;
ptr1 = ptr2 = niz;
for(i=0; i<n; i++)
{
if(ptr1 > 0)
{
ptr2 = ptr1;
ptr2++;
}
ptr1++;
}
return (ptr2 - niz);
}
/
Funkcija koja prikazuje na ekranu niz
/
void stampa_niz(int niz[], int n)
{
int i;
printf("\nNovi niz:\t");
for(i=0; i<n; i++)
printf("%d ", niz[i]);
printf("\n\n");
}
/
Funkcija koja prikazuje na ekranu poruke o greskama
/
void greska(int status)
{
puts(poruke_o_greskama[status]);
exit(1);
}

primer3_2


( ).
15. 18. :
cita_niz(), sazima_niz(), stampa_niz() greska().
greska()
.

int sazima_niz()
cita_niz() stampa_niz() .
. cita_niz()

( 44. 50.).
stampa_niz() ,

( 66. 73.).
40

sazima_niz ( 52. 64.) ptr1


ptr2 (ptr1 = ptr2 = niz;).
ptr1 ,
ptr2
( ).
for ( 56. 62.) ,
( ), :

, ptr1 0.
( 57.), (
ptr2)
(ptr2=ptr1;),
( 58., 59. 61.);

ptr1 0.
( 61.), ptr1
;

ptr1 0.
( 57.) (
ptr2)
(ptr2=ptr1;),
( 58., 59. 61.).
.
( 20. 42.) ( 3.2 ))
a n1 .
malloc()
(n1sizeof(int)).
NULL , ( 29.).
cita_niz()
( niz n1) ( 3.2 )).
sazima_niz()
( niz n1),
n2. ( 34.),
realloc() (niz)
,
(n2sizeof(int)).
( 35. 36.) (
). stampa_niz()
( niz n1).
free().

( 40.).
3.2 ) .

3.2 a) primer3_2 ( )

41

3.2 ) primer3_2 ( )

3.2 ) primer3_2 ( )

primer3_3

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
42

/
primer3_3.c
/
/
Sazimanje zadatog niza celih brojeva na niz pozitivnih brojeva
/
/
Verzija2: dinamicka dodela/oslobadjanje memorije za niz iz raznih f-ja
/
#include <stdio.h>
#include <stdlib.h>
#define MAX
#define GRESKA_DODELA
#define GRESKA_PROMENA

100
0
1

/dozvoljena duzina niza/


/status prve poruke greske/
/status druge poruke greske/

char poruke_o_greskama[] =
{
"\nNije uspela dinamicka dodela memorije za niz!\n",
"\nNije uspela promena dinamicki dodeljene memorije za niz!\n"
void cita_niz(int ptr_ptr_niz, int n);
int sazima_niz(int ptr_ptr_niz, int n);
void stampa_niz(int ptr_niz, int n);
void greska(int status);
main()
{
int n1, n2, niz;
do
{

printf("\nBroj elemenata niza, n<=%d? ", MAX);


scanf("%d", &n1);
}while(n1<1 || n1>MAX);
cita_niz(&niz, n1);
n2 = sazima_niz(&niz, n1);
stampa_niz(niz, n2);
return 0;
}

};

34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:

/
Funkcija koja cita niz sa tastature
/
void cita_niz(int ptr_ptr_niz, int n)
{
int i;
if((ptr_ptr_niz = malloc(n sizeof(int))) == NULL)
greska(GRESKA_DODELA);
printf("\nElementi niza:\t");
for(i=0; i<n; i++)
scanf("%d", ptr_ptr_niz+i);
}
/
Funkcija koja sazima zadati niz na niz pozitivnih brojeva
/
int sazima_niz(int ptr_ptr_niz, int n)
{
int i, n2, ptr1, ptr2;
ptr1 = ptr2 = ptr_ptr_niz;
for(i=0; i<n; i++)
{
if(ptr1 > 0)
{
ptr2 = ptr1;
ptr1++; ptr2++;
else
ptr1++;
}
n2 = ptr2 - ptr_ptr_niz;

if(n2<n)
if((ptr_ptr_niz = realloc(ptr_ptr_niz,n2 sizeof(int))) == NULL)
greska(GRESKA_PROMENA);
return n2;
}
/
Funkcija koja prikazuje na ekranu rezultujuci niz
/
void stampa_niz(int ptr_niz, int n)
{
int i;
printf("\nNovi niz:\t");
for(i=0; i<n; i++)
printf("%d ", (ptr_niz+i));
printf("\n\n");
free(ptr_niz);
}
/
Funkcija koja prikazuje na ekranu poruke o greskama
/
void greska(int status)
{
puts(poruke_o_greskama[status]);
exit(1);
}

43

primer3_3


, :
, ,
.
.
(
), .

. :
- ptr int
int ptr;
( ptr
int).
int ptr_ptr; - ptr_ptr
int ( ptr_ptr
int).

, int.

.
15. 18.
: cita_niz(), sazima_niz(), stampa_niz() greska().
a
, e
,
.
.
:
( ).
cita_niz() 35. 44.
,
, ( 3.3 )).

,
( ) . 38.
malloc() , n
ptr_ptr_niz ( ).

( ) ptr_ptr_niz. ptr_ptr_niz

: scanf("%d",ptr_ptr_niz+i) ( 43.). cita_niz()
( 3.3 )).
sazima_niz() ( 46. 64.)
realloc()
( ). .
stampa_niz() ( 66. 75.)
e , ( 71.)
( 3.3)) (free()).

44

3.3 a) primer3_3 ( )

3.3 ) primer3_3 ( )

3.3 ) primer3_3 ( )

primer3_4
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:

/
primer3_4.c
/
/
Spajanje do 10 redom zadatih nepraznih stringova
/
/
(dinamicka dodela/oslobadjanje memorije za stringove) /
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BROJ
#define MAX
#define DODELA_S1
#define DODELA_S2
#define PROMENA_S1

10
80
0
1
2

/dozvoljen broj stringova/


/broj korisnih karaktera u stringu/
/status prve poruke greske/
/status druge poruke greske/
/status trece poruke greske/

char poruke_o_greskama[] =
{
"\nNije uspela dinamicka dodela memorije za prvi zadati string!\n",
"\nNije uspela dinamicka dodela memorije za sledeci string!\n",
"\nNije uspelo prosirenje dinamicki dodeljene memorije!\n"
};
void greska(int status);
main()
{
int i, l;
char string1, string2;
if((string1 = malloc(MAX+1)) == NULL)
greska(DODELA_S1);
if((string2 = malloc(MAX+1)) == NULL)

45

29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:

greska(DODELA_S2);
puts("Prvi string:");
gets(string1);
l = strlen(string1);
if((string1 = realloc(string1, l+1)) == NULL)
greska(PROMENA_S1);
for(i=0; i<BROJ; i++)
{
puts("\nSledeci string:");
gets(string2);
if(strlen(string2)==0)
break;
l += strlen(string2);
if((string1 = realloc(string1,l+1)) == NULL)
greska(PROMENA_S1);
strcat(string1, string2);
}
puts(string1);
free(string1);
free(string2);
return 0;
}
/
Funkcija koja prikazuje na ekranu poruke o greskama
/
void greska(int status)
{
puts(poruke_o_greskama[status]);
exit(1);
}

primer3_4
, 10
, ,
,
, .
.

( ).
( 23.)
: char string1 char string2 (
string1 string2, ).
( 25. 29.)
string1 string2 (
46

malloc() ).
(
3.4 a)), string1, (
33.) realloc() ( 35.) string1 (
realloc())
( realloc()).
( 38. 51.)
: (
3.4 ) 3.4 )), string2 ( 40.),
( 42.), string1
( 45. 48.) string2 string1 ( 50.).
( 52.) (
3.4 )) ( 54. 55.).

3.4 a) primer3_4 ( )

3.4 ) primer3_4 ( )

3.4 ) primer3_4 ( )

3.4 ) primer3_4 ( )

3.4 ) primer3_4 ( )

47

primer3_5

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:

48

/
primer3_5.c
/
/
Prikaz na ekranu onih nizova od zadatih m<=10 nizova (svaki
/
/
duzine n<=10) ciji su svi elementi razliciti od nule (dinamicka
/
/
dodela/oslobadjanje memorije za niz nizova celih brojeva)
/
#include <stdio.h>
#include <stdlib.h>
#define MAX 10 /dozvoljeni broj imena/
void cita_niz(int niz[], int n);
void stampa_niz(int niz[], int n);
void greska(void);
main()
{
int niz[MAX], i, m, n;
do
{

printf("\nBroj nizova: ");


scanf("%d", &m);
printf("\nBroj elemenata jednog niza: ");
scanf("%d", &n);
}while(m<1 || m>MAX || n<1 || n>MAX);
for(i=0; i<m; i++)
{
if((niz[i] = malloc(n sizeof(int))) == NULL)
greska();
}
for(i=0; i<m; i++)
{
printf("\n%d. niz: ", i+1);
cita_niz(niz[i], n);
}
printf("\nNizovi bez broja 0:\n");
for(i=0; i<m; i++)
stampa_niz(niz[i], n);
printf("\n\n");
for(i=0; i<m; i++)
free(niz[i]);
return 0;
}
/
Funkcija koja cita sa tastature jednodimenzionalni niz
/
void cita_niz(int niz[], int n)
{
int i;
for(i=0; i<n; i++)
scanf("%d", &niz[i]);

48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:

}
/
Funkcija koja prikazuje na ekranu jednodimenzionalni niz
/
void stampa_niz(int niz[], int n)
{
int i, ima_nulu = 0;
for(i=0; i<n; i++)
if(niz[i]==0)
ima_nulu = 1;
printf("\n");
if(!ima_nulu)
for(i=0; i<n; i++)
printf("%d ", niz[i]);
}
/
Funkcija koja prikazuje na ekranu poruke o greskama
/
void greska(void)
{
printf("\nNema dovoljno memorije za nizove.\n");
exit(1);
}

primer3_5


0.
: cita_niz(),
, stampa_niz(),
greska().
( 44. 48.) int
scanf()
. ( 50. 60.)
0,
ima_nulu 1 ( 55.)
( 58. 59.).
15. , MAX (10)
int (int niz[MAX]).
m<=10 ( 3.5 ))
n<=10 ( 3.5 )), for , m
( 24. 27.), malloc(),
n int
( ) niz[i]. , m :
niz[0] : niz[0] [0], niz[0] [1],..., niz[0] [n-1],
...
niz[m-1] : niz[m-1] [0], niz[m-1] [1],..., niz[m-1] [n-1].
, for , m
( 29. 32.), cita_niz()

(niz[i]) (n).
( 3.5 ), 3.5 ) 3.5 )) .
for , m ( 35.
36.), stampa_niz(), , ,
(niz[i]) (n)) ( 3.5 )).
49


, for , m ( 39. 40.).

3.5 a) primer3_5 ( )

3.5 ) primer3_5 ( )

3.5 ) primer3_5 ( )

3.5 ) primer3_5 ( )

3.5 ) primer3_5 ( )

3.5 ) primer3_5 ( )

50

primer3_6

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:

/
primer3_6.c
/
/
Sortiranje zadatog niza od n<=10 imena (duzina imena m<=30) po
/
/
abecednom redu. Za kraj unosa treba zadati prazan red (dinamicka
/
/
dodela/oslobadjanje prostora u memorji za niz znakovnih nizova)
/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BROJ
#define MAX
#define GRESKA_DODELE
#define GRESKA_PROMENE

10
30
0
1

/dozvoljeni broj imena/


/broj korisnih karaktera u stringu/
/status prve poruke greske/
/status druge poruke greske/

char poruke_o_greskama[] =
{
"\nNije uspela dinamicka dodela memorije za niz!\n",
"\nNije uspela promena dinamicki dodeljene memorije za niz!\n"

};

int cita_imena(char imena[]);


void sortira_imena(char imena[], int n);
void stampa_imena(char imena[], int n);
void greska(int status);
main( )
{
int n; char imena;
if((imena = malloc(BROJ sizeof(char )))==NULL)
greska(GRESKA_DODELE);
n = cita_imena(imena);
if((imena = realloc(imena, n sizeof(char )))==NULL)
greska(GRESKA_PROMENE);
sortira_imena(imena, n);
stampa_imena(imena,n);
free(imena);
return 0;
}
/
Funkcija koja kreira spisak i popunjava ga imenima sa tastature
/
int cita_imena(char imena[])
{
int i, l;
puts("Unesite imena u posebnim redovima, prazan red za kraj");

51

47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:

52

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


{
if((imena[i] = malloc(MAX+1))==NULL)
greska(GRESKA_DODELE);
gets(imena[i]);
if((l = strlen(imena[i])) == 0)
{
free(imena[i]);
break;
}
if((imena[i] = realloc(imena[i], l+1)) == NULL)
greska(GRESKA_PROMENE);
}
return i;
}
/
Funkcija koja sortira spisak imena
/
void sortira_imena(char imena[], int n)
{
int i, j; char pom;
if((pom = malloc(MAX+1))==NULL)
greska(GRESKA_DODELE);
for(i=0; i<n-1; i++)
for(j=i+1; j<n; j++)
if(strcmp(imena[i], imena[j]) > 0)
{
strcpy(pom, imena[i]);
strcpy(imena[i], imena[j]);
strcpy(imena[j], pom);
}
free(pom);
}
/
Funkcija koja prikazuje na ekranu i nakon toga ukida spisak imena
/
void stampa_imena(char imena[], int n)
{
int i;
for(i=0; i<n; i++)
puts(imena[i]);
for(i=0; i<n; i++)
free(imena[i]);
}
/
Funkcija koja prikazuje na ekranu poruke o greskama
/
void greska(int status)
{
puts(poruke_o_greskama[status]);
exit(1);
}

primer3_6

,
.
.
cita_imena() ( 42. 61.)
: .
,
: char imena char imena[].
. for ( 47. 59.)
( : imena[i], i=0,...,BROJ-1),
( 50.), ,
, ( 57. 58.).
.
( 52.)
( 53. 55.).
sortira_imena() ( 63. 77.) :
,
.
stampa_imena() ( 79. 87.) :
. for ( 82.
83.) (
: imena[0],..., imena[n-1])
( 85. 86.).
malloc() ( 26.)
(imena) char
:
BROJsizeof(char ).
cita_imena() ( 3.6 )),
( 29.).
( imena) :
nsizeof(char ) ( 31. 32.). sortira_imena()
stampa_imena() ( imena
( 34. 35.), (
37.). , , 3.6 ).

3.6 ) primer3_6 ( )

3.6 ) primer3_6 ( )

53



( ).

(
).


sizeof() ( ).




, .

. ,
, .

54

3.
_____________________________________________
1.
n (n100) ,
, m ( m
). ,
.

55

3.
_____________________________________________
,
.

1.
n (n100) ,
, :
0 10,

2.
n (n100) ,
, :
.

3.
n (n200),
, :
(: ).

4.
( ),
( n (n10)),
: .

5.
,
( n (n10)), :
.

56

4.

57


_____________________________________________
primer4_1
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:

/
primer4_1.c
/
/
Formiranje strukture podataka, zadatih preko tastature: /
/
ime, broj indeksa i godina upisa (primena operatora tacka(.))
/
#include <stdio.h>
#define MAX 30
struct student{
char ime[MAX+1];
int br_indeksa, god_upisa;
};
main()
{
struct student student1;

/broj korisnih karaktera u stringu/


/definicija tipa strukture: student/

/deklaracija strukture: student1/

printf("\nUnesite ime i prezime: ");


gets(student1.ime);
printf("\nBroj indeksa: ");
scanf("%d", &student1.br_indeksa);
printf("\nGodina upisa: ");
scanf("%d", &student1.god_upisa);
printf("\n%s ", student1.ime);
printf("%d %d\n\n", student1.br_indeksa, student1.god_upisa);
return 0;
}

primer4_1
.

.
e a
o.

. ( 8. 11.)
struct (student).
(
: ime ( MAX ), br_indeksa
god_upisa ( int). -

58

. , ,
e ( 10.).
- ( 11.).

(
).
(
) .

. student1 ( 14.).
( 4.1 ), 4.1 )
4.1 )) student1 (ime, br_indeksa
god_upisa).
(.). ,
(student1.ime, student1.br_indeksa student1.god_upisa).
17., 20. 23.
student1.
printf() ( 25. 26.)
student1 (
4.1 ).

4.1 a) primer4_1 ( )

4.1 ) primer4_1 ( )

4.1 ) primer4_1 ( )

4.1 ) primer4_1 ( )

59

primer4_2
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:

/
primer4_2.c
/
/
Formiranje strukture od podataka zadatih preko tastature:
/
/
ime ulice, broj ulaza i broj telefona (primena operatora ->)
/
#include <stdio.h>
#define MAX1
30
#define MAX2
15

/broj korisnih karaktera u jednom stringu/


/broj korisnih karaktera u drugom stringu/

struct adresa{
char ulica[MAX1+1], telefon[MAX2+1];
int br_ulaza;
};
main()
{
struct adresa adresa1;
struct adresa ptr_a;
ptr_a = &adresa1;

/deklaracija strukture tipa adresa/


/deklaracija pokazivaca na strukturu/
/inicijalizacija pokazivaca/

printf("\nUnesite ime ulice: ");


gets(ptr_a->ulica);
printf("\nBroj ulaza: ");
scanf("%d", &ptr_a->br_ulaza);getchar();
printf("\nBroj telefona: ");
gets(ptr_a->telefon);
printf("\nul. %s %d, ", ptr_a->ulica, ptr_a->br_ulaza);
printf("tel. %s\n\n", ptr_a->telefon);
return 0;
}

primer4_2
adresa ( 9.
12.), : (ulic telefon)
int (br_ulaza).
adresa1 adresa ( 15.),
ptr_a adresa ( 16.)
adresa1 ( 18.).
(
)
.
. ( 4.2 ), 4.2 )
4.2 ))

60

adresa1 (ulica, br_ulaza telefon)


(->): ptr_a->ulica, ptr_a->br_ulaza, ptr_a->telefon.
, ( 21., 24. 27.)
( 29. 30.)
. 4.2 ).

4.2 a) primer4_2 ( )

4.2 ) primer4_2 ( )

4.2 ) primer4_2 ( )

4.2 ) primer4_2 ( )

primer4_3
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:

/
primer4_3.c
/
/
Izracunavanje povrsine pravougaonika
/
/
zadatih koordinata (kompleksna struktur)
/
#include <stdio.h>
struct koordinate{
int x, y;
};

/Definicija 1. tipa strukture/

struct pravougaonik{
/Definicija 2. tipa strukture/
struct koordinate dole_levo, gore_desno;
};

61

14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27
28:
29:
30:

main( )
{
int duzina, sirina;
struct pravougaonik p1;

/Deklaracija strukture 2. tipa/

printf("\nKoordinate dole levo ugla: ");


scanf("%d%d", &p1.dole_levo.x, &p1.dole_levo.y);
printf("\nKoordinate gore desno ugla: ");
scanf("%d%d", &p1.gore_desno.x, &p1.gore_desno.y);
duzina = p1.gore_desno.x - p1.dole_levo.x;
sirina = p1.gore_desno.y - p1.dole_levo.y;
printf("\nPovrsina pravougaonika: %ld \n\n", duzinasirina);
return 0;
}

primer4_3
,
: , ,
... .

( 7.
13.): koordinate ( int: x, y) pravougaonik
( koordinate: dole_levo gore_desno).
p1 pravougaonik.

( 4.3 ) 4.3 ))
p1:
p1.dole_levo.x
- dole_levo, p1,
p1.dole_levo.y
- dole_levo, p1,
p1.gore_desno.x
- gore_desno, p1,
p1.gore_desno.y
- gore_desno, p1,

( 25. 27.). 3.3 )
.
,
.

4.3 a) primer4_3 ( )

4.3 ) primer4_3 ( )
62

4.3 ) primer4_3 ( )

primer4_4
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:

/
primer4_4.c
/
/
Formiranje strukture i prikaz na ekranu iz posebne funkcije
/
/
podataka iz strukture (ime,smer,broj indeksa i godina upisa studenta
/
#include <stdio.h>
#define MAX 30

/broj korisnih karaktera u stringu/

struct student{
char ime[MAX+1], smer[MAX+1];
int br_indeksa, god_upisa;
};
void stampa(struct student x);
main()
{
struct student student1;
printf("\nIme i prezime studenta: ");
gets(student1.ime);
printf("\nSmer na kome je student: ");
gets(student1.smer);
printf("\nBroj indeksa i godina upisa (u obliku xx/xxxx): ");
scanf("%d/%d", &student1.br_indeksa, &student1.god_upisa);
stampa(student1);
return 0;
}
/
Funkcija koja prikazuje na ekranu vrednosti clanova strukture
/
void stampa(struct student x)
{
printf("\nStudent:\t%s\nSmer:\t\t%s", x.ime, x.smer);
printf("\nBroj indeksa:\t%d", x.br_indeksa);
printf("\nGodina upisa:\t%d\n\n", x.god_upisa);
}

63

primer4_4

.
, ,
.
, , ( 8.
11.) student ( : ime smer
int: br_indeksa god_upisa)
stampa() ( 13.).

student ( x
) .
(
)

. .
stampa() ( 32. 36.)
.
, (x)
( 33. 35.).
, .

student, student1 ( 16.).
( 4.4 ), 4.4 ) 4.4 )),
student1 stampa()
,
( 27.).
4.4 ).

4.4 a) primer4_4 ( )

4.4 ) primer4_4 ( )

4.4 ) primer4_4 ( )

64

4.4 ) primer4_4 ( )

primer4_5
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:

/
primer4_5.c
/
/
Formiranje strukture zadatih podataka (o studentima i njihovim
/
/
ocenama) i prikaz na ekranu spiska studenata koji su polozili ispit
/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BROJ
#define MAX
#define GRESKA_DODELE
#define GRESKA_PROMENE

100
30
0
1

/dozvoljeni broj studenata/


/broj korisnih karaktera u stringu/
/status prve poruke greske/
/status druge poruke greske/

char poruke_o_greskama[] =
{
"\nNije uspela dinamicka dodela memorije za niz!\n",
"\nNije uspela promena dinamicki dodeljene memorije za niz!\n"};
struct student{
char ime[MAX+1], smer[MAX+1];
int br_indeksa, god_upisa, ocena;
};
void cita_spisak(struct student niz[], int n);
int sazima_spisak(struct student niz[], int n);
void stampa_spisak(struct student niz[], int n);
void greska(int status);
main( )
{
int n,n2;
struct student spisak;

/Deklaracija pokazivaca na niz struktura/

do
{

printf("\nBroj studenata: ");


scanf("%d", &n);
}while(n<1 || n>BROJ);
65

36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:

66

if((spisak = malloc(n sizeof(struct student)))==NULL)


greska(GRESKA_DODELE);
cita_spisak(spisak, n);
n2 = sazima_spisak(spisak, n);
if((spisak = realloc(spisak, n2 sizeof(struct student)))==NULL)
greska(GRESKA_PROMENE);
stampa_spisak(spisak, n2);
free(spisak);
return 0;
}
/
Funkcija koja cita podatke sa tastature i formira niz struktura
/
void cita_spisak(struct student niz[], int n)
{
int i, tmp;
for (i = 0; i <n; i++)
{
tmp = getchar();
printf("\nIme i prezime studenta: ");
gets(niz[i].ime);
printf("Smer na kome je student: ");
gets(niz[i].smer);
printf("Broj indeksa i godina upisa (u obliku xx/xxxx): ");
scanf("%d/%d", &niz[i].br_indeksa, &niz[i].god_upisa);
do
{

printf("Ocena: ");
scanf("%d", &niz[i].ocena);
}while(niz[i].ocena<5 || niz[i].ocena>10);
}
}
/
Funkcija koja sazima zadati spisak (niz struktura) /
/
na spisak studenata koji su polozili ispit
/
int sazima_spisak(struct student niz[], int n)
{
struct student ptr1, ptr2;
for(ptr1=ptr2=niz; ptr1<niz+n; ptr1++)
if((ptr1).ocena != 5)
ptr2++ = ptr1;
return (ptr2 - niz);
}

85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:

/
Funkcija koja prikazuje na ekranu rezultujuci spisak
/
void stampa_spisak(struct student niz[], int n)
{
int i;
puts("\nSpisak studenata koji su polozili ispit:");
for (i = 0; i <n; i++)
{
printf("\n%s %s ", niz[i].ime, niz[i].smer);
printf("%d %d ", niz[i].br_indeksa, niz[i].god_upisa);
printf("%d", niz[i].ocena);
}
printf("\n\n");
}
/
Funkcija koja prikazuje na ekranu poruke o greskama
/
void greska(int status)
{
puts(poruke_o_greskama[status]);
exit(1);
}

primer4_5

( )
.
.
.
student :
ime smer, int: br_indeksa, god_upisa
ocen ( 18. 21.).

( 23. 26.).
cita_spisak()
student ( [] )
n .

. ( 53. 72.)
for n : , ,
, 5 10
:
:
niz[0].ime,
niz[0].smer,
niz[0].br_indeksa,
niz[0].god_upisa,
niz[0].ocena,
...
:
niz[n-1].ime,
niz[n-1].smer,
niz[n-1].br_indeksa,
niz[n-1].god_upisa,
niz[n-1].ocena.

67

sazima_spisak()
student n . (
75. 83.) (
),
,
ocena 5 ( ).
.
: for ( 78.
80.) .
student (ptr1 ptr2)
(niz). ptr1
(niz+n), ocen ptr1
5, (
ptr1 ptr2
ptr2 ). ptr1

.
: (ptr2 niz).
stampa_spisak(), ,
student n
for ( 90. 94.)
. .
greska()
,
.
.
( : struct student
spisak[MAX]; MAX),

( 30.) student,
student (struct student spisak;).
( 4.5 a)) n
( )
n student
spisak ( 37. 38.).
cita_spisak() sazima_spisak().
: spisak
n ( 40. 41.).
( )
n2.

( 43. 44.) realloc()
spisak
(n2 sizeof(struct student)).
stampa_spisak() : spisak
n2, (
46. 48.).
( 4.5 ), 4.5 ), 4.5
) 4.5 )) 4.5 ).

68

4.5 a) primer4_5 ( )

4.5 ) primer4_5 ( )

4.5 ) primer4_5 ( )

4.5 ) primer4_5 ( )

4.5 ) primer4_5 ( )

4.5 ) primer4_5 ( )

69

primer4_6

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:

70

/
primer4_6.c
/
/
Kreiranje/pretrazivanje spiska zadatih adresa pomocu povezanih listi
/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 30

/broj korisnih karaktera u stringu/

struct adresa{
char prezime[MAX+1], ulica[MAX+1];
int br_ulaza, br_stana;
struct adresa sledeca;
};
void cita_adresu(struct adresa ptr_adresa);
void nalazi_adrese(struct adresa ptr_adresa);
void stampa_adresu(struct adresa ptr_adresa);
main()
{
char nastavak = 'D';
struct adresa prva, tekuca;
prva = malloc(sizeof(struct adresa));
tekuca = prva;
do
{

if(tekuca == NULL)
{
fprintf(stderr, "Nije uspela dodela memorije!");
exit(1);
}
tekuca->sledeca = NULL;
cita_adresu(tekuca);
printf("\nIzabrati D za nastavak: ");
nastavak = getchar(); nastavak = getchar();

if(nastavak == 'D')
{
tekuca->sledeca = malloc(sizeof(struct adresa));
tekuca = tekuca->sledeca;
}
}while(nastavak == 'D');
nalazi_adrese(prva);
free(prva);
return 0;
}

48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:

void cita_adresu(struct adresa ptr_adresa)


{
puts("\nUneti prezime, ulicu, broj ulaza i broj stana:");
scanf("%s%s%d%d",
ptr_adresa->prezime, ptr_adresa->ulica,
&ptr_adresa->br_ulaza, &ptr_adresa->br_stana);
}
void nalazi_adrese(struct adresa ptr_adresa)
{
int br_ulaza;
char ulica[MAX+1];
printf("\nUneti ime ulice i broj ulaza: ");
scanf("%s%d", ulica, &br_ulaza);
while(ptr_adresa != NULL)
{
if(strcmp(
ptr_adresa->ulica, ulica)==0 &&
ptr_adresa->br_ulaza == br_ulaza)
stampa_adresu(ptr_adresa);
ptr_adresa = ptr_adresa->sledeca;
}
}
void stampa_adresu(struct adresa ptr_adresa)
{
printf("%s %s %d %d\n",
ptr_adresa->prezime, ptr_adresa->ulica,
ptr_adresa->br_ulaza, ptr_adresa->br_stana);
}

primer4_6

,
( ) .
.

.
,
: , ,
, ... .
, (
), .
4. 6. ,
7. . 9. 13.
adresa (prezime, ulica, br_ulaza, br_stana
sledeca ), 15. 17.
: cita_adresu(), nalazi_adrese() stampa_adresu() (
adresa).
( 21.)
adresa ( prva
, tekuca ).
.

71


( 23. 24.). ,
. ,
NULL ( ) ( 26. 31.).
cita_adresu()
(
). ( 38.)

( 39. 40.). ,
nalazi_adrese() ( 44.)
.
cita_adresu() (ptr_adresa)
adresa.
: ptr_adresa->prezime,
ptr_adresa->ulica,
ptr_adresa->br_ulaza,
ptr_adresa->br_stana;
nalazi_adrese() (ptr_adresa).

(
ptr_adresa ptr_adresa->sledeca
), stampa_adresu() ( 62. 64.).
stampa_adresu()
(ptr_adresa) .
4.6 ) 4.6 ) .

4.6 a) primer4_6 ( )

4.6 ) primer4_6 ( )

4.6 ) primer4_6 ( )

4.6 ) primer4_6 ( )

72

4.6 ) primer4_6 ( )

4.6 ) primer4_6 ( )

4.6 ) primer4_6 ( )

4.6 ) primer4_6 ( )



.
 typedef ,
.
 ,
e , .


 , ,
( ).
 , ,
, .

malloc(),
free().

73

4.
___________________________________________
1.
pravougaonik
( tacka)
x y - ( )
.

74

4.
___________________________________________
,
.
.

1.

: redni_broj_smera
: ime_smera broj_studenata. n
n (n10).
.

2.
:
ime_studenta, ime_smera, br_indeksa god_upis.
n (n100),
,
( ).

3.
:
(ime_stanara) n (n100) , ( :
naziv_ulice, broj_ulaza)
( ).
, .

4.
,
:
a)
: ime, adresa, poz_broj_mreze, broj_mob,
) ime adresa
, br_mob_telefon brojem poz_broj_mreze.

75

76

5.

C

77


_____________________________________________
primer5_1
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:

78

/
primer5_1.c
/
/
Upis zadatog niza brojeva u tekstualnu datoteku
/
/
i citanje sadrzaja datoteke iz iste funkcije
/
#include <stdio.h>
#include <stdlib.h>
#define MAX1
10
#define MAX2
20

/dozvoljena duzina niza/


/broj korisnih karaktera u stringu/

typedef enum{GRESKA_DODELE, GRESKA_DAT}Greska;


char poruke_o_greskama[] = {
"\nGreska pri dinamickoj dodeli memorije!\n",
"\nGreska pri otvaranju datoteke za upis!\n"

};

void greska(Greska status);


main()
{
FILE fptr;
int i, n, niz;
char temp[MAX1], ime_dat[MAX2+1];
/Formiranje niza/
do
{
printf("\nDuzina niza (n <= %d): ", MAX1);
scanf("%d", &n); fflush(stdin);
}while(n<1 || n>MAX1);
if((niz = malloc(nsizeof(int))) == NULL)
greska(GRESKA_DODELE);
printf("Vrednosti elemenata niza: ");
for (i=0; i<n; i++)
scanf("%d", &niz[i]);
fflush(stdin);
/Otvaranje tekstualne datoteke za upis i citanje/
printf("Ime datoteke: ");
gets(ime_dat);
if((fptr = fopen(ime_dat, "w+")) == NULL)
greska(GRESKA_DAT);

44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:

/Upis u tekstualnu datoteku i prikaz na ekranu/


printf("\nUpisano u datoteku %s:", ime_dat);
for (i=0; i<n; i++)
{
fprintf(fptr, "\nniz[%d] = %d", i, niz[i]);
fprintf(stdout, "\nniz[%d] = %d", i, niz[i]);
}
rewind(fptr);
/Povratak na pocetak datoteke/
/*Citanje iz tekstualne datoteke i prikaz na ekranu*/
printf("\n\nProcitano iz datoteke %s:", ime_dat);
for(i=0; i<n; i++)
{
fscanf(fptr, "%s%s%d", temp, temp, &niz[i]);
fprintf(stdout, "\nniz[%d] = %d", i, niz[i]);
}
printf("\n\n");
fclose(fptr);
return 0;

/Zatvaranje datoteke/

}
/
Funkcija koja prikazuje na ekranu poruke o greskama
/
void greska(Greska status)
{
fprintf(stderr, poruke_o_greskama[status]);
exit(1);
}

primer5_1
/
(stdin, stdout, stderr)
/ .
, ,
.
/ (
: ).
fopen()
stdio.h .
FILE ( stdio.h)
. fopen()
FIL.
, .

, .
( 19.) :
fptr FILE (FILE fptr;), (int niz;)
(char ime_dat[MAX2+1]).
( 24. 35.)
( 5.1 )), ,
( 5.1 )) (
5.1 )). ( 38. 39.), 41.

79

fopen()
().
(ime_dat),
("w+").
fopen() fptr
FILE (niz.txt)
. NULL
greska() (
42.). ( 45.).
fprintf().
printf() ,
fptr ( 47.). fprintf()

(fptr) (stdout).
48. fprintf()

: , ,
. 1, 2 3, , :
niz[0] = 1
niz[1] = 2
niz[2] = 3
, ,
rewind(fptr). rewind() ,
fptr, ( 50.)
fptr ( 55.)
( 56.).
( temp) . ( :
temp niz[0], =,
niz[1], =).
fprintf() (
printf()) .
/
fptr fclose(fptr) ( 60.).
5.1 ) , 5.1 )
niz.txt ( ).

5.1 a) primer5_1 ( )

5.1 ) primer5_1 ( )

5.1 ) primer5_1 ( )

80

5.1 ) primer5_1 ( )

5.1 ) primer5_1 ( )

primer5_2
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:

/
primer5_2.c
/
/
Upis zadatog znakovnog niza u tekstualnu datoteku, /
/
prikaz na ekranu pojedinih delova ove datoteke, kao i
/
/
vrednosti indikatora pozicije posle svakog citanja sadrzaja
/
#include <stdio.h>
#include <stdlib.h>
#define MAX 5

/broj korisnih karaktera u stringu/

typedef enum {GRESKA1_DAT,GRESKA2_DAT}Greska;


char poruke_o_greskama[] = {
"\nGreska pri otvaranju datoteke za upis!\n",
"\nGreska pri otvaranju datoteke za citanje!\n" };
void greska(Greska status);
main()
{
FILE fptr;
char bafer[MAX+1];
char poruka[] = "abcdefghijklmnopqrstuvwxyz";
/Otvaranje datoteke, upis u datoteku i zatvaranje datoteke/
if ( (fptr = fopen("primer.txt", "w")) == NULL)
greska(GRESKA1_DAT);

81

27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:

fputs(poruka, fptr);
fclose(fptr);
/Otvaranje iste datoteke za citanje/
if ((fptr = fopen("primer.txt", "r")) == NULL)
greska(GRESKA2_DAT);
printf("\nPo otvaranju datoteke detektuje se pozicija: %ld", ftell(fptr));
/Citanje prvih 5 karaktera iz datoteke/
fgets(bafer, MAX+1, fptr);
printf("\n\nProcitan sadrzaj: %s, ", bafer);
printf("detektovana pozicija u datoteci: %ld", ftell(fptr));
/Citanje sledecih 5 karaktera iz datoteke/
fgets(bafer, MAX+1, fptr);
printf("\n\nProcitan sadrzaj: %s, ", bafer);
printf("detektovana pozicija u datoteci: %ld", ftell(fptr));
/Povratak na pocetak datoteke/
rewind(fptr);
printf("\n\nNakon povratka na pocetak, ");
printf("detektovana pozicija u datoteci: %ld", ftell(fptr));
/Citanje prvih 5 karaktera iz datoteke i zatvaranje datoteke/
fgets(bafer, MAX+1, fptr);
printf("\n\nProcitan sadrzaj od pocetka datoteke: %s\n\n", bafer);
fclose(fptr);
return 0;
}
/
Funkcija koja prikazuje na ekranu poruke o greskama
/
void greska(Greska status)
{
fprintf(stderr, poruke_o_greskama[status]);
exit(1);
}

primer5_2

, .
ftell(),
, fptr.
.
( 19., 20. 21)
: fptr FILE,
bafer poruka.
( z).
( 24. 28.):
("primer.txt") ("w") ( 24.),
82

( z) .
fputs()
( fptr )
puts() ( 27.),
fptr
fclose(fptr) ( 28.).
( 31. 54.):
("primer.txt") ("r") ( 31.),

ftell() ( 34.) 0 (0 ),
fgets()
( fptr
MAX) gets()
bafer ( 37)
( 38.),

ftell() ( 39.) 5 (5 ),

fgets() bafer ( 42.),
( 43.),

ftell() ( 44.) 10 (10 ),

rewind() ( 47.),

ftell() ( 48. 49.) 0 (0 ,
),
, ,
fgets() bafer ( 52.),
( 53.),
( 54.).
5.2 ),
5.2 ).

5.2 a) primer5_2 ( )

5.2 ) primer5_2 ( )

83

primer5_3
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:

84

/
primer5_3.c
/
/
Kopiranje sadrzaja jedne tekstualne datoteke u drugu, /
/
izmena imena datoteke i brisanje datoteke
/
#include <stdio.h>
#include <stdlib.h>
#define MAX 20

/broj korisnih karaktera u stringu/

typedef enum{
GRESKA_KOPIRANJA, GRESKA_IMENA, GRESKA_BRISANJA}Greska;
char poruke_o_greskama[] = {
"\nGreska pri kopiranju datoteke!\n",
"\nGreska pri promeni imena datoteke!\n",
"\nGreska pri brisanju datoteke!\n"
};
int kopira_dat(char ime1, char ime2);
void greska(Greska status);
main()
{
char dat1[MAX+1], dat2[MAX+1];
/Kopiranje sadrzaja iz jedne u drugu datoteku/
printf("\nIme originalne datoteke: ");
gets(dat1);
printf("Ime datoteke kopije: ");
gets(dat2);
if(kopira_dat(dat1, dat2) == 0)
printf("Uspesno izvrseno kopiranje datoteke.\n");
else
greska(GRESKA_KOPIRANJA);
/Izmena imena datoteke/
printf("\nUnesite staro ime datoteke: ");
gets(dat1);
printf("Unesite novo ime datoteke: ");
gets(dat2);
if (rename(dat1, dat2) == 0)
printf("Ime datoteke %s je promenjeno u ime %s.\n", dat1, dat2);
else
greska(GRESKA_IMENA);
/Brisanje datoteke/
printf("\nUnesite ime datoteke koju treba izbrisati: ");
gets(dat1);

48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:

if (remove(dat1) == 0)
printf("Datoteka %s je izbrisana.\n\n", dat1);
else
greska(GRESKA_BRISANJA);
return 0;
}
/
Funkcija koja kopira sadrzaj jedne tekst datoteke u drugu
/
int kopira_dat( char ime1, char ime2)
{
FILE fptr1, fptr2;
int c;
if ( (fptr1 = fopen(ime1, "r") ) == NULL )
return -1;
if ( (fptr2 = fopen(ime2, "w") ) == NULL )
return -1;
while ((c=fgetc(fptr1)) !=EOF )
fputc(c, fptr2);
fclose(fptr2);
fclose(fptr1);
return 0;
}
/
Funkcija koja prikazuje na ekranu poruke o greskama
/
void greska(Greska status)
{
fprintf(stderr, poruke_o_greskama[status]);
exit(1);
}

primer5_3

: ,
. .

17. kopira_dat().
:

. .
57. 73. kopira_dat().
( 58.) FILE
( ).
, (r) (w) ( 61.
64.). -1.
,
fgetc(). , (EOF),
fputc() ( 66. 67.).
85


(getchar() putchar()) fptr1
. ( 69. 70.)
0 ( ).
( 21.)
dat1 dat2 .
( 5.3 ) 5.3 ))
dat1 dat2. kopira_dat()

( 5.3 )).
, ,
.
rename() ( 40.).
,
(
).
0, ( 5.3 )).
remove() ( 49.).
( ,
). 0,
( 5.3 )).

5.3 a) primer5_3 ( )

5.3 ) primer5_3 ( )

5.3 ) primer5_3 ( )

5.3 ) primer5_3 ( )

5.3 ) primer5_3 ( )

86

primer5_4
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:

/
primer5_4.c
/
/
Upis zadatog niza brojeva u binarnu datoteku
/
/
i citanje sadrzaja iste datoteke
/
#include <stdio.h>
#include <stdlib.h>
#define MAX 5

/dozvoljena duzina niza/

typedef enum{GRESKA1_DAT,GRESKA2_DAT}Greska;
char poruke_o_greskama[] = {
"\nGreska pri otvaranju datoteke za upis!\n",
"\nGreska pri otvaranju datoteke za citanje!\n" };
void greska(Greska status);
main()
{
FILE fptr;
int i, niz1[MAX], niz2[MAX];
/Inicijalizacija niza1/
for (i=0; i<MAX; i++)
niz1[i] = 2i;
/Otvaranje binarne datoteke za upis/
if((fptr = fopen("primer.bin", "wb")) == NULL)
greska(GRESKA1_DAT);
/Upis vrednosti niza1 u datoteku i zatvaranje datoteke/
fwrite(niz1, sizeof(int), MAX, fptr);
fclose(fptr);
/Otvaranje iste datoteke za citanje/
if ( (fptr = fopen("primer.bin", "rb")) == NULL)
greska(GRESKA2_DAT);
/Citanje podataka iz datoteke u niz2 i zatvaranje datoteke/
fread(niz2, sizeof(int), MAX, fptr);
fclose(fptr);
/Prikaz vrednosti elemenata upisanog i procitanog niza/
printf("\nUpis\tCitanje\n\n");
for (i=0; i<MAX; i++)
printf("%d\t%d\n", niz1[i], niz2[i]);
printf("\n");
return 0;

87

48:
49:
50:
51:
52:
53:

}
/
Funkcija koja prikazuje na ekranu poruke o greskama
/
void greska(Greska status)
{
fprintf(stderr, poruke_o_greskama[status]);
exit(1);
}

primer5_4
( )
.
18. fptr FILE (
).
( 19.)
( 22. 23.).
( 26.)
fopen().
( ,
), je ("wb").

fwrite() ( 30.).
( )
. ,
, fwrite().
, MAX niz1 sizeof(int)
fptr.
, ,
fclose() ( 31.), ,
fopen() ( 34.).

fread() ( 38.).
.
,
fread(). , MAX
sizeof(int), fptr niz2
.
, ,
fclose() ( 39.).
43. 44. :
(niz1) ,
(niz2) ( 5.4).

5.4 primer5_4

88

primer5_5
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:

/
primer5_5.c
/
/
Citanje sadrzaj odredjenog dela binarne datoteke
/
/
u koju je prethodno upisan zadati niz
/
#include <stdio.h>
#include <stdlib.h>
#define MAX 5

/dozvoljena duzina niza/

typedef enum{GRESKA1_DAT, GRESKA2_DAT, GRESKA_POZ} Greska;


char poruke_o_greskama[] = {
"\nGreska pri otvaranju datoteke za upis!\n",
"\nGreska pri otvaranju datoteke za citanje!\n",
"\nGreska pri pozicioniranju u datoteci\n"
};
void greska(Greska status);
main()
{
FILE fptr;
int i, broj, rbroj, niz[MAX];
for (i=0; i<MAX; i++)
niz[i] = 10i;
/Otvaranje binarne datoteke za upis/
if ((fptr = fopen("primer.bin", "wb")) == NULL)
greska(GRESKA1_DAT);
/Upis vrednosti niza u datoteku i zatvaranje datoteke/
fwrite(niz, sizeof(int), MAX, fptr);
fclose(fptr);
printf("\nUpisano u datoteku primer.bin:\n");
for (i=0; i<MAX; i++)
printf("\n%d. element: %d", i+1, niz[i]);
/Otvaranje binarne datoteke za citanje/
if ((fptr = fopen("primer.bin", "rb")) == NULL)
greska(GRESKA2_DAT);
do
{ printf("\n\nBirati redni broj elementa(od 1 do %d): ",MAX);
scanf("%d", &rbroj);
}while(rbroj < 1 || rbroj > MAX);
/Pomeranje indikatora pozicije na odredjeni element/
if ((fseek(fptr, (rbroj-1)sizeof(int), SEEK_SET) ) != 0)

89

48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:

greska(GRESKA_POZ);
/Citanje odredjenog elementa niza iz datoteke/
fread(&broj, sizeof(int), 1, fptr);
printf("\n%d. element ima vrednost %d.\n\n", rbroj, broj);
fclose(fptr);
return 0;
}
/
Funkcija koja prikazuje na ekranu poruke o greskama
/
void greska(Greska status)
{
fprintf(stderr, poruke_o_greskama[status]);
exit(1);
}

primer5_5


.
19. fptr FILE,
20. . ( 22. 23.).
:
("primer.bin") (wb)

(e 26. 27.),

( 30),
( 31.),
( 33. 35.)
( 7.5 )).
:
("primer.bin") (rb)

(e 38. 39.),

( 41. 44.),
fseek()
( 47.)

( 48.),
(
51.) ( 52.),
( 54.).
fseek(), ftell() rewind(),
.
: rewind(),
ftell(),

90

(
fseek()).
fseek()
.
: SEEK_SET (
), SEEK_CUR ( )
SEEK_END ( ).
( 47.) fseek()
fptr,
(SEEK_SET)
((rbroj-1)sizeof(int)).

5.5 ) 5.5 ).

5.5 a) primer5_5 ( )

5.5 ) primer5_5 ( )

primer5_6

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:

/
primer5_6.c
/
/
Formiranje i azuriranje sadrzaja binarne datoteke koja cuva zapise
/
/
fiksne duzine: ime, prezime, smer, reg. broj i broj polozenih ispita
/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 20

/broj korisnih karaktera u stringu/

typedef enum{GRESKA1_DAT, GRESKA2_DAT, GRESKA_POZ} Greska;


char poruke_o_greskama[] = {
"\nGreska pri otvaranju datoteke za upis!\n",
"\nGreska pri otvaranju datoteke za citanje!\n",
"\nGreska pri pozicioniranju u datoteci\n"
};

91

16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
92

FILE fptr;
typedef struct student{
char ime[MAX+1], prezime[MAX+1], smer[MAX+1], reg_broj[MAX+1];
int br_pol_ispita;
}Student;
Student s1;
int broj_struktura = 0;
void unos(void);
void izmene(void);
void prikaz(void);
void greska(Greska status);
main()
{
int opcija, izlaz = 0;
unos();
do
{

printf("\n\n1. Izmena\n2. Prikaz\n3. Izlaz");


printf("\n\nIzabrati opciju: ");
scanf("%d", &opcija);
switch(opcija)
{
case 1:
izmene();
break;
case 2:
prikaz();
break;
default:
izlaz = 1;
break;

}
}while(!izlaz);
return 0;
}
/
Funkcija koja upisuje sadrzaj u binarnu datoteku
/
void unos(void)
{
/Otvaranje datoteke/
if((fptr = fopen("student.bin", "wb")) == NULL)
greska(GRESKA1_DAT);
/Prihvatanje vrednosti clanova strukture i upis u datoteku/
printf("\nUneti za svakog studenta u posebnom redu ");
printf("(do reci Kraj u posebnom redu):\nime i prezime, ");

66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:

printf("ime smera, registarski broj i broj polozenih ispita\n\n");


while(1)
{
scanf("%s", s1.ime);
if(strcmp(s1.ime, "Kraj")==0)
break;
scanf("%s%s",s1.prezime, s1.smer);
scanf("%s%d",s1.reg_broj, &s1.br_pol_ispita);
fwrite(&s1, sizeof(Student), 1, fptr);
broj_struktura++;
}
/Zatvaranje datoteke/
fclose(fptr);
}
/
Funkcija koja azurira sadrzaj binarne datoteke
/
void izmene(void)
{
int rbroj, promena;
/Otvaranje datoteke/
if ( (fptr = fopen("student.bin", "rb+")) == NULL)
greska(GRESKA2_DAT);
/Izmena podataka u datoteci/
printf("\nUnesite redni broj studenta ");
printf("i dodatni broj polozenih ispita: ");
do
{

scanf("%d", &rbroj);
scanf("%d", &promena);

}
while(rbroj < 1 || rbroj > broj_struktura);

if((fseek(fptr, (rbroj-1) sizeof(Student),SEEK_SET))!=0)


greska(GRESKA_POZ);
fread(&s1, sizeof(Student), 1, fptr);
s1.br_pol_ispita += promena;
if((fseek(fptr, -sizeof(Student), SEEK_CUR)) != 0)
greska(GRESKA_POZ);
fwrite(&s1, sizeof(Student), 1, fptr);
/Zatvaranje datoteke/
93

116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
139:
140:
141:

fclose(fptr);
}
/
Funkcija koja prikazuje sadrzaj binarne datoteke
/
void prikaz(void)
{
int i;
/Otvaranje datoteke/
if((fptr = fopen("student.bin", "rb")) == NULL)
greska(GRESKA2_DAT);
/Prikaz na ekranu sadrzaja datoteke/
for(i=0; i<broj_struktura;i++)
{ fread(&s1, sizeof(Student), 1, fptr);
printf("\n%d. %s %s %s ", i+1, s1.ime, s1.prezime, s1.smer);
printf("%s %d ispita", s1.reg_broj, s1.br_pol_ispita);
}
/Zatvaranje datoteke/
fclose(fptr);
}
/
Funkcija koja prikazuje na ekranu poruke o greskama
/
void greska(Greska status)
{
fprintf(stderr, poruke_o_greskama[status]);
exit(1);
}

primer5_6


.
, , .
Student
: ime, prezime, smer, reg_broj,
: br_pol_ispita. s1
( 19. 23.).
broj_struktura
0 ( 25.).
.
27. 29. : unos(),
izmene() prikaz().
.
unos() ( 58.):
("student.bin") ("wb"),
fptr
( 60. 61.),

( 64.),
while(1) ( 68.)
s1 (s1.ime,

94

s1.prezime, s1.smer, s1.reg_broj, s1.br_pol_ispita).


s1.ime "Kraj",
. ,
s1 ( s1, sizeof(Student))
fptr. ( 76.)
broj_struktura ( 78.),
( 82.).
izmene() ( 85.):
("student.bin") ("rb+"),
fptr
( 89. 90.),

( 93. 100.),
fseek()

( 103.)
( 104.),
( 106.),
s1.br_pol_ispita
( 108.),
fseek() ,

( 110.)

( 111.),
( 113.),
( 116.).
prikaz() ( 119.):
("student.bin") ("rb"),
fptr
( 123. 124.),
for (
)
( 127. 131.),
( 134.).
( 32.) unos()
( 35.), . do.. while
( 37. 53.) : 1. Izmena, 2. Prikaz, 3. Izlaz.
1. izmene(),
. 2. prikaz(),
. 3.
. 5.6 ) 5.6 )
.

95

5.6 a) primer5_6 ( )

5.6 ) primer5_6 ( )

5.6 ) primer5_6 ( )

5.6 ) primer5_6 ( )

5.6 ) primer5_6 ( )

5.6 ) primer5_6 ( )

96

5.6 ) primer5_6 ( )

5.6 ) primer5_6 ( )

5.6 ) primer5_6 ( )





(

).

. (
, ,
).



/
(fopen()). ,
( ),
. ,

. NULL
.
 /

.

97

5.
_____________________________________________
1.

:
. .

98

5.
_____________________________________________

.

1.

.

2.
C
:
.

3.

:
(:).

4.

) ( ) m (m10) ,
n (n10), m ,
)
0,
,
) .

5.

) ( ) : ime, prezime, br_indeksa,
god_upisa, ocena, n (n10) n
,
)
,
) :
br_indeksa god_upisa.

99

100

6.

101


___________________________________________________________________

primer6_1
, greska
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:

/
direkt.h
/
/
Datoteka_zaglavlje sa direktivama
/

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:

/
global.h
/
/
Datoteka_zaglavlje sa definicijama
/

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:

/
extern.h
/
/
Datoteka_zaglavlje sa eksternim definicijama
/

102

#if !defined _direkt_h_


#define _direkt_h_
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 20

/broj korisnih karaktera u stringu/

#endif

#if !defined _global_h_


#define _global_h_
#include "direkt.h"
typedef enum{NEMA_ARG, GRESKA1_DAT, GRESKA2_DAT}Greska;
char poruke_o_greskama[100] = {
"\nZa pokretanje programa potrebno je zadati imena "
"\ndatoteka u komandnoj liniji, posle imena programa!",
"\nGreska pri otvaranju datoteke za citanje!\n",
"\nGreska pri otvaranju datoteke za upis!\n"
};
void greska(Greska);
#endif

#if !defined _extern_h_


#define _extern_h_
#include "direkt.h"
extern enum{NEMA_ARG, GRESKA1_DAT, GRESKA2_DAT}Greska;
extern char poruke_o_greskama[100];
extern void greska(Greska);
#endif

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:

/
glavni.c
/
/
Glavni modul: kopiranje sadrzaja jedne tekst datoteke u drugu
/
/
bez reci greska (imena datoteka prihvataju se iz komandne linije)
/

1:
2:
3:
4:
5:
6:
7:
8:
9:

/
greska.c
/
/
Modul sa funkcijom koja prikazuje na ekranu poruke o greskama
/

#include "global.h"
main(int argc, char argv[])
{
char rec[MAX+1];
FILE fptr1, fptr2;
if(argc < 3)
greska(NEMA_ARG);
if((fptr1 = fopen(argv[1], "r")) == NULL)
greska(GRESKA1_DAT);
if((fptr2 = fopen(argv[2], "w")) == NULL)
greska(GRESKA2_DAT);
while(1)
{
fscanf(fptr1, "%s", rec);
if(feof(fptr1))
break;
if(strcmp(rec, "greska") != 0)
fprintf(fptr2, "%s ", rec);
}
fclose(fptr2);
fclose(fptr1);
return 0;
}

#include "extern.h"
void greska(Greska)
{
fprintf(stderr, poruke_o_greskama[Greska]);
exit(1);
}

primer6_1

( , ).
. (source
103

files). , #include,
.h (header files).

, greska.

:
direkt.h #include
#define
( , ,
);
global.h
( ) (
) (greska());
extern.h
global.h,
( extern ).
(
global.h) (
). global.h,
, (
glavni.c), extern.h,
, .
(
direkt_h) :
#if !defined
#define
:
#endif
( )

. ,
diret.h (#if !defined _direkt_h_),
7. 10.
(#define _direkt_h_). .
(#endif) .
, glavni.c greska.c
( ):
glavni.c .
(
6.1 )).
FILE (fptr1 fptr2).

( 11. 12.) fopen()
. , ( argv[1]),
( 14. 15.), , (
argv[2]), ( 17. 18.).
while(1) ( 20. 28.).
( greska)
fscanf()
fprintf().
104

feof() ( 23.).
0,
. ,
1 ( 24.). ,
( 30. 31.);
greska.c
(
).
.
( )
6.1 ).
,
, ,
6.1 ), (
greska) 6.1 ).

6.1 a) primer6_1 ( )

6.1 ) primer6_1 ( )

6.1 ) primer6_1 ( )

6.1 ) primer6_1 ( )

primer6_2
,
1:
2:
3:
4:
5:
6:
7:
8:
9:

/
direkt.h
/
/
Datoteka_zaglavlje sa direktivama
/
#if !defined _direkt_h_
#define _direkt_h_
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
105

10:
11:
12:
13:

#define BROJ
#define MAX

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:

/
global.h
/
/
Datoteka_zaglavlje sa definicijama
/

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:

/
extern.h
/
/
Datoteka_zaglavlje sa eksternim definicijama
/

106

100
30

/dozvoljeni broj adresa u spisku/


/broj korisnih karaktera u stringu/

#endif

#if !defined _global_h_


#define _global_h_
#include "direkt.h"
typedef enum{
GRESKA_DODELE, GRESKA_PROMENE, OPCIJA_KRAJ}Greska;
char poruke_o_greskama[] = {
"\nNije uspela dinamicka dodela memorije za niz!\n",
"\nNije uspela promena dinamicki dodeljene memorije za niz!\n",
"\nIzabrana je opcija za kraj!\n"

};

struct adresa{
char prezime[MAX+1], ulica[MAX+1];
int br_ulaza, br_stana;
} spisak;
int broj_adresa;
void cita_adresu(void);
void dodaje_adresu(struct adresa x);
void menja_adresu(void);
void stampa_adrese(void);
void greska(Greska);
#endif

#if !defined _extern_h_


#define _extern_h_
#include "direkt.h"
extern enum{
GRESKA_DODELE, GRESKA_PROMENE, OPCIJA_KRAJ}Greska;
extern char poruke_o_greskama[BROJ];
extern struct adresa{

15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:

char prezime[MAX+1], ulica[MAX+1];


int br_ulaza, br_stana;
} spisak;
extern int broj_adresa;
extern void cita_adresu(void);
extern void dodaje_adresu(struct adresa x);
extern void menja_adresu(void);
extern void stampa_adrese(void);
extern void greska(Greska);
#endif
/
glavni.c
/
/
Glavni modul: glavna funkcija i pozivi ostalih funkcija
/
#include "global.h"
main( )
{
int opcija;
broj_adresa = 0;
while(1)
{
printf("\n1. Nova adresa");
printf("\n2. Izmena adrese");
printf("\n3. Prikaz");
printf("\n4. Izlaz");
printf("\n\nIzabrati opciju: ");
scanf("%d", &opcija);
fflush(stdin);
switch(opcija)
{
case 1:
if(broj_adresa < BROJ)
cita_adresu();
break;
case 2:
menja_adresu();
break;
case 3:
stampa_adrese();
break;
case 4:
greska(OPCIJA_KRAJ);
break;
default:
break;

107

37:
38:
39:
40:
41:
42:
43:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:

108

}
}
if(broj_adresa > 0)
free(spisak);
return 0;
}
/
cita_adresu.c
/
/
Modul sa funkcijom koja cita podatke o adresi sa tastature
/
/
i funkcijom koja dodaje adresu spisku
/
#include "extern.h"
/
Funkcija koja cita podatke o adresi sa tastature
/
void cita_adresu(void)
{
struct adresa adr1;
int i, ista_adresa = 0;
printf("\nUneti prezime stanara, ime ulice, broj ulaza i broj stana:\n");
scanf("%s%s", adr1.prezime, adr1.ulica);
scanf("%d%d", &adr1.br_ulaza, &adr1.br_stana);
fflush(stdin);
if(broj_adresa==0)
dodaje_adresu(adr1);
else
{
for(i=0; i<broj_adresa; i++)
if(strcmp(spisak[i].prezime, adr1.prezime)==0 &&
strcmp(spisak[i].ulica, adr1.ulica)==0 &&
spisak[i].br_ulaza == adr1.br_ulaza &&
spisak[i].br_stana == adr1.br_stana)
ista_adresa = 1;
if(!ista_adresa)
dodaje_adresu(adr1);
}
}
/
Funkcija koja dodaje adresu spisku
/
void dodaje_adresu(struct adresa x)
{
if(broj_adresa==0)
{
if((spisak = malloc(sizeof(struct adresa))) == NULL)
greska(GRESKA_DODELE);
}
else if((spisak = realloc( spisak, (broj_adresa+1)
sizeof(struct adresa))) == NULL)
greska(GRESKA_PROMENE);
spisak[broj_adresa] = x;
broj_adresa++;
}

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:

/
menja_adresu.c
/
/
Modul sa funkcijom koja azurira podatke o adresi u spisku
/

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:

/
stampa_adrese.c
/
/
Modul sa funkcijom koja prikazuje na ekranu spisak adresa
/

1:
2:
3:
4:

/
greska.c
/
/
modul sa funkcijom koja prikazuje na ekranu poruke o greskama
/

#include "extern.h"
void menja_adresu(void)
{
char ulica[MAX+1];
int i, br_ulaza, br_stana;
printf("\nStara adresa (ulica, broj ulaza i broj stana):\n");
scanf("%s%d%d", ulica, &br_ulaza, &br_stana);
for(i=0; i<broj_adresa; i++)
if(strcmp(spisak[i].ulica, ulica)==0 &&
spisak[i].br_ulaza==br_ulaza &&
spisak[i].br_stana==br_stana)
{
printf("\nNova adresa (ulica, broj ulaza i broj stana):\n");
scanf("%s%d%d", spisak[i].ulica,
&spisak[i].br_ulaza,
&spisak[i].br_stana);
fflush(stdin);
}
}

#include "extern.h"
void stampa_adrese(void)
{
char ulica[MAX+1];
int i, br_ulaza;
printf("\nIme ulice i broj ulaza:\n");
scanf("%s%d", ulica, &br_ulaza);
fflush(stdin);
printf("\nSpisak stanara na adresi %s %d:\n", ulica, br_ulaza);
for(i=0; i<broj_adresa; i++)
if(strcmp(spisak[i].ulica,ulica)==0
&& spisak[i].br_ulaza==br_ulaza)
{
printf("%s %s ", spisak[i].prezime,spisak[i].ulica);
printf("%d %d\n", spisak[i].br_ulaza, spisak[i].br_stana);
}
}

#include "extern.h"
109

5:
6:
7:
8:
9:
10:

void greska(Greska)
{
fprintf(stderr, poruke_o_greskama[Greska]);
exit(1);
}

primer6_2
,
( , ).

:
direkt.h, #include
#define
;
global.h ,
glavni.c.
( ),
greska(),
adresa (prezime, ulica, br_ulaza, br_stana)
(spisak),

broj_adresa,

:
cita_adresu(), dodaje_adresu(), menja_adresu(), stampa_adrese()
(
dodaje_adresu()
);
extern.h .
global.h (
extern ).
glavni.c, cita_adresu.c,
menja_adresu.c, stampa_adrese.c greska.c (
):
glavni.c
broj_adresa 0 ( 9.) while(1) (
11. 38.) : 1. Nova adresa, 2. Izmena
adrese, 3. Prikaz, 4. Izlaz. 1.
broj_adresa
(BROJ) cita_adresu(), 2.
menja_adresu() 3.
stampa_adrese(). 4.

( 39. 40.);
cita_adresu. cita_adresu()
dodaje_adresu().
adr1
adresa, ( 9. 15.).
( 17.)
dodaje_adresu()
adr1, ( 18.).
110

( 19.),
dodaje_adresu()
adr1 ( 20. 28.).
dodaje_adresu()
adresa. ( 32.)
adresa ( 33.
34.),
adresa ( 36. 38.).
,
( 40. 41);
menja_adresu.
menja_adresu().
( 10. 11.)
( )
( 13. 22.);
stampa_adrese.
stampa_adrese(). :
( 10. 11.),
( )
( ) (
14. 20.);
greska.c
.
6.2 ) 6.2 )
.

6.2 a) primer6_2 ( )

6.2 ) primer6_2 ( )

6.2 ) primer6_2 ( )

111

6.2 ) primer6_2 ( )

6.2 ) primer6_2 ( )

6.2 ) primer6_2 ( )

6.2 ) primer6_2 ( )

6.2 ) primer6_2 ( )

112

primer6_3

, ,

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:

/
direkt.h
/
/
Datoteka zaglavlje sa direktivama
/

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:

/
global.h
/
/
Datoteka zaglavlje sa definicijama
/

#if !defined _direkt_h_


#define _direkt_h_
#include <stdio.h>
#include <stdlib.h>
#define MAX
30
#define BROJ
100

/broj korisnih karaktera u stringu/


/dozvoljeni broj struktura u nizu/

#endif

#if !defined _global_h_


#define _global_h_
#include "direkt.h"
typedef enum{GRESKA1_DAT, GRESKA2_DAT}Greska;
char poruke_o_greskama[] = {
"\nGreska pri otvaranju datoteke za citanje!\n",
"\nGreska pri otvaranju datoteke za upis!\n"
};
struct student{
char ime[MAX+1];
int reg_broj, god_upisa;
};
struct pol_ispiti{
struct student student1;
int broj_ispita;
}polozio;
int broj_zapisa;
FILE fptr;
void dod_dat(void);
void azur_dat(void);
void prikaz_dat(void);
void greska(Greska);
#endif
113

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:

/
extern.h
/
/
Datoteka zaglavlje sa eksternim definicijama
/

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:

/
glavni.c
/
/
Glavni modul: prikaz na ekranu menu-a i pozivi ostalih funkcija
/

114

#if !defined _extern_h_


#define _extern_h_
#include "direkt.h"
extern enum{GRESKA1_DAT, GRESKA2_DAT}Greska;
extern char poruke_o_greskama[BROJ];
extern struct student{
char ime[MAX+1];
int reg_broj, god_upisa;
};
extern struct pol_ispiti{
struct student student1;
int broj_ispita;
}polozio;
extern int broj_zapisa;
extern FILE fptr;
extern void dod_dat(void);
extern void azur_dat(void);
extern void prikaz_dat(void);
extern void greska(Greska);
#endif

#include "global.h"
main()
{
int opcija, izlaz = 0;
do
{
printf("\n1. Dodavanje");
printf("\n2. Azuriranje");
printf("\n3. Prikaz");
printf("\n4. Izlaz");
printf("\n\nIzabrati opciju: ");
scanf("%d", &opcija);
fflush(stdin);

switch(opcija)
{
case 1:

21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:

dod_dat();
break;
case 2:
azur_dat();
break;
case 3:
prikaz_dat();
break;
case 4:
izlaz = 1;
break;
default:
break;
}
}while(!izlaz);
return 0;
}
/
dod_dat.c
/
/
Modul sa funkcijom koja datoteci dodaje zapise o studentima
/
#include "extern.h"
void dod_dat(void)
{
int rbr; struct pol_ispiti prazno = {0};
/Datoteka sa zadatim imenom ne postoji/
if((fptr = fopen("ispiti.bin", "rb+")) == NULL)
{
/Datoteka sa zadatim imenom se kreira/
if((fptr = fopen("ispiti.bin", "wb+")) == NULL)
greska(GRESKA1_DAT);
broj_zapisa = 0;
fwrite(&broj_zapisa, sizeof(broj_zapisa), 1, fptr);
}
/Datoteka postoji, citanje broja zapisa/
else
{
fread(&broj_zapisa, sizeof(broj_zapisa), 1, fptr);
/Dodavanje zapisa/
while(1)
{
printf("\nRedni broj studenta: ");
scanf("%d", &rbr);
fflush(stdin);
if(rbr<1 || rbr>BROJ) break;
printf("Ime studenta: ");
gets(polozio.student1.ime);

115

32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
116

printf("Registarski broj i godina upisa: ");


scanf("%d%d",&polozio.student1.reg_broj,
&polozio.student1.god_upisa);
fflush(stdin);
polozio.broj_ispita = 0;
/Nov zapis iza kraja datoteke/
if(rbr>broj_zapisa)
{
fseek(fptr, 0, SEEK_END);
while(++broj_zapisa<rbr)
fwrite(&prazno, sizeof(prazno), 1, fptr);
broj_zapisa = rbr;
}
/Nov zapis pre kraja datoteke/
else
fseek(fptr,sizeof(broj_zapisa)+
(rbr-1)sizeof(polozio), SEEK_SET);
/Dodavanje zapisa/
fwrite(&polozio, sizeof(polozio), 1, fptr);
/Promena broja zapisa/
rewind(fptr);
fwrite(&broj_zapisa, sizeof broj_zapisa, 1, fptr);
}
}
fclose(fptr);
}
/
azur_dat.c
/
/
Modul sa funkcijom koja azurira sadrzaj datoteke
/
#include "extern.h"
void azur_dat(void)
{
int rbr,promena;
/Datoteka sa zadatim imenom ne postoji/
if((fptr = fopen("ispiti.bin", "rb+")) == NULL)
greska(GRESKA2_DAT);
/Datoteka postoji/
fread(&broj_zapisa, sizeof(broj_zapisa), 1, fptr);
/Azuriranje zapisa/
while(1)

17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
1:
2:
3:
4:
5:
6:
7:
8:
9:

/Citanje rednog broja studenta sa tastature/


printf("\nRedni broj studenta: ");
scanf("%d", &rbr);
fflush(stdin);
if(rbr<1 || rbr>BROJ)
break;
if(rbr>broj_zapisa)
{
printf("\nPogresno zadat redni broj studenta!\n");
continue;
}
/Citanje podataka iz datoteke/
fseek(fptr, sizeof(broj_zapisa) +
(rbr-1)sizeof(polozio), SEEK_SET);
fread(&polozio, sizeof(polozio), 1, fptr);
/Prikaz ucitanih podataka na ekranu/
if(polozio.student1.ime[0])
{
printf(" %-20s %-5d %-5d %-3d\n",
polozio.student1.ime,polozio.student1.reg_broj,
polozio.student1.god_upisa, polozio.broj_ispita);
/Citanje novog podatka sa tastature/
printf("\nBroj dodatno polozenih ispita: ");
scanf("%d", &promena);
fflush(stdin);
polozio.broj_ispita += promena;
/Upis novih podataka u datoteku/
fseek(fptr, -sizeof(polozio), SEEK_CUR);
fwrite(&polozio, sizeof(polozio), 1, fptr);
}
else
printf(" Ne postoji student sa ovim rednim brojem.\n");

}
fclose(fptr);
}
/
prikaz_dat.c
/
/
Modul sa funkcijom koja prikazuje na ekranu sadrzaj datoteke
/
#include "extern.h"
void prikaz_dat(void)
{
int rbr;
/Otvaranje datoteke sa zadatim imenom/
117

10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
1:
2:
3:
4:
5:
6:
7:
8:
9:

fptr = fopen("ispiti.bin", "rb+");


/Datoteka ne postoji/
if(fptr==NULL)
greska(GRESKA2_DAT);
/Datoteka postoji/
fread(&broj_zapisa, sizeof(broj_zapisa), 1, fptr);
for(rbr=1; rbr<=broj_zapisa; rbr++)
{
printf("%3d", rbr);
fread(&polozio, sizeof(polozio), 1, fptr);
/Prikaz podataka na ekranu/
if(polozio.student1.ime[0] != '\0')
{
printf(" %-20s %-5d %-5d %-3d\n",
polozio.student1.ime,polozio.student1.reg_broj,
polozio.student1.god_upisa, polozio.broj_ispita);
}
else
printf(" Ne postoji student sa zadatim rednim brojem.\n");
}
fclose(fptr);
}
/
greska.c
/
/
Modul sa funkcijom koja prikazuje na ekranu poruke o greskama
/
#include "extern.h"
void greska(Greska)
{
fprintf(stderr, poruke_o_greskama[Greska]);
exit(1);
}

primer6_3

,
.
:
direkt.h #include
#define
;
global.h
glavni.c.
( ),
greska(),
student (ime, reg_broj, god_upisa),
pol_ispiti ( student
broj_ispita),
118

broj_zapisa, fptr FILE,


: dod_dat(), azur_dat() prikaz_dat().

;
extern.h .
global.h (
extern ).
glavni.c, dod_dat.c,
azur_dat.c, prikaz_dat.c greska.c:
glavni.c do.. while
: 1.Dodavanje, 2.Azuriranje, 3.Prikaz, 4.Izlaz,
4. 1.
dod_dat(), 2. azur_dat(),
3. prikaz_dat();
dod_dat. dod_dat().
( 10.) ("ispiti.bin")
,
. ,
("wb+")
( 12. 13.), broj_zapisa () 0
( 15. 16.).
, ( 19.)
( 20.)
while(1) ( 23. 61.):

,

polozio.student1:
polozio.student1.ime,
polozio.student1.reg_broj,
polozio.student1.god_upis,

polozio.broj_ispita
0 ( 38.),

,
( 42.),

(e 44. 45.),
,

,
,
() ( 52. 53.),
.

( ) ( 56.)


( 59. 60.);
azur_dat.c azur_dat().
"ispiti.bin"

( 9. 10.). ,

119

( 13.). ,
while(1) ( 16. 54.):


( ) ( 18. 28.),

()
( 31. 32.),


( 33.),

( 36.)

(polozio.student1.ime,polozio.student1.reg_broj,polozio.student1.god_
upisa, polozio.broj_ispita),
,
( 46.).

( 49. 50.),

, ,
.

( 55.);
prikaz_dat.c prikaz_dat().
"ispiti.bin"

( 10. 14.).
( 17.),
for ( )
, ( 19. 31.).
( 32.);
greska.c
.
6.3 ) 6.3 )
.

6.3 a) primer6_3 ( )

6.3 ) primer6_3 ( )

6.3 ) primer6_3 ( )
120

6.3 ) primer6_3 ( )

6.3 ) primer6_3 ( )

6.3 ) primer6_3 ( )

6.3 ) primer6_3 ( )

6.3 ) primer6_3 ( )

6.3 ) primer6_3 ( )

6.3 ) primer6_3 ( )

121

6.3 ) primer6_3 ( )

6.3 ) primer6_3 ( )

6.3 ) primer6_3 ( )

6.3 ) primer6_3 ( )

primer6_4
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
122

/
primer6_4.c
/
/
Odredjivanje veceg od dva zadata cela broja, pomocu makroa
/
#include <stdio.h>
/Definicije Makroa/
#define UCITAJ_CELE(x,y)
#define ISPISI_TEKST(x)
#define ISPISI_CEO(x)
#define MAX(x,y)

scanf("%d%d",&x,&y)
printf(#x)
printf("%d\n\n",(x))
((x)>(y))?(x):(y)

main()
{
int a, b;
/Pozivi Makroa/
ISPISI_TEKST(\nZadati dva cela broja:\t\t);
UCITAJ_CELE(a,b);
ISPISI_TEKST(Veci od dva zadata broja je:\t);
ISPISI_CEO(MAX(a,b));
return 0;
}

primer6_4
#define

,
.

, #define ,
, .
(
),
( ).
.
( 7. 10.)
:
UCITAJ_CELE(x,y) scanf("%d%d",&x,&y),
ISPISI_TEKST(x) printf(x) ( printf(#x)),
ISPISI_CEO(x) printf("%d\n\n",(x)),
MAX(x,y) ((x)>(y))?(x):(y).
, ,
( ISPISI_CEO MAX).
ISPISI_TEKST #.
.
UCITAJ_CELE,
ISPISI_TEKST, ISPISI_CEO MAX ( )
. ( 16. 19.)
( ) -
,
. 6.4 ) 6.4 ) .
,
, ,
,
.

( )
( ). e

.

6.4 a) primer6_4 ( )

6.4 ) primer6_4 ( )

123


 : ,
( ,
).
 ,
.
 , ,
.

( ).



.
, (
)
.


.

124

6.
_____________________________________________
1.

: (
). : direkt.h,
global.h, extern.h, glavni.c, kopira.c, greska.c.

125

6.
_____________________________________________
e o .
:
a) , ,
) .

1.

( _ ).

2.

: #include #define, .

3.

n (n100) , : ime,
broj_indeksa, adresa br_telefona
( ).

4.
,
( _ ),
, ,
.

5.
m (m10)
( ), n (n10),

.

126

7.
/
++

/
/
/

127


_____________________________________________
primer7_1
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:

128

//primer7_1.cpp
//Realizacija ulaza/izlaza (tastatura/ekran) za razlicite vrste podataka
#include <iostream>
//potrebna biblioteka ulaza/izlaza
#define MAX1
80
//broj korisnih karaktera u stringu
#define MAX2
10
//broj karaktera stringa, koji se citaju
using namespace std;
//potreban imenski prostor za biblioteke
int main( )
{
int znak, broj_i;

//tip rezultata glavne funkcije neophodan


float broj_f; char odgovor, string[MAX1+1];

cout << "\nUlaz/Izlaz podataka u C++ programu\n";


cout << "Zelite li da nastavite (D/N)? ";
cin >> odgovor;
cin.ignore();
//prihvata znak za prelaz u novi red
if(odgovor == 'D' || odgovor == d)
{
cout << "\nCelobrojna vrednost: ";
cin >> broj_i;
cout << "Zadata celobrojna vrednost je: " << broj_i << endl;
cout << "\nRealna vrednost: ";
cin >> broj_f;
cout << "Zadata realna vrednost je: " << broj_f << endl;
//Citanje do prvog belog znaka od zadatog reda znakova
cout << "\nRed teksta:\n";
cin >> string;
cout << "Prva rec je: " << string << endl;
//Citanje ostatka od zadatog reda znakova
cin.get(string, MAX1+1); //prihvata ostatak do kraja reda
cin.ignore();
//prihvata znak za prelaz u novi red
//Citanje znak po znak do znaka za prelaz u novi red
cout << "\nRed teksta:\n";
while((znak = cin.get()) != '\n')
cout.put((char)znak);
//moze i: cout << (char)znak;
//Citanje zadatog broja znakova ili do znaka za prelaz u novi red
cout << "\n\nRed teksta:\n";
cin.get(string, MAX2+1);
cout << "Prvih " << MAX2 << " znakova: " << string << endl;
}
return 0;

primer7_1
++
.
.
. ()
( ) ,
. ,
, (.):
ime_objekta_klase.ime_clana.

, ,
++ .
/ (stdio.h)
++,
++. ++ e e
/ (iostream fstream) (istream, ostream, fstream,
ifstream, ofstream) (cin, cout, cerr).
++ , std
, using namespace std; ( 6.).

. istream , ostream
, iostream .
:
in istream
(),
cout ostream
(),
cerr ostream
(),
.
scanf() printf(), %
, ++
( >> <<)
( ++).
>>
++ , <<
++ ( ,
, ).
( 11.
12.). ++:
:
printf("\nUlaz/Izlaz podataka u C programu\n")
++: cout << "\nUlaz/Izlaz podataka u C++ programu\n";
, (<<)
\n ( printf()).
( 13.) (D/N)
char (cin >> odgovor). (>>)
.
ignore(), cin (cin.ignore()), istream.
D (d) ( 16.),
129

(>>) : ( 18.),
( 22.) ( 27.).
19. endl,
.
,
( 31.) get() istream. get()

. cin.get(string, MAX1+1)
MAX1 string.

, cin.get(string, MAX1+1) cin.ignore()
cin.getline(string, MAX1+1) (
).
get()
put() ostream
( 36. 37.). put()
( ) (char).
( 41.) get()
: (string) MAX2+1,
MAX2 (10) .
, get() .
. ++
.
7.1 )
7.1 ).

7.1 ) primer7_1 ( )

7.1 ) primer7_1 ( )

7.1 ) primer7_1 ( )

7.1 ) primer7_1 ( )

130

7.1 ) primer7_1 ( )

7.1 ) primer7_1 ( )

7.1 ) primer7_1 ( )

primer7_2
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:

//primer7_2.cpp
//Primena funkcija za konverziju i formatiranje ulaza/izlaza
#include <iostream>
#include <iomanip>
using namespace std;
void stampa_rbr( void );
int main( )
{
char slovo = 'A';
char string[] = "Formatiranje C++ ulaza/izlaza";
int broj_i = 1234;
double broj_d = 1.23456;
//1. stampanje samog slova A
stampa_rbr();
cout << slovo;
//2. stampanje ASCII koda slova A
stampa_rbr();
cout << (int)slovo;
//3. stampanje znaka zadate ASCII vrednosti (slova a)
stampa_rbr();
cout << (char)97;

131

27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:

132

//4. stampanje niza znakova


stampa_rbr();
cout << string;
//5. stampanje prvih 5 znakova od niza
stampa_rbr();
cout.write(string,5);
//6. stampanje celog broja u oktalnom obliku
stampa_rbr();
cout.setf(ios::oct);
cout << broj_i;
//moze i: cout << oct << broj_i;
cout.unsetf(ios::oct);
//7. stampanje celog broja u heksadecimalnom obliku (malim slovima)
stampa_rbr();
cout.setf(ios::hex);
cout << broj_i;
//moze i: cout << hex << broj_i;
//8. stampanje celog broja u heksadecimalnom obliku (velikim slovima)
stampa_rbr();
cout.setf(ios::uppercase);
cout << broj_i;
cout.unsetf(ios::hex);
//9. stampanje celog broja u decimalnom obliku
stampa_rbr();
cout << broj_i;
//moze i: cout << dec << broj_i;
//10. stampanje celog broja,u polju zadate sirine, desno poravnanje
stampa_rbr();
cout.width(10);
cout << broj_i;
//11. stampanje celog broja, u polju zadate sirine, levo poravnanje
stampa_rbr();
cout.width(10);
cout.setf(ios::left);
cout << broj_i;
cout.unsetf(ios::left);
//12. stampanje celog broja, desno poravnanje, nule ispred broja
stampa_rbr();
cout.width(10);
cout.fill('0');
cout << broj_i;
cout.fill(' ');
//13. stampanje realnog broja, sa standardnom preciznoscu
stampa_rbr();

77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:

cout << broj_d;


//14. stampanje realnog broja, u polju zadate sirine,
stampa_rbr();
cout.width(10);
cout << broj_d;
//15. stampanje realnog broja, sa 2. decimalne cifre
stampa_rbr();
cout.width(10);
cout.precision(2);
cout << broj_d;
//16. stampanje realnog broja, sa eksponentom
stampa_rbr();
cout.setf(ios::scientific);
cout << broj_d << endl;
cout.unsetf(ios::scientific);
return 0;
}
//Funkcija koja prikazuje redni broj na pocetku reda
void stampa_rbr (void)
{
static int redni_broj = 0;
cout << "\n";
cout.width(2);
cout << ++redni_broj << ". ";
}

primer7_2
.
( )
(iomanip).

( 10. 13.) (
15. 94.):
slovo , :
cout << slovo; - ,
cout << (int)slovo; - ASCII .
( ) (
97) :
cout << (char)97;
, string
cout << string;
write() ostream
(5) (string):
cout.write(string,5);
,
:
133

-
,
cout.unsetf(ios::oct);
-
,
cout.setf(ios::hex);
-
,
cout.setf(ios::uppercase); -
,
cout.unsetf(ios::hex);
-
,
cout.width(10);
- (10)
,

,
cout.setf(ios::left);
-
,
cout.unsetf(ios::left);
-
,
cout.fill('0');
-
,
cout.fill(' ');
-
,
cout.precision(2);
-

,
cout.setf(ios::scientific); -
,
,
cout.unsetf(ios::scientific); -
.
setf()
, unsetf() .
stampa_rbr() ( 99. 104.)
,
.
7.2.
cout.setf(ios::oct);

7.2 primer7_2

134

primer7_3
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:

//primer7_3.cpp
//Tabeliranje vrednosti izraza: 10 stepenovan brojem x
//u zadatom opsegu i sa zadatim korakom za x
#include <iostream>
#include <iomanip>
#include <math.h>
#define MIN
0
//donja granica opsega vrednosti x
#define MAX
20
//gornja granica opsega vrednosti x
#define MAX1
2
//sirina polja za prikaz vrednosti x
#define MAX2
10
//sirina polja za prikaz vrednosti izraza
using namespace std;
int main()
{
int xmin, xmax, dx;
do
{
cout << "\nUnesite cele brojeve ";
cout << "xmin>=" << MIN << ", xmax<=" << MAX << " i dx: ";
cin >> xmin >> xmax >> dx;
}while(xmin<MIN || xmax>MAX || dx>xmax);
//Stampanje na ekranu zaglavlja tabele i tabele
cout << "\nx\t10 stepenovano brojem x\t\t10 stepenovano brojem x"
<< "\n\t(desno poravnanje)\t\t(levo poravnanje)"
<< "\n================================"
<< "================================\n\n";
cout.setf(ios::fixed);
cout.precision(0);
for(int x = xmin; x<=xmax; x+=dx)
{
//Desno poravnanje vrednosti x u 1. koloni tabele
cout.width(MAX1);
cout.unsetf(ios::left);
cout << x << "\t\t";
//Desno poravnjanje vrednosti izraza u 2. koloni tabele
cout.width(MAX2);
cout.unsetf(ios::left);
cout << pow(10,x) << "\t\t";
//Levo poravnjanje vrednosti izraza u 3. koloni tabele
cout.width(MAX2);
cout.setf(ios::left);
cout << pow(10,x) << "\n";
}
cout << "\n";
return 0;
}
135

primer7_3
( 7.3 ))
x:
( 15. 19.). ( 30. 45.)
x:,
10x :
.
.
(<<)
,
( 22. 25.).
pow(10,x)
math.h, double.
, 27. 28.
setf(ios::fixed) precision(0) cout. ,
for .
x, ,
. MAX1 (2)
.
, unsetf(ios::left)
( 32. 33.).
10x,
x. MAX2 (10)
.
, unsetf(ios::left)
( 37. 38.).
10x,
x , ,
setf(ios::left), MAX2 (10) ,
( 42. 43.).
7.3 ).

7.3 ) primer7_3 ( )

7.3 ) primer7_3 ( )
136

primer7_4
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:

//primer7_4.cpp
//Citanje niza celih brojeva iz komandne linije i prikaz na ekranu
//njegovih elemenata u oktalnom, heksadecimalnom i binarnom obliku
#include <iostream>
#include <iomanip>
#include <stdlib.h>
using namespace std;
void stampa_bin( int decimal_value );
int main(int argc, char argv[])
{
int decimalni;
if( argc < 2 )
{
cerr << "\nUneti ime programa i niz celih brojeva.\n";
exit(1);
}
cout << "\nZadati niz brojeva u raznim oblicima:\n\n";
cout << "dec\tokt\theksa\tbin\n";
for(int i=1; i<argc; i++)
{
decimalni = atoi( argv[i]);
cout << "\n" << decimalni << "\t";
cout << oct << decimalni << "\t";
cout << hex << decimalni << "\t";
stampa_bin(decimalni);
}
return 0;
}
//Funkcija koja prikazuje na ekranu niz u binarnom obliku
void stampa_bin(int broj)
{
int broj_cifara = 0;
int niz_binarnih[50];
while( broj != 0 )
{
niz_binarnih[broj_cifara++] = broj % 2;
broj /= 2;
}
for( int i=broj_cifara-1; i>=0; i-- )
cout << dec << niz_binarnih[i];
}

137

primer7_4

,
.

( ).
( 14. 17.), cerr ostream
exit(1) .
, , for
( 22. 28.):
, atoi() ( 23),
decimalni
( 25. 26.). (decimalni,
cout << oct << decimalni cout << hex << decimalni),
( 27.)
stampa_bin(), ( 33. 44.).
stampa_bin()
, .
35. (niz_binarnih[50]),
.
2
2,
0 ( 37. 40.).
, ( 42. 43.),
.

7.4 ) 7.4 ).

7.4 ) primer7_4 ( )

7.4 ) primer7_4 ( )

138


 / /, C++
iostream ( ) (>>)
(<<). stdio.h,
/ C++
, .
 ,
:
cin >> x; (cin) (>>)
x,
cout << x; (cout) (<<)
x.


 setf() ,
.
unsetf().
 C++
, (
ignor() get()).

139

7.
_____________________________________________
1.
++ , (
) kraj, n=20 ,
,
.

140

7.
_____________________________________________
:
1.
;
2.
.

1.
++ n (n10)
,
.

2.
++ n (n5)
, ,
.

3.
++ (
)
.

4.
++ n (n5) (
) ,
, .

141

142

8.
, ,

++

143


_____________________________________________
primer8_1
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:

//primer8_1.cpp
//Pristup globalnoj promenljivoj (istog imena kao i lokalna)
#include <iostream>
using namespace std;
float suma(float f1, float f2);
float f = 10.5;
int main()
{
float a=10.5, b=10.5;
cout << "\n" << a << "(lok) + " << b << "(lok) + ";
cout << f << "(glob) = " << suma(a, b) << endl;
return 0;
}
//Funkcija koja izracunava sumu
float suma(float f1,float f2)
{
float f = 20.5;
return(f1 + f2 + (::f) );
}

primer8_1
C++
(
)
(::)
, .
f ( 7.)
main() suma().
suma()
a=10.5 b=10.5 .
suma() f (
), ( 21.)
f, ,
(::f).

( b) f ( 8.1).

8.1 primer8_1
144

primer8_2
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:

//primer8_2.cpp
//Koriscenje funkcije sa podrazumevanim vrednostima argumenata
//za prikaz izabrane opcije i brojeva sa tastature
#include <iostream>
using namespace std;
void podr_argumenti(char c = 'X', int broj1 = 0, float broj2 = 0.5);
int main()
{
podr_argumenti('A', 1, 1.5);

//stampa: A, 1, 1.5

podr_argumenti('B', 2);

//stampa: B, 2, 0.5

podr_argumenti('C');

//stampa: C, 0, 0.5

podr_argumenti();

//stampa: X, 0, 0.5

return 0;
}
//Funkcija koja prikazuje na ekranu izabrane argumente
void podr_argumenti(char c, int broj1, float broj2)
{
cout << "\nIzabrana opcija: " << c << endl;
cout << "Ceo broj: " << broj1 << endl;
cout << "Realan broj: " << broj2 << endl;
}

primer8_2
C++
.
7. podr_argumenti()
( ASCII slova X,
broj1 0 broj2 0.5).
podr_argumenti() ( 21. 25.)
(c, broj1 broj2).
podr_argumenti() :

podr_argumenti() ( 10.),
,
podr_argumenti()
(broj2 = 0.5) ( 12.),
,
podr_argumenti()
(broj1 = 0 broj2 = 0.5) ( 14.),
,
podr_argumenti()
(c = 'X', broj1 = 0 broj2 = 0.5) ( 16.).
8.2 podr_argumenti().
145

8.2 primer8_2

primer8_3
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
146

//primer8_3.cpp
//Izracunavanje srednje vrednosti izabranog niza
//pomocu preklopljenih funkcija
#include <iostream>
#define MAX 4
//duzina niza
using namespace std;
float srednja_vrednost(int niz_int[], int n);
float srednja_vrednost(float niz_float[], int n);
int main()
{
int a[MAX] = {1, 2, 3, 4};
float b[MAX] = {1.25, 2.25, 3.25, 4.25};
cout << "\nSrednja vrednost niza celih brojeva:\t";
cout << srednja_vrednost(a, MAX) << endl;
cout << "Srednja vrednost niza realnih brojeva:\t";
cout << srednja_vrednost(b, MAX) << endl;
return 0;
}
//Funkcija koja izracunava srednju vrednost niza celih brojeva
float srednja_vrednost( int niz_int[], int n)
{
int s = 0;
for(int i=0; i<n; i++)
s += niz_int[i] ;
return ((float)s/n);
}
//Funkcija koja izracunava srednju vrednost niza realnih brojeva
float srednja_vrednost( float niz_float[], int n )
{
float s = 0;
for(int i=0; i<n; i++)
s += niz_float[i] ;
return (s/n);
}

primer8_3
C++ .

, .

. ,
.

srednja_vrednost(). 8.
( , ,
), 9. (
, , ).
( 23. 28.)

.
( 30. 35.)
,
.

( 16.), b ( 18.)
( 8.3).

8.3 primer8_3

primer8_4
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:

//primer8_4.cpp
//Prikaz na ekranu dela zadatog teksta, pomocu inline funkcije
#include <iostream>
#include <ctype.h>
using namespace std;
inline void stampa_slovo(char kod_slova)

{ cout << kod_slova; };

int main()
{
char prvo, posl;
cout << "\n\inline\ funkcija nema potrebe za stekom\n";
cout << "C++ prevodilac proverava broj i tipove argumenata.\n";
do
{

cout << "\nPrvo slovo za stampu: ";


cin >> prvo;
cout << "Poslednje slovo za stampu: ";
147

19:
20:
21:
22:
23:
24:
25:
26:
27:
28:

cin >> posl;


}while(!isalpha(prvo) || !isalpha(posl) || prvo>posl);
cout << "\n";
for(char c=prvo; c<=posl; c++)
stampa_slovo(c);
cout << "\n\n";
return 0;
}

primer8_4
(inline
).

.
,
, .
.
7. inline stampa_slovo()
ASCII .
( 8.4 ) 8.4 )) do..while
( 15. 20.) , for
( 23. 24.), ,
stampa_slovo(). 8.4 ).

8.4 a) primer8_4 ( )

8.4 ) primer8_4 ( )

8.4 ) primer8_4 ( )
148

primer8_5
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:

//primer8_5.cpp
//Poziv funkcije za izmenu zadate strukture podataka na tri nacina:
//po vrednosti, po referenci pomocu pokazivaca
//i po referenci pomocu reference.
#include <iostream>
#define MAX 30
//broj korisnih karaktera u stringu
using namespace std;
struct student{
char ime[MAX+1];
int reg_broj;
int god_upisa;
int polozenih;
};
void po_vrednosti(student x);
void po_ref_pok(student ptr_x);
void po_ref_ref(student &ref_x);
int main()
{
student s1;
s1.polozenih = 10;
cout << "Vrednost broja, clana strukture\n\n";
cout << "na pocetku: " << s1.polozenih << endl;
//Predaja funkciji kopije strukture
po_vrednosti(s1);
cout << "posle predaje funkciji strukture po vrednosti:\t";
cout << s1.polozenih << endl;
//Predaja funkciji pokazivaca na strukturu
po_ref_pok(&s1);
cout << "posle predaje funkciji pokazivaca na strukturu:\t";
cout << s1.polozenih << endl;
//Predaja funkciji reference strukture
po_ref_ref(s1);
cout << "posle predaje funkciji reference na strukturu:\t";
cout << s1.polozenih << \n\n;
return 0;
}
//Funkcija koja dobija strukturu po vrednosti
void po_vrednosti(student x)
{
x.polozenih++;
//sintaksa strukture
}

149

48:
49:
50:
51:
52:
53:
54:
55:

//Funkcija koja dobija pokazivac na strukturu


void po_ref_pok(student ptr_x)
{
ptr_x->polozenih++;
//sintaksa pokazivaca
}
//Funkcija koja dobija referencu na strukturu
void po_ref_ref(student &ref_x)
{
ref_x.polozenih++;
//sintaksa reference
}

primer8_5

.
9. 14. student (ime, reg_broj,
god_upisa, polozenih) : po_vrednosti(),
po_ref_pok(), po_ref_ref() ( 16. 18.).
( 45. 55.)
: student (x),
student (ptr_x),
student (&ref_x).
(polozenih).
x.polozenih++;
,
.
ptr_x->polozenih++;
,
, .
ref_x.polozenih++;
,
, . ( )
( ), .
: ->
( , 54.), &
( , 38.).
( 18.) (&ref_x). ,
, ()
.
a
student (s1), s1.polozenih 10
( 21. 25.). C++,
student
: student s1 ( struct student s1).
.
po_vrednosti() s1
s1.polozenih ( 28. 30.).
po_ref_pok() s1
s1.polozenih ( 33. 35.).
po_ref_ref() s1
s1.polozenih ( 38. 40.).

150

28. 38. (po_vrednosti(s1);


po_ref_ref(s1);) s1,
( ,
, ).
8.5
, .

8.5 primer8_5

primer8_6
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:

//primer8_6.cpp
//Odredjivanje najveceg broja u zadatom dinamickom nizu celih brojeva
#include <iostream>
#include <stdlib.h>
#define MAX 50
//dozvoljena duzina niza
using namespace std;
int main( )
{
int i, n, max, niz;
do
{

cout << "\nBroj elemenata niza: ";


cin >> n;
}while(n<1 || n>MAX);
niz = new int[n];
if(niz==NULL)
{
cerr << "Nije uspela dodela memorije\n\n";
exit(1);
}
cout << "\nUnesite vrednosti elemenata niza: ";
for(i=0; i<n; i++)
cin >> niz[i];
max = niz[0];
for(i=1; i<n; i++)
if(niz[i]>max)
max = niz[i];
cout<< "\nNajveca vrednost zadatog niza je: " << max << "\n\n";
151

34:
35:
36:
37:
38:

delete niz;
return 0;
}

primer8_6
,
.
, , ++
new delete,.
new

NULL ( ).
delete
, .

. 9. niz int,
.
( 8.6 ))
( 11. 14.)
new (
) ( 16.).
niz.
NULL,
( 18. 21.). , ,
( 8.6 )) ( 23. 25.),
( 27. 31.)
( 8.6 )). ,
delete
( 35.).

8.6 ) primer8_6 ( )

8.6 ) primer8_6 ( )

8.6 ) primer8_6 ( )

152

primer8_7
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:

//primer8_7.cpp
//Dinamicka dodela memorije za zadatu strukturu podataka
#include <iostream>
#include <stdlib.h>
#define MAX 15
//broj korisnih karaktera u stringu
using namespace std;
struct student{
char ime[MAX+1];
char prezime[MAX+1];
int reg_broj;
int god_upisa;
};
int main()
{
student ptr_s;
ptr_s = new student;
if(ptr_s==NULL)
{
cerr << "Nije uspela dodela memorije\n";
exit(1);
}
cout << "\nIme, prezime, registarki broj i godina upisa:\n";
cin >> ptr_s->ime >> ptr_s->prezime;
cin >> ptr_s->reg_broj >> ptr_s->god_upisa;
cout << "\nUneti podaci:\n";
cout << ptr_s->ime << " " << ptr_s->prezime << " ";
cout << ptr_s->reg_broj << " " << ptr_s->god_upisa << "\n\n";
delete ptr_s;
return 0;
}

primer8_7

, .
8. 13. student (ime, prezime,
reg_broj god_upisa).
ptr_s
student, new (
) ( 18.)

153

NULL ( 20. 23.).


( 8.7 )) :
ptr_s->ime,
ptr_s->prezime,
ptr_s->reg_broj,
ptr_s->god_upisa,
( 8.7 ))
( 33.).

8.7 ) primer8_7 ( )

8.7 ) primer8_7 ( )

primer8_8
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
154

//primer8_8.cpp
//Prikaz na ekranu podataka zadatog dinamickog niza struktura
#include <iostream>
#include <stdlib.h>
#define BROJ
2
//broj adresa (struktura u nizu)
#define MAX
30
//broj korisnih karaktera u stringu
using namespace std;
struct adresa{
char ime[MAX+1];
char ulica[MAX+1];
int broj;
char grad[MAX+1];
};
void prikaz_adresa(struct adresa adrese[], int n);
void greska(void);
int main()
{
adresa adrese;
adrese = new adresa[BROJ];
if(adrese==NULL)

25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:

greska();
cout << "\n==============UNOS ADRESA ============== \n";
for(int i=0; i<BROJ; i++)
{
cout << "\nIme i prezime: ";
cin.getline(adrese[i].ime, MAX+1);
cout << "Ulica: ";
cin.getline(adrese[i].ulica, MAX+1);
cout << "Broj: ";
cin >> adrese[i].broj;
cin.ignore();
cout << "Grad: ";
cin.getline(adrese[i].grad, MAX+1);
}
prikaz_adresa(adrese, BROJ);
delete adrese;
return 0;
}
//Funkcija koja prikazuje na ekranu sadrzaj niza struktura
void prikaz_adresa(struct adresa adrese[], int n)
{
cout << "\n================ ADRESE ================ \n";
for(int i=0; i<BROJ; i++)
{
cout << "\nIme:\t\t" << adrese[i].ime << endl;
cout << "Ulica i broj:\t" << adrese[i].ulica << " ";
cout << adrese[i].broj << endl;
cout << "Grad :\t\t" << adrese[i].grad << endl;
}
cout << "\n";
}
//Funkcija koja prikazuje na ekranu poruke o greskama
void greska(void)
{
cerr << "Nije uspela dodela memorije\n";
exit(1);
}

primer8_8

, .
( 9. 14.) adresa
(ime, ulica, broj grad), prikaz_adresa() greska().
prikaz_adresa() ( 50. 59.)
adresa
for .

155

greska(void)
( 61. 64.).
adrese
adresa,
. new
, ,
( 22.) NULL ,
( 24. 25.).
( 11.8 )) ( 27.
41.), prikaz_adresa() ( 43.)
( 45.).
8.8 ) 8.8 )
, .

8.8 ) primer8_8 ( )

8.8 ) primer8_8 ( )

8.8 ) primer8_8 ( )

8.8 ) primer8_8 ( )

8.8 ) primer8_8 ( )

156

8.8 ) primer8_8 ( )



.
 inline
.



. (
)

.

157

8.
_____________________________________________
1.
++ ,
(dan, mesec godina) :
Januar 1. 2004.
Februar 1. 2004.
:
: redni_broj_meseca ime_meseca.
.

158

8.
_____________________________________________
1.
++ (i, l d)
int, long
double. n (n50).
.

2.
++
n (n50) , ,
,
(O/R).
,
.
.
.

3.
++
a) :

1. Citanje niza
2. Sazimanje niza
3. Prosirenje niza
4. Prikaz niza
5. Izlaz

5.
) 1. , n
(n20),
) 2. ,
) 3. , n
(n20), ,
) 4. .

4.
++ :
) :
ime_vlasnika, adresa (ulica broj), broj_soba, broj_kvadrata cena.
100 ,
) , ,
,
) .

159

160

9.

++

161


_____________________________________________
primer9_1
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
162

//primer9_1.cpp
//Kopiranje sadrzaja jedne tekst datoteke u drugu,
//uz konverziju svih velikih slova u ista mala
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <ctype.h>
#define MAX 30
//broj korisnih karaktera u stringu
using namespace std;
int main()
{
int c;
char ime1[MAX+1], ime2[MAX+1];
ifstream fin;
ofstream fout;

//Kreiranje ulaznog toka


//Kreiranje izlaznog toka

//Zadavanje imena datoteke za citanje


cout << "\nIme originalne tekst datoteke: ";
cin >> ime1;
//Otvaranje datoteke za citanje
fin.open(ime1, ios::in | ios::nocreate);
//Izvestaj o neuspesnom otvaranju za citanje ako datoteka ne postoji
if(!fin)
{
cerr << "\nNEMOGUCE CITANJE";
cerr << "\nDatoteka sa zadatim imenom ne postoji!\n";
exit(1);
}
//Zadavanje imena datoteke za upis
cout << "Ime datoteke kopije: ";
cin >> ime2;
//Otvaranje datoteke za upis
fout.open(ime2,ios::out | ios::noreplace);
//Izvestaj o neuspesnom otvaranju za upis ako datoteka vec postoji
if(!fout)
{
cerr << "\nNEDOZVOLJEN UPIS";
cerr << "\nDatoteka sa zadatim imenom vec postoji!\n";
exit(1);
}

45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:

//Kopiranje uz konverziju velikih slova u mala


while((c = fin.get()) != EOF)
{
fout.put((char)tolower(c));
}
cout << "\nUSPESNO IZVRSENO KOPIRANJE\n";
//Zatvaranje otvorenih datoteka za citanje i upis
fin.close();
fout.close();
return 0;
}

primer9_1
++
:
fstream iostream (
),
ifstream istream (
),
ofstream ostream (
).
.
(fstream, ifstream ofstream) (get(), put()\)
( (>>), (<<))
(iostream, istream ostream).

.

.

.
fstream ( 5.).
14. 15. : fin ifstream fout ofstream.
( 9.1 ))
ime1 ( 18. 19.),
open() fin ( 22.),
ios::in ( ) ios::nocreate ( ,
). fin
ime1. (
) ( 25. 29.).
( 9.1 ))
im2 ( 32. 33.),
open fout ( 36.)
ios::out ( ) ios::noreplace (
). fout
ime2. (
) ( 39.
43.).
163

while ( 46. 48.) ,


, , EOF (
get() fin ,
( put() fout).
52. 53. close()
fin fout, e . 9.1 )
, .
9.1 ) 9.1 )
.

9.1 ) primer9_1 ( )

9.1 ) primer9_1 ( )

9.1 ) primer9_1 ( )

9.1 ) primer9_1 ( )

9.1 ) primer9_1 ( )

primer9_2
1:
2:
3:
4:
5:
6:
7:
8:

164

//primer9_2.cpp
//Kopiranje sadrzaja jedne tekst datoteke u drugu dodavanjem
//rednog broja linije, i u trecu dopisivanjem na kraj postojeceg sadrzaja
#include <iostream>
#include <fstream>
#include <stdlib.h>
#define MAX 80
//broj korisnih karaktera u stringu
using namespace std;

9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:

enum Greska{GRESKA_CITANJA, GRESKA_UPISA};


char poruke_o_greskama[] = {
"\nGreska pri otvaranju datoteke za citanje!\n",
"\nGreska pri otvaranju datoteke za upis!\n"
};
void greska(Greska status);
int main()
{
char red[MAX+1];
int rbr = 1;
//Kreiranje ulazno/izlaznih tokova
fstream f1, f2, f3;
//Otvaranje datoteka za kopiranje sadrzaja
f1.open("primer1.txt", ios::in | ios::nocreate);
if(!f1)
greska(GRESKA_CITANJA);
f2.open("primer2.txt", ios::out);
if(!f2)
greska(GRESKA_UPISA);
//Kopiranje uz dodavanje rednog broja na pocetak svake linije
while(!f1.eof())
{
f1.getline(red, MAX+1);
f2 << rbr++ << ": " << red << endl;
}
cout << "\nUSPESNO IZVRSENO KOPIRANJE\n";
//Zatvaranje otvorenih datoteka
f1.close();
f2.close();
//Otvaranje datoteka za dopisivanje sadrzaja
f1.open("primer1.txt", ios::in | ios::nocreate);
if(!f1)
greska(GRESKA_CITANJA);
f3.open("primer3.txt", ios::out | ios::app);
if(!f3)
greska(GRESKA_UPISA);
//Dopisivanje sadrzaja
while(!f1.eof())
{
f1.getline(red, MAX+1);
f3 << "\n" << red;
}
cout<<"\nUSPESNO IZVRSENO DOPISIVANJE\n\n";

165

59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:

//Zatvaranje otvorenih datoteka


f1.close();
f3.close();
return 0;
}
//Funkcija koja prikazuje na ekranu poruke o greskama
void greska(Greska status)
{
cerr << poruke_o_greskama[status];
exit(1);
}

primer9_2

.
++
typedef enum,
enum typedef ( 9.).
typedef .
f1, f2 f3
( 21.).
f1 f2 "primer1.txt"
"primer2.txt", . "primer1.txt"
ios::in ( ) ios::nocreate ( , ),
"primer2.txt" ios::out ( ) ( 24. 30.).
while
f1, eof()
f1 0 ( 33.).
getline() ( MAX )
( 34.) f2
( 35.). ,
( 37.) ( 40. 41.).
f1 f3 "primer1.txt"
"primer3.txt", . , "primer1.txt"
ios::in ( ) ios::nocreate ( ),
"primer2.txt" ios::out ( ) ios::app (
) ( 44. 50.).
while
f1 eof() f1
0 ( 53.).
getline() ( MAX )
( 54.) ,
f3 ( 55.).
, ( 57.)
( 60. 61.).
9.2 ), 9.2 ) 9.2)
, 9.2 )
9.2 ) 9.2 )
.

166

9.2 ) primer9_2 ( )

9.2 ) primer9_2 ( )

9.2 ) primer9_2 ( )

9.2 ) primer9_2 ( )

9.2 ) primer9_2 ( )

9.2 ) primer9_2 ( )

primer9_3
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:

//primer9_3.cpp
//Upis u tekst datoteku / citanje iz tekst datoteke stringova i
//prikaz na ekranu i izmene vrednosti tekuce pozicije u istoj datoteci
#include <fstream>
#include <fstream.h>
#include <stdlib.h>
#include <string.h>
#define MAX1
4
//broj korisnih karaktera u jednom stringu
#define MAX2
7
//broj korisnih karaktera u drugom stringu
using namespace std;
167

11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:

168

int main()
{
char string1[MAX1+1] = "Test";
char string2[MAX2+1] = "Program";
char string[MAX1+MAX2+1];
fstream f;
f.open("test.txt", ios::out | ios::in);
if(!f)
{
cerr << "\nGreska pri otvaranju datoteke\n";
exit(1);
}
cout << "\nUPIS PRVOG STRINGA";
for(int i = 0; string1[i] != '\0'; i++)
{
f.put(string1[i]);
cout << "\nUpisan znak: " << (char)string1[i];
cout <<"\t\t\tTekPoz: " << f.tellp();
}
cout << "\n\nUPIS DRUGOG STRINGA: ";
f.write(string2,strlen(string2));
cout << string2 << ",\tTekPoz: " << f.tellp();
cout << "\n\nPOVRATAK NA POCETAK";
f.seekp(0);
cout << ",\t\tTekPoz: " << f.tellp();
cout << "\n\nCITANJE DATOTEKE: ";
f.getline(string, MAX1+MAX2+1);
cout << string;
cout << ",\tTekPoz: " << f.tellp();
cout << "\n\nPOMERAJ " << MAX1 << " OD POCETKA";
f.seekp(MAX1, ios::beg);
cout << ",\t\tTekPoz: " << f.tellp();
cout << "\n\nPOMERAJ " << MAX2 << " OD TRENUTNE POZICIJE";
f.seekp(MAX2, ios::cur);
cout << ",\tTekPoz: " << f.tellp();
cout << "\n\nPOMERAJ " << -(MAX1+MAX2) << " OD KRAJA";
f.seekp(-(MAX1+MAX2), ios::end);
cout << ",\t\tTekPoz: " << f.tellp() << "\n\n";
f.close();
return 0;
}

primer9_3
,
, .
C++
,
. tellg(), a
seekg().
tellp(), seekp().
( 12., 13.
14.), f fstream ( 16.),
. f
"test.txt". "test.txt" ios::out | ios::in (
) ( 18. 22.).
string1
: . tellp()
f ( 24. 29.).
string2
, write() f. ,
tellp() f
( 31. 33.).
seekp(0) f
. seekp()
. tellp()
f, ( 35. 37.).
MAX1+MAX2 ,
getline() f, tellp()
f ( 39. 42.).
seekp(MAX1,ios::beg) f,
MAX1 (ios::beg).
seekp(MAX2,ios::cur) f,
MAX2 (ios::cur).
seekp(-(MAX1+MAX2),ios::end) f,
(MAX1+ MAX2) (ios::end).
tellp(),
9.3.

9.3 primer9_3
169

primer9_4
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
170

//primer9_4.cpp
//Citanje iz binarne datoteke prethodno upisanog niza celih brojeva
#include <iostream>
#include <fstream>
#include <stdlib.h>
#define MAX 10
//dozvoljena duzina niza
using namespace std;
fstream fbin;
void upis(int niz[], int n);
void prikaz_jednog(int niz[], int n);
void prikaz_svih(int niz[], int n);
int main()
{
int niz[MAX], opcija, izlaz = 0;
//Otvaranje binarne datoteke za upis i citanje
fbin.open("primer.bin", ios::out | ios::in | ios::binary);
if(!fbin)
{
cout << "\nGreska pri otvaranju datoteke!\n";
exit(1);
}
//Inicijalizacija i upis niza u binarnu datoteku
upis(niz, MAX);
//Prikaz jednog ili svih elemenata niza (opciono) iz binarne datoteke
while(1)
{
cout << "\n1. Prikaz vrednosti jednog elementa niza";
cout << "\n2. Prikaz vrednosti svih elemenata niza\n\n";
opcija = cin.get();
cin.ignore();
switch(opcija)
{case '1':
prikaz_jednog(niz, MAX);
break;
case '2':
prikaz_svih(niz, MAX);
break;
default:
izlaz = 1;
break;
}
if(izlaz)
break;
}

49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:

fbin.close();
return 0;
}
//Funkcija koja upisuje u datoteku niz celih brojeva
void upis(int niz[], int n)
{
cout << "\nNiz je inicijalizovan na vrednosti:\n";
for (int i=0; i<MAX; i++)
{
niz[i] = 10(i+1);
cout << niz[i] << " ";
}
cout << "\ni upisan u datoteku.\n";
fbin.write((char )niz, MAXsizeof(int));
}
//Funkcija koja prikazuje na ekranu vrednost elementa niza
//sa rednim brojem zadatim preko tastature
void prikaz_jednog(int niz[], int n)
{
int rbroj, broj;
do
{

cout << "Redni broj elementa: ";


cin >> rbroj;
cin.ignore();
}while(rbroj<1 || rbroj>n);
//Pomeraj tekuce pozicije na odredjeni element,za citanje
fbin.seekg((rbroj-1)sizeof(int), ios::beg);
//Citanje vrednosti odredjenog elementa niza iz datoteke
fbin.read((char )&broj, sizeof(int));
cout << "Vrednost elementa, procitana iz datoteke: ";
cout << (int)broj << endl;
}
//Funkcija koja prikazuje na ekranu niz celih brojeva
void prikaz_svih(int niz[], int n)
{
//Pomeraj tekuce pozicije na pocetak datoteke, za citanje
fbin.seekg(0);
//Citanje vrednosti svih elemenata niza iz datoteke
fbin.read((char )niz, nsizeof(int));
cout << "\nCeo niz: ";
for(int i=0; i<n; i++)
cout << niz[i] << " ";
cout << endl;
}

171

primer9_4

, .
a fbin fstream
( 8.) .
10. 12. :
upis(), prikaz_jednog() prikaz_svih().
.
upis() ( 54. 63.)
, (
9.4 )) write() fbin.
prikaz_jednog() ( 66. 82.)
(rbroj) ( 69. 73.)
seekg() fbin
(ios::beg) int ((rbroj1)sizeof(int) ( 76.).
read((char )&broj,
sizeof(int)) fbin ( 79.).

( char),
.
( 9.4 )).
prikaz_svih() ( 84. 95.)
seekg(0) fbin
( 86.).
read((char )niz, nsizeof(int)) fbin ( 89.).
,
n (
char),
.
( 9.4 )).
int fbin
"primer.bin" ( 18.). "primer.bin"
ios::out | ios::in | ios::binary (, ).
upis(), ,
while(1) ( 28. 48.) :


(prikaz_jednog() prikaz_svih() ). ( 9.4
)), ( 47.) ( 50.).

9.4 ) primer9_4 ( )
172

9.4 ) primer9_4 ( )

9.4 ) primer9_4 ( )

9.4 ) primer9_4 ( )

primer9_5
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:

//primer9_5.cpp
//Azuriranje sadrzaja binarne datoteke. Zapis fiksne duzine:
//ime studenta, smer, reg. broj i broj polozenih ispita.
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <string.h>
#define MAX 15
//broj korisnih karaktera u stringu
using namespace std;
enum Greska{GR_OTV_UP, GR_OTV_CIT};
char poruke_o_greskama[] = {
"\nGreska pri otvaranju datoteke za upis!\n",
"\nGreska pri otvaranju datoteke za citanje!\n"};
fstream fbin;
struct student{
char ime[MAX+1];
char prezime[MAX+1];
char smer[MAX+1];
char reg_broj[MAX+1];
int br_pol_ispita;
}s1;
int broj_struktura = 0;
173

25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:

174

void izmene(void);
void prikaz(void);
void greska(Greska status);
int main()
{
char opcija; int izlaz = 0;
//Otvaranje binarne datoteke za upis
fbin.open("studenti.bin", ios::out | ios::binary);
if(!fbin)
greska(GR_OTV_UP);
//Prihvatanje vrednosti clanova strukture i upis u datoteku
cout << "\nUnositi: ime, prezime, smer, reg. broj i ";
cout << "broj pol. ispita (do reci Kraj)\n";
while(1)
{
cin >> s1.ime;
if(strcmp(s1.ime, "Kraj")==0) break;
cin >> s1.prezime >> s1.smer;
cin >> s1.reg_broj >> s1.br_pol_ispita;
//Upis strukture u datoteku
fbin.write((char )&s1, sizeof(student));
broj_struktura++;
}
fbin.close();
do
{
cout << "\n1. Izmena\n2. Prikaz\n3. Izlaz";
cout << "\n\nIzabrati opciju: "; cin >> opcija;
switch(opcija)
{
case '1':
izmene(); break;
case '2':
prikaz(); break;
default:
izlaz = 1; break;
}while(!izlaz);
return 0;

}
//Funkcija koja azurira sadrzaj datoteke
void izmene(void)
{
int rbroj, promena;
//Otvaranje binarne datoteke za citanje i upis
fbin.open("studenti.bin", ios::in | ios::out | ios::binary);
if(!fbin)
greska(GR_OTV_CIT);
//Izmena podataka u datoteci
cout << "\nRedni broj studenta (do broja 0) i dodatni broj pol. Ispita\n";
while(1)
{
cin >> rbroj;

75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:

if(rbroj == 0)
break;
cin >> promena;
//Pomeraj na strukturu i citanje njenog sadrzaja
fbin.seekg(-(rbroj-1)sizeof(student), ios::beg);
fbin.read((char )&s1, sizeof(student));
s1.br_pol_ispita += promena;
//Povratak na pocetak strukture i upis njenog sadrzaja
fbin.seekp(-sizeof(student), ios::cur);
fbin.write((char )&s1, sizeof(student));
}
fbin.close();
}
//Funkcija koja prikazuje na ekranu sadrzaj datoteke
void prikaz(void)
{
int i;
//Otvaranje binarne datoteke za citanje
fbin.open("studenti.bin", ios::in | ios::binary);
if(!fbin)
greska(GR_OTV_CIT);
//Prikaz na ekranu sadrzaja datoteke
fbin.seekg(0);
for(i=0; i<broj_struktura;i++)
{
fbin.read((char )&s1, sizeof(student));
cout << s1.ime << " " << s1.smer << " ";
cout << s1.reg_broj << " " << s1.br_pol_ispita << endl;
}
fbin.close();
}
//Funkcija koja prikazuje na ekranu poruke o greskama
void greska(Greska status)
{
cerr << poruke_o_greskama[status];
exit(1);
}

primer9_5
(
, ).
a fbin fstream
( 15.), .
17. 23. student (ime,
prezime, smer, reg_broj, broj_pol_ispita) s1 ,
24. 0
broj_struktura.
175

26. 28. : izmene(),


prikaz() greska().
. greska() .
izmene() ( 63. 89.)
fbin "studenti.bin". , "studenti.bin"
ios::in | ios::out | ios::binary (, ) ( 67.
69.).
, ( )
( 74. 77.)
(rbroj) (promena):

( 80.),
(
) ( 81.),
(br_pol_ispita) ( 82.),
(
) ( 85.),

( 86.),
, ( 88.).
prikaz() ( 91. 108.) fbin
"studenti.bin". "studenti.bin"
ios::in | ios::binary (, ) ( 95. 97.).
( 100.), for
( 102.),
( 104. 105.) ( 107.).
fbin
"studenti.bin". "studenti.bin" ios::out |
ios::binary (, ) ( 34. 36.).
, ( 39.
45.), ( 48.),
( 49.) ( 51.).
: 1.Izmena, 2.
Prikaz 3. Izlaz, 3.
(1. 2.) (izmene() prikaz()).
9.5 ) 9.5 )
.

9.5 ) primer9_5 ( )

9.5 ) primer9_5 ( )
176

9.5 ) primer9_5 ( )

9.5 ) primer9_5 ( )

9.5 ) primer9_5 ( )

9.5 ) primer9_5 ( )

9.5 ) primer9_5 ( )

primer9_6

1:
2:
3:
4:
5:
6:
7:
8:
9:

//primer9_6.cpp
//Pretrazivanje spiska stanara
//(upotreba dinamicke dodele memorije i povezanih lista)
#include <iostream>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#define MAX 30
//broj korisnih karaktera u stringu
using namespace std;

177

10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
178

struct adresa{
char ime[MAX+1];
char ulica[MAX+1];
int broj;
char grad[MAX+1];
adresa sledeca;
};
void cita(adresa ptr_a);
void nalazi(adresa ptr_a);
void stampa(adresa ptr_a);
void greska(void);
int main()
{
char odgovor = 'd';
adresa prva, tekuca;
prva = new adresa;
tekuca = prva;
do
{

if( tekuca == NULL )


greska();
tekuca->sledeca = NULL;
cita(tekuca);
cout << "\n\nUnesite d za nastavak: ";
cin >> odgovor;
cin.ignore();
//cita znak za prelaz u novi red

if( tolower(odgovor) == 'd')


{
tekuca->sledeca = new adresa;
tekuca = tekuca->sledeca;
}
}while(tolower(odgovor) == 'd');
nalazi(prva);
return 0;
}
//Funkcija koja cita sa tastature podatke o adresi
void cita(adresa ptr_a)
{
cout << "\nUnesite ime i prezime stanara: ";
cin.getline(ptr_a -> ime, MAX+1);
cout << "Unesite ime ulice: ";
cin.getline(ptr_a -> ulica, MAX+1);

60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:

cout << "Unesite broj ulaza: ";


cin >> ptr_a -> broj;
cin.ignore();
cout << "Unesite ime grada: ";
cin.getline(ptr_a -> grad, MAX+1);
}
//Funkcija koja nalazi zadatu adresu u postojecem spisku
void nalazi(adresa ptr_a)
{
char grad[MAX+1], ulica[MAX+1];
int broj_ulaza;
cout << "\nTrazeni grad? ";
cin.getline(grad, MAX+1);
cout << "Trazena ulica: ";
cin.getline(ulica, MAX+1);
cout << "Trazeni broj ulaza? ";
cin >> broj_ulaza;
cin.ignore();
cout << "\nSpisak stanara:\n";
while(ptr_a != NULL )
{
if(
strcmp(grad, ptr_a -> grad) == 0 &&
strcmp(ulica, ptr_a -> ulica) == 0 &&
broj_ulaza == ptr_a -> broj
stampa(ptr_a);
ptr_a = ptr_a -> sledeca;
}

}
//Funkcija koja prikazuje na ekranu ime od adrese
void stampa(adresa ptr_a)
{
cout << ptr_a -> ime << endl;
}
//Funkcija koja prikazuje na ekranu poruke o greskama
void greska(void)
{
cerr << "Nije uspela dinamicka dodela memorije\n";
exit(1);
}

primer9_6

(
) .
adresa (ime, ulica, broj, grad
sledeca ), : cita() , nalazi(), stampa() greska().
, greska(), adresa.

179

cita() ( 54. 67.)


.
nalazi() ( 69. 92.)
(grad, ulica broj_ulaza)
( ). while
( )

stampa().
stampa() ( 94. 96.)
(ime) ( ).
( 24. 52.) do..while (
31. 47.) cita(),
, .
nalazi()
. 9.6 ) 9.6 )
.

9.6 a) primer9_6 ( )

9.6 ) primer9_6 ( )

9.6 ) primer9_6 ( )

9.6 ) primer9_6 ( )

9.6 ) primer9_6 ( )

180

9.6 ) primer9_6 ( )

9.6 ) primer9_6 ( )

9.6 ) primer9_6 ( )



fstream fstream, ofstream
ifstream.
fstream. ,
ofstream, , ifstream.



fstream .

fstream
.

181

9.
_____________________________________________
1.
++
: .
.

182

9.
_____________________________________________

.

1.
++
.

2.
++
: .

3.
++
:
.

4.
++ :
a) m (m100) , n (n100),
, m ,
) ,
0, ,
) .

5.
++ :
) (ime, broj_indeksa, ocena) n
(n100) , n ,
)
,
) (ime broj_indeksa)
ocena.

183

184

10.

++

185


_____________________________________________
primer10_1
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
186

//primer10_1.cpp
//Izracunavanje broja sati, minuta i sekundi u zadatom broju sekundi
//(Koriscenje konstruktora i destruktora klase)
#include <iostream>
using namespace std;
class konv {
int ukupno_sek;
public:
konv(void)
{
ukupno_sek=0;
cout << "\nPocetak konvertovanja.\n\n"; }
~konv(void)
{
cout << "\nKraj konvertovanja.\n\n";
}
void prikaz(int);
void u_sate(void);
void u_min(void);
void u_sek_ost(void);
};
int main( )
{
konv konv_obj;
int ukupno;
cout << "Ukupan broj sekundi? "; cin >> ukupno;
konv_obj.prikaz(ukupno);
konv_obj.u_sate();
konv_obj.u_min();
konv_obj.u_sek_ost();
return 0;
}
void konv::prikaz(int sek)
{
if(sek>0)
ukupno_sek = sek;
cout << ukupno_sek << " sekundi je:" << endl;
void konv::u_sate(void)
{
cout<<ukupno_sek/3600 << " sati, ";
void konv::u_min(void)
{
cout << (ukupno_sek / 60) % 60 << " minuta, ";
void konv::u_sek_ost(void)
{
cout << ukupno_sek% 60 << " sekundi." << endl;

}
}
}
}

primer10_1

,
.
a konv ( 7. 20.),
.
konv. ukupno_sek ( 8.)
( ,
), (
).
( 9. 19.)
, .
konv() ( 10. 12.),
.
,
podatka ukupno_sek ( 11.)
( 12.).
~konv() ( 13. 14.),
, ~
. ,
( 14.).
prikaz(), u_sate(), u_min() u_sek_ost()
( 16. 19.).
konv_obj (
22.) ukupno (
24. 26.),
konv: prikaz(), u_sate(), u_min() u_sek_ost() konv_obj (
28. 31.).
. (
35. 44.), ,
, (::)
(void konv::prikaz(), void konv::u_sate(), void
konv::u_min(),void konv::u_sek_ost()).
ukupno_sek (
, ).
10.1 ) 10.1 )
.

10.1 a) primer10_1 ( )

187

10.1 ) primer10_1 ( )

primer10_2
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:

188

//primer10_2.cpp
//Izracunavanje apsolutnih vrednosti brojeva u raznim oblicima
//(Preklapanje funkcija, clanica klase)
#include <iostream>
#include <stdlib.h>
#include <math.h>
using namespace std;
class apsolutna {
public:
int f_aps(int);
double f_aps(double);
double f_aps (char *);
};
int main( )
{
apsolutna aps_obj;
cout << "\nApsolutna vrednost broja -547 je: "
<< aps_obj.f_aps(-547) << endl;
cout << "\nApsolutna vrednost broja -547.256 je: "
<< aps_obj.f_aps(-547.256) << endl;
cout << "\nApsolutna vrednost broja \"-547.82abc\" je: "
<< aps_obj.f_aps("-547.82abc" ) << endl;
return 0;
}
int apsolutna:: f_aps(int broj)
{
int aps_i;
aps_i = abs(broj);
return aps_i;
}
double apsolutna:: f_aps(double broj)
{
double aps_d;
aps_d = fabs(broj);
return aps_d;
}

39:
40:
41:
42:
43:
44:

double apsolutna:: f_aps(char *s)


{
double broj, aps_d;
broj = atof(s);
aps_d = fabs(broj);
return aps_d;
}

primer10_2

.
a apsolutna ( 9. 14.),
,
: ,
.
apsolutna.
( 10. 13.),
f_aps(), ,
, (

). int ,
double ,
doubl.
aps_obj ( 16.),
apsolutna (
f_aps()) aps_obj ( 18.
25.). , ,
f_aps()
, ,
( 29. 44.).
10.2 .

10.2 primer10_2

primer10_3
1:
2:
3:
4:
5:
6:

//primer10_3.cpp
//Provera lozinke studenta i prikaz poena ostvarenih na testu
//(Poziv funkcija, privatnih i javnih clanica klase)
#include <iostream>
#include <string.h>
#include <stdlib.h>
189

7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:

190

#define MAX 30
using namespace std;
class test {
char ime[MAX+1];
int lozinka,
br_tacnih,
br_netacnih;
double br_poena;
int Br_tacnih(void);
int Br_netacnih(void);
double Br_poena(void);
public:
void Prompt(int neka_lozinka);
void Pocetak(char *poc_ime,
int poc_lozinka,
int poc_tacnih,
int poc_netacnih,
double poc_poena);
void Pozdrav(void);
void Tacnih(int broj);
void Netacnih(int broj);
} student;
int main( )
{
int uneta_lozinka;
student.Pocetak("Student Student", 1234, 0, 0, 0);
cout<<"Unesite lozinku: "; cin>>uneta_lozinka;
student.Pozdrav(); student.Prompt(uneta_lozinka);
student.Tacnih(7); student.Prompt(uneta_lozinka);
student.Netacnih(3); student.Prompt(uneta_lozinka);
return 0;
}
int test::Br_tacnih(void)
{
return(br_tacnih);
}
int test::Br_netacnih(void)
{
return(br_netacnih);
}
double test::Br_poena(void)
{
return(br_poena);
}
void test::Prompt(int neka_lozinka)
{
char izbor;
if( neka_lozinka == lozinka )

57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:

cout<<"\nBirati opciju P za broj poena ";


cout<<"ili bilo koju drugu opciju za kraj: ";
cin>>izbor;
if(izbor == 'P' || izbor == 'p')
{
cout << "\nTacnih odgovora: ";
cout << student.Br_tacnih();
cout << "\nNetacnih odgovora: ";
cout << student.Br_netacnih();
cout << "\nTrenutno ostvarenih poena: ";
cout << student.Br_poena()<<endl;
}
else
{
cout<<"\nIzabrana opcija za kraj!\n\n"; exit(1);
}

}
else
{
}

cout<<"\nUneta nekorektna lozinka!\n\n"; exit(1);

}
void test::Pocetak( char *poc_ime,
int poc_lozinka,
int poc_tacnih,
int poc_netacnih,
double poc_poena)
{
strcpy(ime,poc_ime);
lozinka = poc_lozinka;
br_tacnih = poc_tacnih;
br_netacnih = poc_netacnih;
br_poena = poc_poena;
}
void test::Pozdrav(void)
{
cout<<"\nDobro dosli na test "<<ime<<endl;
cout<<"\nZa tacan odgovor ostvarujete 1 poen";
cout<<"\nZa netacan odgovor -0.5 poena"<<endl;
}
void test::Tacnih(int broj)
{
br_tacnih += broj;
br_poena += broj;
}
void test::Netacnih(int broj)
{
br_netacnih += broj;
br_poena -= broj*0.5;
}

primer10_3

, .
a test ( 10. 31.),
, .
191

,
student ( 31.).
test. ime, lozinka
br_tacnih, br_netacnih br_poena (e 11. 15.)
test. Br_tacnih(), Br_Netacnih() Br_poena()
(e 17. 19.),
. Prompt(), Pocetak(), Pozdrav(), Tacnih()
Netacnih() ( 21. 30.)
, .
uneta_lozinka
( 34.). Pocetak() student
( 36.), , , ,
. ,
uneta_lozinka test:
Pozdrav(), Tacnih() Netacnih() student, ,

. ,
Prompt() ( test)
student,
,
(e 36. 41.).
, Br_tacnih(), Br_Netacnih()
Br_poena(), , Prompt(), Pocetak(), Pozdrav(), Tacnih() Netacnih()
(e 45. 99.).
test,
. Prompt()
Br_tacnih(), Br_Netacnih() Br_poena()
(e 61. 66.), Pocetak()
ime, lozinka br_tacnih, br_netacnih br_poena
(e 81. 85.).
10.3 ) 10.3 )
.

10.3 ) primer10_3 ( )

10.3 ) primer10_3 ( )

192

10.3 ) primer10_3 ( )

10.3 ) primer10_3 ( )

primer10_4
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:

//primer10_4.cpp
//Azuriranje podataka o studentu i ocenama na ispitima
//(Nasledjivanje kod klasa)
#include <iostream>
#include <string.h>
#define MAX 30
using namespace std;
class student {
char ime[MAX+1],
st_program[MAX+1],
broj_ind[MAX+1];
public:
void citanje( void );
void prikaz( void );
};

193

17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:

194

class obavezno:public student{


char predmet_ob[MAX+1];
int ocena_ob;
public:
void citanje_ob( void );
void prikaz_ob( void );
};
class izborno:public student{
char predmet_izb[MAX+1];
int ocena_izb;
public:
void citanje_izb( void );
void prikaz_izb( void );
};
int main( )
{
obavezno obav_obj;
izborno izb_obj;
cout << "\nStudent koji je polozio obavezan predmet: \n";
obav_obj.citanje_ob();
cout << "\nStudent koji je polozio izborni predmet: \n";
izb_obj.citanje_izb();
cout << "\nPolozen obavezan predmet: \n";
obav_obj.prikaz_ob();
cout << "\nPolozen izborni predmet: \n";
izb_obj.prikaz_izb();
return 0;
}
void student::citanje(void)
{
cout << "Ime studenta: " ;
cin.get(ime, MAX+1, '\n') ;
cin.ignore() ;
cout << "Studijsksi program: " ;
cin.get(st_program, MAX+1, '\n') ;
cin.ignore() ;
cout << "Broj indeksa: " ;
cin.get(broj_ind, MAX+1, '\n') ;
cin.ignore() ;
}
void student::prikaz(void)
{
cout << "Ime: " << ime << endl ;
cout << "Studijski program: " << st_program << endl ;
cout << "Broj indeksa: " << broj_ind << endl ;
}

67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:

void obavezno::citanje_ob(void)
{
citanje();
cout << "Naziv predmeta: ";
cin.get(predmet_ob, MAX+1, '\n');
cin.ignore();
cout << "Ocena: ";
cin >> ocena_ob;
cin.ignore();
}
void obavezno::prikaz_ob(void)
{
prikaz();
cout << "Naziv predmeta: " << predmet_ob << endl ;
cout << "Ocena: " << ocena_ob << endl ;
}
void izborno::citanje_izb(void)
{
citanje();
cout <<"Naziv predmeta: ";
cin.get(predmet_izb, MAX+1, '\n');
cin.ignore();
cout << "Ocena: ";
cin >> ocena_izb;
cin.ignore();
}
void izborno::prikaz_izb(void)
{
prikaz();
cout <<"Naziv predmeta: " << predmet_izb << endl ;
cout <<"Ocena: " << ocena_izb << endl ;
}

primer10_4

/ .
a student ( 9. 16.),
( )
. ,
student (
,
). : obavezno,
( 17. 23.) izborno,
( 24. 30.).
,
. ,

195

obavezno izborno : class obavezno:public student ( 17.) class


izborno:public student ( 24.)
.
student ime, st_program broj_ind (e
10. 12.) citanje() prikaz() ( 14. 15).
obavezno predmet_ob ocena_ob
citanje_ob() prikaz_ob() ( 18. 22). izborno
predmet_izb ocena_izb, citanje_izb()
prikaz_izb() ( 25. 29).
,
obavezno obav_obj izborno izb_obj ( 32.
33.). citanje_ob(), citanje_izb(), prikaz_ob()
prikaz_izb()( 35. 45.), .
student,
obavezno izborno,
(e 49. 100.).
student::citanje() (e
49. 61.), student::prikaz()
(e 62. 66.). obavezno::citanje() ( 67.
77.) izborno::citanje() ( 84. 94.)
citanje() student,
. obavezno::prikaz() ( 78.
83.) izborno::prikaz() ( 95. 100.)
prikaz() student,
.
10.4 ) 10.4 )
.

10.4 ) primer10_4 ( )

10.4 ) primer10_4 ( )

196

10.4 ) primer10_4 ( )


 - ++

++,
" ", " ".
 ( ) -
,
,

, .


 ( )
(ime_objekta.ime_clana).

.
 ,
,
(tip_povr_vrednosti ime_klase::ime_funkcije(lista_argumenata){...}).

197

10.
_____________________________________________
1.
++,
10.4 (
) ,

. ( )
, .

198

10.
_____________________________________________
-
. .
,
.
, .

1.
++ :
) (: ime, pin,
stanje_na_racunu...),
) pin,
) pin izvestaj()
,
: podizanje_novca(),
polaganje_depozita()...

2.
++ :
) : ime, adresa, drzava...,
) : tip, snaga,
starost...
) ,
: kupovina(), iznajmljivanje(), kraj_programa(),
) , izvestaj() o
, ,
.

199

200

201

1.
zapis.txt
C
zapis.txt :
) sifrira zapis.txt
ASCII
ASCII
, sifra.txt.
( : 10110101
11011010, 01101010 00110101...),
) desifrira .

, sifrira,
desifrira.
.

1.
/
Program za sifriranje i desifriranje teksta
/
#include <stdio.h>
#include <stdlib.h>
void sifruje();
void desifruje();
void prikaz_sadrzaja(char ime);
void greska(char poruka);
main()
{
printf("*****************************************************\n");
printf("Prikaz sadrzaja datoteke pre sifrovanja\n\n");
prikaz_sadrzaja("zapis.txt");
sifruje();
printf("*****************************************************\n");
printf("Sifrovani sadrzaj datoteke:\n\n");
prikaz_sadrzaja("sifra.txt");
printf("*****************************************************\n");
printf("Desifrovani sadrzaj datoteke:\n\n");
desifruje();
}
/
Sifrovanje: rotaciono pomeranje za jedno mesto udesno
/
void sifruje()
{
char c;
unsigned short c1,pom;
FILE pt, pt1;
202

if(!(pt=fopen("zapis.txt","r+")))
greska("Nije uspelo otvaranje datoteke za sifrovanje!\n");
if(!(pt1=fopen("sifra.txt","w+")))
greska("Nije uspelo otvaranje datoteke za sifrovanje!\n");
while ((c=fgetc(pt))!= EOF)
{
c1=c;
pom=1;
pom=c1&pom;
/
sacuvan bit najmanje tezine
/
c1>>=1;
/
pomeraj za jedno mesto udesno
/
pom<<=7;
c1=c1|pom;
/
postavljen bit najvece tezine
/
c=c1;
fputc(c,pt1);
}
fclose(pt);
fclose(pt1);
}
/
Desifrovanje: rotaciono pomeranje za jedno mesto ulevo
/
void desifruje()
{
char c;
unsigned short c1,pom;
FILE pt;
if(!(pt=fopen("sifra.txt","r+")))
greska("Nije uspelo otvaranje datoteke za desifrovanje!\n");
while ((c=fgetc(pt))!= EOF)
{
c1=c;
pom=1;
pom<<=7;
pom=pom&c1;
/
sacuvan bit najvece tezine
/
pom>>=7;
c1<<=1;
/
pomeraj za jedno mesto ulevo
/
c1=c1|pom;
/
postavljen bit najmanje tezine
/
c=c1;
printf("%c",c);
}
fclose(pt);
}
/
Prikaz sadrzaja datoteke
/
void prikaz_sadrzaja(char ime[])
{
FILE pt;
char c;

203

if(!(pt=fopen(ime,"r")))
greska("Nije uspelo otvaranje datoteke za citanje!\n");
while ((c=fgetc(pt))!= EOF)
printf("%c",c);
printf("\n");
fclose(pt);
}
void greska(char poruka)
{
printf("%s\n",poruka);
exit(1);
}

204

2.

(string1) (string2).
. ,
, .
.

.
,
.
, ,
.

2.
/
Program koji u datoj datoteci zamenjuje jedan niz znakova drugim
/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef enum {poziv,memorija,datoteka,zamena,argumenti} Poruke;
char tekstovi_poruka[]={ "\nNema imena fajla\n",
"\nGreska prilikom dinamicke dodele memorije\n",
"\nGreska prilikom otvaranja datoteke\n",
"\nU tekstu se ne pojavljuje dati niz znakova\n",
"\nIma previse argumenata\n"
};
void stampanje_poruke(Poruke status)
{
fprintf(stderr,tekstovi_poruka[status]);
exit(1);
}
main(int arg, char argv[])
{
FILE fptr, tmpfptr;
unsigned broj_zamena,duzina1,duzina2,i,broj_znakova;
char tmp1, tmp2, p, tmp;
char c;
/
naredba visestruke selekcije prema broju ucitanih argumenata
/
switch(arg)
{
case 1:
stampanje_poruke(poziv);
case 2:
205

fptr=fopen(argv[1],"r");
if(fptr==NULL)
stampanje_poruke(datoteka);
while ((c=fgetc(fptr))!=EOF)
putchar(c);
fclose(fptr);
break;
case 3: /
naveden je i niz znakova koji se brise
/
case 4: /
naveden je i niz znakova kojim se zamenjuje
/
fptr=fopen(argv[1],"r");
if(fptr==NULL)
stampanje_poruke(datoteka);
broj_znakova=0;
while((c=fgetc(fptr))!=EOF)
broj_znakova++;
rewind(fptr);
broj_zamena=0;
duzina1=strlen(argv[2]);
tmp1=malloc(broj_znakova+1);
if(tmp1==NULL)
stampanje_poruke(memorija);
/
sadrzaj cele datoteke se smesta u jedan niz znakova
/
for(i=0;i<broj_znakova;i++)
(tmp1+i)=fgetc(fptr);
(tmp1+i)='\0';
p=tmp1;
tmp=tmp1;
/
prebrojavanje na koliko mesta treba obrisati odnosno
zameniti dati niz znakova
/
while(strstr(p,argv[2])!=NULL)
{
broj_zamena++;
p=strstr(p,argv[2])+duzina1;
}
if(broj_zamena==0)
{
puts(tmp1);
free(tmp1);
fclose(fptr);
stampanje_poruke(zamena);
}
/
brisanje niza znakova (zamena praznom niskom)
/

206

if(arg==4)
duzina2=strlen(argv[3]);
else
duzina2=0;
/
rezervacija mesta za izmenjeni niz znakova
/
tmp2=malloc(broj_znakova+1+
(duzina2-duzina1)broj_zamena);
if(tmp2==NULL)
stampanje_poruke(memorija);
tmp2='\0';
/
pronalazenje i zamena date niske znakova
/
while(1)
{
p=strstr(tmp,argv[2]);
if(p==NULL)
break;
strncat(tmp2,tmp,p-tmp);
if(arg==4)
strcat(tmp2,argv[3]);
tmp=p+duzina1;
}
strcat(tmp2,tmp);
puts(tmp2);
printf("\nUkupan broj izvrsenih zamena je %i\n",broj_zamena);
/
izmenjeni tekst se smesta u privremenu datoteku
/
tmpfptr=fopen("temp~","w");
if(tmpfptr==NULL)
stampanje_poruke(datoteka);
for(i=0;i<strlen(tmp2);i++)
fputc((tmp2+i),tmpfptr);
/
stara datoteka se brise a privremena datoteka se
preimenuje
/
fclose(fptr);
fclose(tmpfptr);
remove(argv[1]);
rename("temp~",argv[1]);
free(tmp1);
free(tmp2);
break;
default:
stampanje_poruke(argumenti);
break;
}
}

207

3.
C e
,
, .

:
struct zaposleni{
char imeIPrezime Radnika[40];
int maticniBroj;
int godineRadngStaza;
char strucnaSprema[45];
double plata;
}
:
struct licniPodaci{
int maticniBroj;
char adresa[40];
char grad[30];
long int brojTelefona;
char opisPosla[50];
}
0.

: , , .

3.
/
Program za evidenciju podataka o zaposlenima u jednoj firmi
/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct zaposleni{
char imeIPrezimeRadnika[40];
int maticniBroj;
int godineRadnogStaza;
char strucnaSprema[45];
double plata;
};
struct licniPodaci{
int maticniBroj;
char adresa[40];
char grad[30];
long int brojTelefona;
char opisPosla[50];
};
struct podaci{
208

char imeIPrezimeRadnika[40];
char adresa[40];
char strucnaSprema[45];
double plata;
};
void prikazuje(char ,int);
void greska(char g[]);
main(int argc, char argv[])
{
FILE fpt1, fpt2, fpt3;
struct zaposleni radnik;
struct licniPodaci licni;
char grad[30];
struct podaci tekuci;
double pl;
int broj=0,br1=0,i;
if(argc!=4)
greska("Niste uneli potreban broj parametara.\n");
if(!(fpt1=fopen(argv[1],"wb")))
greska("Nije uspelo otvaranje prve datoteke za pisanje.\n");
if(!(fpt2=fopen(argv[2],"wb")))
greska("Nije uspelo otvaranje druge datoteke za pisanje.\n");
while(1)
{
printf("\nUnesite maticni broj radnika.\n");
scanf("%d",&radnik.maticniBroj);
if(radnik.maticniBroj==0)
break;
licni.maticniBroj=radnik.maticniBroj;
printf("\nUnesite ime i prezime radnika ");
getchar();
gets(radnik.imeIPrezimeRadnika);
printf("\nUnesite broj godina radnog staza radnika %s.",
radnik.imeIPrezimeRadnika);
scanf("%d",&radnik.godineRadnogStaza);
printf("\nUnesite strucnu spremu radnika %s.",
radnik.imeIPrezimeRadnika);
scanf("%s",radnik.strucnaSprema);
printf("\nDohodak radnika %s je: ",radnik.imeIPrezimeRadnika);
scanf("%lf",&pl);radnik.plata=pl;
printf("\nUnesite licne podatke o radniku %s.\nAdresa:",
radnik.imeIPrezimeRadnika);
getchar();
209

gets(licni.adresa);
printf("\nGrad:");
scanf("%s",licni.grad);
printf("\nOpis posla: ");
getchar();
gets(licni.opisPosla);
printf("\nBroj telefona: ");
scanf("%d",&licni.brojTelefona);
if(fwrite(&radnik, sizeof(struct zaposleni),1,fpt1)!=1)
greska("Greska pri upisu u prvu datoteku\n");
if(fwrite(&licni,sizeof(struct licniPodaci),1,fpt2)!=1)
greska("Greska pri upisu u drugu datoteku\n");
broj++;
}
fclose(fpt1);
fclose(fpt2);
if(!(fpt1=fopen(argv[1],"rb")))
greska("Nije uspelo otvaranje prve datoteke za citanje.\n");
if(!(fpt2=fopen(argv[2],"rb")))
greska("Nije uspelo otvaranje druge datoteke za citanje.\n");
if(!(fpt3=fopen(argv[3],"wb")))
greska("Nije uspelo otvaranje trece datoteke za pisanje.\n");
printf("\nUnesite ime grada iz koga zelite podatke o radnicima.\n");
scanf("%s",&grad);
for (i=0;i<broj;i++)
{
if(fread(&radnik, sizeof(struct zaposleni),1,fpt1)!=1)
greska("Greska pri citanju prve datoteke\n");
if(fread(&licni,sizeof(struct licniPodaci),1,fpt2)!=1)
greska("Greska pri citanju druge datoteke\n");
if(strcmp(grad,licni.grad)==0)
{
strcpy(tekuci.imeIPrezimeRadnika,radnik.imeIPrezimeRadnika);
strcpy(tekuci.adresa, licni.adresa);
strcpy(tekuci.strucnaSprema, radnik.strucnaSprema);
tekuci.plata=radnik.plata;
if(fwrite(&tekuci,sizeof(struct podaci),1,fpt3)!=1)
greska("Greska pri upisu u drugu datoteku\n");
br1++;
}
}
fclose(fpt1);
fclose(fpt2);
fclose(fpt3);
prikazuje(argv[3],br1);

210

}
void prikazuje(char ime, int br)
{
FILE ptr;
int i;
struct podaci tekuci;
if(!(ptr=fopen(ime,"rb")))
greska("Nije uspelo otvaranje datoteke za citanje.\n");
printf("\nPodaci o odgovarajucim radnicima\n");
for(i=0;i<br;i++){
if(fread(&tekuci,sizeof(struct podaci),1,ptr)!=1)
greska("Greska pri upisu u drugu datoteku\n");
printf("\nIme i prezime: %s \n",tekuci.imeIPrezimeRadnika);
printf("\nAdresa: %s",tekuci.adresa);
printf("\nStrucna sprema: %s",tekuci.strucnaSprema);
printf("\nLicni dohodak %.2f dinara \n", tekuci.plata);
printf("\n");
}
}
void greska(char g[])
{
printf("%s",g);
exit(1);
}

211

4.
:
struct obaveza{
char opis_obaveze[30];
int dan, mesec, godina;
int sat, minut;
}
:
1.
Unos obaveze
2.
Brisanje obaveze
3.
Obaveze sa odredjenim datumom
4.
Pregled svih unetih obaveza
5.
Kraj rada
5.

4.
/
Program za evidenciju obaveza, po datumima i terminima
/
#include <stdio.h>
#include <stdlib.h>
struct obaveza{
char opis_obaveze[30];
int dan, mesec, godina;
int sat, minut;
};
struct cvor{
struct obaveza ob;
struct cvor cv;
};
struct cvor brisi_obavezu(struct cvor pocetak);
int prikaz_menija();
void prikazi_listu(struct cvor pocetak);
void prikaz_dnevnih_obaveza(struct cvor pocetak);
main()
{
int op;
struct cvor pocetak=NULL, tekuci, novi;
while(1)
{
op=prikaz_menija();

212

switch(op)
{
case 1:
if ((novi=malloc(sizeof(struct cvor)))==NULL)
{
printf("Greska prilikom dodele memorije");
exit(1);
}
novi->cv=NULL;
printf("Unesite opis obaveze\n");
scanf("%s", novi->ob.opis_obaveze);
printf("Unesite datum obaveze u formi dd mm gggg ");
scanf("%d%d%d", &novi->ob.dan,&novi->ob.mesec,
&novi->ob.godina);
printf("Unesite sat i minut u formi ss mm ");
scanf("%d %d",&novi->ob.sat,&novi->ob.minut);
if(pocetak==NULL) /
prvi element liste
/
pocetak=novi;
else
/
kretanje kroz listu i dodavanje
/
{
/
novog elementa na kraj
/
tekuci=pocetak;
while(tekuci->cv)
{
tekuci=tekuci->cv;
}
tekuci->cv=novi;
}
break;
case 2:
pocetak=brisi_obavezu(pocetak);
break;
case 3:
prikaz_dnevnih_obaveza(pocetak);
break;
case 4:
prikazi_listu(pocetak);
break;
case 5:
printf("\n\n");
exit(1);
default:
printf("Izabrali ste nepostojecu opciju!\n");
break;
}
}
}

213

int prikaz_menija()
{
int opcija;
printf("******************************************\n");
printf("1. Unos obaveze\n");
printf("2. Brisanje obaveze\n");
printf("3. Obaveze sa odredjenim datumom\n");
printf("4. Pregled svih obaveza\n");
printf("5. Kraj rada\n");
printf("******************************************\n");
printf("Unesite redni broj opcije koju ste izabrali: ");
scanf("%d",&opcija);
return opcija;
}
void prikazi_listu(struct cvor pocetak)
{
struct cvor tekuci=pocetak;
int brojac=1;
while(tekuci)
{
printf("\n%d. Obaveza %s ",brojac,tekuci->ob.opis_obaveze);
printf("datum obaveze: %d.%d.%d.",
tekuci->ob.dan,tekuci->ob.mesec,tekuci->ob.godina);
printf(" u %d sati i %d minuta.\n",tekuci->ob.sat,tekuci->ob.minut);
tekuci=tekuci->cv;
brojac++;
}
}
struct cvor brisi_obavezu(struct cvor pocetak)
{
struct cvor tekuci=pocetak, prethodni=pocetak;
int br,j=1;
prikazi_listu(pocetak);
printf("Unesite redni broj obaveze koju zelite da izbacite\n");
scanf("%d",&br);
if(pocetak==NULL)
/
ispitivanje da li je lista prazna
/
{
printf("Nedozvoljeno brisanje!\n");
return NULL;
}

214

if (br==1)
{
/
treba izbaciti prvi element liste
/
pocetak=tekuci->cv;
free(tekuci);
return pocetak;
}
else
{
while((tekuci->cv)&& j!=br)
{
prethodni=tekuci;
tekuci=tekuci->cv;
j++;
}
if(tekuci->cv==NULL)
if(br==j)
{
prethodni->cv=NULL;
free(tekuci);
return pocetak;
}
else
{
printf("Uneli ste preveliki redni broj\n");
return pocetak;
}
if(j==br)
{
prethodni->cv=tekuci->cv;
free(tekuci);
return pocetak;
}
return NULL;
}
}
void prikaz_dnevnih_obaveza(struct cvor pocetak)
{
struct cvor tekuci=pocetak;
int brojac=1,dan,mesec,godina;
printf("Unesite datum za koji zelite pregled obaveza\n");
scanf("%d%d%d",&dan,&mesec,&godina);
while(tekuci)
{
if((dan==tekuci->ob.dan) &&(mesec==tekuci->ob.mesec)
&& (godina == tekuci->ob.godina))
{
printf("\n%d. Obaveza %s ",brojac,tekuci->ob.opis_obaveze);
215

printf("datum obaveze: %d.%d.%d.",


tekuci->ob.dan,tekuci->ob.mesec,tekuci->ob.godina);
printf(" u %d sati i %d minuta.\n",tekuci->ob.sat,tekuci->ob.minut);
brojac++;
}
tekuci=tekuci->cv;
}
if(brojac==1)
{
printf("Za uneti datum nema unetih obaveza!\n");
}
}

216

5.
.
reci.txt .
.
(_)
. .
, ,
.
.
5 ,
2 ,
1 . 10
. ,
.
.
.
10
.

2.

, . ,
.
15
. 15 .

5.
/
Program za igru pogadjanja reci
/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include<time.h>
#define BROJ_POKUSAJA 10
#define POGODAK 5
#define PROMASAJ -2
#define BONUS 2
#define KAZNA 1
typedef enum {MEMORIJA,DATOTEKA,CITANJE,UPIS}Greska;
char poruke[]={

"\nProblem sa memorijom\n",
"\nProblem sa datotekom\n",
"\nProblem sa citanjem podataka\n",
"\nProblem sa upisivanjem podataka\n"};

217

typedef struct {
char ime[20];
int bodovi;
} Igrac;
void poruka(GRESKA);
void lista(int);
main()
{
FILE fptr;
unsigned i,j,poeni=0,nadjen,ima,ind;
char rec, copy,c;
char slova1[]="A B C D E F G H I J K L M N O P R S T U V Z",slova[44];
time_t timer;
/
otvaranje datoteke u kojoj se nalaze zadate reci /
fptr=fopen("reci.txt","r");
if(fptr==NULL)
poruka(DATOTEKA);
/
pokretanje generatora slucajnih brojeva pomocu tekuceg vremena
/
srand(time(&timer));
while(1)
{
strcpy(slova,slova1);
while (!(i=rand()));
rec=malloc(15);
if(rec==NULL)
poruka(MEMORIJA);
j=0;
/
pomocu slucajnog broja ucitava se rec iz datoteke
/
while(j<i)
{
if(!fscanf(fptr,"%s",rec))
poruka(CITANJE);
j++;
if(feof(fptr))
rewind(fptr);
}
/
pravi se rec od donjih crta
/
copy=malloc(strlen(rec)+1);
if(copy==NULL)
poruka(MEMORIJA);
realloc(rec,strlen(rec)+1);
for(i=0;i<strlen(rec);i++)
(copy+i)='_';
218

(copy+i)='\0';
/
pocinje pogadjanje
/
for(i=0;i<BROJ_POKUSAJA;i++)
{
printf("\n\n\nPOGADJA SE REC");
printf("\t\tbroj poena: %i\t\tpreostalo pokusaja: %i\n",
poeni,BROJ_POKUSAJA-i);
printf("\nSlova na raspolaganju: %s\n\n",slova);
for(j=0;j<strlen(copy);j++)
printf("%c ",(copy+j));
putchar('\n');
/
proverava se da li je uneti znak slovo
/
while(1)
{
printf("\nUnesi slovo: ");
scanf("%c",&c);
c=toupper(c);
getchar();
if(c>'Z'||c <'A'||c=='Q'||c=='W'||c=='Y'||c=='X')
printf("\t\tNije slovo");
else
break;
}
/
ako je slovo nadjeno brise se sa spiska ponudjenih
/
nadjen=0;
for(j=0;j<strlen(slova);j++)
if(c==slova[j])
{
nadjen=1;
slova[j]=' ';
break;
}
if(nadjen==0)
{
printf("\t\tTo slovo je proslo");
ima=2;
poeni+=KAZNA;
i--;
}
/
nadjeno slovo se upisuje u rec umesto donje crte
/
else
{
ima=0;
for(j=0;j<strlen(rec);j++)
if(c==(rec+j))
219

{
(copy+j)=c;
ima=1;
}
}
if(ima==1)
{
poeni+=POGODAK;
i--;
}
else
{
poeni+=PROMASAJ;
if(ima!=2)
printf("\t\tNema tog slova");
}
if(ind=(strcmp(rec,copy)==0))
{
printf("\nBRAVO,pogodio si rec %s\n",rec);
poeni=poeni+(BROJ_POKUSAJA-i-1)BONUS;
printf("\nBonus: %i poena, ukupno : %i poena\n",
(BROJ_POKUSAJA-i-1)2,poeni);
break;
}
}
if(!ind) printf("\nZao mi je, nisi pogodio rec %s iz %i puta\n",rec, i);
printf("\nZelis li jos da pogadjas (d/n)? ");
scanf("%c",&c);
getchar();
if(c=='n' || c=='N')
{
printf("\n\n");
break;
}
}
fclose(fptr);
lista(poeni);
}
void lista(int poeni)
{
FILE fptr;
int i,j,mesto,plasman=0;
char novoime;
Igrac igrac,tmpigrac;
printf("\nBroj poena %i\n",poeni);
printf("\nTOP 15\n");
fptr=fopen("najbolji.dat","rb+");
220

/
slucaj ako niko pre nije igrao
/
if(fptr==NULL)
{
mesto=1;
fptr=fopen("najbolji.dat","wb");
if(fptr==NULL)
poruka(DATOTEKA);
printf("\nUnesi ime: ");
fflush(stdin);
gets(tmpigrac.ime);
tmpigrac.bodovi=poeni;
if(fwrite(&tmpigrac,sizeof(Igrac),1,fptr)!=1)
poruka(UPIS);
fclose(fptr);
printf("\n1. %-20s %i\n",tmpigrac.ime,poeni);
printf("\nTrenutno se nalazis na %i. mestu\n",mesto);
}
/
ispisivanje na ekranu liste rezultata
/
else
{
igrac=malloc(15sizeof(Igrac));
if(igrac==NULL)
poruka(MEMORIJA);
for(j=0;j<15;j++)
{
if(fread(igrac+j,sizeof(Igrac),1,fptr)!=1 && !feof(fptr))
poruka(CITANJE);
if(feof(fptr))
break;
printf("\n%2i. %-20s %i",j+1,(igrac+j)->ime,(igrac+j)->bodovi);
}
putchar('\n');
if(j<15) j++;
/
ako se rezultat nalazi u prvih petnaest
ubacivanje tog rezultata u listu
/
if((igrac+j-1)->bodovi<poeni)
{
plasman=1;
mesto=j;
printf("\nUnesite ime ");
novoime=malloc(20);
if(novoime==NULL)
poruka(MEMORIJA);
fflush(stdin);
gets(novoime);
(igrac+j-1)->bodovi=poeni;
strcpy((igrac+j-1)->ime,novoime);
221

for(i=j-1;i>0;i--)
if((igrac+i)->bodovi>(igrac+i-1)->bodovi)
{
mesto--;
tmpigrac=(igrac+i);
(igrac+i)= (igrac+i-1);
(igrac+i-1)=tmpigrac;
}
else
break;
}
rewind(fptr);
if(plasman)
{
printf("\n\nTOP 15\n\n");
for(i=0;i<j;i++)
{
if(fwrite(igrac+i,sizeof(Igrac),1,fptr)!=1) poruka(UPIS);
printf("%2i. %-20s %i\n",i+1,(igrac+i)->ime,(igrac+i)->bodovi);
}
printf("\n\nTrenutno se nalazis na %i. mestu\n\n",mesto);
}
else
printf("\n\n");
fclose(fptr);
getchar();
}
}
void poruka(Greska status)
{
fprintf(stderr,poruke[status]);
exit(1);
}

222

6.
mob.bin
:
struct mob{
char ime_modela[20];
int kolicina;
float cena;
};
:
1. Unos podataka
2. Kupovina
3. Kraj
:
1. 1. .
mob.bin .
.
(
). ,
mob.bin
, a , ,
;
2. 2. .
.
mob.bin
.
. ,
,
.

.
;
3. 3.

6.
/
Program koji zurira podatke o mobilnim telefonima
/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct mob{
char ime_modela[20];
int kolicina;
float cena;
};
struct mob model;

223

int broj_modela=0;
int prikaz_menija();
void unos_podataka();
void unos();
void kupovina();
main()
{
int opcija;
while(1)
{
opcija=prikaz_menija();
switch(opcija)
{
case 1:
unos_podataka();
break;
case 2:
kupovina();
break;
case 3:
exit(1);
default:
printf("Izabrali ste nepostojecu opciju, birajte ponovo!\n");
break;
}
}
return 0;
}
int prikaz_menija()
{
int opcija;
printf("******************************************\n");
printf("1. Unos podataka\n");
printf("2. Kupovina\n");
printf("3. Kraj\n");
printf("******************************************\n");
printf("Unesite redni broj opcije koju ste izabrali:");
scanf("%d",&opcija);
return opcija;
}

void unos_podataka()
{

224

struct mob niz_struct;


FILE pt1, pt;
int i, postoji=1, unesen=0;
/
postoji=1 ako je mob.bin kreirana, inace je 0
/
if((pt1=fopen("mob.bin","rb"))==NULL)
postoji=0;
else
fclose(pt1);
/
mob.bin je prethodno kreirana
/
if((postoji==1) && (broj_modela!=0))
{
if((pt=fopen("mob.bin","rb"))==NULL)
{
printf("Greska pri otvaranju datoteke za pisanje!\n");
exit(1);
}
unos();
if((niz_struct=malloc(sizeof(struct mob)broj_modela))==NULL)
{
printf("Greska pri dodeli memorije\n");
exit(1);
}
if(fread(niz_struct,sizeof(struct
mob),broj_modela,pt)!=broj_modela)
{
printf("Greska pri citanju");
exit(1);
}
fclose(pt);
for(i=0;i<broj_modela;i++)
/
1. model je u mob.bin i cena je ista
/
if(strcmp(model.ime_modela,niz_struct[i].ime_modela)==0)
if(niz_struct[i].cena==model.cena)
{
niz_struct[i].kolicina+=model.kolicina;
if((pt1=fopen("mob.bin","wb"))==NULL)
{
printf("Greska pri otvaranju datoteke za pisanje!\n");
exit(1);
}
if(fwrite(niz_struct,sizeof(struct mob),broj_modela,pt1)
!=broj_modela)
{
printf("Greska\n");
exit(1);
}
225

fclose(pt1);
unesen=1;
break;
}/
kraj 1. slucaja
/
/
2. model nije upisan u mob.bin, ili se cene razlikuju
/
if (unesen==0)
{
broj_modela++;
if((pt1=fopen("mob.bin","ab"))==NULL)
{
printf("Greska pri otvaranju datoteke za pisanje!\n");
exit(1);
}
if(fwrite(&model,sizeof(struct mob),1,pt1)!=1)
{
printf("Greska\n");
exit(1);
}
fclose(pt1);
}/
kraj 2. slucaja
/
free(niz_struct);
}
/
mob.bin nije prethodno kreirana, unosi se prvi model
/
else
{
if((pt=fopen("mob.bin","wb"))==NULL)
{
printf("Greska pri otvaranju datoteke za pisanje!\n");
exit(1);
}
unos();
printf("Model %s komada: %d cena: %f\n",
model.ime_modela,model.kolicina,model.cena);
if(fwrite(&model,sizeof(struct mob),1,pt)!=1)
{
printf("Greska\n");
exit(1);
}
broj_modela++;
fclose(pt);
}
}
void kupovina()
{
FILE pt;
struct mob niz;
int i,j,postoji=0,kol;
226

float racun;
struct mob temp;
if((niz=malloc(sizeof(struct mob)broj_modela))==NULL)
{
printf("Greska pri dodeli memorije\n");
exit(1);
}
if((pt=fopen("mob.bin","rb"))==NULL)
{
printf("Greska pri otvaranju datoteke za citanje!\n");
exit(1);
}
if(fread(niz,sizeof(struct mob),broj_modela,pt)!=broj_modela)
{
printf("Greska pri citanju");
exit(1);
}
for(i=0;i<broj_modela;i++)
printf("Model %s komada: %d cena: %f\n",
niz[i].ime_modela,niz[i].kolicina,niz[i].cena);
fclose(pt);
printf("\nUnesite ime modela aparata koji zelite da kupite:");
scanf("%s",temp.ime_modela);
for(i=0;i<broj_modela;i++)
if(strcmp(temp.ime_modela,niz[i].ime_modela)==0)
{
postoji=1;
printf("Cena %s modela je %f.\n",niz[i].ime_modela,niz[i].cena);
printf("Koliko komada zelite da kupite\n");
scanf("%d",&kol);
if(kol>niz[i].kolicina)
{
printf("Mozete kupiti maksimalno %d aparata\n",niz[i].kolicina);
break;
}
racun=kolniz[i].cena;
printf("Vas racun iznosi %f dinara.\n",racun);
niz[i].kolicina-=kol; /
azurira se broj aparata posle prodaje
/
if(niz[i].kolicina==0) /
brisu se podaci o modelu
/
/
kog vise nema u ponudi
/
{
broj_modela--;
for(j=i;j<broj_modela;j++)
{
strcpy(niz[j].ime_modela,niz[j+1].ime_modela);
227

niz[j].cena=niz[j+1].cena;
niz[j].kolicina=niz[j+1].kolicina;
}
}
if((pt=fopen("mob.bin","wb"))==NULL)
{
printf("Greska pri otvaranju datoteke za upis!\n");
exit(1);
}
if(fwrite(niz,sizeof(struct
mob),broj_modela,pt)!=broj_modela)
{
printf("Greska\n");
exit(1);
}
fclose(pt);
break;
}
if(postoji==0)
printf("Model %s nije trenutno u ponudi\n", temp.ime_modela);
free(niz);
}
void unos()
{
printf("Unesite naziv modela: ");
scanf("%s",model.ime_modela);
printf("\nUnesite broj aparata: ");
scanf("%d",&model.kolicina);
printf("\nUnesite cenu %s modela: ", model.ime_modela);
scanf("%f",&model.cena);
printf("\n");
}

228

7.

.
: , .
.
-. -
75 99 100 185 .

.
:
( -) ,
2.0 1.8.
.
3 20.
.
.
.
.
. .
: , .
,
.

.

, ,
. ,

.
-
-.

7.
/
Program koji prati takmicenje u skijaskim skokovima
/
#include <stdio.h>
#include <stdlib.h>
#define NH 2.0
#define LH 1.8
#define BROJ_SUDIJA 5
#define BROJ_SERIJA 2
#define MINIMALNA_OCENA 3
#define MAKSIMALNA_OCENA 20
#define KRITICNA_TACKA 185
typedef struct{

229

char ime[15], prezime[15], zemlja [4];


int startna_pozicija,izvedena_serija;
float bodovi;
}Skakaci;
int K_tacka;
float koef;
void ucitavanje (Skakaci [],int);
void stampanje (Skakaci [],int);
void Ktacka(void);
float skok(Skakaci );
int plasman(Skakaci [],int,int);
void izvestaj(float,int);
main()
{
Skakaci takmicari;
int i,broj_takmicara,trenutna_pozicija,izvedeni_skokovi;
float broj_bodova;
Ktacka();
while(1)
{
printf("\nUkupan broj skakaca: ");
scanf("%i",&broj_takmicara);
if(broj_takmicara>0)
break;
printf("\nNepravilno unesen broj skakaca\n");
}
takmicari=malloc(broj_takmicarasizeof(Skakaci));
if(takmicari==NULL)
{
printf("\nNema dovoljno raspolozive memorije !\n");
exit(1);
}
ucitavanje(takmicari,broj_takmicara);
printf("\nSKACE SE PRVA SERIJA\n\n");
izvedeni_skokovi=0;
for(i=0;i<broj_takmicara;i++)
{
broj_bodova=skok(takmicari+i);
trenutna_pozicija=plasman(takmicari,i,broj_takmicara);
izvestaj(broj_bodova,trenutna_pozicija);
izvedeni_skokovi++;
if(izvedeni_skokovi%10==0)
230

{
printf("\nTrenutna rang lista prve serije\n");
stampanje(takmicari,i+1);
}
}
printf("\nPlasman posle prve serije\n");
stampanje(takmicari,broj_takmicara);
printf("\nSKACE SE DRUGA SERIJA\n\n");
izvedeni_skokovi=0;
for(i=broj_takmicara-1;i>=0;i--)
{
if((takmicari+i)->izvedena_serija!=BROJ_SERIJA)
{
broj_bodova=skok(takmicari+i);
trenutna_pozicija=plasman(takmicari,i,broj_takmicara);
izvestaj(broj_bodova,trenutna_pozicija);
i=broj_takmicara-1;
izvedeni_skokovi++;
if(izvedeni_skokovi%10==0)
{
printf("\nTrenutna rang lista prve serije\n");
stampanje(takmicari,izvedeni_skokovi);
}
}
}
printf("\nKonacan plasman posle druge serije\n");
stampanje(takmicari,broj_takmicara);
printf("\n\n");
free (takmicari);
return 0;
}
/
unosi se K-tacka i na osnovu nje odredjuje koeficijent
/
void Ktacka(void)
{
while(1)
{
printf("\nUnesite K-tacku skakaonice ");
scanf("%i",&K_tacka);
if(K_tacka<75 || K_tacka>185)
printf("\nNepravilno unesena K-tacka!\n");
else
break;
}

231

if(K_tacka<100)
koef=(float)NH;
else
koef=(float)LH;
}
/
unose se podaci o skakacima i odredjuje startna pozicija za prvi skok
/
void ucitavanje (Skakaci skakaci[],int broj_skakaca)
{
int i;
printf("\nUnosimo startnu listu:\n");
for(i=0;i<broj_skakaca;i++)
{
printf("\n");
printf("Ime: ");
scanf("%s",skakaci[i].ime);
printf("Prezime: ");
scanf("%s",skakaci[i].prezime);
printf("Zemlja: ");
scanf("%s",skakaci[i].zemlja);
skakaci[i].bodovi=0;
skakaci[i].izvedena_serija=0;
skakaci[i].startna_pozicija=i+1;
}
}
/
prikazuje se na ekranu trenutna rang lista posle n skokova
/
void stampanje (Skakaci skakaci[],int n)
{
int i;
printf("\nPlasman posle %i. takmicara\n\n",n);
for(i=0;i<n;i++)
{
printf("%2i. ",i+1);
printf("%-10s ",skakaci[i].ime);
printf("%-10s ",skakaci[i].prezime);
printf("(%s)\t\t",skakaci[i].zemlja);
if(skakaci[i].bodovi==0)
printf("-.-\n");
else
printf("%.2f\n",skakaci[i].bodovi);
}
}
/
ocenjivanje pojedinacnog skoka
/
float skok(Skakaci skakac)
{
int i,imax,imin;
232

float ocene[BROJ_SUDIJA],duzina_skoka,suma;
printf("\n%i. ",skakac->startna_pozicija);
printf("%s ",skakac->ime);
printf("%s ",skakac->prezime);
printf("(%s)\n",skakac->zemlja);
while(1)
{
printf("\nUnesite duzinu skoka: ");
scanf("%f",&duzina_skoka);
if(duzina_skoka>=0 && duzina_skoka<KRITICNA_TACKA)
break;
printf("\nNepravilno unesena duzina skoka\n");
}
/
diskvalifikovani takmicar ima duzinu skoka 0 i broj bodova je 0
/
if(duzina_skoka==0)
{
skakac->bodovi=0;
skakac->izvedena_serija=BROJ_SERIJA;
}
/
unose se ocene sudija
/
else
{
skakac->izvedena_serija++;
printf("\nOcene sudija:\n");
for(i=0;i<BROJ_SUDIJA;i++)
{
printf("%i. sudija: ",i+1);
scanf("%f",&ocene[i]);
if(ocene[i]<MINIMALNA_OCENA ||
ocene[i]>MAKSIMALNA_OCENA )
{
printf("\nNepravilno\n");
i=i-1;
}
}
imax=BROJ_SUDIJA-1;
imin=0;
for(i=0;i<BROJ_SUDIJA;i++)
{
if(ocene[i]<ocene[imin])
imin=i;
if(ocene[BROJ_SUDIJA-1-i]>ocene[imax])
imax=BROJ_SUDIJA-1-i;
}
/
odredjuje se ukupan broj poena
/
suma=0;
233

for(i=0;i<BROJ_SUDIJA;i++)
if (i!=imax && i!=imin)
suma=suma+ocene[i];
suma=suma+(duzina_skoka-K_tacka)koef;
/
ukoliko su poeni negativni takmicar je diskvalifikovan
/
if(suma<0)
{
skakac->bodovi=0;
skakac->izvedena_serija=BROJ_SERIJA;
}
else
skakac->bodovi=skakac->bodovi+suma;
}
return (skakac->bodovi);
}
/
odredjuje se trenutni plasman skakaca
/
int plasman(Skakaci skakaci[],int k,int broj_skakaca)
{
int i;
Skakaci temp;
if(k==broj_skakaca-1 || skakaci[k].bodovi>skakaci[k-1].bodovi)
{
for(i=k;i>0;i--)
if(skakaci[i].bodovi>skakaci[i-1].bodovi)
{
temp=skakaci[i];
skakaci[i]=skakaci[i-1];
skakaci[i-1]=temp;
}
else
break;
return i+1;
}
else
{
for(i=k;i<broj_skakaca-1;i++)
if(skakaci[i].bodovi<skakaci[i+1].bodovi)
{
temp=skakaci[i];
skakaci[i]=skakaci[i+1];
skakaci[i+1]=temp;
}
else
break;
return (i+1);
}
}

234

void izvestaj(float broj_bodova, int plasman)


{
printf("\nUkupan broj bodova je: %.2f\n",broj_bodova);
if(broj_bodova!=0)
printf("\nTrenutna pozicija: %i\n",plasman);
else
printf("\nTrenutna pozicija: bez plasmana\n");
}

235

8.

.
:
1. Kreiranje baze
2. Listanje Baze
3. Rezervacija sobe
4. Potvrda rezervacije
5. Otkazivanje rezervacije
0 Izlaz
0 .

.
1. .
.
apt .
(Enter).
2. .
: , ,
.
3. .
.
. ,
.
4.
.
5.
.
.

.

8.
/
Program za evidenciju rezervacija soba u hotelu u toku jedne sezone
/
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>
#define KRAJ 0
#define PORUKE_MENIJA 7
#define OD_GODINE 2000
#define DO_GODINE 2015
#define MAX_IME 30
#define DANI 366
#define DUZINA 5
#define MESECI 12

236

int dani_u_mesecu[31];
char dani_u_godini[DANI][MAX_IME];
char meseci_u_godini[]={ "januar","februar","mart","april","maj","juni","juli",
"avgust","septembar","oktobar","novembar","decembar"};
int broj_dana[]={31,28,31,30,31,30,31,31,30,31,30,31};
typedef struct {
char broj_sobe[DUZINA];
char tip_sobe[DUZINA];
char dani[DANI][MAX_IME];
} Hotel;
int prestupna(int);
void niz_datuma(int);
int meni(void);
int baza_hotela (char );
int slobodni_termini(Hotel);
int pregled_baze(char );
int rezervacija_sobe(char );
int provera_datuma(int,int);
int potvrda_rezervacije(char );
int otkazivanje(char );
int rezervisano(Hotel);
void pisanje_poruka(int);
main()
{
int i,izbor,status;
char ime_hotela[MAX_IME],godina[DUZINA];
char ime_datoteke;
for(i=0; i<31; i++)
dani_u_mesecu[i] = i+1;
printf("\nUnesite ime hotela: ");
gets(ime_hotela);
while(1)
{
printf("\nUnesite godinu (%i - %i): ",OD_GODINE,DO_GODINE);
gets(godina);
if (OD_GODINE<=atoi(godina) && atoi(godina)<=DO_GODINE)
break;
printf("\nGodina je van opsega \n");
}

237

ime_datoteke=malloc(strlen(ime_hotela)+strlen(godina)+2);
if(ime_datoteke==NULL)
{
pisanje_poruka(1);
exit(1);
}
strcpy(ime_datoteke,ime_hotela);
strcat(ime_datoteke,"_");
strcat(ime_datoteke,godina);
niz_datuma(atoi(godina));
do
{
printf("\n\n HOTEL %s - godina %s\n\n",ime_hotela,godina);
izbor=meni();
switch(izbor)
{
case KRAJ: break;
case 1:

status=baza_hotela(ime_datoteke);
pisanje_poruka(status);
break;

case 2:

status=pregled_baze(ime_datoteke);
if(status)
pisanje_poruka(status);
break;

case 3:

status=rezervacija_sobe(ime_datoteke);
if(status>=0)
pisanje_poruka(status);
break;

case 4:

status=potvrda_rezervacije(ime_datoteke);
if(status)
pisanje_poruka(status);
break;

case 5:

status=otkazivanje(ime_datoteke);
if(status)
pisanje_poruka(status);
break;

default:

printf("\nNepoznat izbor\n");
break;

}
}
while(izbor!=KRAJ);

238

printf("\n\nKRAJ PROGRAMA\n\n");
}
int meni(void)
{
int i,izbor;
char poruke[]={

"1. Kreiranje baze hotela",


"2. Listanje baze",
"3. Rezervacija sobe",
"4. Provera rezervacije",
"5. Otkazivanje rezervacije",
"0. Izlaz",
"Vas izbor: "
};

for(i=0;i<PORUKE_MENIJA-1;i++)
puts(poruke[i]);
printf("\n%s",poruke[PORUKE_MENIJA-1]);
scanf("%i",&izbor);
return izbor;
}
int prestupna(int god)
{
int prestup;
if(god%400==0) prestup=1;
else if(god%100==0)
prestup=0;
else if(god%4==0)
prestup=1;
else
prestup=0;
return prestup;
}
/
formira se niz datuma, redom, od 1. januara do 31. decembra
/
void niz_datuma(int god)
{
char temp;
int index=0,i,j;
temp=malloc(MAX_IME+1);
broj_dana[1]+=prestupna(god);
for(i=0;i<MESECI;i++)
for(j=0;j<broj_dana[i];j++)
{
itoa(dani_u_mesecu[j], temp, 10);
239

strcat(temp, ". ");


strcat(temp,meseci_u_godini[i]);
strcpy(dani_u_godini[index++],temp);
}
if(!prestupna(god)) strcpy(dani_u_godini[DANI-1],"--");
free(temp);
}
/
u bazi hotela za svaku sobu postoji broj, tip i niz datuma formiran
prethodnom funkcijom
/
int baza_hotela (char datoteka)
{
FILE fptr;
Hotel soba;
int i;
printf("\nIme datoteke je %s\n",datoteka);
fptr=fopen(datoteka,"wb");
if(fptr==NULL)
return 2;
fflush(stdin);
while(1)
{
printf("\nUnesite broj sobe (Enter za kraj): ");
gets(soba.broj_sobe);
if(strlen(soba.broj_sobe)==0)
break;
printf("\nUnesite tip sobe (1,2,3,4,apt): ");
gets(soba.tip_sobe);
for(i=0;i<DANI;i++)
strcpy(soba.dani[i],dani_u_godini[i]);
if(fwrite(&soba,sizeof(Hotel),1,fptr)!=1)
{
fclose(fptr);
return 3;
}
}
fclose(fptr);
return 0;
}
int pregled_baze(char datoteka)
{
FILE fptr;
Hotel soba;
240

fptr=fopen(datoteka,"rb");
if(fptr==NULL)
return 2;
fflush(stdin);
while(1)
{
if(fread(&soba,sizeof(Hotel),1,fptr)!=1 && !feof(fptr))
{
fclose(fptr);
return 4;
}
if(feof(fptr))
break;
printf("\nBroj sobe: %s",soba.broj_sobe);
printf("\nTip sobe (broj kreveta): %s\n",soba.tip_sobe);
slobodni_termini(soba);
if(rezervisano(soba)==0)
printf("\nNema rezervisanih termina\n");
getchar();
}
fclose(fptr);
return 0;
}
/
soba je rezervisana odredjenog dana ako se umesto datuma u nizu nalazi
ime osobe na koju glasi rezervacija
/
int slobodni_termini(Hotel soba)
{
int ima_termina,nadjen,pocetak,kraj,i;
ima_termina=nadjen=0;
printf("\nSoba je slobodna u sledecim terminima:\n");
for(i=0;i<DANI;i++)
{
if(isdigit(soba.dani[i][0]))
{
ima_termina++;
nadjen=1;
if(ima_termina==1)
kraj=pocetak=i;
else
kraj=i;
}
else if(ima_termina!=0)
{
printf("\n%s - %s\n",soba.dani[pocetak],soba.dani[kraj]);
ima_termina=0;

241

}
}
if(kraj==DANI-1)
printf("\n%s - %s\n",soba.dani[pocetak],soba.dani[kraj]);
if(!nadjen) printf("\nNema slobodnih termina\n");
return nadjen;
}
int rezervacija_sobe(char datoteka)
{
FILE fptr;
Hotel soba;
char osoba[MAX_IME],br_sobe[DUZINA];
int mesto_u_bazi,nadjena,index_pocetka,index_kraja,slobodno,i;
int dan_pocetka,dan_kraja,mesec_pocetka,mesec_kraja;
mesto_u_bazi=nadjena=0;
fptr=fopen(datoteka,"rb+");
if(fptr==NULL)
return 2;
printf("\nUnesite broj sobe ");
scanf("%s",br_sobe);
fflush(stdin);
/
proverava se da li u bazi postoji soba sa unetim brojem
/
while(1)
{
if(fread(&soba,sizeof(Hotel),1,fptr)!=1 && !feof(fptr))
{
fclose(fptr);
return 4;
};
if(feof(fptr))
break;
mesto_u_bazi++;
if(strcmp(soba.broj_sobe,br_sobe)==0)
{
nadjena=1;
break;
}
}
if(!nadjena)
{
printf("\nNe postoji soba sa tim brojem\n");
fclose(fptr);
return -1;
}

242

/
daje se izvestaj da li je i u kojim terminima je slobodna soba
/
if(!slobodni_termini(soba))
{
fclose(fptr);
return -1;
}
/
unosi se datum pocetka i kraja rezervacije i proverava se da li su
podaci pravilno uneti
/
printf("\nUnesite datum pocetka rezervacije (d-m) ");
scanf("%i-%i",&dan_pocetka,&mesec_pocetka);
index_pocetka=provera_datuma(dan_pocetka,mesec_pocetka);
if(index_pocetka==-1)
{
printf("\nPogresno unet datum\n");
fclose(fptr);
return -1;
}
printf("\nUnesite datum kraja rezervacije (d-m) ");
scanf("%i-%i",&dan_kraja,&mesec_kraja);
index_kraja=provera_datuma(dan_kraja,mesec_kraja);
if(index_kraja==-1)
{
printf("\nPogresno unet datum\n");
fclose(fptr);
return -1;
}
if(index_kraja<index_pocetka)
{
printf("\nPogresno uneti termini\n");
fclose(fptr);
return -1;
}
fflush(stdin);
slobodno=0;
for(i=index_pocetka;i<=index_kraja;i++)
if(!isdigit(soba.dani[i][0]))
{
slobodno=1;
break;
}
if(slobodno)
{
printf("\nSoba nije slobodna u tom terminu\n");
fclose(fptr);
return -1;
}

243

/
umesto datuma upisuje se ime osobe na koju ce glasiti rezervacija
/
printf("\nUnesite ime na koje ce biti rezervacija :");
gets(osoba);
for(i=index_pocetka;i<=index_kraja;i++)
strcpy(soba.dani[i],osoba);
if(fseek(fptr,(mesto_u_bazi-1)sizeof(Hotel),SEEK_SET))
{
fclose(fptr);
return 3;
}
if(fwrite(&soba,sizeof(Hotel),1,fptr)!=1)
{
fclose(fptr);
return 3;
}
fclose (fptr);
return 0;
}
int provera_datuma(int dan, int mesec)
{
char temp;
int i;
temp=malloc(MAX_IME);
if(mesec>0 && mesec<=MESECI && dan>0 && dan<=31)
{
/*brojevi od 1 do 31 pretvaraju se u niz znakova*/
itoa(dani_u_mesecu[dan-1], temp, 10);
strcat(temp, ". ");
strcat(temp,meseci_u_godini[mesec-1]);
for(i=0;i<DANI;i++)
if(strcmp(dani_u_godini[i],temp)==0)
{
free(temp);
return i;
}
}
free(temp);
return -1;
}
/
trazi u datoteci za koju sobu se umesto datuma nalazi navedeno ime
/
int potvrda_rezervacije(char datoteka)
{
char osoba[MAX_IME];
FILE fptr;
int nadjen_u_bazi,nadjen,i,index_pocetka,index_kraja;
Hotel soba;

244

fflush(stdin);
fptr=fopen(datoteka,"rb");
if(fptr==NULL)
return 2;
printf("\nUnesite ime osobe ");
gets(osoba);
nadjen_u_bazi=nadjen=0;
printf("\nNa ime %s je rezervisano:\n",osoba);
while(1)
{
if(fread(&soba,sizeof(Hotel),1,fptr)!=1 && !feof(fptr))
{
fclose(fptr);
return 4;
}
if(feof(fptr))
break;
for(i=0;i<DANI;i++)
{
if(strcmp(soba.dani[i],osoba)==0)
{
nadjen++;
nadjen_u_bazi=1;
if(nadjen==1)
index_pocetka=index_kraja=i;
else
index_kraja=i;
}
else
{
if(nadjen!=0)
{
printf("\nSoba %s : ",soba.broj_sobe);
printf("%s - ",dani_u_godini[index_pocetka]);
printf("%s\n",dani_u_godini[index_kraja]);
}
nadjen=0;
}
}
}
if(nadjen_u_bazi==0)
printf("\nNema rezervacije na to ime\n");
fclose(fptr);
return 0;
}

245

/
umesto imena ponovo se upisuje datum
/
int otkazivanje (char datoteka)
{
FILE fptr;
Hotel soba;
char osoba[MAX_IME];
int nadjen,mesto_u_bazi,i;
nadjen=mesto_u_bazi=0;
fflush(stdin);
fptr=fopen(datoteka,"rb+");
if(fptr==NULL)
return 2;
printf("\nNa koje ime se otkazuje rezervacija ");
gets(osoba);
while(1)
{
if(fread(&soba,sizeof(Hotel),1,fptr)!=1 && !feof(fptr))
{
fclose(fptr);
return 4;
}
if(feof(fptr)) break;
mesto_u_bazi++;
for(i=0;i<366;i++)
if(strcmp(soba.dani[i],osoba)==0)
{
nadjen++;
strcpy(soba.dani[i],dani_u_godini[i]);
}
if(fseek(fptr,(mesto_u_bazi-1)sizeof(Hotel),SEEK_SET))
{
fclose(fptr);
return 3;
}
if(fwrite(&soba,sizeof(Hotel),1,fptr)!=1)
{
fclose(fptr);
return 3;
}
if(fseek(fptr,mesto_u_bazisizeof(Hotel),SEEK_SET))
{
fclose(fptr);
return 3;
}
}
246

if(nadjen==0)
printf("\nNema rezervacije na ime %s\n",osoba);
else
printf("\nOtkazano %i rezervacija\n",nadjen);
fclose(fptr);
return 0;
}
int rezervisano (Hotel soba)
{
int nadjen=0,rezervisano=0,i;
printf("\nSoba je rezervisana u sledecim terminima:\n");
for(i=0;i<366;i++)
{
if(isalpha(soba.dani[i][0]))
{
nadjen++;
rezervisano=1;
if(nadjen==1)
printf("\n%s -",dani_u_godini[i]);
else if(strcmp(soba.dani[i],soba.dani[i-1])!=0)
{
printf(" %s na ime %s\n",dani_u_godini[i-1],soba.dani[i-1]);
nadjen=0;
i=i-1;
}
}
else if(nadjen!=0)
{
printf(" %s na ime %s\n",dani_u_godini[i-1],soba.dani[i-1]);
nadjen=0;
}
}
return rezervisano;
}
void pisanje_poruka(int broj_greske)
{
char poruke[]={
"Uspesno",
"Nema dovoljno memorije",
"Neuspeh prilikom otvaranja datoteke",
"Neuspeh prilikom upisivanja podataka u datoteku",
"Neuspeh prilikom citanja podataka"
puts(poruke[broj_greske]);
}

};

247

248

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

______________________________

______________________________

______________________________

249

250

_____________________________________________
1.
auto
break
case
char
const
continue
default
do

double
else
enum
extern
float
for
goto
if

int
long
register
return
short
signed
sizeof
static

struct
switch
typedef
union
unsigned
void
volatile
while

, ++ 32 ,
: class, private, protected, public, new delete.

2. ++

\n
\t
\v
\b
\r
\f
\a
\'
\''
\\

(NewLine NL)
(HorizontalTabulation HT)
(VerticalTabulation VT)
(BackSpace BS)
(CarriageReturn CR)
(FormFeed FF)
/ (Alarm/Bell BELL)

(BackSlash)

3. ++

Character
Short integer
Integer

char
short
int

()
1
2
2/4

Long integer

long

Unsigned character
Unsigned short integer
Unsigned integer
Unsigned long integer
Single-precision
Floating_point
Double-precision
Floating-point

unsigned char
unsigned short
unsigned
unsigned long

1
2
2/4
4

float

double

-128 do 127
-32768 do 32767(1)
(1)/(2)
-2,147,483,648
2,147,438,647(2)
0 do 255
0 do 65535 (3)
(3)/(4)
0 4,294,967,295 (4)
1.2E-38 3.4E38
(=7 )
2.2E-308 1.8E308
(=16 )

251

4.

%c
%d
%u
%o
%x (X)
%f
%e
%g


char
int ( )
unsigned int ( )
int/unsigned int ( )
int/unsigned int ( )
float, double ( )
float, double ( )
float, double ( )

5.

%c
%d
%u
%o
%x (X)
%i
%f
%e
%g
%lf
%le
%lg


char
int ( )
unsigned int ( )
int/unsigned int ( )
int/unsigned int ( )
int ( )
float ( )
float ( )
float ( )
double ( )
double ( )
double ( )

6.

15
14
13
12
11
10
9
8
7
6
5
4
3
2
1


2
1
2
2
2
2
2
2
2
2
2
2
3
2
2

[ ] ( ) . ->
! ~ ++ -- + - & () sizeof
/ %
+ << >>
< <= > >=
== !=
&
^
|
&&
||
?:
= += -= = /= %= &= ^= |= <<= >>=
,

++ o ,
: :: ( 16),
new delete ( 14)
>> << ( , 11).

252

7. stdio.h
scanf("format",a1,2\)

printf("format",izraz1,izraz2\)
getchar(void)
putchar()
gets(s)
puts(s)
fopen(ime, mod)

fclose(fptr)
fscanf(fptr, "format,a1, 2\)

fprintf(fptr, format, izraz\)


fgetc(fptr)

fputc(c, fptr)

fgets(s, max+1, fptr)

fputs(s, fptr)
fread(a, vel, n, fptr)
fwrite(a, vel, n, fptr)
ftell(fptr)
fseek(fptr, n, poz)

rewind(fptr)
fflush(fptr)
feof(fptr)


formatu
(1,2...)
, formatu,
(izraz1, izraz2...)

ASCII
ASCII

,
s
s
ime mod
FILE
NULL

fptr

fptr, formatu
(1,2...)
formatu,
izraz fptr

fptr ASCII

ASCII

fptr

fptr , max
s
s
fptr
n x vel
( fptr)
n x vel
( fptr),

fptr

fptr, poz n


fptr,

fptr
0,
fptr

253

8. ctype.h
ctype.h
int 0 (true), c
( c int ASCII ).
isalnum(c)

0, c ASCII
.

isalpha(c)

0, c ASCII
.

isdigit(c)

0 c ASCII
.

islower(c)

0 c ASCII
.

isupper(c)

0 c ASCII
.

tolower(c)

c ASCII ,
ASCII .

toupper(c)

c ASCII ,
ASCII .

9. math.h
math.h
x y double double.
cos( x)

cos x

fabs( x)

|x|

log( x)

loge x, x>0.

log10(x)

log10 x, x>0.

pow( x, y)

xy

sin( x)

sin x.

sqrt( x)

tan( x)

tg x.

254

10. stdlib.h
stdlib.h.
atof(s)

a double,
s.

atoi(s)

a int,
s.

atol(s)

a long,
s.

rand()

a - int,
0 RAND_MAX (32767).

exit(status)

status
: 1 ( ) 0 (
).

malloc(n)

n
.
( ) NULL .

realloc(a,n)
n .

( ) NULL .
free(a)

11. string.h
string.h, s, s1 s2
, c n int.
strcat(s1, s2)

s2
s1 s1.

strcmp(s1, s2)

s1 s2
int:
<0, s1 ASCII s2,
0, s1 ASCII s2,
>0, s1 ASCII s2.

strcpy(s1, s2)

s2 s1
( \0) s1.

strlen(s)

s ( \0).

255

12. fstream.h
f.open(ime, mod)
f.close()
f.get()

f.get(s, max+1)

f.get(s, max+1, c)

f.getline(s, max+1)

f.put(c)

f.read(a, n)

f.write(a, n)

f.tellg()

f.tellp()

f.seekg(n, poz)

f.seekp(n, poz)

f.flush()
f.eof()

256

ime mod
f

f

f ASCII


f, max
s

f, max

s

f, max
, s (
\n)

f
ASCII

n
f

n
f,


,
f

,
f

, f,
poz n

, f,
poz n

f
0,
f

13. ASCII

257

258


_____________________________________________

[1]

, ,
, 2006.

[2]

, ++ ,
, 2004.

[3]

,
e , 2004.

[4]

, , , 1996.

[5]

Brian W. Kernighan, Dennis M. Ritchie, The C Programming Language - ANSI


C, Prentice Hall Software Series, 1988.

[6]

Augie Hansen,
, , 1991.

[7]

Peter Aitken, Bradley Jones,Teach Yourself C in 21 Days,CD edition,1998.

[8]

Chris H. Pappas, William H. Murray, C/C++ ,


, 1996.

259

You might also like