fsr - uvod u c++

199
PROGRAMSKI JEZICI I PROGRAMSKI JEZICI I I dio: Uvod u jezik C++ I dio: Uvod u jezik C++ Sveučilište u MOSTARU STUDIJ RAČUNARSTVA

Upload: ismar-kunc

Post on 29-Jun-2015

401 views

Category:

Documents


9 download

DESCRIPTION

Sveučilište mostar - studij računarstva

TRANSCRIPT

Page 1: FSR - Uvod u c++

PROGRAMSKI JEZICI IPROGRAMSKI JEZICI II dio: Uvod u jezik C++I dio: Uvod u jezik C++

Sveučilište u MOSTARU

STUDIJ RAČUNARSTVA

Page 2: FSR - Uvod u c++

2

1.1.1.1. Uvod Uvod u C u C++++

Malo istorije...Malo istorije...

O programskom jeziku CO programskom jeziku C Nastao 70-ih godina prošlog vijekaNastao 70-ih godina prošlog vijeka

1970. Ken Thompson, “B”1970. Ken Thompson, “B”1972. Denis Ritchie, “C”1972. Denis Ritchie, “C”

ZahtjeviZahtjevi koje je trebao da zadovolji: koje je trebao da zadovolji:

Viši programski jezik sa implementiranim mogućnostima mašinskog jezikaViši programski jezik sa implementiranim mogućnostima mašinskog jezika

(direktan pristup memoriji, veći skup operatora, ...)(direktan pristup memoriji, veći skup operatora, ...)

prednosti: prednosti: udobnost višeg programskog jezika, moć mašinskog udobnost višeg programskog jezika, moć mašinskog jezikajezika

Programski jezik sa malim setom naredbi i bogatom bibliotekom funkcijaProgramski jezik sa malim setom naredbi i bogatom bibliotekom funkcija

prednosti: prednosti: jednostavnost programiranja i pojednostavljeni jednostavnost programiranja i pojednostavljeni prevodiociprevodioci

Standardizacija:Standardizacija: ANSI, 1988. ANSI, 1988.

Page 3: FSR - Uvod u c++

3

1.1.1.1. Uvod Uvod u C u C++++

Malo istorije...Malo istorije...

Istorijat jezika C++Istorijat jezika C++

Pojava objektno-orijentisanih (OO) koncepata u programiranju Pojava objektno-orijentisanih (OO) koncepata u programiranju zahtijevala je nove mogućnosti jezika “C”zahtijevala je nove mogućnosti jezika “C”

1980. “C sa klasama”1980. “C sa klasama” dodate su klase jeziku “C”dodate su klase jeziku “C” strukture omogućavaju da podaci imaju samo vrijednostistrukture omogućavaju da podaci imaju samo vrijednosti klase omogućavaju da se definišu i moguće operacije nad klase omogućavaju da se definišu i moguće operacije nad

podacimapodacima

1983. “C++”1983. “C++” ++ znači da se ne radi o novom jeziku nego o proširenom ++ znači da se ne radi o novom jeziku nego o proširenom

jeziku “C”jeziku “C” dodate virtuelne funkcije, omogućeno preklapanje operatoradodate virtuelne funkcije, omogućeno preklapanje operatora autor: autor: Bjarne StroustrupBjarne Stroustrup

Standardizacija:Standardizacija: ANSI, 1995. ANSI, 1995.

Page 4: FSR - Uvod u c++

4

1.1.1.1. Uvod Uvod u C u C++++

Razvoj C/C++ Razvoj C/C++ programa?programa?

Procedura za razvoj C/C++ programaProcedura za razvoj C/C++ programa

.C.C

EDITOR

IZVORNI KOD(SOURCE)

.OBJ.OBJ

OBJEKTNI KOD

KOMPAJLER

.EXE.EXE

IZVRŠNI KOD

LINKER.CPP.CPP

Page 5: FSR - Uvod u c++

5

1.1.1.1. Uvod Uvod u C u C++++

Kako programirati Kako programirati u jeziku C ?u jeziku C ?

Programiranje u programskom jeziku CProgramiranje u programskom jeziku C Program u programskom jeziku C čini određen broj funkcijaProgram u programskom jeziku C čini određen broj funkcija Jedna od funkcija obavezno se naziva Jedna od funkcija obavezno se naziva mainmain - glavna funkcija - glavna funkcija izvršavanje C programa = poziv i izvršavanje funkcije main()izvršavanje C programa = poziv i izvršavanje funkcije main()

Primjer:Primjer:

#include <stdio.h>#include <stdio.h>main()main(){{ printf(“Primjer programa”);printf(“Primjer programa”);}}

Page 6: FSR - Uvod u c++

6

Kako programirati Kako programirati u jeziku C?u jeziku C?

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

main()main()

{{ printf(“Primjer”);printf(“Primjer”);}}

Svaki program mora da ima main funkciju

main()

Zaglavlje funkcije

printf(“Primjer”);

tijelo funkcije (blok iskaza)

{

Početak bloka

}

Kraj bloka

;

Separator iskaza

#include <stdio.h>

Pretprocesorska direktiva

1.1.1.1. Uvod Uvod u C u C++++

Page 7: FSR - Uvod u c++

7

1.1.1.1. Uvod Uvod u C u C++++

PRETPROCESORSKPRETPROCESORSKA direktiva?A direktiva?

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

main()main()

{{printf(“Primjer”);printf(“Primjer”);

}}

#include <stdio.h> Pretprocesorska direktiva

Obrađuje se prije prevođenja programa

Obavezno počinje sa #

#include – najčešće korištena direktiva

Uključuje u program sadržaj datoteke koja se navodi kao parametar

#include <ime>ili

#include ”ime”

Standardne biblioteke

<stdio.h> funkcije za standardni I/O<math.h> matematičke funkcije ...

#define – često korištena direktiva

Definiše simboličke konstante i makroe

#define IME vrijednost

#define PI 3.14159#define EPS 0.0001

Page 8: FSR - Uvod u c++

8

1.1.1.1. Uvod Uvod u C u C++++

PRETPROCESORSKPRETPROCESORSKA direktiva?A direktiva?

Primjer:Primjer:

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

#define PI 3.14159#define PI 3.14159

#define EPS 1e-6#define EPS 1e-6

#define MAXINT 32767#define MAXINT 32767

#define K_OCT 071#define K_OCT 071

#define K_HEX 0x41#define K_HEX 0x41

main()main()

{{ printf( ”printf( ”%d%d””,, MAXINTMAXINT ); );

printf(printf( ” ”%8.5f%8.5f\n”\n”,, PI ); PI );

printf(printf( ” ”%%1010..88ff\n”\n”,, EPS ); EPS );

printf(printf( ” ”%%d %d”d %d”,,K_OCT, K_HEX );K_OCT, K_HEX );}}

#include <stdio.h>Pretprocesorska direktiva

uključuje standardne funkcije za ulaz/izlaz podataka#define PI 3.14159

Pretprocesorska direktiva definiše simboličku konstantu

PI#define EPS 1e-6Pretprocesorska direktiva

definiše simboličku konstantu EPS = 0.000001#define MAXINT 32767

Pretprocesorska direktiva definiše cjelobrojnu konstantu

MAXINT = 32767#define K_OCT 071definiše oktalnu konstantu

K_OCT = 071Oktalna konstanta započinje nulom

071 = 7*8 + 1*1 = 56 + 1 = 57 dec#define K_HEX 0x41

definiše heksadecimalnu konstantu K_HEX = 0x41

Heksadecimalna konstanta počinje sa 0x0x41 = 4*16 + 1*1 = 64 + 1 = 65 dec

printf( ”%d”, MAXINT );

printf( ”%8.5f\n”, PI );

printf( ”%10.8f\n”, EPS );

printf( ”%d %d”,K_OCT, K_HEX );

Glavni program (funkcija main)ispisuje vrijednosti definisanih konstanti

na ekran

Za ispis na ekran koristi se standardna funkcija printf()

Page 9: FSR - Uvod u c++

9

1.1.1.1. Uvod Uvod u C u C++++

PRETPROCESORSKPRETPROCESORSKA direktiva?A direktiva?

Primjer:Primjer:

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

#define PI 3.14159#define PI 3.14159

#define EPS 1e-6#define EPS 1e-6

#define MAXINT 32767#define MAXINT 32767

#define K_OCT 071#define K_OCT 071

#define K_HEX 0x41#define K_HEX 0x41

main()main()

{{ printf( ”printf( ”%d%d””,, MAXINTMAXINT ); );

printf(printf( ” ”%8.5f%8.5f\n”\n”,, PI ); PI );

printf(printf( ” ”%%1010..88ff\n”\n”,, EPS ); EPS );

printf(printf( ” ”%%d %d”d %d”,,K_OCT, K_HEX );K_OCT, K_HEX );}}

printf( ”%d”, MAXINT );

32767_

printf( ”%8.5f\n”, PI );

_3.14159

printf( ”printf( ”%d%d””,, MAXINTMAXINT ); );

0.00000100

printf( ”%10.8f\n”, EPS );

printf(printf( ” ”%8.5f%8.5f\n”\n”,, PI ); PI );

printf( ”%d %d”,K_OCT, K_HEX );

57_65_

printf(printf( ” ”%%1010..88ff\n”\n”,, EPS ); EPS );

printf(printf( ” ”%%d %d”d %d”,,K_OCT, K_HEX );K_OCT, K_HEX );

Page 10: FSR - Uvod u c++

10

1.1.1.1. Uvod Uvod u C u C++++

printf ???printf ???

Standardna funkcija za izlaz (ispis) na ekranStandardna funkcija za izlaz (ispis) na ekran

printfprintf( ”konverzioni string” , lista_argumenata )( ”konverzioni string” , lista_argumenata ) ”konverzioni string”

Kontrolni (konverzioni) niz određuje način na koji se vrši ispis

Štampa se sve što se nađe unutar ” ” sve dok se ne dođe do znaka %

Kad se dođe do znaka % gleda se sljedeći znak (grupa znakova) koji se naziva konverzioni karakter

Konverzioni karakter definiše kako će se ispisati odgovarajući podatak iz liste argumenata

Mora biti onoliko znakova % u cijelom stringu koliko ima i argumenata u listi

lista_argumenata

Određuje šta treba da se ispiše (koji podaci treba da se ispišu)

Argumenti se odvajaju zapetama

Argumenti mogu da budu promjenljive, konstante, izrazi

Page 11: FSR - Uvod u c++

11

1.1.1.1. Uvod Uvod u C u C++++

Konverzioni karakteri ?Konverzioni karakteri ?

Konverzioni karakteriKonverzioni karakteri

%c - %c - znakznak%s - %s - stringstring%d - %d - integer (cijeli broj)integer (cijeli broj)%sd – %sd – short integershort integer%ld – %ld – long integerlong integer

Opšti oblik:Opšti oblik:

% [širina] [.preciznost] tip

Ukupan broj mjesta za ispis podatkan – najmanje n znakova (vodeće bjeline)0n – najmanje n znakova (vodeće nule)

[širina]

Ukupan broj mjesta za ispis decimala.d – najviše d decimala

[.preciznost]

%f - %f - floatfloat%lf - %lf - doubledouble%o - %o - oktalni podatakoktalni podatak%x - %x - heksadecimalni podatakheksadecimalni podatak%% - %% - ispis znaka %ispis znaka %

Page 12: FSR - Uvod u c++

12

1.1.1.1. Uvod Uvod u C u C++++

Konverzioni karakteri ?Konverzioni karakteri ?

Primjer:Primjer:

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

main()main()

{{ int var=65;int var=65;

printf( ”printf( ”Znakovi:Znakovi:\n”);\n”);

printf( ”printf( ”%%2c\n”2c\n”,, ’A’); ’A’);

printf(printf( ” ”%%4c\n%6c\n”4c\n%6c\n”,, var, ’B’); var, ’B’);

printf(printf( ” ”%%8c\n”8c\n”,, var+1); var+1);

printf(printf( ” ”%%3d\n”3d\n”,, ’A’); ’A’);

printf(printf( ” ”%%03d”03d”,, ’A’); ’A’);

}}

MEMORIJA

0100 0001

int var=65;

Znakovi:

int var=65;

printf( ”Znakovi:\n”);printf( ”Znakovi:\n”);

printf( ”%2c\n”, ’A’);

.A

printf( ”%2c\n”, ’A’);

printf( ”%4c\n%6c\n”, var, ’B’);

...A

.....B

printf( ”%4c\n%6c\n”, var, ’B’);

printf( ”%8c\n”, var+1);

.......B

printf( ”%8c\n”, var+1);

printf( ”%3d\n”, ’A’);

.65

printf( ”%3d\n”, ’A’);

printf( ”%03d”, ’A’);

065

printf( ”%03d”, ’A’);

Page 13: FSR - Uvod u c++

13

1.1.1.1. Uvod Uvod u C u C++++

Specijalne znakovne Specijalne znakovne konstantekonstante??

Specijalne znakovne konstanteSpecijalne znakovne konstante

\n\n - - novi rednovi red

\b\b - - jedno mjesto unazadjedno mjesto unazad

\a\a - - zzvučni signal (beeper)vučni signal (beeper)

\\r r – – vraćanje na početak redavraćanje na početak reda

\\t t – – tabulator udesnotabulator udesno

\’\’ – – ispisuje znak ’ispisuje znak ’

\”\” – – ispisuje znak ”ispisuje znak ”

\\\\ – – ispisuje znak \ispisuje znak \

\ddd \ddd – – ispisuje znak sa kodom ddd oktalnoispisuje znak sa kodom ddd oktalno

\xdd \xdd – – ispisuje znak sa kodom dd heksadecimalnoispisuje znak sa kodom dd heksadecimalno

Page 14: FSR - Uvod u c++

14

1.1.1.1. Uvod Uvod u C u C++++

cout ???cout ???

Standardni izlaz u jeziku C++Standardni izlaz u jeziku C++ I u C++ jeziku može da se koristi I u C++ jeziku može da se koristi printf()printf() funkcija iz funkcija iz <stdio.h><stdio.h>

C++ ima biblioteku C++ ima biblioteku <iostream.h><iostream.h> za rad sa U/I tokovima za rad sa U/I tokovimatok = stream = dugački niz bajtovatok = stream = dugački niz bajtova

standardni tok za izlaz podataka standardni tok za izlaz podataka

coutcout - upućivač na konzolu - upućivač na konzolu u istom programu u istom programu NE TREBANE TREBA istovremeno koristiti istovremeno koristiti printf()printf() i i coutcout

cout << izraz1 << izraz2 << ... << izrazN;cout << izraz1 << izraz2 << ... << izrazN;

Page 15: FSR - Uvod u c++

15

1.1.1.1. Uvod Uvod u C u C++++

cout ???cout ???

Primjer:Primjer:

#include <iostream.h>#include <iostream.h>

main()main()

{{ cout << ”Prog. jezik C++”;cout << ”Prog. jezik C++”;}}

Prog. jezik C++

cout << ”Prog.” << ” jezik” << ” C++”;cout << ”Prog.” << ” jezik” << ” C++”;

cout << ”Prog. ” ;cout << ”Prog. ” ;

cout << ”jezik ” ;cout << ”jezik ” ;

cout << ”C++” ;cout << ”C++” ;

Page 16: FSR - Uvod u c++

16

1.1.1.1. Uvod Uvod u C u C++++

cout ???cout ???

Primjer:Primjer:

#include <iostream.h>#include <iostream.h>

main()main()

{{ cout << ”Jezik C++cout << ”Jezik C++\n\n”;”;}}

Jezik C++_

cout << ”cout << ”JJezik” << ” C++”ezik” << ” C++” << ”\n” << ”\n”;;

cout << ”cout << ”JJezik ezik C++C++” ” << endl << endl ;;

manipulator za kraj linije (reda)

Page 17: FSR - Uvod u c++

17

1.1.1.1. Uvod Uvod u C u C++++

TIPOVI TIPOVI ??????

Prosti tipovi podatakaProsti tipovi podataka

ZnakovniZnakovni char char (1 bajt)(1 bajt)

CjelobrojniCjelobrojni short short (1 bajt)(1 bajt) int int (2 bajta)(2 bajta) long long (4 bajta)(4 bajta)

RealniRealni float float (4 bajta)(4 bajta) double double (8 bajtova)(8 bajtova)

Kvalifikatori za cjelobrojne podatkeKvalifikatori za cjelobrojne podatke signed signed - o- označeniznačeni ako se ne navede podrazumijeva se signed short (-128..+127) signed int (-32767..+32768)

ununsigned signed - - neneooznačeniznačeni unsigned short (0..255) unsigned int (0..65535)

BROJ BAJTOVA ZA BROJ BAJTOVA ZA CJELOBROJNE PODATKE CJELOBROJNE PODATKE

ZAVISI OD OPERATIVNOG ZAVISI OD OPERATIVNOG SISTEMASISTEMA

Page 18: FSR - Uvod u c++

18

1.1.1.1. Uvod Uvod u C u C++++

LOGIČKI PODACI ???LOGIČKI PODACI ???

Logički podaci u jeziku CLogički podaci u jeziku CC ne raspolaže logičkim tipom podatakaC ne raspolaže logičkim tipom podataka

Nisu implementirane ni logičke konstante Nisu implementirane ni logičke konstante TRUE (istina) i FALSE (laž)TRUE (istina) i FALSE (laž)

Bilo koji podatak može da se posmatra kao logičkiBilo koji podatak može da se posmatra kao logički ISTINA ...ISTINA ... podatak <> 0podatak <> 0

LAŽ ... podatak = 0LAŽ ... podatak = 0Uobičajeno je da se koriste cjelobrojni podaciUobičajeno je da se koriste cjelobrojni podaciRezultati logičkih operacijaRezultati logičkih operacija

rezultat=1 ->rezultat=1 -> ISTINA (tačno)ISTINA (tačno) rezultat=0 ->rezultat=0 -> LAŽ (netačno)LAŽ (netačno)

Page 19: FSR - Uvod u c++

19

1.1.1.1. Uvod Uvod u C u C++++

LOGIČKI PODACI ???LOGIČKI PODACI ???

Logički podaci u jeziku C++Logički podaci u jeziku C++C++ ima ugrađen tip C++ ima ugrađen tip boolbool

Implementirane su i logičke konstante Implementirane su i logičke konstante TRUETRUE (istina) (istina) ( 1 )( 1 )FALSEFALSE (laž) (laž) ( 0 )( 0 )

Naravno, i dalje bilo koji podatak može da se posmatra kao logičkiNaravno, i dalje bilo koji podatak može da se posmatra kao logički ISTINA ...ISTINA ... podatak <> 0podatak <> 0

LAŽ ... podatak = 0LAŽ ... podatak = 0

Primjer:Primjer:

#include <iostream.h>#include <iostream.h>main()main(){{ bool t = TRUE, n = FALSE;bool t = TRUE, n = FALSE; cout << t << endl << n;cout << t << endl << n;}}

10

Page 20: FSR - Uvod u c++

20

1.1.1.1. Uvod Uvod u C u C++++

PROMJENLJIVE ???PROMJENLJIVE ???

Promjenljive (varijable)Promjenljive (varijable)Promjenljiva je simboličko ime za neku memorijsku lokacijuPromjenljiva je simboličko ime za neku memorijsku lokaciju

Svaka promjenljiva mora da ima neko jedinstveno imeSvaka promjenljiva mora da ima neko jedinstveno imeime se formira od slova, cifara i znaka _ime se formira od slova, cifara i znaka _prvi znak ne može biti cifraprvi znak ne može biti ciframaksimalno 31 znakmaksimalno 31 znakrazlikuju se velika i mala slovarazlikuju se velika i mala slova

MEMORIJAMEMORIJA

broj

BROJ

podatak_1

Broj-1

123A

Page 21: FSR - Uvod u c++

21

1.1.1.1. Uvod Uvod u C u C++++

PROMJENLJIVE ???PROMJENLJIVE ???

Promjenljiva mora biti tačno određenog tipaPromjenljiva mora biti tačno određenog tipa

Tip promjenljive ne može se mijenjati tokom izvršavanja programaTip promjenljive ne može se mijenjati tokom izvršavanja programapromjenljiva može biti nekog promjenljiva može biti nekog prostogprostog ili ili složenogsloženog tipa tipa

Može da se mijenja samo vrijednost (sadržaj memorijske lokacije)Može da se mijenja samo vrijednost (sadržaj memorijske lokacije)zato se i zove promjenljiva (varijabla)zato se i zove promjenljiva (varijabla)

MEMORIJA

int

charA

x

ZGa ABC

2.35

13

13

6-657

ABC

2.35

D

Page 22: FSR - Uvod u c++

22

1.1.1.1. Uvod Uvod u C u C++++

PROMJENLJIVE ???PROMJENLJIVE ???

Svaka promjenljiva mora biti definisana!!!Svaka promjenljiva mora biti definisana!!!

Prevodiocu (kompajleru) mora se ukazati na to da će se u Prevodiocu (kompajleru) mora se ukazati na to da će se u programu koristiti neka promjenljiva, kako bi on mogao da programu koristiti neka promjenljiva, kako bi on mogao da rezerviše potreban prostor u memorijirezerviše potreban prostor u memoriji

Opšti oblik definicije promjenljive:Opšti oblik definicije promjenljive:

tip imepromjenljive [=vrijednost]

Početna vrijednost

početna vrijednost ne mora se dodjeljivati

[ ] se koriste da bi se naglasilo da nije obavezno

[=vrijednost]

Npr.Npr.

int i,j,n=10;int i,j,n=10;

float a, e=2.71;float a, e=2.71;

char znak=’+’,c;char znak=’+’,c;

Page 23: FSR - Uvod u c++

23

1.1.1.1. Uvod Uvod u C u C++++

PROMJENLJIVE ???PROMJENLJIVE ???

Primjer:Primjer:

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

main()main()

{{ int i=9,j;int i=9,j;

float a,b;float a,b;

j=i/2;j=i/2;

a=i/2.0;a=i/2.0;

b=a*2.0/j;b=a*2.0/j;

printf( ”printf( ”i=%di=%d\n”\n”, i , i ););

printf( ”printf( ”j=%dj=%d\n”\n”, j , j ););

printf(printf( ” ”a=%6.2fa=%6.2f\n”\n”, a , a ); );

printf( printf( ””b=%6.2fb=%6.2f\n”\n”, b , b ););

}}

MEMORIJA

jj

aa

bb

ii

int i=9,j;int i=9,j;int i=9,j;

float a,b;float a,b;float a,b;

j=i/2;

0000 10010000 1001

0000 00000000 00009

0000 01000000 0100

0000 00000000 00004

1001 00001001 0000

0100 00000100 0000

0000 00000000 0000

0000 00000000 00004.5

j=i/2;

a=i/2.0;a=i/2.0;a=i/2.0;

b=a*2.0/j;

0001 00000001 0000

0100 00000100 0000

0000 00000000 0000

0000 00000000 00002.25

Page 24: FSR - Uvod u c++

24

1.1.1.1. Uvod Uvod u C u C++++

PROMJENLJIVE ???PROMJENLJIVE ???

Primjer:Primjer:

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

main()main()

{{ int i=9,j;int i=9,j;

float a,b;float a,b;

j=i/2;j=i/2;

a=i/2.0;a=i/2.0;

b=a*2.0/j;b=a*2.0/j;

printf( ”printf( ”i=%di=%d\n”\n”, i , i ););

printf( ”printf( ”j=%dj=%d\n”\n”, j , j ););

printf(printf( ” ”a=%6.2fa=%6.2f\n”\n”, a , a ); );

printf( printf( ””b=%6.2fb=%6.2f\n”\n”, b , b ););

}}

MEMORIJA

j

a

b

i0000 10010000 0000

9

0000 01000000 0000

4

1001 00000100 0000

0000 00000000 0000

4.5

0001 00000100 0000

0000 00000000 0000

2.25

b=a*2.0/j;b=a*2.0/j;

printf( ”i=%d\n”, i );

i=9

printf( ”printf( ”i=%di=%d\n”\n”, i , i ););

printf( ”j=%d\n”, j );

j=4

printf( ”printf( ”j=%dj=%d\n”\n”, j , j ););

printf( ”a=%6.2f\n”, a );

a= 4.50

printf(printf( ” ”a=%6.2fa=%6.2f\n”\n”, a , a ););

printf( ”b=%6.2f\n”, b );

b= 2.25

Page 25: FSR - Uvod u c++

25

1.1.1.1. Uvod Uvod u C u C++++

PROMJENLJIVE ???PROMJENLJIVE ???

Promjenljive u jeziku C++Promjenljive u jeziku C++Promjenljiva ne mora da bude definisana na početku bloka (programa)Promjenljiva ne mora da bude definisana na početku bloka (programa)

Može biti definisana bilo gdje u programu (tamo gdje treba)Može biti definisana bilo gdje u programu (tamo gdje treba)

Doseg (domen važenja) promjenljive je do kraja bloka u kojem je definisanaDoseg (domen važenja) promjenljive je do kraja bloka u kojem je definisana

U istom bloku ne može se više puta definisati ista promjenljivaU istom bloku ne može se više puta definisati ista promjenljiva

Primjer:Primjer:

#include <iostream.h>#include <iostream.h>main()main(){{ int i=9;int i=9; cout << cout << ”Prije bloka : ” << ”Prije bloka : ” << i << endl;i << endl; { { int i=5;int i=5; cout << ”U bloku : ” << i << endl;cout << ”U bloku : ” << i << endl; }} int j=10;int j=10; cout << ”i=” << i << ” j=” << j << endlcout << ”i=” << i << ” j=” << j << endl;;}}

Prije bloka : 9U bloku : 5i=9 j=10

Page 26: FSR - Uvod u c++

26

1.1.1.1. Uvod Uvod u C u C++++

PROMJENLJIVE ???PROMJENLJIVE ???

Promjenljive u jeziku C++Promjenljive u jeziku C++

Primjer:Primjer:

#include <iostream.h>#include <iostream.h>

main()main()

{{

for ( int k=0; k<n ; k++)for ( int k=0; k<n ; k++)

{ ... }{ ... }

for ( int k=n; k>0 ; k--)for ( int k=n; k>0 ; k--)

{ ... }{ ... }

}}

Dozvoljena definicija promjenljive u C++

U jeziku C nije dozvoljeno, jer definicija promjenljive mora biti na početku bloka

GREŠKA !!!

Ne može se ponoviti definicija promjenljive k u istom bloku!!!

Page 27: FSR - Uvod u c++

27

1.1.1.1. Uvod Uvod u C u C++++

KONSTANTE ???KONSTANTE ???

Konstante u jeziku CKonstante u jeziku CDefinisanje konstante moguće je preko pretprocesorske direktiveDefinisanje konstante moguće je preko pretprocesorske direktive

#define ime vrijednost#define ime vrijednost

Konstante u jeziku C++Konstante u jeziku C++Uvedena je ključna riječ Uvedena je ključna riječ constconst za definisanje konstanti za definisanje konstantiGubi se potreba za direktivom #define za definisanje konstantiGubi se potreba za direktivom #define za definisanje konstantiOpšti oblikOpšti oblik

const tip ime = vrijednost ;const tip ime = vrijednost ;Npr.Npr.

const int DIM = 100;const int DIM = 100; const char ODG = ’D’;const char ODG = ’D’; const bool TACNO = 1;const bool TACNO = 1;

Definisanoj Definisanoj konstantikonstanti nije mogu nije moguće promijeniti vrijednost !!!će promijeniti vrijednost !!!(konstanta = READ ONLY promjenljiva)(konstanta = READ ONLY promjenljiva)

Page 28: FSR - Uvod u c++

28

1.1.1.1. Uvod Uvod u C u C++++

OPERATORI ???OPERATORI ???

Aritmetički operatoriAritmetički operatoridodjela vrijednosti dodjela vrijednosti (=)(=)

a=3; c=2; a=3; c=2;

sabiranje sabiranje (+)(+)a=3; c=a+2; a=3; c=a+2; c c 5 5

oduzimanje oduzimanje (-)(-)b=3; c=b-2; b=3; c=b-2; c c 1 1

množenje množenje (*)(*)a=2; b=3; c=a*b; a=2; b=3; c=a*b; c c 6 6

dijeljenje dijeljenje (/)(/)i=9; k=4; n=i/k; i=9; k=4; n=i/k; c c 2 2

p=9.0; q=4.0; r=p/q; p=9.0; q=4.0; r=p/q; c c 2.25 2.25

ostatak cjelobrojnog dijeljenja ostatak cjelobrojnog dijeljenja (%)(%)c=9%4; c=9%4; c c 1 1

p=6%8; p=6%8; p p 6 6

Page 29: FSR - Uvod u c++

29

1.1.1.1. Uvod Uvod u C u C++++

OPERATORI ???OPERATORI ???

Primjer:Primjer:

#include <iostream.h>#include <iostream.h>

main()main()

{{

int a,b,c;int a,b,c;

a=b=c=10;a=b=c=10;

printf(printf( ” ”%d %d %d%d %d %d\n”\n”,, a,b,ca,b,c ); );

a = (b=10) + (c=20);a = (b=10) + (c=20);

printf(printf( ” ”%d %d %d%d %d %d\n”\n”,, a,b,ca,b,c ); );}}

MEMORIJA

aa0000 10100000 1010

0000 00000000 0000

bb0000 10100000 1010

0000 00000000 0000

cc0000 10100000 1010

0000 00000000 0000

10 10 10

0001 01000001 0100

0000 00000000 0000

0001 11100001 1110

0000 00000000 0000

30 10 20

Page 30: FSR - Uvod u c++

30

1.1.1.1. Uvod Uvod u C u C++++

OPERATORI ???OPERATORI ???

Aritmetički operatori Aritmetički operatori (nastavak)(nastavak)

Operator uvećavanja za jedan (inkrement) Operator uvećavanja za jedan (inkrement) (++)(++)

Operator umanjivanja za jedan (dekrement) Operator umanjivanja za jedan (dekrement) (--)(--)

prefiksni oblik prefiksni oblik postfiksni oblikpostfiksni oblik

++prom++prom prom++ prom++

--prom--prom prom-- prom--

Npr. Npr.

i=i+1 i=i+1 ++i ++i i++ i++

i=i-1 i=i-1 --i --i i-- i--

Npr. Npr. i = 2;i = 2; j = (++i)+5;j = (++i)+5; -------------------- i i i+1 = 2+1 = 3 i+1 = 2+1 = 3 j j i+5 = 3+5 = 8 i+5 = 3+5 = 8

Npr. Npr. i = 2;i = 2; j = (i++)+5;j = (i++)+5; -------------------- j j i+5 = 2+5 = 7 i+5 = 2+5 = 7 i i i+1 = 2+1 = 3 i+1 = 2+1 = 3

Page 31: FSR - Uvod u c++

31

1.1.1.1. Uvod Uvod u C u C++++

OPERATORI ???OPERATORI ???

Aritmetički operatori Aritmetički operatori (nastavak)(nastavak)

Složeni operatori dodjeljivanjaSloženi operatori dodjeljivanja

x=x+y x=x+y x+=yx+=y Npr. x+=3 Npr. x+=3 x=x+3 x=x+3

x=x-y x=x-y x-=yx-=y Npr. x-=3 Npr. x-=3 x=x-3 x=x-3

x=x*y x=x*y x*=yx*=y Npr. x*=3 Npr. x*=3 x=x*3 x=x*3

x=x/y x=x/y x/=yx/=y Npr. x/=3 Npr. x/=3 x=x/3 x=x/3

x=x%y x=x%y x%=yx%=y Npr. x%=3 Npr. x%=3 x=x%3 x=x%3

Page 32: FSR - Uvod u c++

32

1.1.1.1. Uvod Uvod u C u C++++

OPERATORI ???OPERATORI ???

Relacioni operatoriRelacioni operatori > > veće veće

< < manjemanje

>= >= veće ili jednakoveće ili jednako

<= <= manje ili jednakomanje ili jednako

== == jednakojednako

!= != različitorazličito

Npr. Npr.

i = 3<5i = 3<5

i = 3>5i = 3>5

i = 3==5i = 3==5

i = 3!=5 i = 3!=5

i = 3=5i = 3=5

i i 1 (istina) 1 (istina)

i i 0 (laž) 0 (laž)

i i 0 (laž) 0 (laž)

i i 1 (istina) 1 (istina)

greškagreška

Page 33: FSR - Uvod u c++

33

1.1.1.1. Uvod Uvod u C u C++++

OPERATORI ???OPERATORI ???

Logički operatoriLogički operatori && - && - AND = logičko I AND = logičko I

|||| - - OROR = logičko I = logičko ILILI

!! -- NOT = logi NOT = logiččko NE ko NE

Npr. Npr. i = 5 && 1i = 5 && 1 i = 1 && 1i = 1 && 1 j = 0 && 1j = 0 && 1 k = !0k = !0 k = !9k = !9 k = !(k+1)k = !(k+1) m = !(!(0))m = !(!(0)) m = !(!(5)) m = !(!(5)) x = 0 && (i=50)x = 0 && (i=50) y = 1 y = 1 |||| (j=128) (j=128)

i i 1 (istina) 1 (istina) i i 1 (istina) 1 (istina) j j 0 (laž) 0 (laž) k k 1 (istina) 1 (istina) k k 0 (laž) 0 (laž) k k 0 (laž) 0 (laž) m m 0 (laž) 0 (laž) m m 1 (istina) 1 (istina) x x 0 (laž) 0 (laž) y y 1 (istina) 1 (istina)

Page 34: FSR - Uvod u c++

34

1.1.1.1. Uvod Uvod u C u C++++

OPERATORI ???OPERATORI ???

Bitski operatori (operacije nad bitima)Bitski operatori (operacije nad bitima) & & -- bitsko AND bitsko AND

|| -- bitsko bitsko OROR

~~ - - bitsko bitsko NOTNOT (prvi komplement) (prvi komplement)

^̂ - - bitsko bitsko XORXOR ( (ekskluzivno ILIekskluzivno ILI))

<<<< - pomjeranje ( - pomjeranje (šiftvanje)šiftvanje) ulijevoulijevo

>>>> - pomjeranje ( - pomjeranje (šiftvanje)šiftvanje) udesnoudesno

Složeni bit operatoriSloženi bit operatori

x=x&y x=x&y x&=yx&=y Npr. x&=Npr. x&=33 x=x& x=x&33

x=xx=x||y y xx||=y=y Npr. xNpr. x||==55 x=x x=x|5|5

x=xx=x<<<<y y xx<<<<=y=y Npr. Npr. x<<x<<==11 x=x x=x<<1<<1

x=xx=x>>>>y y xx>>>>=y=y Npr. Npr. x>>x>>=3 =3 x=x x=x>>>>33

Page 35: FSR - Uvod u c++

35

1.1.1.1. Uvod Uvod u C u C++++

BITSKI operatoriBITSKI operatori ??? ???

& - bitsko AND& - bitsko AND

Primjer:Primjer:

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

main()main()

{{

char c=’9’;char c=’9’;

short cifra;short cifra;

cifra = c & 0x0F;cifra = c & 0x0F;

printf(printf( ” ”%d%d\n”\n”,, ccifra );ifra );}}

MEMORIJA

cc00001111 10 100101

cifracifra

cc00001111 10 100101

00000000 1 1001001

0x0F0x0F00000000 1 1111111&&

00000000 1 1001001

9

Page 36: FSR - Uvod u c++

36

1.1.1.1. Uvod Uvod u C u C++++

BITSKI operatoriBITSKI operatori ??? ???

|| - bitsko - bitsko OROR

Primjer:Primjer:

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

main()main()

{{

short cifra=9; short cifra=9;

char c;char c;

c = cifra | 0x30;c = cifra | 0x30;

printf(printf( ” ”%%c\n”c\n”,, cc ); );}}

MEMORIJA

cifracifra00000000 10 100101

cc

cifracifra00000000 10 100101

00001111 1 1001001

0x300x3000001111 00000000||

00001111 1 1001001

9

Page 37: FSR - Uvod u c++

37

1.1.1.1. Uvod Uvod u C u C++++

BITSKI operatoriBITSKI operatori ??? ???

~~ - bitsko - bitsko NOTNOT

Primjer:Primjer:

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

main()main()

{{

short x=1,y; short x=1,y;

y = ~x;y = ~x;

printf(printf( ” ”%%d\n”d\n”,, y ); y );}}

MEMORIJA

xx00000000 00000101

yy

xx00000000 00000101

11111111 11101110~~

11111111 11101110

-2

Page 38: FSR - Uvod u c++

38

1.1.1.1. Uvod Uvod u C u C++++

BITSKI operatoriBITSKI operatori ??? ???

^̂ - - XOR (EX ILI)XOR (EX ILI)

Primjer:Primjer:

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

main()main()

{{

short x=0x73,y; short x=0x73,y;

y = x^0x32;y = x^0x32;

printf(printf( ” ”%%c\n”c\n”,, y ); y );}}

MEMORIJA

xx00111111 00110011

yy

xx00111111 00110011

00100100 00010001

0x320x3200001111 00100010^̂

00100100 00010001

A

Page 39: FSR - Uvod u c++

39

1.1.1.1. Uvod Uvod u C u C++++

BITSKI operatoriBITSKI operatori ??? ???

<<<< - - shift lijevoshift lijevo

Primjer:Primjer:

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

main()main()

{{

short x=3,y; short x=3,y;

y = x<<1;y = x<<1;

printf(printf( ” ”%%d\n”d\n”,, y ); y );}}

MEMORIJA

xx00000000 00001111

yy

xx00000000 00001111

00000 000 00111100

<<<<11

00000000 01100110

6

Page 40: FSR - Uvod u c++

40

1.1.1.1. Uvod Uvod u C u C++++

BITSKI operatoriBITSKI operatori ??? ???

<<<< - - shift lijevoshift lijevo

Primjer:Primjer:

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

main()main()

{{

short x=3,y; short x=3,y;

y = x<<4;y = x<<4;

printf(printf( ” ”%%d\n”d\n”,, y ); y );}}

MEMORIJA

xx00000000 00001111

yy

xx00000000 00001111

00011 011 00000000

<<<<44

0011 00000011 0000

48

Page 41: FSR - Uvod u c++

41

1.1.1.1. Uvod Uvod u C u C++++

BITSKI operatoriBITSKI operatori ??? ???

>>>> - - shift desnoshift desno

Primjer:Primjer:

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

main()main()

{{

short x=12,y; short x=12,y;

y = x>>1;y = x>>1;

printf(printf( ” ”%%d\n”d\n”,, y ); y );}}

MEMORIJA

xx00000000 11001100

yy

xx00000000 11001100

00000 000 00111100

>>>>11

00000000 01100110

6

Page 42: FSR - Uvod u c++

42

1.1.1.1. Uvod Uvod u C u C++++

BITSKI operatoriBITSKI operatori ??? ???

>>>> - - shift desnoshift desno

Primjer:Primjer:

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

main()main()

{{

short x=-short x=-44,y; ,y;

y = x>>y = x>>22;;

printf(printf( ” ”%%d\n”d\n”,, y ); y );}}

MEMORIJA

xx11111111 11110000

yy

xx11111111 11110000

111111 111111 1111

>>>>22

11111111 11111111

-1

Page 43: FSR - Uvod u c++

43

1.1.1.1. Uvod Uvod u C u C++++

PRIORITET PRIORITET OPERATORA ?OPERATORA ?

Prioritet i asocijativnost operatoraPrioritet i asocijativnost operatoraPrioritetPrioritet OperatoriOperatori AsocijativnostAsocijativnost

najvišinajviši

najnižinajniži

(( ) ) { } -> .{ } -> . ! ~ ++ -- + - * & (tip)! ~ ++ -- + - * & (tip)

(( ) ) { } -> .{ } -> .

* / %* / % ! ~ ++ -- + - * & (tip)! ~ ++ -- + - * & (tip)

+ -+ - * / %* / %

<< >><< >> + -+ -

< <= > >=< <= > >= << >><< >>

== != & ^ | && ||== != & ^ | && || < <= > >=< <= > >=

?:?: == != & ^ | && ||== != & ^ | && ||

= += -= *= /= %= &= ^= |== += -= *= /= %= &= ^= |= ?:?:

,, = += -= *= /= %= &= ^= |== += -= *= /= %= &= ^= |= ,,

Page 44: FSR - Uvod u c++

44

1.1.1.1. Uvod Uvod u C u C++++

ASOCIJATIVNOSTASOCIJATIVNOST OPERATORA ?OPERATORA ?

Prioritet i asocijativnost operatoraPrioritet i asocijativnost operatora (nastavak)(nastavak)

Asocijativnost operatora slijeva udesno Asocijativnost operatora slijeva udesno (())

tzv. lijeva asocijativnost operatoratzv. lijeva asocijativnost operatora

X X opop Y Y opop Z Z (X (X opop Y) Y) opop Z Z

Asocijativnost operatora zdesna ulijevo Asocijativnost operatora zdesna ulijevo (())

tzv. desna asocijativnost operatoratzv. desna asocijativnost operatora

X X opop Y Y opop Z Z X X opop (Y (Y opop Z) Z)

Page 45: FSR - Uvod u c++

45

1.1.1.1. Uvod Uvod u C u C++++

USLOVNI USLOVNI OPERATOR ?OPERATOR ?

Uslovni operator (?:)Uslovni operator (?:)

Opšti oblik:Opšti oblik:

uslov ? izraz1 : izraz2uslov ? izraz1 : izraz2

ISTINA LAŽuslov

izraz1 izraz2

Npr. Npr. y = 5;y = 5; x = (y>0) ? 100 : 200;x = (y>0) ? 100 : 200; -------------------- x x 100 100

Npr. Npr. y = -2;y = -2; x = (y>0) ? 100 : 200;x = (y>0) ? 100 : 200; -------------------- x x 200 200

Page 46: FSR - Uvod u c++

46

1.1.1.1. Uvod Uvod u C u C++++

NOVI OPERATORI U NOVI OPERATORI U C++ ?C++ ?

Operator za razrješenje dosega (::)Operator za razrješenje dosega (::)Operator :: ima najviši priroritetOperator :: ima najviši priroritet

Bez operatora za razješenje dosega nemoguće je u unutrašnjem bloku Bez operatora za razješenje dosega nemoguće je u unutrašnjem bloku pristupiti identifikatoru iz spoljašnjeg bloka ako je on maskiran pristupiti identifikatoru iz spoljašnjeg bloka ako je on maskiran istoimenim identifikatoromistoimenim identifikatorom

Primjer:Primjer:

......int x = 1;int x = 1; // globalno x=1// globalno x=1 int f()int f(){{ int x = 2; int x = 2; // lokalno x=2// lokalno x=2 x++; x++; // lokalno x=3// lokalno x=3 ::x++;::x++; // globalno x=2// globalno x=2 return x + return x + ::x::x; ; }}

Komentar u C++ // sve iza je komentar

u C++ vrijednost koja se vraća pomoću

return ne mora da se navodi unutar zagrada

Page 47: FSR - Uvod u c++

47

1.1.1.1. Uvod Uvod u C u C++++

ULAZ PODATAKAULAZ PODATAKA ??? ???

Standardna funkcija za Standardna funkcija za uulaz (čitanje) podatakalaz (čitanje) podataka

scanfscanf( ”konverzioni string” , lista_argumenata )( ”konverzioni string” , lista_argumenata ) ”konverzioni string”

Kontrolni (konverzioni) niz određuje način na koji se vrši unos podataka

Sličan konverzionom nizu kod printf()

Čine ga konverzioni karakteri koji definišu način unosa podataka

lista_argumenata

Određuje šta treba da se unese (koji podaci treba da se učitaju)

Argumenti se odvajaju zapetama

Argumenti su pokazivači na memorijske lokacije u koje se

smještaju učitani podaci

Ako se učitava promjenljiva x tada je argument oblika &x

Page 48: FSR - Uvod u c++

48

1.1.1.1. Uvod Uvod u C u C++++

ULAZ PODATAKAULAZ PODATAKA ??? ???

Primjer:Primjer:

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

main()main()

{{ int broj;int broj;

printf( ”printf( ”Unesite cijeli broj:Unesite cijeli broj:\n”\n” ););

scanfscanf( ”( ”%d%d””,, &broj &broj ););

printf(printf( ” ”Unijeli ste %dUnijeli ste %d\n”\n”,, broj broj ); );

}}

MEMORIJA

brojbroj

Unesite cijeli broj:

6

00000000 0110 0110

0000 00000 0000000

Unijeli ste 6

Page 49: FSR - Uvod u c++

49

1.1.1.1. Uvod Uvod u C u C++++

cin ???cin ???

Standardni ulaz u jeziku C++Standardni ulaz u jeziku C++ I u C++ jeziku može da se koristi I u C++ jeziku može da se koristi scanf()scanf() funkcija iz funkcija iz <stdio.h><stdio.h>

C++ ima biblioteku C++ ima biblioteku <iostream.h><iostream.h> za rad sa U/I tokovima za rad sa U/I tokovimatok = stream = dugački niz bajtovatok = stream = dugački niz bajtova

standardni tok za ulaz podataka standardni tok za ulaz podataka

cincin - upućivač na konzolu - upućivač na konzolu u istom programu u istom programu NE TREBANE TREBA istovremeno koristiti istovremeno koristiti scanf()scanf() i i cincin

cin >> prom1 >> prom2 >> ... >> promN;cin >> prom1 >> prom2 >> ... >> promN;

Page 50: FSR - Uvod u c++

50

1.1.1.1. Uvod Uvod u C u C++++

cin ???cin ???

Primjer:Primjer:

#include <stdio.h>#include <stdio.h>main()main(){{ int broj;int broj; printf( ”printf( ”Unesite cijeli broj:Unesite cijeli broj:\n”\n” );); scanfscanf( ”( ”%d%d””,, &broj &broj );); printf(printf( ” ”Unijeli ste %dUnijeli ste %d””,, broj broj ); ); }}

#include <iostream.h>#include <iostream.h>main()main(){{ int broj ;int broj ; cout << cout << ””Unesite cijeli broj:Unesite cijeli broj:\n”\n” ;; cin >> broj cin >> broj ;; cout <<cout << ” ”Unijeli ste Unijeli ste ”” << << broj broj ; ; }}

Page 51: FSR - Uvod u c++

51

1.1.1.1. Uvod Uvod u C u C++++

MALO VJEŽBE...MALO VJEŽBE...

Primjer:Primjer:

Napisati program koji za proizvoljnu vrijednost poluprečnika kruga računa i ispisuje njegov obim i površinu.

POČETAK

r

o = 2*r*PI

p= r*r*PI

o

p

KRAJ

Dijagram tokaDijagram toka

ProgramProgram

#include <iostream.h>#include <iostream.h>

main()main()

{{

const float PI=3.14159;const float PI=3.14159;

float r,o,p;float r,o,p;

cout << "r=" ;cout << "r=" ;

cin >> r ;cin >> r ;

o = 2*r*PI;o = 2*r*PI;

p = r*r*PI; p = r*r*PI;

cout << "Obim : " << o << endl ;cout << "Obim : " << o << endl ;

cout << "Povrsina : " << p << endl ;cout << "Povrsina : " << p << endl ;

}}

r=3r=3Obim : 18.8495Obim : 18.8495Povrsina : 28.2743Povrsina : 28.2743

Page 52: FSR - Uvod u c++

52

1.1.1.1. Uvod Uvod u C u C++++

ZADACI ZAZADACI ZA VJEŽB VJEŽBUU......

Zadaci:Zadaci:

1. Napisati program koji učitava dužinu stranice kvadrata (a), a zatim računa i ispisuje njegov obim i površinu.

2. Napisati program koji učitava dužinu strane kocke (a), a zatim računa i ispisuje njenu zapreminu i površinu.

3. Napisati program koji učitava dužine stranice pravougaonika (a i b), a zatim računa i ispisuje njegov obim i površinu te dužinu dijagonale.

4. Napisati program koji učitava dužine strana dužine strana pravougaone prizme (a, b, c), a zatim računa i ispisuje njenu zapreminu i površinu.

5. Napisati program koji učitava temperaturu izraženu u C, a zatim ispisuje koliko je to K.

6. Napisati program koji učitava ugao izražen u stepenima, minutama i sekundama, a zatim ispisuje koliko je to ukupno stepeni.

7. Napisati program koji učitava ugao izražen u stepenima, minutama i sekundama, a zatim ispisuje koliko je to radijana.

8. Napisati program koji učitava ugao izražen u radijanima, a zatim ispisuje koliko je to stepeni.

9. Napisati program koji učitava ugao izražen u radijanima, a zatim ispisuje koliko je to stepeni, minuta i sekundi (stepeni, minute i sekunde su cjelobrojni).

Page 53: FSR - Uvod u c++

53

1.2.1.2. Naredbe Naredbe

NAREDBE ?NAREDBE ?

NaredbeNaredbeC raspolaže malim skupom naredbiC raspolaže malim skupom naredbi

Svaka naredba (iskaz) završava sa Svaka naredba (iskaz) završava sa ;; (terminator iskaza) (terminator iskaza)

Osnovne grupe naredbi:Osnovne grupe naredbi:

naredbe grananja i izbora:naredbe grananja i izbora: if, switchif, switch

naredbe petlji:naredbe petlji: while, do while, forwhile, do while, for

naredbe za nasilnu promjenu toka:naredbe za nasilnu promjenu toka: break, continue, goto, returnbreak, continue, goto, return

Komponovana (složena) naredbaKomponovana (složena) naredba

jednu ili više naredbi grupišemo korištenjem velikih zagrada jednu ili više naredbi grupišemo korištenjem velikih zagrada {}{}

opšti oblik:opšti oblik: { { iskaz1;iskaz1;iskaz2;iskaz2; … …iskazN;iskazN;

}}

Složena naredba izvršava se tako što se izvršavaju jedna po jedna prosta naredba (iskaz)

od kojih je sastavljena

Ekvivalentna je BLOKU naredbi u PASCALUBEGIN ... END

Page 54: FSR - Uvod u c++

54

1.2.1.1.2.1. Naredbe grananja i izbora Naredbe grananja i izbora

ifif ??

Naredba Naredba ififOmogućava realizaciju grananja u programu:Omogućava realizaciju grananja u programu:

jednoblokovsko, dvoblokovsko, višeblokovskojednoblokovsko, dvoblokovsko, višeblokovsko

Jednoblokovsko grananjeJednoblokovsko grananje

iskaz

ISTINA LAŽuslov

if (uslov) iskaz;if (uslov) iskaz;

složeni iskaz

ISTINA LAŽuslov

if (uslov) if (uslov) { { iskaziskaz11;; ... ... iskazN;iskazN; }}

Page 55: FSR - Uvod u c++

55

1.2.1.1.2.1. Naredbe grananja i izbora Naredbe grananja i izbora

ifif ? ?

PrimjerProgram koji provjerava da li je učitani broj pozitivan.

broj

ISTINA LAŽ

POČETAK

"pozitivan"

KRAJ

broj>0

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

main()main()

{{ float float brojbroj;;

printf(printf( ”Unesite broj: ” ); ”Unesite broj: ” );

scanfscanf( ”( ”%%f”f”,, &&brojbroj ););

if ( broj>0 ) if ( broj>0 )

printf(printf( ”Broj je pozitivan\n” ”Broj je pozitivan\n”,, ); );

}}

Page 56: FSR - Uvod u c++

56

1.2.1.1.2.1. Naredbe grananja i izbora Naredbe grananja i izbora

ifif ? ?

Dvoblokovsko grananjeDvoblokovsko grananje

if (uslov) if (uslov) iskaz1;iskaz1; elseelse iskaz2;iskaz2;

if (uslov) if (uslov) { { iskaziskaz11;; ... ... iskazN;iskazN; }} elseelse { { iskaziskaz11;; ... ... iskazN;iskazN; }}

ISTINA LAŽuslov

iskaz 1 iskaz 2

ISTINA LAŽuslov

složeni iskaz 1 složeni iskaz 2

Page 57: FSR - Uvod u c++

57

1.2.1.1.2.1. Naredbe grananja i izbora Naredbe grananja i izbora

ifif ? ?

PrimjerProgram koji provjerava da li je učitani prirodni broj paran ili neparan.

#include <stdio.h>#include <stdio.h>main()main(){{ int int brojbroj, ost;, ost; printf(printf( ”Unesite broj: ” ); ”Unesite broj: ” ); scanfscanf( ”( ”%d%d””,, &&brojbroj );); if ( brojif ( broj<=<=0 ) 0 ) printf(printf(””Nije prirodanNije prirodan\n”);\n”); elseelse {{ ost = broj % 2;ost = broj % 2; if (ost==0)if (ost==0) printf(printf(””ParanParan\n”);\n”); elseelse printf(printf(””NeparanNeparan\n”);\n”); }}}}

ISTINA LAŽ

ISTINA LAŽ

POČETAK

broj

"GREŠKA"

"Paran" "Neparan"

KRAJ

ost = broj MOD 2

broj<=0

ost = 0

if (broj % 2 == 0)

Page 58: FSR - Uvod u c++

58

1.2.1.1.2.1. Naredbe grananja i izbora Naredbe grananja i izbora

ifif ??

Višeblokovsko grananjeVišeblokovsko grananje

if (uslov1) if (uslov1) iskaz1;iskaz1; else if (uslov2)else if (uslov2) iskaz2; iskaz2; else if (uslov3)else if (uslov3) iskaz3; iskaz3;

... ...

else if (uslovN)else if (uslovN) iskazN;iskazN; [[elseelse iskaz0;iskaz0;]]

Blok 1Uslov 1ISTINA

LAŽ

Blok 2

Blok NUslov NISTINA

LAŽ

Uslov 2ISTINA

LAŽ

Blok 0

Page 59: FSR - Uvod u c++

59

1.2.1.1.2.1. Naredbe grananja i izbora Naredbe grananja i izbora

ifif ? ?

PrimjerProgram koji za učitanu numeričku ocjenu ispisuje opisnu ocjenu.

#include <stdio.h>#include <stdio.h>main()main(){{ int int ocjenaocjena;; printf(printf( ”Ocjena? ” ); ”Ocjena? ” ); scanfscanf( ”( ”%d%d””,, &&ocjenaocjena );); if (ocjena=if (ocjena===5) 5) printf(printf(”Odlican\n”);”Odlican\n”); elseelse if (ocjena= if (ocjena===4) 4) printf(printf(”Vrlo dobar\n”);”Vrlo dobar\n”); elseelse if (ocjena= if (ocjena===3) 3) printf(printf(”Dobar\n”);”Dobar\n”); elseelse if (ocjena= if (ocjena===2) 2) printf(printf(”Dovoljan\n”);”Dovoljan\n”); elseelse if (ocjena= if (ocjena===1) 1) printf(printf(”Nedovoljan\n”);”Nedovoljan\n”); elseelse printf(printf(”GRESKA\n”);”GRESKA\n”); }}

POČETAK

ocjena=5

ocjena

ISTINA

"Odlican"

LAŽ

"GRESKA"

KRAJ

ISTINA

"Nedovoljan"

ocjena=4ISTINA

"Vrlo dobar"

LAŽ

ocjena=3ISTINA

"Dobar"

LAŽ

ocjena=2

ocjena=1

LAŽISTINA

"Dovoljan"

LAŽ

Page 60: FSR - Uvod u c++

60

1.2.1.1.2.1. Naredbe grananja i izbora Naredbe grananja i izbora

switchswitch ? ?

Naredba Naredba switchswitchOmogućava realizaciju Omogućava realizaciju selektivnog selektivnog

vivišeblokovskog grananjašeblokovskog grananja

izraz

v1 v2 vn inače. . .

blok 1 blok 0blok 2 blok n

switch (izraz) switch (izraz) {{ case v1:case v1: iskaz1;iskaz1; ...... iskazN;iskazN; case v2:case v2: iskaz1;iskaz1; ...... iskazN;iskazN; .. .. ..

case vN:case vN: iskaz1;iskaz1; ...... iskazN;iskazN; [default:[default: iskaz0;iskaz0;]] }}

Page 61: FSR - Uvod u c++

61

1.2.1.1.2.1. Naredbe grananja i izbora Naredbe grananja i izbora

switchswitch ? ?

Naredba Naredba switchswitch switch (izraz) switch (izraz) {{ case v1:case v1: iskaz1;iskaz1; ...... iskazN;iskazN; case v2:case v2: iskaz1;iskaz1; ...... iskazN;iskazN; .. .. ..

case vN:case vN: iskaz1;iskaz1; ...... iskazN;iskazN; [default:[default: iskaz0;iskaz0;]] }}

selektorski izrazne može biti float ili double

Na početku se izračunava vrijednost izraza

Izračunata vrijednost pronalazi se među konstantama v1 .. vN

Ako se vrijednost pronađe, izvršavaju se svi iskazi od pronađenog case do kraja

switch

Ako se vrijednost ne pronađe, prelazi se na iskaze iza default:

Ako se želi izlazak iz naredbe switch kad se završi odgovarajući case, treba koristiti

naredbu break

break;

break;

break;

Page 62: FSR - Uvod u c++

62

1.2.1.1.2.1. Naredbe grananja i izbora Naredbe grananja i izbora

switchswitch ? ?

PrimjerProgram koji za učitanu numeričku ocjenu ispisuje opisnu ocjenu koristeći selektivno višeblokovsko grananje.

#include <stdio.h>#include <stdio.h>main()main(){{ int int ocjenaocjena;; printf(printf(”Ocjena? ”);”Ocjena? ”); scanf scanf(”(”%d%d””,&,&ocjena);ocjena); switch (ocjena)switch (ocjena) {{ case 5:case 5: printf(printf(”Odlican\n”);”Odlican\n”); break; break; case 4:case 4: printf(printf(”Vrlo dobar\n”);”Vrlo dobar\n”); break; break; case 3:case 3: printf(printf(”Dobar\n”);”Dobar\n”); break; break; case 2:case 2: printf(printf(”Dovoljan\n”);”Dovoljan\n”); break; break; case 1:case 1: printf(printf(”Nedovoljan\n”);”Nedovoljan\n”); break; break; default:default: printf(printf(”GRESKA\n”);”GRESKA\n”); }}}}

Page 63: FSR - Uvod u c++

63

1.2.1.1.2.1. Naredbe grananja i izbora Naredbe grananja i izbora

switchswitch ? ?

Primjer: Program koji simulira rad kalkulatora cjelobrojnih operacija

#include <stdio.h>#include <stdio.h>main()main(){{ int x,y,rez;int x,y,rez; char op;char op; printf(printf(””Unesite izraz u obliku op1 operator op2: Unesite izraz u obliku op1 operator op2: \n”);\n”); scanfscanf(”(”%d %c %d%d %c %d””,&x,&op,&y),&x,&op,&y);; switch (op)switch (op) {{ case case ’+’’+’:: rez=x+y;rez=x+y; break; break; case case ’-’’-’:: rez=x-y;rez=x-y; break; break; case case ’*’’*’:: rez=x*y;rez=x*y; break; break; case case ’/’’/’:: rez=x*y;rez=x*y; break; break; default:default: printf(printf(”Ne poznajem tu operaciju!\n”);”Ne poznajem tu operaciju!\n”); return (0);return (0); }} printf printf ((”%d %c %d = %d”, x,op,y,rez);”%d %c %d = %d”, x,op,y,rez); }}

Nasilni izlaz iz programa

Page 64: FSR - Uvod u c++

64

1.2.1.1.2.1. Naredbe grananja i izbora Naredbe grananja i izbora

ZADACI ZAZADACI ZA VJEŽB VJEŽBUU......

Zadaci:Zadaci:

1. Napisati program koji učitava dva broja, a zatim ispisuje manji broj.

2. Napisati program koji učitava tri broja, a zatim ispisuje najmanjeg (najvećeg).

3. Napisati program koji učitava prirodan broj manji od 100, a zatim ispisuje zbir njegovih cifara.

4. Napisati program koji učitava prirodan broj manji od 1000, a zatim ispisuje zbir njegovih cifara.

5. Učitati godinu, pa ispisati da li je ona prestupna ili nije.

6. Napisati program koji za učitani redni broj dana u sedmici ispisuje njegov naziv (ponedjeljak, utorak, ... , nedjelja).

7. Napisati program koji za učitani redni broj mjeseca u godini ispisuje naziv mjeseca (januar, februar, ... , decembar).

8. Napisati program koji učitava redni broj mjeseca i godinu, a zatim ispisuje koliko ima dana u tom mjesecu. U obzir uzeti da li je godina prestupna.

Page 65: FSR - Uvod u c++

65

1.2.2.1.2.2. Naredbe nasilne promjene toka Naredbe nasilne promjene toka

break break ??

Naredba Naredba breakbreakDejstvo:Dejstvo:

u naredbi u naredbi switchswitch::• nasilni prekid izvršavanja naredbe switchnasilni prekid izvršavanja naredbe switch• prelazak na prvi iskaz iza naredbe switchprelazak na prvi iskaz iza naredbe switch

u petljama:u petljama:• nasilni prekid izvršavanja petljenasilni prekid izvršavanja petlje• prelazak na prvi iskaz iza petljeprelazak na prvi iskaz iza petlje

u ostalim slučajevima:u ostalim slučajevima:• nema dejstvanema dejstva

Page 66: FSR - Uvod u c++

66

1.2.2.1.2.2. Naredbe nasilne promjene toka Naredbe nasilne promjene toka

return return ??

Naredba Naredba returnreturnDejstvo: izlazak iz funkcije Dejstvo: izlazak iz funkcije

• prekida izvršavanje date funkcije prekida izvršavanje date funkcije

(ignorišu se svi iskazi iza return)(ignorišu se svi iskazi iza return)

• ako se nalazimo u main funkciji – prekid programaako se nalazimo u main funkciji – prekid programa

Omogućava da funkcija vrati neku vrijednostOmogućava da funkcija vrati neku vrijednost

Opšti oblikOpšti oblik

return (vrijednost);return (vrijednost);

iliili

return (izrazreturn (izraz););

Page 67: FSR - Uvod u c++

67

1.2.2.1.2.2. Naredbe nasilne promjene toka Naredbe nasilne promjene toka

goto goto ??

Naredba Naredba gotogotoOmogućava bezuslovni skokOmogućava bezuslovni skok

Opšti oblikOpšti oblik

goto labela;goto labela;

Labela (oznaka) neke naredbe u istoj funkciji

Primjer

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

int broj;int broj;

lab1:lab1: printf(printf(””Unesite prirodan broj:Unesite prirodan broj: ”); ”);

scanfscanf(”(”%d%d””,&broj,&broj););

if (broj<1)if (broj<1)

{ { printf(”Nije prirodan!printf(”Nije prirodan!\n\n””); goto kraj; }); goto kraj; }

printf (”%d %s paran\n”, broj, (broj%2)? ”nije” : ”je”);printf (”%d %s paran\n”, broj, (broj%2)? ”nije” : ”je”);

goto lab1;goto lab1;

kraj: printf(”KRAJ...”);kraj: printf(”KRAJ...”);}}

Bezuslovni skok na iskaz označen

sa lab1

Bezuslovni skok na iskaz označen

sa kraj

Page 68: FSR - Uvod u c++

68

1.2.3.1.2.3. Naredbe petlji Naredbe petlji

while while ??

Naredba Naredba whilewhileOmogućava realizaciju petlje sa izlazom na vrhuOmogućava realizaciju petlje sa izlazom na vrhu

while (izraz) while (izraz) { { iskaziskaz11;; ... ... iskazN;iskazN; }}

uslov

ISTINA

tijelo petlje

LAŽ while (izraz) while (izraz) iskaz;iskaz;

Opšti oblikOpšti oblik

Ciklus će se izvršavati sve Ciklus će se izvršavati sve dok je uslov ispunjen dok je uslov ispunjen

(ne mora ni jedamput)(ne mora ni jedamput)

iliili

Sve dok je izraz ISTINIT (!=0) izvršava se Sve dok je izraz ISTINIT (!=0) izvršava se (složena) naredba(složena) naredba

Kad izraz postane LAŽ (==0) prekida se Kad izraz postane LAŽ (==0) prekida se izvršavanje petljeizvršavanje petlje

Page 69: FSR - Uvod u c++

69

1.2.3.1.2.3. Naredbe petlji Naredbe petlji

while while ??

Primjer: Program koji N puta ispisuje riječ "ALGORITAM“.

POČETAK

KRAJ

n

b = 1

b <=n

"ALGORITAM"

ISTINA

LAŽ

b = b + 1

#include <stdio.h>#include <stdio.h>main()main(){{ int n, b=1;int n, b=1; printf(printf(”Unesite ”Unesite NN: ”);: ”); scanfscanf(”(”%d%d””,&n,&n);); while ( b<=n )while ( b<=n ) {{ printf(printf(””AlgoritamAlgoritam\n”);\n”); b++;b++; }}}}

Page 70: FSR - Uvod u c++

70

1.2.3.1.2.3. Naredbe petlji Naredbe petlji

while while ??

Primjer: Program koji N puta ispisuje riječ "ALGORITAM". (bez korištenja pomoćnog brojača)

POČETAK

KRAJ

n

n

"ALGORITAM"

ISTINA

LAŽ

n--

#include <stdio.h>#include <stdio.h>main()main(){{ int n;int n; printf(printf(”Unesite ”Unesite NN: ”);: ”); scanf scanf(”(”%d%d””,&n,&n);); while (n)while (n) {{ printf(printf(””ALGORITAMALGORITAM\n”);\n”); n--;n--; }}}}

#include <stdio.h>main(){ int n; printf(”Unesite N: ”); scanf(”%d”,&n); while (n--) printf(”ALGORITAM\n”); }

Page 71: FSR - Uvod u c++

71

1.2.3.1.2.3. Naredbe petlji Naredbe petlji

while while ??

Primjer: Program koji učitava n, a zatim izračunava i ispisuje n!

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

main()main()

{{

int n, f=1;int n, f=1;

printf(printf(”Unesite ”Unesite NN: ”);: ”);

scanfscanf(”(”%d%d””,&n,&n););

printf(printf(””%d!=%d!=””,n,n););

while (n)while (n)

f *= n--;f *= n--;

printf(printf(””%d%d””,f,f););

}}

POČETAK

KRAJ

n

f = 1

n

f

ISTINA

LAŽ

f = f * n

n = n -1

Page 72: FSR - Uvod u c++

72

1.2.3.1.2.3. Naredbe petlji Naredbe petlji

while while ??

Primjer: Program koji učitava prirodan broj, a zatim ispisuje zbir njegovih cifara.

#include <stdio.h>#include <stdio.h>main()main(){{ int b, s=0;int b, s=0; printf(printf(”Unesite ”Unesite brojbroj: ”);: ”); scanfscanf(”(”%d%d””,&b,&b);); if (b<1)if (b<1) printf(printf(””Nije prirodan!Nije prirodan!”);”); elseelse {{ while (b)while (b) {{ s += b % 10;s += b % 10; b /= 10;b /= 10; }} printf(printf(””Zbir cifara je:%dZbir cifara je:%d””,s,s);); }}}}

POČETAK

b

KRAJ

"Nije prirodan"

b < 1ISTINA LAŽ

s = 0

b > 0LAŽ

ISTINA

c = b MOD 10

s = s + c

b = b DIV 10

s

KRAJ

Page 73: FSR - Uvod u c++

73

1.2.3.1.2.3. Naredbe petlji Naredbe petlji

while while ??

Primjer: Program koji učitava prirodan broj, a zatim ispisuje da li je on prost ili nije.

#include <stdio.h>#include <stdio.h>#include <#include <mathmath.h>.h>main()main(){{ int b, p, d=int b, p, d=11;; printf(printf(”Unesite ”Unesite brojbroj: ”);: ”); scanfscanf(”(”%d%d””,&b,&b);); if (b<1)if (b<1) printf(printf(””Nije prirodan!Nije prirodan!”);”); elseelse {{ p = p = ((bb ==== 22)) | (b % 2);| (b % 2); while (while (p && (d+=2p && (d+=2))<=sqrt(b))<=sqrt(b)) pp = b % = b % dd;; printf(printf(”%”%dd %s prost” %s prost”,, b, p ? ”je”:”nije”); b, p ? ”je”:”nije”); }}}}

POČETAK

b

KRAJ

"Nije prirodan"

b < 1ISTINA LAŽ

p = (b==2) (b%2)

LAŽ

ISTINA

p = b%d != 0

d = 3

KRAJ

p && d < b

d = d + 2

LAŽISTINAp

“NIJE"“JESTE"

Page 74: FSR - Uvod u c++

74

1.2.3. 1.2.3. Naredbe petljiNaredbe petlji

do ... do ... while while ??

Naredba Naredba do...wdo...whilehileOmogućava realizaciju petlje sa izlazom na dnuOmogućava realizaciju petlje sa izlazom na dnu

dodo { { iskaziskaz11;; ... ... iskazN;iskazN; } } while (izraz); while (izraz);

dodo iskaz;iskaz; while (izraz); while (izraz);

Opšti oblikOpšti oblik

iliiliISTINA

uslov

tijelo petlje

LAŽ

1. Izvršavaju se iskazi iza 1. Izvršavaju se iskazi iza dodo

2. Računa se vrijednost izraza2. Računa se vrijednost izraza

3. Ako je izraz ISTINIT (!=0) idi na korak 13. Ako je izraz ISTINIT (!=0) idi na korak 1

4. Ako je izraz LAŽ (==0) prekida se izvršavanje 4. Ako je izraz LAŽ (==0) prekida se izvršavanje petlje i prelazi na sljedeći iskaz iza petlje i prelazi na sljedeći iskaz iza whilewhile

Page 75: FSR - Uvod u c++

75

1.2.3. 1.2.3. Naredbe petljiNaredbe petlji

do ... do ... while while ??

Primjer: Program koji N puta ispisuje riječ "ALGORITAM“.

#include <stdio.h>#include <stdio.h>main()main(){{ int n, b=1;int n, b=1; dodo {{ printf(printf(”Unesite ”Unesite NN: ”);: ”); scanfscanf(”(”%d%d””,&n,&n);); }} while (while (n<1n<1));; dodo {{ printf(printf(””AlgoritamAlgoritam\n”);\n”); b++;b++; }} while (b<=n);while (b<=n);}}

POČETAK

N

b = 1

"ALGORITAM"

b = b + 1

ISTINA N < 1

LAŽ

ISTINAb<=N

KRAJ

LAŽ

#include <stdio.h>main(){ int n, b=1; do { printf(”Unesite N: ”); scanf(”%d”,&n); } while (n<1); do printf(”Algoritam\n”); while ( ++b <= n );}

Page 76: FSR - Uvod u c++

76

1.2.3. 1.2.3. Naredbe petljiNaredbe petlji

do ... do ... while while ??

Primjer: Euklidovim algoritmom odrediti NZD dva prirodna broja.

#include <stdio.h>#include <stdio.h>main()main(){{ int int x,y,p,ostx,y,p,ost;; dodo {{ printf(printf(”Unesite X i Y:”);”Unesite X i Y:”); scanfscanf(”(”%d%d %d” %d”,&,&x,&y);x,&y); }} while (while (x<1 || y<1x<1 || y<1));; if (x<y) if (x<y) { p=x; x=y; y=p; }{ p=x; x=y; y=p; } dodo { { ost = x%y;ost = x%y; x = y;x = y; y = ost;y = ost; }} while (y);while (y);}}

POČETAK

X , Y

ISTINA

LAŽ

X<1 v Y<1

P=XX=YY=P

ISTINA LAŽX < Y

T

Y > 0

KRAJ

ISTINA

X = Y

Y = ost

ost=X MOD Y

X

T

LAŽ

Page 77: FSR - Uvod u c++

77

1.2.3. 1.2.3. Naredbe petljiNaredbe petlji

do ... do ... while while ??

Primjer: Podijeliti dva prirodna broja na proizvoljan broj decimala. (koristeći pravilo za ručno dijeljenje)

#include <stdio.h>#include <stdio.h>main()main(){{ int int x,y,x,y,bd;bd; dodo {{ printf( printf(”Unesite X i Y:”);”Unesite X i Y:”); scanf scanf(”(”%d%d %d” %d”,&,&x,&y);x,&y); }} while (while (x<1 || y<1x<1 || y<1));; dodo {{ printf( printf(””Broj decimalaBroj decimala:”);:”); scanf scanf(”(”%d%d””,&bd,&bd);); }} while (bdwhile (bd<1<1)); ; printf(”%d:%d=%d.”, x, y, x/y);printf(”%d:%d=%d.”, x, y, x/y); dodo { { xx = x%y = x%y * 10 * 10;; printf(”%d”, x/y);printf(”%d”, x/y); }} while (while (--bd--bd););}}

Page 78: FSR - Uvod u c++

78

1.2.3.1.2.3. Naredbe petlji Naredbe petlji

do ... do ... while while ??

Primjer: Program koji računa drugi korijen iz pozitivnog realnog broja X na četiri decimale koristeći Njutnovu iterativnu formulu.

...2 ,1 ,0 ,2

,2

110

n

xX

x

xX

x nn

n

POČETAK

X

ISTINA

LAŽ

X < 0

eps = 0.0001

xN = (X+1) / 2

xS = xN

xN = (xS + X/ xS) / 2

|xN - xS | > epsISTINA

KRAJ

LAŽ

xN

#include <stdio.h>#include <stdio.h>#include <math.h>#include <math.h>#define EPS 0.0001#define EPS 0.0001main()main(){{ floatfloat x,xs,xnx,xs,xn;; dodo { { printf(printf(”X=”);”X=”); scanf scanf(”(”%%f”f”,&,&x);}x);} while (while (x<0x<0));; xn = (x+1)/2; xn = (x+1)/2; dodo { xs = xn; xn = (xs + x/xs) / 2;}{ xs = xn; xn = (xs + x/xs) / 2;} while (fabs(xn-xs)>EPS);while (fabs(xn-xs)>EPS); printf(”Korijen je: %8.4f”,xn);printf(”Korijen je: %8.4f”,xn);}}

Page 79: FSR - Uvod u c++

79

1.2.3.1.2.3. Naredbe petlji Naredbe petlji

for for ??

Naredba Naredba forfor

for (poc_izraz; uslov; izraz_petlje)for (poc_izraz; uslov; izraz_petlje) { { iskaziskaz11;; ... ... iskazN;iskazN; }}

for (poc_izraz; uslov; izraz_petlje) for (poc_izraz; uslov; izraz_petlje) iskaz;iskaz;

Opšti oblikOpšti oblik

iliiliuslov petlje

ISTINA

tijelo petlje

LAŽ

početniizraz

izraz petlje Ekvivalentno sljedećoj Ekvivalentno sljedećoj whilewhile petlji: petlji:

pocetni_izraz;pocetni_izraz; while (uslov)while (uslov) { { iskaz; izraz_petlje;iskaz; izraz_petlje; }}

Page 80: FSR - Uvod u c++

80

1.2.3.1.2.3. Naredbe petlji Naredbe petlji

forfor ??

Primjer: Program koji N puta ispisuje riječ "ALGORITAM“.

#include <stdio.h>#include <stdio.h>main()main(){{ int n, int n, ii;;

printf(printf(”Unesite ”Unesite NN: ”);: ”); scanf scanf(”(”%d%d””,&n,&n););

for (i=1 ; i<=n ; i++)for (i=1 ; i<=n ; i++) printf(printf(””AlgoritamAlgoritam\n”);\n”);}}

POČETAK

KRAJ

i = 1, N

"ALGORITAM"

N

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

printf(”Unesite N: ”); scanf(”%d”,&n);

for ( ; n ; n--) printf(”Algoritam\n”);}

Početni izraz nepotreban, pa je izostavljen.

Uslov petlje (n), odnosno (n>0)

Page 81: FSR - Uvod u c++

81

1.2.3.1.2.3. Naredbe petlji Naredbe petlji

forfor ??

Primjer: Program koji ispisuje cijele brojeve iz intervala <A,B>.

#include <stdio.h>#include <stdio.h>main()main(){{ int a, b, broj;int a, b, broj;

printf(printf(”Unesite ”Unesite granice intervalagranice intervala: ”);: ”); scanfscanf(”(”%d %d%d %d””,&a, &b,&a, &b););

for (for ( broj broj==a+a+1 ; 1 ; brojbroj<=<=b-1b-1 ; ; brojbroj++++ )) printf(printf(”” %d %d””, broj, broj););}}

#include <stdio.h>main(){ int a, b, broj;

printf(”Unesite granice intervala: ”); scanf(”%d %d”,&a, &b);

for ( broj=a+1 ; broj<=b-1 ; )

printf(” %d”, broj++);}

POČETAK

KRAJ

broj = A+1, B-1

broj

A , B

izraz petlje izostavljen ali je implementiran u sljedećem

iskazu!!!printf(” %d”, broj++);

Page 82: FSR - Uvod u c++

82

1.2.3.1.2.3. Naredbe petlji Naredbe petlji

forfor ??

Primjer: Program koji računa n!

#include <stdio.h>#include <stdio.h>main()main(){{ int n, bint n, b, p, p;; dodo {{ printf(printf(””n=n=”);”); scanf scanf(”(”%d%d””,&,&n); }n); } while (n<0);while (n<0);

for (for ( p=1, p=1, bb=2 ; =2 ; bb<=n ; <=n ; bb++++ ) ) p=p*b;p=p*b;

printf(printf(””%d%d!=%d”!=%d”, , n, p);n, p);}}

POČETAK

KRAJ

P = 1

P

b = 2, N

P = P * b

N

ISTINA N < 0

LAŽ

#include <stdio.h>main(){ int n, p; do { printf(”n=”); scanf(”%d”,&n); } while (n<0);

for ( p=1 ; n ; p*=n-- );

printf(”%d”, p);}

dva početna izrazameđusobno odvojeni zapetom

Page 83: FSR - Uvod u c++

83

1.2.3.1.2.3. Naredbe petlji Naredbe petlji

forfor ??

Primjer: Učitati prirodan broj, pa provjeriti da li je on savršen.

KRAJ

LAŽ

“NIJE"

ISTINA

“JESTE"

broj = S

POČETAK

broj

D = 2, broj/2

ost = broj % D

"Nije prirodan"

broj < 1ISTINA LAŽ

ost = 0

ISTINA

LAŽ

S = 1

S = S + D

KRAJ

#include <stdio.h>#include <stdio.h>main()main(){{ int broj, d, s;int broj, d, s; printf(printf(””Unesite prirodan broj:Unesite prirodan broj:”);”); scanfscanf(”(”%d%d””,&broj,&broj); ); if if ((brojbroj<<11)) printf(”Nije prirodan!”);printf(”Nije prirodan!”); elseelse

{{

for (for ( s=1, d=2 ; d<=broj/2 ; d++s=1, d=2 ; d<=broj/2 ; d++ ) ) s += (broj%d) ? 0 : d;s += (broj%d) ? 0 : d;

printf(printf(””%d%d %s savrsen” %s savrsen”, , broj, broj,

(broj==s) ? ”je” : ”nije” );(broj==s) ? ”je” : ”nije” ); }}}}

Page 84: FSR - Uvod u c++

84

1.2.3.1.2.3. Naredbe petlji Naredbe petlji

forfor ??

Primjer: Ispisati sve savršene prirodne brojeve manje od 1000.

LAŽISTINA

broj

broj = S

KRAJ

POČETAK

broj = 1, 999

D = 2, broj/2

ost = broj MOD D

ost = 0

ISTINA

LAŽ

S = 1

S = S + D

#include <stdio.h>#include <stdio.h>main()main(){{ int broj, d, s;int broj, d, s;

for (for ( broj=1 broj=1 ; broj ; broj<1000<1000 ; ; brojbroj++++ ))

{ { for (for ( s=1, d=2 ; d<=broj/2 ; d++s=1, d=2 ; d<=broj/2 ; d++ ) ) s += (broj%d) ? 0 : d;s += (broj%d) ? 0 : d;

if (broj==s) if (broj==s) printf(” %d”, printf(” %d”, broj)broj);;

}}}}

Page 85: FSR - Uvod u c++

85

1.2.3. 1.2.3. Naredbe petljiNaredbe petlji

forfor ??

Primjer: Program koji ispisuje prvih n redova sljedećeg trougla:

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

#include <stdio.h>#include <stdio.h>main()main(){{ int n, red, broj;int n, red, broj;

do { printf(”n=? ”); scanf(”%d”,&n); } while (n<1 || n>20);

for (for ( red=1 red=1 ; ; red<=nred<=n ; ; redred++++ )) { { for (for ( broj broj==11 ; broj ; broj<=red<=red ; ; brojbroj++++ ) ) printf(”*”);printf(”*”);

printf(”printf(”\n\n””));;

}}}}

Page 86: FSR - Uvod u c++

86

1.2.3. 1.2.3. Naredbe petljiNaredbe petlji

forfor ??

Primjer: Program koji ispisuje prvih n redova sljedećeg trougla:

1121231234...123456789123456789012345678901...

#include <stdio.h>#include <stdio.h>main()main(){{ int n, red, broj;int n, red, broj;

do { printf(”n=? ”); scanf(”%d”,&n); } while (n<1 || n>20);

for (for ( red=1 red=1 ; ; red<=nred<=n ; ; redred++++ )) { { for (for ( broj broj==11 ; broj ; broj<=red<=red ; ; brojbroj++++ ) )

printf(”*”);printf(”*”);

printf(”printf(”\n\n””));;

}}}}

printf(”%d”, broj%10);

Page 87: FSR - Uvod u c++

87

1.2.3. 1.2.3. Naredbe petljiNaredbe petlji

forfor ??

Primjer: Program koji ispisuje prvih n redova sljedeće piramide cifara:

1 232 34543 4567654 . . . 89012345432109890123456765432109 . . .

#include <stdio.h>#include <stdio.h>main()main(){{ int n, red, broj;int n, red, broj;

do { printf(”n=”); scanf(”%d”,&n); } while (n<1 || n>20);

for (for ( red=1 red=1 ; ; red<=nred<=n ; ; redred++++ )) { { for (for ( broj broj==11 ; broj ; broj<=<=n-n-redred ; ; brojbroj++++ ) ) printf(”printf(” ””));;

for (for ( broj broj=red ; broj=red ; broj<=<=2*2*redred-1 ; -1 ; brojbroj++++ ) ) printf(”printf(”%d%d””, broj%10), broj%10);;

for (for ( broj broj=2*red-2 ; broj>==2*red-2 ; broj>=redred ; ; brojbroj---- ) ) printf(”printf(”%d%d””, broj%10), broj%10);;

printf(”printf(”\n\n””));; }}}}

Page 88: FSR - Uvod u c++

88

1.2.3.1.2.3. Naredbe petlji Naredbe petlji

ZADACI ZAZADACI ZA VJEŽB VJEŽBUU......

Zadaci:Zadaci:

1. Napisati program koji koji učitava prirodan broj, a zatim ispisuje sve parne brojeve manje od njega. Zadatak riješiti korištenjem a) for petlje; b) while petlje; c) do…while petlje.

2. Napisati program koji tabelarno ispisuje vrijednosti funkcije f(x)=2x+3, za vrijednosti argumenta x[A,B], s korakom x. Zadatak riješiti korištenjem a) for petlje; b) while petlje; c) do…while petlje.

3. Učitati n brojeva, a zatim ispisati koliko među njima ima pozitivnih, kao i njihovu aritmetičku sredinu.

4. Učitati n brojeva, a zatim ispisati najvećeg.

5. Učitati n brojeva, a zatim ispisati najmanjeg, kao i njegov redni broj.

6. Ispisati sve dvocifrene proste brojeve.

7. Ispisati prvih n prostih brojeva.

8. Ispisati prvih n savršenih brojeva.

9. Učitati broj pa provjeriti da li je Armstrongov. Broj je Armstrongov ako je jednak zbiru kubova svojih cifara.

10. Učitati dva prirodna broja pa provjeriti da li oni predstavljaju par prijateljskih brojeva. Za dva broja kažemo da su prijateljski ako je prvi jednak zbiru djelilaca drugog, a drugi jednak zbiru djelilaca prvog broja.

Page 89: FSR - Uvod u c++

89

1.3. 1.3. Složeni tipovi podatakaSloženi tipovi podataka

Složeni tipovi ?Složeni tipovi ?

Složeni tipovi podatakaSloženi tipovi podatakaC raspolaže sljedećim složenim tipovima podataka:C raspolaže sljedećim složenim tipovima podataka:

polja (indeksirane promjenljive) polja (indeksirane promjenljive)

jednodimenzionalno = NIZ,jednodimenzionalno = NIZ,

dvodimenzionalno = MATRICA,dvodimenzionalno = MATRICA,

višedimenzionalnovišedimenzionalno

strukturestrukture

unijeunije

Page 90: FSR - Uvod u c++

90

1.3.1. 1.3.1. PoljaPolja

NIZOVI ?NIZOVI ?

NizoviNizoviNiz ili vektor je jednodimenzionalno poljeNiz ili vektor je jednodimenzionalno polje

To je skup podataka istog tipa To je skup podataka istog tipa

U memoriji se smješta u niz uzastopnih mem. lokacijaU memoriji se smješta u niz uzastopnih mem. lokacija

Svi podaci u nizu imaju jedno ime = IME NIZASvi podaci u nizu imaju jedno ime = IME NIZA

Ime niza predstavlja početnu adresu niza u memoriji Ime niza predstavlja početnu adresu niza u memoriji

Svaki element u nizu određen je: Svaki element u nizu određen je: imenom niza, i imenom niza, i

indeksom (pomjerajem u odnosu na početak niza)indeksom (pomjerajem u odnosu na početak niza)

MEMORIJA

nniziz[0][0]

nniziz[1][1]

nniziz[2][2]

nniziz[3][3]

nniziz[4][4]

nniziz[5][5]

nniziz[6][6]

nniziz[7][7]

Page 91: FSR - Uvod u c++

91

1.3.1. 1.3.1. PoljaPolja

NIZOVINIZOVI ? ?

Deklaracija nizaDeklaracija nizaOpOpšti oblik deklaracije:šti oblik deklaracije:

tip tip imeime_niza [broj_elemenata] = {lista vrijednosti}_niza [broj_elemenata] = {lista vrijednosti}

tip niza (tip podataka u nizu)

ime niza (identifikator u skladu sa sintaksom jezika, važe sva pravila kao i za skalarne

promjenljive)broj elemenata u nizu (cjelobrojna konstanta)(rezerviše se potreban

broj bajtova za memorisanje deklarisanog

broja elemenata)

vrijednosti elemenata u nizu (inicijalizacija niza)

(nije obavezno inicijalizovanje)(vrijednosti se razdvajaju

zapetama)

Page 92: FSR - Uvod u c++

92

1.3.1. 1.3.1. PoljaPolja

NIZOVINIZOVI ? ?

Deklaracija nizaDeklaracija nizaPrimjer deklaracije:Primjer deklaracije:

int int niz[5];niz[5];

charchar tekst[10];tekst[10];

MEMORIJA

teksttekst

10*1B = 10B10*1B = 10B

nizniz

5*2B = 10B5*2B = 10B

nniziz[0][0]

nniziz[1][1]

nniziz[2][2]

nniziz[3][3]

nniziz[4][4]

tekst[0]tekst[0]tekst[1]tekst[1]

tekst[9]tekst[9]

PrimjerPrimjer::

#define MAX 5#define MAX 5 #define LENG 10#define LENG 10 main()main() { { intint niz[MAX];niz[MAX]; charchar tekst[LENG];tekst[LENG]; ...... }}

Page 93: FSR - Uvod u c++

93

1.3.1. 1.3.1. PoljaPolja

NIZOVINIZOVI ? ?

Deklaracija nizaDeklaracija nizaPrimjer deklaracijePrimjer deklaracije sa inicijalizacijom sa inicijalizacijom::

int int A[3]={1,2,3};A[3]={1,2,3}; 31 2A[2]A[0] A[1]

B[2]B[0] B[1]

31 2 4B[3]

C[2]C[0] C[1]

010 0 0C[3]

0C[4]

D[2]D[0] D[1]

00 0 0D[3]

0D[4]

intint B[]={1,2,3,4};B[]={1,2,3,4};

int C[5]={10};int C[5]={10};

int D[5]={0};int D[5]={0};

Page 94: FSR - Uvod u c++

94

1.3.1. 1.3.1. PoljaPolja

NIZOVINIZOVI ? ?

Primjer: Učitati niz od n cijelih brojeva, pa ih ispisati redoslijedom kojim su učitani.

#include <stdio.h>#include <stdio.h>#define MAX 100#define MAX 100main()main(){{ int int niz[MAX];niz[MAX]; int i,n;int i,n;

dodo { printf(”n=”); scanf(”%d”, &n); }{ printf(”n=”); scanf(”%d”, &n); } while (n<1);while (n<1);

for (for ( ii=1=1 ; i ; i<<=n ; i++=n ; i++ )) { printf(”Unesite %d. broj:”);{ printf(”Unesite %d. broj:”); scanf(”%d”, &niz[i-1]); }scanf(”%d”, &niz[i-1]); }

printf(”Unijeli ste: ”);printf(”Unijeli ste: ”); for (for ( ii==0 ; i0 ; i<<n ; i++n ; i++ )) printf(” %d”, niz[i]);printf(” %d”, niz[i]);}}

POČETAK

n

ISTINA n < 1

LAŽ

KRAJ

i = 1, n

niz[i-1]

i = 0, n-1

niz[i]

Page 95: FSR - Uvod u c++

95

1.3.1. 1.3.1. PoljaPolja

NIZOVINIZOVI ? ?

Primjer: Učitati niz od n cijelih brojeva, pa ih ispisati obrnutim redoslijedom.

#include <stdio.h>#include <stdio.h>#define MAX 100#define MAX 100main()main(){{ int int niz[MAX];niz[MAX]; int i,n;int i,n;

dodo { printf(”n=”); scanf(”%d”, &n); }{ printf(”n=”); scanf(”%d”, &n); } while (n<1);while (n<1);

for (for ( ii=1=1 ; i ; i<<=n ; i++=n ; i++ )) { printf(”Unesite %d. broj:”);{ printf(”Unesite %d. broj:”); scanf(”%d”, &niz[i-1]); }scanf(”%d”, &niz[i-1]); }

printf(”Unijeli ste: ”);printf(”Unijeli ste: ”); for (for ( ii==n ; i>=1 ; i++n ; i>=1 ; i++ )) printf(” %d”, niz[i-1]);printf(” %d”, niz[i-1]);}}

POČETAK

n

ISTINA n < 1

LAŽ

KRAJ

i = 1, n

niz[i-1]

i = n, 1

niz[i-1]

Page 96: FSR - Uvod u c++

96

1.3.1. 1.3.1. PoljaPolja

NIZOVINIZOVI ? ?

Primjer: Učitati niz od n cijelih brojeva, pa ispisati njihovu aritmetičku sredinu i one učitane brojeve koji su veći od sredine.

POČETAK

n

ISTINA n < 1

LAŽ

i = 0, n-1

niz[i]

s = 0

s = s + niz[i]

T

KRAJ

i = 0, n-1

T

as = s/n

LAŽISTINA

niz[i]

niz[i]>as

#include <stdio.h>#include <stdio.h>#define MAX 100#define MAX 100main()main(){{ int int niz[MAX];niz[MAX]; int i,n,s=0;int i,n,s=0; float as;float as;

dodo { printf(”n=”); { printf(”n=”); scanf(”%d”, &n); }scanf(”%d”, &n); } while (n<1);while (n<1);

for (ifor (i==0;i0;i<<=n-1;i++)=n-1;i++) { printf(”Unesite broj:”);{ printf(”Unesite broj:”); scanf(”%d”, &niz[i]);scanf(”%d”, &niz[i]); s+=niz[i]; }s+=niz[i]; }

as=(float)s / n;as=(float)s / n;

printf(”Sredina: %7.3f\n”,as);printf(”Sredina: %7.3f\n”,as);

printf(”Veci su: ”);printf(”Veci su: ”); for (for ( ii==0 ; i<n ; i++0 ; i<n ; i++ )) if (niz[i]>as)if (niz[i]>as) printf(” %d”, niz[i]);printf(” %d”, niz[i]);}}

Page 97: FSR - Uvod u c++

97

1.3.1. 1.3.1. PoljaPolja

NIZOVINIZOVI ? ?

Primjer: Učitati niz od n cijelih brojeva, pa ispisati njihovu aritmetičku sredinu i onaj učitani broj koji joj je najbliži.

#include <stdio.h>#include <stdio.h>#include <math.h>#include <math.h>#define MAX 100#define MAX 100main()main(){ { int int niz[MAX]niz[MAX], , i, i, rb=0,rb=0, n, s=0; n, s=0; float as;float as;

dodo { printf(”n=”); scanf(”%d”, &n); }{ printf(”n=”); scanf(”%d”, &n); } while (n<1);while (n<1);

for ( ifor ( i==0; i0; i<<=n-1; i++ )=n-1; i++ ) { { printf(”Unesite broj:”);printf(”Unesite broj:”); scanf(”%d”, &niz[i]);scanf(”%d”, &niz[i]); s+=niz[i]; }s+=niz[i]; }

as=(float)s / n;as=(float)s / n;

for (for ( ii=1=1 ; i<n ; i++ ; i<n ; i++ )) if (if ( fabs( fabs(niz[i]niz[i]-as-as)) < fabs( < fabs(niz[niz[rbrb]]-as-as)) ) rb=i; ) rb=i; printf(” printf(” SredinaSredina je je: %7.3f: %7.3f\n”, as);\n”, as); printf(” printf(” Najblizi jeNajblizi je %d. po redu\n”, rb+1); %d. po redu\n”, rb+1); printf(” To je broj: %d”, niz[rb]);printf(” To je broj: %d”, niz[rb]);}}

Page 98: FSR - Uvod u c++

98

1.3.1. 1.3.1. PoljaPolja

NIZOVINIZOVI ? ?

Primjer: Učitati niz A od n cijelih brojeva, pa zatim formirati niz B, tako da je element bi jednak najvećoj cifri elementa ai.

#include <stdio.h>#include <stdio.h>#define MAX 100#define MAX 100main()main(){ { int int a[MAX]a[MAX], , b[MAX], i, n, pom, c;b[MAX], i, n, pom, c; do do { printf(”n=”); scanf(”%d”, &n); } { printf(”n=”); scanf(”%d”, &n); } while ((n<1) || (n>MAX));while ((n<1) || (n>MAX));

for ( ifor ( i==0; i0; i<<=n-1; i++ )=n-1; i++ ) { { printf(”Unesite broj:”);printf(”Unesite broj:”); scanf(”%d”, &a[i]); }scanf(”%d”, &a[i]); }

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

{ b[i]=0; pom=a[i];{ b[i]=0; pom=a[i];

do do

{ c=pom%10; pom/=10; if (c>b[i]) b[i]=c; } { c=pom%10; pom/=10; if (c>b[i]) b[i]=c; }

while (pom);while (pom); }} printf(”\n Aprintf(”\n A::”); for (”); for ( ii==0 ; i<n ; i++0 ; i<n ; i++ ) printf(” %d”, a[i]); ) printf(” %d”, a[i]); printf(”\n Bprintf(”\n B::”); for (”); for ( ii==0 ; i<n ; i++0 ; i<n ; i++ ) printf(” %d”, b[i]);) printf(” %d”, b[i]); }}

Page 99: FSR - Uvod u c++

99

1.3.1. 1.3.1. PoljaPolja

NIZOVINIZOVI ? ?

Primjer: Program koji učitava koeficijente dva polinoma A i B, stepena m i n, respektivno, (m , n < 10), a zatim izračunava i ispisuje proizvod ta dva polinoma.

Polinom A:Polinom A:Am(x) = amxm + am-1xm-1 +...+ a1x + a0

Polinom B:Polinom B:Bn(x) = bnxn + bn-1xn-1 +...+ b1x + b0

Množenje dva monoma:Množenje dva monoma:aixi * bjxj = ai*bjxi+j

Proizvod polinoma A i polinoma B:Proizvod polinoma A i polinoma B:Cm+n(x) = cm+nxm+n + cm+n-1xm+n-1 +...+ c1x + c0

Page 100: FSR - Uvod u c++

100

1.3.1. 1.3.1. PoljaPolja

NIZOVINIZOVI ? ?

Primjer: Program koji učitava koeficijente dva polinoma A i B, stepena m i n, respektivno, (m , n < 10), a zatim izračunava i ispisuje proizvod ta dva polinoma.

#include <stdio.h>#include <stdio.h>#define MAX 10#define MAX 10main()main(){ { int int a[MAX]a[MAX], , b[MAX], b[MAX], cc[2*MAX]={0};[2*MAX]={0}; int i,j,m,n;int i,j,m,n; printf(”Polinom A:\n”);printf(”Polinom A:\n”); do do { { printf(”Stepen polinoma A (m) je:”); printf(”Stepen polinoma A (m) je:”); scanf(”%d”, &m); scanf(”%d”, &m); } } while ((m<0) || (m>=MAX));while ((m<0) || (m>=MAX)); for ( ifor ( i==m; i>=0; i-- )m; i>=0; i-- ) { { printf(”Unesite koeficijent a%d: ”,i);printf(”Unesite koeficijent a%d: ”,i); scanf(”%d”, &a[i]); scanf(”%d”, &a[i]); }}

Page 101: FSR - Uvod u c++

101

1.3.1. 1.3.1. PoljaPolja

NIZOVINIZOVI ? ?

printf(”Polinom B:\n”);printf(”Polinom B:\n”); do do { { printf(”Stepen polinoma B (n) je:”); printf(”Stepen polinoma B (n) je:”); scanf(”%d”, &n); scanf(”%d”, &n); } } while ((n<0) || (n>=MAX));while ((n<0) || (n>=MAX)); for ( ifor ( i==n; i>=0; i-- )n; i>=0; i-- ) { { printf(”Unesite koeficijent b%d: ”,i);printf(”Unesite koeficijent b%d: ”,i); scanf(”%d”, &b[i]); scanf(”%d”, &b[i]); }}

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

printf(”Proizvod:\n”);printf(”Proizvod:\n”); for ( ifor ( i==m+n; i>=0; i-- )m+n; i>=0; i-- ) printf(” %da%d ”, c[i], i);printf(” %da%d ”, c[i], i);}}

Page 102: FSR - Uvod u c++

102

1.3.1. 1.3.1. PoljaPolja

NIZOVINIZOVI ? ?

Primjer: Program koji učitava prirodan broj n (n<100), a zatim ispisuje n!

Napomena:Napomena:Standardni prosti tipovi (int, long) omogućavaju maksimalnoStandardni prosti tipovi (int, long) omogućavaju maksimalno

12!=47900160012!=479001600

Rješenje problema?Rješenje problema?Problemi ”velikih brojeva” rješavaju se tako što se broj Problemi ”velikih brojeva” rješavaju se tako što se broj posmatra kao niz cifara!!!posmatra kao niz cifara!!!

f[2]f[4] f[3]00 0 0

f[1]1

f[0]00 0 0 0f[7]f[9] f[8] f[6] f[5]

1!=f[2]f[4] f[3]00 0 0

f[1]2

f[0]00 0 0 0f[7]f[9] f[8] f[6] f[5]

2!=f[2]f[4] f[3]00 0 0

f[1]6

f[0]00 0 0 0f[7]f[9] f[8] f[6] f[5]

3!=f[2]f[4] f[3]00 0 2

f[1]4

f[0]00 0 0 0f[7]f[9] f[8] f[6] f[5]

4!=f[2]f[4] f[3]10 0 2

f[1]0

f[0]00 0 0 0f[7]f[9] f[8] f[6] f[5]

5!=

Page 103: FSR - Uvod u c++

103

1.3.1. 1.3.1. PoljaPolja

NIZOVINIZOVI ? ?

Primjer: Program koji učitava prirodan broj n (n<100), a zatim ispisuje n!

#include <stdio.h>#include <stdio.h>#define MAX#define MAXCIFCIF 10 100000main()main(){ { int fint f[MAX[MAXCIFCIF]={]={11};}; int i,j,nint i,j,n, pom, prenos, pom, prenos;; do do { printf(”{ printf(”n=n=”); scanf(”%d”, &”); scanf(”%d”, &nn); } ); } while ((while ((nn<<11) || () || (n>100n>100));)); for ( ifor ( i==2; i2; i<=n<=n; i; i++++ ) ) for ( j=0, prenos=0; j<MAXCIF; j++ )for ( j=0, prenos=0; j<MAXCIF; j++ ) { { pom = fpom = f[j]*i + prenos;[j]*i + prenos; f[j] = pom % 10;f[j] = pom % 10; prenos = pom / 10;prenos = pom / 10; }} printf(”%d!printf(”%d!==”,n);”,n); for ( j=for ( j=MAXCIF-1; f[j]=MAXCIF-1; f[j]==0; j=0; j---- ) ); /* preskace vodece nule */; /* preskace vodece nule */ for (for (; j>=; j>=0; j0; j---- ) ) printf(”%d”,f[j]); /* ispisuje cifre */printf(”%d”,f[j]); /* ispisuje cifre */}}

Page 104: FSR - Uvod u c++

104

1.3.1. 1.3.1. PoljaPolja

NIZOVINIZOVI ? ?

Primjer: Program koji učitava niz cijelih brojeva, a zatim ih ispisuje u rastućem redoslijedu.

Sortiranje niza:Sortiranje niza:Sortiranje je postupak kojim se mijenja poredak elemenata u Sortiranje je postupak kojim se mijenja poredak elemenata u nizu, kako bi se podaci doveli u željeni redoslijed:nizu, kako bi se podaci doveli u željeni redoslijed:

rastući (ascending)rastući (ascending)opadajući (descending)opadajući (descending)

Rješenje problema?Rješenje problema?Postoji velik broj algoritama za sortiranjePostoji velik broj algoritama za sortiranjeNajpopularniji algoritmi za sortiranje:Najpopularniji algoritmi za sortiranje:

select-sortselect-sortbubble-sortbubble-sortquick-sortquick-sortshell-sortshell-sortstack-sortstack-sort......

Page 105: FSR - Uvod u c++

105

1.3.1. 1.3.1. PoljaPolja

NIZOVINIZOVI ? ?

SELECT-SORT: uzastopni izbor (selekcija) odgovarajućeg elementa

77 22 66 33 22 Polazni niz

a[2]a[0] a[1] a[3] a[4]

1. Prolaz: sređivanje prve pozicije (niz[0])

??????

0 indeks podobnog elementa

2<72<7

1

6<26<2

1

3<23<2

1

2<22<2

1

22 77 66 33 22 Niz nakon 1. prolaza

a[2]a[0] a[1] a[3] a[4]

6<76<7

2

3<63<6

3

2<32<3

4

2. Prolaz: sređivanje druge pozicije (niz[1])

22 ??????

indeks podobnog elementa1

22 22 66 33 77 Niz nakon 2. prolaza

Page 106: FSR - Uvod u c++

106

1.3.1. 1.3.1. PoljaPolja

NIZOVINIZOVI ? ?

22 22 66 33 77 Niz nakon 2. prolaza

a[2]a[0] a[1] a[3] a[4]

3<63<6

3

77<3<3

3

22 22 33 66 77 Niz nakon 3. prolaza

3. Prolaz: sređivanje treće pozicije (niz[2])

22 22 ??????

indeks podobnog elementa2

77<<66

3

22 22 33 66 77 Niz nakon 4. prolaza

indeks podobnog elementa3

4. Prolaz: sređivanje četvrte pozicije (niz[3])

22 22 33 ??????

Page 107: FSR - Uvod u c++

107

1.3.1. 1.3.1. PoljaPolja

NIZOVINIZOVI ? ?

Primjer: Program koji učitava niz cijelih brojeva, a zatim ih ispisuje u rastućem redoslijedu.

#include <stdio.h>#include <stdio.h>#define MAX 10#define MAX 1000main()main(){ { int nizint niz[MAX];[MAX]; int i,j,nint i,j,n, rb, pom, rb, pom;; do do { printf(”{ printf(”n=n=”); scanf(”%d”, &”); scanf(”%d”, &nn); } ); } while ((while ((nn<<11) || () || (n>100n>100));));

for ( ifor ( i=1=1; i; i<<=n; i++ )=n; i++ ) { { printf(”Unesite broj:”);printf(”Unesite broj:”); scanf(”%d”, &scanf(”%d”, &nizniz[i[i-1-1]); }]); }

for ( ifor ( i=0=0; i; i<n-1<n-1; i; i++++ ) ) { { for ( j=i+1, rb=i; j<n; j++ )for ( j=i+1, rb=i; j<n; j++ ) if (nizif (niz[j][j] < niz < niz[[rbrb]]) rb=j;) rb=j; if (rb!=i)if (rb!=i) { pom= { pom=nizniz[i]; [i]; nizniz[i]=[i]=nizniz[rb]; [rb]; nizniz[rb]=pom; }[rb]=pom; } }} printf(”Sortirani niz:”);printf(”Sortirani niz:”); for ( for ( ii==0; i<n0; i<n; ; i++i++ ) ) printf(” %d”,niz[i]); printf(” %d”,niz[i]);}}

Page 108: FSR - Uvod u c++

108

1.3.1. 1.3.1. PoljaPolja

MATRICEMATRICE ? ?

Dvodimenzionalna poljaDvodimenzionalna poljaElement niza moElement niza može da bude novi nizže da bude novi niz

tako dobijamo dvodimenzionalno polje (matrica)tako dobijamo dvodimenzionalno polje (matrica)

...0 1 j ... m-1

0

1

i

n-1

red (vrsta)red (vrsta)

kolonakolona(stupac)(stupac)mat[i][j]

mat[1][0]

mat[n-1][m-1]

Page 109: FSR - Uvod u c++

109

1.3.1. 1.3.1. PoljaPolja

MATRICEMATRICE ? ?

Deklaracija matriceDeklaracija matriceOpOpšti oblik deklaracije:šti oblik deklaracije:

tip tip imeime_mat [D1][D2] = { {L1},{L2},...,{Ln-1} }_mat [D1][D2] = { {L1},{L2},...,{Ln-1} }

tip matrice (tip podataka) ime matrice

dimenzije matrice D1 = broj redovaD2 = broj kolona

rezerviše se potreban broj bajtova za memorisanje D1*D2 elemenata

vrijednosti elemenata u matrici inicijalizacija matrice

nije obavezno inicijalizovanje

Page 110: FSR - Uvod u c++

110

MEMORIJA

fizičkafizička predstavapredstava

1.3.1. 1.3.1. PoljaPolja

MATRICEMATRICE ? ?

Deklaracija matriceDeklaracija matricePrimjer deklaracije:Primjer deklaracije:

charchar tablica[2][3];tablica[2][3];

20 1

0

1

llogiogiččka ka predstavapredstavatablicatablica[0][0][0][0]

tablicatablica[0][[0][11]]

tablicatablica[0][[0][22]]

tablicatablica[[11][0]][0]

tablicatablica[[11][][11]]

tablicatablica[[11][][22]]

Page 111: FSR - Uvod u c++

111

1.3.1. 1.3.1. PoljaPolja

MATRICEMATRICE ? ?

Deklaracija matriceDeklaracija matricePrimjer deklaracije sa inicijalizacijom:Primjer deklaracije sa inicijalizacijom:

int matint mat[2][3][2][3] = = { {3,1,8}, {2,5,6} };{ {3,1,8}, {2,5,6} };20 1

83 1

62 5

0

1

Primjer deklaracije sa inicijalizacijom:Primjer deklaracije sa inicijalizacijom:

int matint mat[2][3][2][3] = = { {3,1,8} };{ {3,1,8} };20 1

83 1

00 0

0

1

Page 112: FSR - Uvod u c++

112

1.3.1. 1.3.1. PoljaPolja

MATRICEMATRICE ? ?

ManipulacijaManipulacija matric matricomomPrimjer učitavanja matrice:Primjer učitavanja matrice:

for ( for ( red=1red=1; ; red<red<=n; =n; redred++ )++ ) for ( kolfor ( kol=1=1; kol; kol<<=m; kol++ )=m; kol++ ) { { printf(”printf(”matmat[%d][%d]=”,red-1,kol-1);[%d][%d]=”,red-1,kol-1); scanf(”%d”, &mat[redscanf(”%d”, &mat[red-1-1][kol-1]); ][kol-1]); }}

iliili::

for ( for ( red=red=0; 0; red<red<n; n; redred++ )++ ) for ( kolfor ( kol==0; kol0; kol<<m; kol++ )m; kol++ ) { { printf(”printf(”matmat[%d][%d]=”,red,kol);[%d][%d]=”,red,kol); scanf(”%d”, &mat[red][kol]); scanf(”%d”, &mat[red][kol]); }}

Page 113: FSR - Uvod u c++

113

1.3.1. 1.3.1. PoljaPolja

MATRICEMATRICE ? ?

ManipulacijaManipulacija matric matricomomPrimjer Primjer ispisivanjaispisivanja matrice: matrice:

for ( for ( red=1red=1; ; red<red<=n; =n; redred++ )++ ) { { for ( kolfor ( kol=1=1; kol; kol<<=m; kol++ )=m; kol++ ) printf(” %4d”,mat[red-1][kol-1]);printf(” %4d”,mat[red-1][kol-1]); printf(”\n”);printf(”\n”); }}

iliili::

for ( for ( red=red=0; 0; red<red<n; n; redred++ )++ ) { { for ( kolfor ( kol==0; kol0; kol<<m; kol++ )m; kol++ ) printf(” %4d”,mat[red][kol]);printf(” %4d”,mat[red][kol]); printf(”\n”);printf(”\n”); }}

Page 114: FSR - Uvod u c++

114

1.3.1. 1.3.1. PoljaPolja

MATRICEMATRICE ? ?

ManipulacijaManipulacija matric matricomomPrimjer Primjer manipulacije glavnom dijagonalom:manipulacije glavnom dijagonalom:

mat[0][0]mat[1][1]

mat[i][i]

mat[n-1][n-1]

Ispis elemenata na glavnoj dijagonali:Ispis elemenata na glavnoj dijagonali:

printf(”Glavna dijagonala: ”);printf(”Glavna dijagonala: ”); for ( ifor ( i==0; i0; i<<n; i++ ) printf(” %d”, mat[i][i]);n; i++ ) printf(” %d”, mat[i][i]);

Suma elemenata na glavnoj dijagonali:Suma elemenata na glavnoj dijagonali:

for ( s=ifor ( s=i==0; i0; i<<n; i++ ) s+=mat[i][i];n; i++ ) s+=mat[i][i]; printf(”Suma elemenata na GD: %d”,s);printf(”Suma elemenata na GD: %d”,s);

mat[i][j], i=jmat[i][j], i=j

Page 115: FSR - Uvod u c++

115

1.3.1. 1.3.1. PoljaPolja

MATRICEMATRICE ? ?

ManipulacijaManipulacija matric matricomomPrimjer Primjer manipulacije sporednom dijagonalom:manipulacije sporednom dijagonalom:

mat[0][n-1]mat[1][n-2]

...

mat[n-1][0]

Ispis elemenata na sporednoj dijagonali:Ispis elemenata na sporednoj dijagonali:

printf(”Sporedna dijagonala: ”);printf(”Sporedna dijagonala: ”); for ( ifor ( i==n-1; i>=0; i-- ) printf(” %d”, mat[i][n-1-i]);n-1; i>=0; i-- ) printf(” %d”, mat[i][n-1-i]);

Suma elemenata na sporednoj dijagonali:Suma elemenata na sporednoj dijagonali:

for ( s=ifor ( s=i==0; i0; i<<n; i++ ) s+=mat[i][n-1-i];n; i++ ) s+=mat[i][n-1-i]; printf(”Suma elemenata na SD: %d”,s);printf(”Suma elemenata na SD: %d”,s);

mat[i][j],i+j=n-1mat[i][j],i+j=n-1

Page 116: FSR - Uvod u c++

116

1.3.1. 1.3.1. PoljaPolja

MATRICEMATRICE ? ?

ManipulacijaManipulacija matric matricomomPrimjer Primjer manipulacije donjom trougaonom matricom:manipulacije donjom trougaonom matricom:

Ispis donje trougaone matrice:Ispis donje trougaone matrice:

printf(”Donja trougaona matrica:\n ”);printf(”Donja trougaona matrica:\n ”); for ( ifor ( i==0; i<n; i++ ) 0; i<n; i++ ) { { for ( j=0; j<=i; j++ )for ( j=0; j<=i; j++ ) printf(” %4d”, mat[i][j]);printf(” %4d”, mat[i][j]); printf(”\n”);printf(”\n”); }}

mat[i][j],j<=imat[i][j],j<=i

Page 117: FSR - Uvod u c++

117

1.3.1. 1.3.1. PoljaPolja

MATRICEMATRICE ? ?

ManipulacijaManipulacija matric matricomomPrimjer Primjer manipulacije gornjom trougaonom matricom:manipulacije gornjom trougaonom matricom:

Ispis gornje trougaone matrice:Ispis gornje trougaone matrice:

printf(”Gornja trougaona matrica:\n ”);printf(”Gornja trougaona matrica:\n ”); for ( ifor ( i==0; i<n; i++ ) 0; i<n; i++ ) { { for ( j=1; j<=i; j++ ) printf(”%5c”,’ ’)for ( j=1; j<=i; j++ ) printf(”%5c”,’ ’) for ( j=i; j<n; j++ ) printf(” %4d”, mat[i][j]);for ( j=i; j<n; j++ ) printf(” %4d”, mat[i][j]); printf(”\n”);printf(”\n”); }}

mat[i][j],j>=imat[i][j],j>=i

Page 118: FSR - Uvod u c++

118

transponovana matricatransponovana matrica

1.3.1. 1.3.1. PoljaPolja

MATRICEMATRICE ? ?

ManipulacijaManipulacija matric matricomomPrimjer Primjer transponovanja matricetransponovanja matrice

23

1 4

65

789

3264

7 8

15

9

polazna matricapolazna matrica

Ispis transponovane matrice Ispis transponovane matrice na osnovu originalne matrice:na osnovu originalne matrice:

printf(”Transponovana:\n ”);printf(”Transponovana:\n ”); for ( ifor ( i==0; i<n; i++ ) 0; i<n; i++ ) { { for ( j=0; j<n; j++ ) for ( j=0; j<n; j++ ) printf(” %4d”, mat[j][i]);printf(” %4d”, mat[j][i]); printf(”\n”);printf(”\n”); }}

Transponovanje matrice: Transponovanje matrice:

for ( ifor ( i==0; i<n; i++ ) 0; i<n; i++ ) for ( j=i+1; j<n; j++ ) for ( j=i+1; j<n; j++ ) { { pom=mat[i][j]);pom=mat[i][j]); mat[i][j]=mat[j][i];mat[i][j]=mat[j][i]; mat[j][i]=pom;mat[j][i]=pom; }}

Page 119: FSR - Uvod u c++

119

1.3.1. 1.3.1. PoljaPolja

MATRICEMATRICE ? ?

ManipulacijaManipulacija matric matricomomPrimjer Primjer mnomnoženja dvije matriceženja dvije matrice

32

1 0

1

264 5

MatricaMatrica A A

(m*n)(m*n)

3214

7 1

12

0

MatricaMatrica B B

(n*p)(n*p)

*

MatricaMatrica C C

(m*p)(m*p)

???30???66???15

9244

5173

Množenje matrica:Množenje matrica:

for ( ifor ( i==0; i<m; i++ ) 0; i<m; i++ ) /* red matrice C *//* red matrice C */ for ( j=for ( j=00; j<p; j++ ) ; j<p; j++ ) /* kolona matrice C *//* kolona matrice C */ for ( k=0; k<n; k++ )for ( k=0; k<n; k++ ) c[i][j]+=a[i][k]*b[k][j]; c[i][j]+=a[i][k]*b[k][j];

Page 120: FSR - Uvod u c++

120

1.3.1.1.3.1. Polja Polja

VIŠE DIMENZIJE?VIŠE DIMENZIJE?

VišeVišedimenzionalna poljadimenzionalna poljaC omogućava i manipulaciju višedimenzionalnim poljimaC omogućava i manipulaciju višedimenzionalnim poljima

kocka[sloj][red][kolona]

Trodimenzionalno poljeTrodimenzionalno polje

tip imetip ime[[d1d1][][d2d2][][d3d3];];

Primjer deklaracije:Primjer deklaracije:

int kockaint kocka[[33][][66][][66];];

Primjer 4-dim. polja:Primjer 4-dim. polja:

char P4char P4[[d1d1][][d2d2][][d3d3][][d4d4];];

Page 121: FSR - Uvod u c++

121

1.3.1.3.22. . StruktureStrukture

STRUKTURASTRUKTURA??

StruktureStruktureStruktura je skup heterogenih podataka meStruktura je skup heterogenih podataka međusobno logički povezanihđusobno logički povezanih

Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog)

Atributi?Atributi?

prezimevisina

ime

struct osoba struct osoba {{

char prezime[15];char prezime[15];

char ime[15];char ime[15];

int visina;int visina;

}}

Page 122: FSR - Uvod u c++

122

1.3.1.3.22. . StruktureStrukture

STRUKTURASTRUKTURA??

Deklaracija struktureDeklaracija struktureOpOpšti oblik deklaracije:šti oblik deklaracije:

struct ime struct ime {{ tip1tip1 element1element1;; tip2tip2 element2element2;; ...... tipNtipN elementNelementN;;

}} lista_promjenljivih; lista_promjenljivih;

ključna riječ

ime strukture

Deklaracija elementa (polja)

lista promjenljivih ovog tipaPrimjer:Primjer:

struct osoba struct osoba {{ char prezime[15];char prezime[15]; char ime[15];char ime[15]; int visina;int visina; }} student1, student2, student1, student2, klub[100];klub[100];

Page 123: FSR - Uvod u c++

123

1.3.1.3.22. . StruktureStrukture

STRUKTURASTRUKTURA??

Deklaracija struktureDeklaracija struktureAlternativniAlternativni oblik deklaracije: oblik deklaracije:

struct ime struct ime {{ tip1tip1 element1element1;; ...... tipNtipN elementNelementN;; }};;struct ime lista_promjenljivih;struct ime lista_promjenljivih;

Npr:Npr:

struct osoba struct osoba {{ char ime[15];char ime[15]; int visina;int visina; };}; struct osobastruct osoba student, student, klub[100];klub[100];

Strukture u jeziku C++Strukture u jeziku C++Identifikator strukture može da se koristi i kao identifikator tipa bez korišćenja ključne riječi struct

Primjer:Primjer:

struct osoba struct osoba {{ char ime[15];char ime[15]; int visina;int visina; };};

osobaosoba student, student, klub[100];klub[100];

Page 124: FSR - Uvod u c++

124

1.3.1.3.22. . StruktureStrukture

STRUKTURASTRUKTURA??

Strukture u jeziku C++Strukture u jeziku C++U slučaju da u istom bloku postoji neki podatak prostog tipa i struktura sa istim imenom tada se mora koristiti ključna riječ struct

Primjer:Primjer:

struct struct alfaalfa { int a, b, c{ int a, b, c };};

struct osoba struct osoba {{ char ime[15];char ime[15]; int visina;int visina; };};

intint alfa;alfa;

alfa = 65;alfa = 65;

struct alfa a = { 1, 2, 3 };struct alfa a = { 1, 2, 3 };

osobaosoba student, student, klub[100];klub[100];

Page 125: FSR - Uvod u c++

125

1.3.1.3.22. . StruktureStrukture

STRUKTURASTRUKTURA??

Pristup elementima (poljima) strukturePristup elementima (poljima) strukturePristup pomoPristup pomoću operatoraću operatora

””.” = ELEMENT STRUKTURE .” = ELEMENT STRUKTURE

Primjer:Primjer:

struct osoba struct osoba {{ char prezime[15];char prezime[15]; char ime[15];char ime[15]; int visina;int visina; }} student, student, klub[100];klub[100];

Pristup poljima:Pristup poljima:

student.prezimestudent.prezime = ”Markovic”; = ”Markovic”; klubklub[1][1].prezime.prezime = ”Jankovic”; = ”Jankovic”;student.imestudent.ime = ”Marko”; = ”Marko”; klubklub[1][1]..ime = ”Janko”;ime = ”Janko”;student.visinastudent.visina = 190; = 190; klubklub[1][1]..visina = 202;visina = 202;

Page 126: FSR - Uvod u c++

126

1.3.1.3.22. . StruktureStrukture

STRUKTURASTRUKTURA??

Primjer: Manipulacija kompleksnim brojevima pomoPrimjer: Manipulacija kompleksnim brojevima pomoću struktureću strukture

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

main()main()

{{

struct kompleks struct kompleks {{ floatfloat re,im re,im;; };};

kompleks x = { 3.0, 2.0 };kompleks x = { 3.0, 2.0 }; kompleks y = { 2.0, 3.0 };kompleks y = { 2.0, 3.0 };

kompleks zbir, proizvod;kompleks zbir, proizvod;

zbir.re = x.re + y.re;zbir.re = x.re + y.re; zbir.im = x.im + y.im;zbir.im = x.im + y.im;

proizvod.re = x.re*y.re – x.im*y.im;proizvod.re = x.re*y.re – x.im*y.im; proizvod.im = x.re*y.im + x.im*y.re;proizvod.im = x.re*y.im + x.im*y.re;

printf(”Zbir je: %5.2f + j%5.2f\n”, zbir.re, zbir.im);printf(”Zbir je: %5.2f + j%5.2f\n”, zbir.re, zbir.im); printf(”Proizvod je: %5.2f + j%5.2f\n”, proizvod.re, proizvod.im);printf(”Proizvod je: %5.2f + j%5.2f\n”, proizvod.re, proizvod.im);}}

Page 127: FSR - Uvod u c++

127

1.3.1.3.22. . StruktureStrukture

STRUKTURASTRUKTURA??

Struktura kao element struktureStruktura kao element struktureStruktura moStruktura može da bude element neke druge struktureže da bude element neke druge strukture

Primjer:Primjer:

struct datum struct datum { { int danint dan, , mjesecmjesec, , godina;godina; }; };

struct osoba {struct osoba { char prezime[15];char prezime[15]; char ime[15]; char ime[15]; int visina;int visina; datum rodjen;datum rodjen; }} student student;;

Pristup poljima:Pristup poljima:

student.prezimestudent.prezime = ”Markovic”; = ”Markovic”; student.imestudent.ime = ”Marko”; = ”Marko”;student.visinastudent.visina = 190; = 190; student.rodjen.dan = 1;student.rodjen.dan = 1;student.rodjen.mjesec = 4;student.rodjen.mjesec = 4;student.rodjen.godina = 1980;student.rodjen.godina = 1980;

Page 128: FSR - Uvod u c++

128

1.3.1.3.22. . StruktureStrukture

STRUKTURASTRUKTURA??

Primjer: Manipulacija taPrimjer: Manipulacija tačkom u dvodimenzionalnom koordinatnom sistemučkom u dvodimenzionalnom koordinatnom sistemu

xx

yy

A(x,y)A(x,y)

xx

yy

A(xA(xAA,y,yAA))

B(xB(xBB,y,yBB))

dd

#include <stdio.h>#include <stdio.h>#include <math.h>#include <math.h>#define KV(x) (x)*(x)#define KV(x) (x)*(x)

main()main()

{{

struct struct tackatacka {{ floatfloat xx,,y;y; } a,b;} a,b;

float d;float d;

printf(”A: x=”); scanf(”%f”, &a.x);printf(”A: x=”); scanf(”%f”, &a.x); printf(”A: y=”); scanf(”%f”, &a.y);printf(”A: y=”); scanf(”%f”, &a.y);

printf(”B: x=”); scanf(”%f”, &b.x);printf(”B: x=”); scanf(”%f”, &b.x); printf(”B: y=”); scanf(”%f”, &b.y);printf(”B: y=”); scanf(”%f”, &b.y);

d = sqrt( KV(a.x-b.x) + KV(a.y-b.y));d = sqrt( KV(a.x-b.x) + KV(a.y-b.y));

printf(”Udaljenost: %5.2f”, d);printf(”Udaljenost: %5.2f”, d);

} }

Page 129: FSR - Uvod u c++

129

1.3.1.3.22. . StruktureStrukture

STRUKTURASTRUKTURA??

Primjer:Primjer: Program Program koji učitava koordinate vrhova poligona, koji učitava koordinate vrhova poligona, papa ispisuje ispisuje njegov obim.njegov obim.

#include <stdio.h>#include <stdio.h>#include <math.h>#include <math.h>#define KV(x) (x)*(x)#define KV(x) (x)*(x)main()main(){ { struct struct tackatacka {{ floatfloat xx,,y;y; } } polpol[100];[100]; float ob=0;float ob=0; int i,n;int i,n; do do { printf(”Broj vrhova: ”); scanf(”%d”, &n); }{ printf(”Broj vrhova: ”); scanf(”%d”, &n); } while ((n<3) || (n>100));while ((n<3) || (n>100)); for (i=1; i<=n; i++)for (i=1; i<=n; i++) { printf(”%d. vrh:\n”, i);{ printf(”%d. vrh:\n”, i); printf(” x=”); scanf(”%f”, &pol[i-1].x);printf(” x=”); scanf(”%f”, &pol[i-1].x); printf(” y=”); scanf(”%f”, &pol[i-1].y); }printf(” y=”); scanf(”%f”, &pol[i-1].y); } for (i=1; i<n; i++)for (i=1; i<n; i++) ob += sqrt( KV(pol[i].x-pol[i-1].x)+ KV(pol[i].y-pol[i-1].y));ob += sqrt( KV(pol[i].x-pol[i-1].x)+ KV(pol[i].y-pol[i-1].y)); ob += sqrt( KV(pol[0].x-pol[n-1].x)+ KV(pol[0].y-pol[n-1].y));ob += sqrt( KV(pol[0].x-pol[n-1].x)+ KV(pol[0].y-pol[n-1].y)); printf(”Obim: %5.2f”, ob);printf(”Obim: %5.2f”, ob);} }

AA00(x(x00,y,y00))

AA11(x(x11,y,y11))

AA22

AA33

AA44

Page 130: FSR - Uvod u c++

130

1.3.1.3.33.. UnijeUnije

UNIJAUNIJA??

UnijeUnijeUnija je skup Unija je skup podataka različitih tipova smještenih u istom memorijskom prostoru.podataka različitih tipova smještenih u istom memorijskom prostoru.

Podaci u uniji nisu međusobno nezavisni, jer koriste isti memorijski prostor.Podaci u uniji nisu međusobno nezavisni, jer koriste isti memorijski prostor.

Promjena jednog podatka može dovesti i do promjene drugog podatka u uniji.Promjena jednog podatka može dovesti i do promjene drugog podatka u uniji.

Unija zauzima u memoriji onoliko bajtova koliko je potrebno za memorisanje Unija zauzima u memoriji onoliko bajtova koliko je potrebno za memorisanje najvećeg podatka u unijinajvećeg podatka u uniji

MEMORIJA

Podatak1Podatak1(2 bajta)(2 bajta)

Podatak2Podatak2(1 bajt)(1 bajt)

Zajednička oblastza podatak1 i za podatak2 Unija zauzima

ukupno 2 bajta

Page 131: FSR - Uvod u c++

131

1.3.3. 1.3.3. UnijeUnije

UNIJAUNIJA??

Deklaracija Deklaracija unijeunijeOpOpšti oblik deklaracije:šti oblik deklaracije:

union ime union ime {{ tip1tip1 element1element1;; tip2tip2 element2element2;; ...... tipNtipN elementNelementN;;

}} lista_promjenljivih; lista_promjenljivih;

ključna riječ

ime unije

Deklaracija elementa (polja)

lista promjenljivih ovog tipaPrimjer:Primjer:

union unija union unija {{ char char c;c; intint ii;; }} x; x;

Page 132: FSR - Uvod u c++

132

1.3.3. 1.3.3. UnijeUnije

UNIJAUNIJA??

Deklaracija Deklaracija unijeunijeAlternativniAlternativni oblik deklaracije: oblik deklaracije:

union ime union ime {{ tip1tip1 element1element1;; tip2tip2 element2element2;; ...... tipNtipN elementNelementN;; }};;unionunion ime lista_prom; ime lista_prom;

Primjer:Primjer:

union unija union unija {{ char char cc;; int iint i;; floatfloat ff;; };}; unionunion unija xunija x;;

Pristup elementima (poljima) unijePristup elementima (poljima) unijexx..i = 100;i = 100;

x.c = ’A’;x.c = ’A’;

Page 133: FSR - Uvod u c++

133

1.3.3. 1.3.3. UnijeUnije

UNIJAUNIJA??

Primjer:Primjer:

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

union unija union unija {{ char char cc;; int iint i;; };};

main()main()

{{

union unija xunion unija x;;

x.i = 0x141;x.i = 0x141;

printf(”printf(”x.i = %dx.i = %d\n”, x.i);\n”, x.i);

printf(”printf(”x.x.cc = % = %c\n”, x.c);c\n”, x.c);

}}

MEMORIJA

4141

0101x.ix.i

x.cx.c

x.i = 321

x.c = A

Page 134: FSR - Uvod u c++

134

1.3.1.3.33. . UnijeUnije

UNIJAUNIJA??

UnijaUnija u jeziku C++ u jeziku C++

U slučaju da u istom bloku postoji neki podatak prostog tipa i unija sa istim imenom tada se mora koristiti ključna riječ union

Identifikator unije može da se koristi i kao identifikator tipa bez korišćenja ključne riječi union

Primjer:Primjer:

unionunion alfaalfa {{ double a,b,c;double a,b,c; };};

alfa a1, a2;alfa a1, a2;

Primjer:Primjer:

unionunion alfaalfa { int a, b, c{ int a, b, c };}; intint alfa;alfa; alfa = 65;alfa = 65; union alfa a1, a2 = { 1, 2, 3 };union alfa a1, a2 = { 1, 2, 3 };

Page 135: FSR - Uvod u c++

135

1.3.1.3.33. . UnijeUnije

BEZIMENA UNIJABEZIMENA UNIJA??

Bezimena unijaBezimena unijaU jeziku C++ unije mogu da se definišu bez navođenja identifikatora iza ključne riječi union. Takve unije zovu se bezimene unije.

Članovi bezimene unije ponašaju se kao “obične promjenljive”

Primjer:Primjer:

unionunion {{ int int i; char i; char c;c; };};

char d;char d;

i = 65i = 65;;

d = c;d = c;

Promjenjljive i,c su elementi bezimene unije i pristupa im se kao

“običnim” promjenljivima

Unija za koju je definisan neki podatak nije bezimena. Elementima takve unije pristupa se preko identifikatora i operatora “.”

Primjer:Primjer:

unionunion {{ int int i; char i; char c;c; }} u u;; char d; char d; u.i = 65u.i = 65;; d = u.c; d = u.c;

Page 136: FSR - Uvod u c++

136

1.3.1.3.44. . Definisanje tipovaDefinisanje tipova

Kako definisati Kako definisati vlastiti tipvlastiti tip??

Definisanje korisniDefinisanje korisniččkihkih tipova tipovaC omogućava:C omogućava:

definisanje korisničkih tipovadefinisanje korisničkih tipova

promjenu imena postojećim tipovimapromjenu imena postojećim tipovima

Opšti oblik:Opšti oblik:

typedef staritip novitip;typedef staritip novitip;

Primjeri:Primjeri:

typedef int INTEGER;typedef int INTEGER; INTEGER i,j;INTEGER i,j; ----------------------------------------------

typedef float NIZtypedef float NIZ[100][100];;NIZ niz1, niz2;NIZ niz1, niz2;

----------------------------------------------

typedef typedef struct {struct { int i;int i; char c;char c; }} TIPTIP;; TIP niz[10];TIP niz[10];

Page 137: FSR - Uvod u c++

137

1.3. 1.3. Složeni tipovi podatakaSloženi tipovi podataka

ZADACI ZAZADACI ZA VJEŽB VJEŽBUU......

Zadaci:Zadaci:

1. Napisati program koji učitava N brojeva, a zatim ispisuje sve one koji su pozitivni, kao i njnihov ukupan broj.

2. Napisati program koji učitava N brojeva, a zatim ispisuje sve one elemente niza koji se ne ponavljaju.

3. Napisati program koji učitava N brojeva, a zatim ispisati koliko se puta svaki od njih ponavlja u tom nizu.

4. Napisati program koji učitava N brojeva, a zatim ispisati sve parne brojeve iz tog niza koji su veći od aritmetičke sredine niza.

5. Napisati program koji učitava dvije kvadratne matrice, a zatim ispisuje njihov zbir.

6. Napisati program koji učitava matricu, a zatim ispisuje sve elemente matrice veće od najvećeg elementa na glavnoj dijagonali.

7. Učitati matricu, pa ispisati sve elemente matrice poredane od najvećeg do najmanjeg.

8. Učitati matricu, pa ispisati sve elemente matrice iznad glavne dijagonale poredane od najvećeg do najmanjeg.

9. Ako bi se na prvo polje šahovske table stavilo jedno zrno, a na svako sljedeće polje dvostruko više nego na prethodno, izračunati koliko bi se zrna nalazilo na posljednjem (64-om) polju, odnosno koliko bi ukupno zrna trebalo da bude na tabli.

Page 138: FSR - Uvod u c++

138

1.1.44. . FunkcijeFunkcije

POTPROGRAMI ?POTPROGRAMI ?

PotprogramiPotprogramiPrilikom razvoja algoritma mogu da se uoče logičke cjeline koje se često Prilikom razvoja algoritma mogu da se uoče logičke cjeline koje se često puta ponavljaju, najčešće nad različitim skupom podataka. Takve cjeline puta ponavljaju, najčešće nad različitim skupom podataka. Takve cjeline treba izdvojiti u zasebne programske cjeline – potprograme.treba izdvojiti u zasebne programske cjeline – potprograme.

Korištenjem potprograma:Korištenjem potprograma:povećava se preglednost programa,povećava se preglednost programa,smanjuje se veličina programa,smanjuje se veličina programa,postiže se univerzalnost koda,postiže se univerzalnost koda,omogućava se lakše otklanjanje grešaka.omogućava se lakše otklanjanje grešaka.

U programskim jezicima obično se implementiraju:U programskim jezicima obično se implementiraju:proceduralni potprogrami (proceduralni potprogrami (procedureprocedure))funkcijski potprogrami (funkcijski potprogrami (funkcijefunkcije))

Programski jezik C ima implementirane samo funkcijske potprograme.Programski jezik C ima implementirane samo funkcijske potprograme.

Page 139: FSR - Uvod u c++

139

1.1.44.. FunkcijeFunkcije

FUNKCIJE ?FUNKCIJE ?

FunkcijeFunkcijeFunkcija se obično definiše kao potprogram koji na osnovu određenog broja Funkcija se obično definiše kao potprogram koji na osnovu određenog broja argumenata argumenata daje jedan rezultatdaje jedan rezultat..

Podatak koji funkcija vraća glavnom programu naziva se Podatak koji funkcija vraća glavnom programu naziva se vrijednost funkcijevrijednost funkcije..

Pod Pod tipom funkcijetipom funkcije podrazumijeva se tip podatka koji vraća funkcija. podrazumijeva se tip podatka koji vraća funkcija.

Proceduralni potprogrami (u drugim programskim jezicima) mogu da Proceduralni potprogrami (u drugim programskim jezicima) mogu da vraćaju više podataka. Zbog toga, funkcije u C-u imaju implementiranu vraćaju više podataka. Zbog toga, funkcije u C-u imaju implementiranu mogućnost da osim rezultata – vrijednost funcije, vrate više podataka kroz mogućnost da osim rezultata – vrijednost funcije, vrate više podataka kroz razmjenu argumenata. razmjenu argumenata. Efekat kad funkcija kroz argumente vraća rezultate Efekat kad funkcija kroz argumente vraća rezultate naziva senaziva se bočni efekatbočni efekat..

Funkcija može u potunosti da se ponaša kao procedura, tj. može da daje samo Funkcija može u potunosti da se ponaša kao procedura, tj. može da daje samo bočne efekte.bočne efekte.

Page 140: FSR - Uvod u c++

140

1.1.44. . FunkcijeFunkcije

FUNKCIJE ?FUNKCIJE ?

Definicija funkcijeDefinicija funkcijeOpOpšti oblik definicije funkcije:šti oblik definicije funkcije:

tip ime (arg1, arg2, ... , argN)tip ime (arg1, arg2, ... , argN)

definicija_formalnih_argumenata;definicija_formalnih_argumenata;

{{

definicija_lokalnih_promjenljivih; definicija_lokalnih_promjenljivih;

programski_iskazi;programski_iskazi;

return (izraz); return (izraz); }}

tip funkcije

Ako se ne navede podrazumijeva se int

Ako funkcija ne vraća podatak, tip je void

lista formalnih argumenata parametri kroz koje funkcija

prima podatke (vrijednosti ili adrese)

definicija tipova argumenata

ime funkcije identifikator u skladu sa sintaksom jezika

definicija lokalnih promjenljivih

promjenljive koje se koriste u funkciji,

nisu vidljive izvan funkcije

izlaz iz funkcije i vraćanje vrijednosti datog tipa

U tijelu funkcije može biti biti više return iskaza

Ako funkcija ne vraća ništa, return može da se izostavi.

Page 141: FSR - Uvod u c++

141

1.1.44. . FunkcijeFunkcije

FUNKCIJE ?FUNKCIJE ?

Definicija funkcijeDefinicija funkcijeAlternativni oblik definicije funkcije:Alternativni oblik definicije funkcije:

tip ime ( tip ime ( tip1 arg1, tip2 arg2, ... , tipN tip1 arg1, tip2 arg2, ... , tipN argN argN ))

{{ definicija_lokalnih_promjenljivih; definicija_lokalnih_promjenljivih; programski_iskazi;programski_iskazi; return (izraz); return (izraz); }}

definicija tipova argumenata sadržana je

u listi argumenata

Poziv funkcijePoziv funkcijeOpšti oblik poziva funkcije:Opšti oblik poziva funkcije:

ime ( sarg1, sarg2, ... , sargN )ime ( sarg1, sarg2, ... , sargN )

lista stvarnih argumenata parametri koji se šalju u funkciju

(vrijednosti ili adrese)Zovu se stvarni zato što su to

stvarni, realni podaci

Page 142: FSR - Uvod u c++

142

1.1.44. . FunkcijeFunkcije

PROTOTIP ?PROTOTIP ?

Deklaracija funkcije (prototip)Deklaracija funkcije (prototip)Prototip ili deklaracija funkcije predstavlja njen ”opis za spoljašnji svijet”Prototip ili deklaracija funkcije predstavlja njen ”opis za spoljašnji svijet”

Iz prototipa se vidi kako se komunicira s datom funkcijom, jer sadrži:Iz prototipa se vidi kako se komunicira s datom funkcijom, jer sadrži:tip funkcije,tip funkcije,ime funkcije,ime funkcije,tipove (a može i imena) argumenata.tipove (a može i imena) argumenata.

Opšti oblik prototipa:Opšti oblik prototipa:

tip ime ( tip1, tip2, ... , tipN );tip ime ( tip1, tip2, ... , tipN );

Primjer:Primjer:

int zbir( int a, int b )int zbir( int a, int b )

{{ return (a+b); return (a+b); }}

int zbir( int, int );int zbir( int, int );

void poruka ()void poruka ()

{{ printf(”Zdravo!”); printf(”Zdravo!”); }}

void poruka ();void poruka ();

Page 143: FSR - Uvod u c++

143

1.1.44. . FunkcijeFunkcije

STRUKTURA STRUKTURA PROGRAMA ?PROGRAMA ?

Struktura C programaStruktura C programaUobičajena je sljedeća struktura:Uobičajena je sljedeća struktura:

pretprocesorske direktivepretprocesorske direktive

prototip funkcijaprototip funkcija

mainmain

definicija funkcijadefinicija funkcija

Alternativno je moguće i:Alternativno je moguće i:

pretprocesorske direktivepretprocesorske direktive definicija funkcijadefinicija funkcija mainmain

Pogodno kad imamo malen broj funkcija

Ako funkcija zove neku drugu funkciju, funkcija koja se poziva mora biti

prethodno definisana

Primjer:Primjer:

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

void poruka ();void poruka ();

main()main() {{ poruka();poruka(); }}

void poruka ()void poruka () {{ printf(”Zdravo!”); printf(”Zdravo!”); }}

Page 144: FSR - Uvod u c++

144

1.1.44. . FunkcijeFunkcije

FUNKCIJE ?FUNKCIJE ?

Primjer:Primjer: Program Program koji učitava dužine stranica pravougaonika, a zatim ispisujekoji učitava dužine stranica pravougaonika, a zatim ispisuje njegov obim i površinu. Obim treba da se računa u funkciji obim, anjegov obim i površinu. Obim treba da se računa u funkciji obim, a površina u funkciji povrs.površina u funkciji povrs.

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

float obim(float, float);float obim(float, float);

float povrs(floatfloat povrs(float s1 s1, float, float s2 s2););

main()main(){{ float float a,b, o,p;a,b, o,p; printf(”printf(”Stranica aStranica a: ”); scanf(”%d”, &: ”); scanf(”%d”, &aa); ); printf(”printf(”Stranica bStranica b: ”); scanf(”%d”, &: ”); scanf(”%d”, &bb); ); o = obim(a,b);o = obim(a,b); p = povrs(a,b);p = povrs(a,b); printf(”printf(”Obim Obim : : %7.3f%7.3f\n”, o);\n”, o); printf(”Povrsinaprintf(”Povrsina : : %7.3f%7.3f\n”, p);\n”, p);} }

float obim (float x, float y)float obim (float x, float y) { return ( 2*x + 2*y ); }{ return ( 2*x + 2*y ); }

float povrs (float c, float d)float povrs (float c, float d) { return ( c*d ); }{ return ( c*d ); }

Prototip funkcije obim

Navedeni samo tipovi argumenata

Prototip funkcije povrs

Navedeni tipovi i imena argumenata

Poziv funkcije obimPoziv funkcije povrs

Šalju se stvarni podaci a i b

Definicija funkcije obim

Funkcija prihvata proslijeđene vrijednosti (a i b) kroz formalne

argumente x i y

Funkcija izračunava obim 2*x+2*y i to vraća u glavni program

Page 145: FSR - Uvod u c++

145

1.1.44. . FunkcijeFunkcije

FUNKCIJE ?FUNKCIJE ?

Primjer:Primjer: Funkcija koja ne vraća vrijednostFunkcija koja ne vraća vrijednost

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

void kvadrat ( int );void kvadrat ( int );

main()main(){{ intint i,n;i,n;

do do { printf(”{ printf(”n =n = ”); scanf(”%d”, &n); } ”); scanf(”%d”, &n); } while (n<1); while (n<1);

for (i=1; i<=n; i++)for (i=1; i<=n; i++) kvadrat(i);kvadrat(i);} }

void kvadrat (int k)void kvadrat (int k) { { int kv;int kv; kv = k * k;kv = k * k; printf(”%5d %5d\n”, k, kv);printf(”%5d %5d\n”, k, kv); }}

Funkcija kvadrat ne vraća vrijednost (void)

Ovakva funkcija ponaša se kao proceduralni potprogram

n = 4....1 ....1....2 ....4....3 ....9....4 ...16

Page 146: FSR - Uvod u c++

146

1.1.44. . FunkcijeFunkcije

FUNKCIJE ?FUNKCIJE ?

Primjer:Primjer: Program koji ispisuje prvih n prostih brojeva. Program koji ispisuje prvih n prostih brojeva.

Provjera da li je broj prost vrši se u funkciji prost.Provjera da li je broj prost vrši se u funkciji prost.

#include <stdio.h>#include <stdio.h>#include <math.h>#include <math.h>int prost (int);int prost (int);main()main(){{ int i=1, broj=1, n;int i=1, broj=1, n; do do { printf(”{ printf(”n =n = ”); scanf(”%d”, &n); } ”); scanf(”%d”, &n); } while (n<1);while (n<1); printf(printf(”To su”To su brojev brojevii::\n”);\n”);

while (i<=n)while (i<=n)

{{

if ( prost(broj) ) if ( prost(broj) )

{ printf(” %d”, broj); i++; }{ printf(” %d”, broj); i++; }

broj++;broj++;

} }

}}

int prost (intint prost (int b b)){{ int int dd==33, , pom;pom; pom = (b%2) || (b==2);pom = (b%2) || (b==2); while (pom &&while (pom && d<=sqrt(b))d<=sqrt(b)) { { pom = b%2;pom = b%2; d += 2;d += 2; }} return(pom); return(pom);

}}

n = 6To su brojevi: 1 2 3 5 7 11

Page 147: FSR - Uvod u c++

147

1.1.44. . FunkcijeFunkcije

prenos putem prenos putem VRIJEDNOSTI ?VRIJEDNOSTI ?

Prenos parametara u funkciju putem VRIJEDNOSTIPrenos parametara u funkciju putem VRIJEDNOSTIU prethodnim primjerima korišten je prenos parametara putem VRIJEDNOSTI:U prethodnim primjerima korišten je prenos parametara putem VRIJEDNOSTI:

1. prilikom poziva funkcije šalje se vrijednost 1. prilikom poziva funkcije šalje se vrijednost •• kao stvarni argument kao stvarni argument može da se navede: može da se navede: ime promjenljiveime promjenljive, neka , neka konstantakonstanta ili ili izrazizraz•• izračunava se vrijednost izraza i ta vrijednost šalje u funkcijuizračunava se vrijednost izraza i ta vrijednost šalje u funkciju

2. funkcija prihvata vrijednosti u formalne argumente2. funkcija prihvata vrijednosti u formalne argumente•• formalni i stvarni argumenti formalni i stvarni argumenti moraju da se slažu u:moraju da se slažu u:

brojubroju, , redoslijeduredoslijedu i i tiputipu•• formalni argumenti (promjenljive) automatski nastaju prilikomformalni argumenti (promjenljive) automatski nastaju prilikom

ulaska u funkciju i preuzimaju proslijeđene vrijednostiulaska u funkciju i preuzimaju proslijeđene vrijednosti

3. po izlasku iz funkcije formalni argumenti automatski nestaju3. po izlasku iz funkcije formalni argumenti automatski nestaju

•• automatski nastaju i nestaju pa se nazivaju automatski nastaju i nestaju pa se nazivaju automatske promjenljive automatske promjenljive

U funkciji se kreira slika stvarnih argumenata i koriste te slike, a ne stvarne promjenljive iz glavnog programa, zato nakon izlaska iz funkcije promjenljive u

glavnom programu ostaju nepromijenjene!!!

Page 148: FSR - Uvod u c++

148

1.1.44. . FunkcijeFunkcije

prenos putem prenos putem VRIJEDNOSTI ?VRIJEDNOSTI ?

Primjer:Primjer: Ilustracija prenosa parametara putem vrijednosti. Ilustracija prenosa parametara putem vrijednosti.

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

void f (int);void f (int);

main()main(){{ int i=10;int i=10; printf(printf(””main: %dmain: %d\n”\n”,i,i););

f(i);f(i); printf(printf(””main: %dmain: %d\n”\n”,i,i););

}}

void f (int k)void f (int k){{ printf(printf(”f: %d\n”,”f: %d\n”,kk);); kk=20;=20; printf(printf(”f: %d\n”,”f: %d\n”,kk););

}}

main: 10

MEMORIJA

ii1010

kk10102020

f: 10f: 20main: 10

Page 149: FSR - Uvod u c++

149

1.1.44. . FunkcijeFunkcije

prenos VEKTORA u prenos VEKTORA u funkciju ?funkciju ?

VEKTOR (polje) kao argument funkcijeVEKTOR (polje) kao argument funkcije

Prenos vektora (polja) vrši se putem adresePrenos vektora (polja) vrši se putem adrese

1. prilikom poziva funkcije šalje se adresa niza (vektora) 1. prilikom poziva funkcije šalje se adresa niza (vektora) •• kao stvarni argument kao stvarni argument navodi se ime niza navodi se ime niza

(ime niza je početna adresa niza) (ime niza je početna adresa niza) 2. funkcija prihvata adresu niza2. funkcija prihvata adresu niza

•• formalni argument u definicji funkcije mora da sadrži formalni argument u definicji funkcije mora da sadrži [ ][ ]broj elemenata niza ne mora da se navodibroj elemenata niza ne mora da se navodi

•• ne stvara se kopija niza nego se manipuliše stvarnim podacimane stvara se kopija niza nego se manipuliše stvarnim podacima

U funkciji se manipuliše stvarnim podacima, a ne kopijom niza. Zato funkcija može da promijeni niz,

pa po povratku iz funkcije nemamo originalni nego modifikovani niz !!!

Page 150: FSR - Uvod u c++

150

1.1.44. . FunkcijeFunkcije

prenos VEKTORA u prenos VEKTORA u funkciju ?funkciju ?

Primjer:Primjer: Program koji pronalaProgram koji pronalazi najveći element u nizu.zi najveći element u nizu.

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

int max ( int nizint max ( int niz[], int n[], int n););

main()main(){{ int int a[] = { 2,15,5,0,8 }a[] = { 2,15,5,0,8 };; int n = 5;int n = 5; printf(printf(”Najveci”Najveci: %d: %d\n”\n”,, max( a,n ) ); max( a,n ) );

}}

intint maxmax ( int ( int niz[], int nniz[], int n ) ){{ int i, m=niz[0];int i, m=niz[0]; for (i=1; i<n; i++)for (i=1; i<n; i++) if (niz[i]>m) m=a[i];if (niz[i]>m) m=a[i]; return (m);return (m);

}}

Najveci: 15

Formalni argument

deklaracija niza bez dimenzije

moglo je i int niz[5]

Poziv funkcije

šalje se adresa niza

Page 151: FSR - Uvod u c++

151

1.1.44. . FunkcijeFunkcije

prenos VEKTORA u prenos VEKTORA u funkciju ?funkciju ?

Primjer:Primjer: Program koji sortira i ispisuje niz Program koji sortira i ispisuje niz korišćenjem funkcija.korišćenjem funkcija.

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

void sort ( int nizvoid sort ( int niz[], int n[], int n););void pisi ( int nizvoid pisi ( int niz[], int n[], int n););

main()main(){{ int int a[] = { 2,15,5,0,8 }a[] = { 2,15,5,0,8 };; printf(printf(””Prije:Prije:””); pisi(); pisi( a,n ); a,n ); sort( a,n );sort( a,n ); printf(printf(””Poslije:Poslije:””); pisi(); pisi( a,n ); a,n ); }}

void pisi ( int void pisi ( int niz[], int nniz[], int n ) ){{ int iint i;; for (i=for (i=00; i<n; i++); i<n; i++) printf(printf(”” %d %d””, , niz[niz[ii]]); ); printf(printf(”\n””\n”); ); }}

void void sortsort ( int ( int niz[], int nniz[], int n ) ){{ int i,j,rb,pomint i,j,rb,pom;; for (i=for (i=00; i<n-1; i++); i<n-1; i++) {{ for (rb=i, j=i+1; j<n; j++)for (rb=i, j=i+1; j<n; j++) ifif (niz[j]<niz[rb]) rb=j;(niz[j]<niz[rb]) rb=j; if (rb!=i)if (rb!=i) { { pom=niz[i];pom=niz[i]; niz[i]=niz[rb]; niz[i]=niz[rb]; niz[rb]=pom;niz[rb]=pom; }} }}}}

Prije: 2 15 5 0 8Poslije: 0 2 5 8 15

Page 152: FSR - Uvod u c++

152

1.1.44. . FunkcijeFunkcije

prenos prenos MATRICEMATRICE u u funkciju ?funkciju ?

VIVIŠŠEDIMENEDIMENZZIONALNO poljeIONALNO polje kao argument funkcije kao argument funkcije

Prenos višedimenzionalnog polja vrši se putem adresePrenos višedimenzionalnog polja vrši se putem adrese

U deklaraciji formalnih parametara:U deklaraciji formalnih parametara:

•• pprva dimenzija ne mora da se navede (može samo rva dimenzija ne mora da se navede (može samo [ ] )[ ] )

•• ostale dimenzije moraju da se naveduostale dimenzije moraju da se navedu

Primjer:Primjer:

int funkcija (int a[][10][10], int p, int q)int funkcija (int a[][10][10], int p, int q)

iliili

int funkcija (int a[10][10][10], int p, int q)int funkcija (int a[10][10][10], int p, int q)

U funkciji se manipuliše stvarnim podacima, a ne kopijom polja. Zato po povratku iz funkcije nemamo

originalno nego modifikovano polje !!!

Page 153: FSR - Uvod u c++

153

1.1.44. . FunkcijeFunkcije

prenos prenos MATRICEMATRICE u u funkciju ?funkciju ?

Primjer:Primjer: Program koji transponuje kvadratnu matricuProgram koji transponuje kvadratnu matricu..

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

void void trantran ( int ( int m[m[1010][10], int n][10], int n););void pisi ( int void pisi ( int m[10][10], int nm[10][10], int n););

main()main(){{ int int a[a[1010][][1010] = { {1,2},{3,4} }] = { {1,2},{3,4} };; printf(printf(””Prije:Prije:\n”\n”); pisi(); pisi(a,n);a,n); trantran( a,n );( a,n ); printf(printf(””Poslije:Poslije:\n”\n”); pisi(); pisi(a,n);a,n); }}

void pisi (int void pisi (int m[10][10], int nm[10][10], int n)){{ int i,jint i,j;; for (i=for (i=00; i<n; i++); i<n; i++) { { for (j=0; j<n; j++) for (j=0; j<n; j++) printf(printf(”” % %44dd””, , m[m[ii][j]][j]); ); printf(printf(”\n””\n”); ); }}}}

void void trantran (int (int m[10][10], int nm[10][10], int n)){{ int i,j,pomint i,j,pom;; for (i=for (i=00; i<n; i++); i<n; i++) for (j=i+1; j<n; j++)for (j=i+1; j<n; j++) { { pom=m[i][j];pom=m[i][j]; m[i][j]=m[j][i]; m[i][j]=m[j][i]; m[j][i]=pom;m[j][i]=pom; }} }}}}

Prije: 1 2 3 4Poslije: 1 3 2 4

Page 154: FSR - Uvod u c++

154

1.1.44. . FunkcijeFunkcije

prenos prenos STRUKTURESTRUKTURE u funkciju ?u funkciju ?

STRUKTURA STRUKTURA kao argument funkcijekao argument funkcije

Strukura moStrukura može biti argument funkciježe biti argument funkcije

Primjer:Primjer:

voidvoid funkcija ( funkcija ( struct tacka a struct tacka a ))

Ako funkcija vraća strukturu treba definisati tip, a zatim u definiciji/deklaAko funkcija vraća strukturu treba definisati tip, a zatim u definiciji/deklarraciji aciji funkcije navesti da je funkcija toga tipafunkcije navesti da je funkcija toga tipa

Primjer:Primjer:

typedef struct typedef struct {int i,j} TACKA;{int i,j} TACKA;

TACKA funkcija (TACKA funkcija ( TACKATACKA a a, TACKA b, TACKA b ););

Page 155: FSR - Uvod u c++

155

1.1.44. . FunkcijeFunkcije

prenos prenos STRUKTURESTRUKTURE u funkciju ?u funkciju ?

Primjer:Primjer: Program koji manipuliProgram koji manipuliše kompleksnim brojevima.še kompleksnim brojevima.

#include <stdio.h>#include <stdio.h>typedef struct typedef struct { float re,im; } COMPLEX;{ float re,im; } COMPLEX;COMPLEXCOMPLEX dodjeladodjela ( ( float a, float b float a, float b )) { { COMPLEX x;COMPLEX x; x.re=a; x.im=b;x.re=a; x.im=b; return(x);return(x); } } COMPLEXCOMPLEX zbirzbir ( ( COMPLEX x, COMPLEX y COMPLEX x, COMPLEX y )) { { COMPLEX z;COMPLEX z; z.re=x.re+y.re; z.im=x.im+y.im;z.re=x.re+y.re; z.im=x.im+y.im; return(z);return(z); } } main()main(){{ COMPLEX x,y,z;COMPLEX x,y,z; x=dodjela(1,2); y=doDjela(3,4);x=dodjela(1,2); y=doDjela(3,4); z=zbir(x,y);z=zbir(x,y); printf(printf(”(%.2f,%.2f)+(%.2f,%.2f)=(%.2f,%.2f)\n”,”(%.2f,%.2f)+(%.2f,%.2f)=(%.2f,%.2f)\n”, x.re,x.im,y.re,y.im,z.re,z.imx.re,x.im,y.re,y.im,z.re,z.im););}}

Page 156: FSR - Uvod u c++

156

1.1.44. . FunkcijeFunkcije

REKURZIJAREKURZIJA ? ?

Rekurzivne funkcije (REKURZIJE)Rekurzivne funkcije (REKURZIJE)

Rekurzivna funkcija je funkcija koja sama sebe poziva!!!Rekurzivna funkcija je funkcija koja sama sebe poziva!!!

Primjer:Primjer:

faktorijel:faktorijel: n! = n * (n-1)!, n>n! = n * (n-1)!, n>00; 0!=1 ; 0!=1

stepenovanje:stepenovanje: xxnn = x * x = x * xn-1n-1, n>0; x, n>0; x00=1 =1

FibonaFibonaččijevijev niz niz:: ffnn = = ffnn-1-1 * * ffnn-2-2, n>, n>11; ; f f00==0, f0, f11==11

Opšte karakteristike rekurzivnih (rekurentnih) rješenja:Opšte karakteristike rekurzivnih (rekurentnih) rješenja:

•• problem se svodi na rješavanje istog problema, ali jednostavnijegproblem se svodi na rješavanje istog problema, ali jednostavnijeg

•• funkcija poziva samu sebe sve dok se problem ne pojednostavi do trivijalnogfunkcija poziva samu sebe sve dok se problem ne pojednostavi do trivijalnog

•• rekurzivna rješenja su manje efikasna (veći zahtjev za memorijom)rekurzivna rješenja su manje efikasna (veći zahtjev za memorijom)

•• treba ih izbjegavati, ali postoje problemi koji su po prirodi rekurzivni i koje treba ih izbjegavati, ali postoje problemi koji su po prirodi rekurzivni i koje jeje gotovo nemoguće riješiti bez rekurzijegotovo nemoguće riješiti bez rekurzije

Page 157: FSR - Uvod u c++

157

1.1.44. . FunkcijeFunkcije

REKURZIJAREKURZIJA ? ?

Matematski opis rekurzije:Matematski opis rekurzije:

n! = n * (n-1)!, n>0; 0!=1 n! = n * (n-1)!, n>0; 0!=1

Primjer:Primjer: Rekurzivno izračunavanje faktorijela.Rekurzivno izračunavanje faktorijela.

3! = 3 * 2!3! = 3 * 2!

2! = 2 * 1!2! = 2 * 1!

1! = 1 * 0!1! = 1 * 0!

0! = 10! = 1

1*1 = 11*1 = 1

2*1 = 22*1 = 2

3*2 = 63*2 = 6

int fakt (int n)int fakt (int n){ { if (n == 0) if (n == 0) return (1);return (1); elseelse return (n * fakt(n-1));return (n * fakt(n-1));}}

int fakt (int n)int fakt (int n){ { return (n==0 ? 1 : n*fakt(n-1));return (n==0 ? 1 : n*fakt(n-1));}}

Page 158: FSR - Uvod u c++

158

1.1.44. . FunkcijeFunkcije

REKURZIJAREKURZIJA ? ?

Primjer:Primjer: RekurzivnRekurzivna funkcija za konverziju dekadskog u binarni brojni sistem.a funkcija za konverziju dekadskog u binarni brojni sistem.

11991010 = ? = ?22voidvoid konkon (int (int bb)){ { int cif;int cif; cif = b % 2;cif = b % 2; b /= 2;b /= 2; if (b>0) kon (b);if (b>0) kon (b); printf(”%d”,cif); printf(”%d”,cif); }}

19 : 219 : 2

99 11

44 11

22 00

11 00

00 11

11991010 = 10011 = 1001122

1919cif=1cif=1b=9b=9kon(9) => cif=1kon(9) => cif=1 b=4b=4

kon(4) => cif=0kon(4) => cif=0 b=2 b=2

kon(2) => cif=0kon(2) => cif=0 b=1b=1 kon(1) => cif=1kon(1) => cif=1

b=0b=0””1”1”

” ”0” <=0” <= ” ”0” <=0” <=

” ”1” <=1” <= ” ”1” <=1” <=

Page 159: FSR - Uvod u c++

159

1.1.44. . FunkcijeFunkcije

INLINE funkcijeINLINE funkcije ? ?

Neposredno Neposredno ugrađivanje u kodugrađivanje u kod ( (inline funkcijeinline funkcije))Za malene funkcije (sa malo koda) pogodnije je direktno ugrađivanje u kod, Za malene funkcije (sa malo koda) pogodnije je direktno ugrađivanje u kod, nego da se prevode nezavisno i pozivaju iz nekog koda jer se tako ubrzava nego da se prevode nezavisno i pozivaju iz nekog koda jer se tako ubrzava rad, štede resursi ...rad, štede resursi ...

Opšti oblik:Opšti oblik:

inline tip imefunk ( parametri)inline tip imefunk ( parametri) { tijelo } { tijelo }

kvalifikatorkvalifikator funkcijefunkcije

tiptip funkcije funkcije

Prevodilac ne mora da uvaPrevodilac ne mora da uvaži sugestiju da funkcija bude inline. Tada se to ži sugestiju da funkcija bude inline. Tada se to ignoriše i navedena funkcija se ponaša kao “standardna” funkcijaignoriše i navedena funkcija se ponaša kao “standardna” funkcija

Inline funkcije podsjećaju na makroeInline funkcije podsjećaju na makroe• pogodnije su od makroa jer omogućavaju bolju kontrolu argumenatapogodnije su od makroa jer omogućavaju bolju kontrolu argumenata• obrada makroa je prosta leksička obrada (obrada teksta) – može daobrada makroa je prosta leksička obrada (obrada teksta) – može da dovede do neželjenih posljedica u slučaju bočnih efekatadovede do neželjenih posljedica u slučaju bočnih efekata

Page 160: FSR - Uvod u c++

160

1.1.44. . FunkcijeFunkcije

INLINE funkcijeINLINE funkcije ? ?

Primjer:Primjer: #include <iostream.h>#include <iostream.h> #define max(a,b) ((a)>(b))?(a):(b)#define max(a,b) ((a)>(b))?(a):(b) main()main() {{ int a=3, b=2, c;int a=3, b=2, c; c = max(a,b);c = max(a,b); cout << c << endl;cout << c << endl; c = max(++a,++b);c = max(++a,++b); cout << c << endl; cout << c << endl; }}

c = ((a)>(b)) ? (a):(b) ; c = ((a)>(b)) ? (a):(b) ;

c = ((++a)>(++b)) ? (++a):(++b); c = ((++a)>(++b)) ? (++a):(++b);

35

#include <iostream.h>#include <iostream.h> inlineinline int int max(max(int int aa; int ; int b)b) { return ({ return ((a>b)?(a>b)? a:ba:b); }); } main()main() { int a=3, b=2, c;{ int a=3, b=2, c; c = max(a,b); cout << c << endl;c = max(a,b); cout << c << endl; c = max(++a,++b); cout << c << endl; c = max(++a,++b); cout << c << endl; }}

34

Page 161: FSR - Uvod u c++

161

1.1.44. . FunkcijeFunkcije

podrazumijevane podrazumijevane vrijednostivrijednosti ? ?

Podrazumijevane vrijednosti argumenata u funkciji Podrazumijevane vrijednosti argumenata u funkciji

U definiciji funkcije mogu da se navedu podrazumijevane vrijednosti za U definiciji funkcije mogu da se navedu podrazumijevane vrijednosti za formalne argumente.formalne argumente.

Podrazumijevane vrijednosti formalnih argumenata koriste se kad u Podrazumijevane vrijednosti formalnih argumenata koriste se kad u pozivu funkcije nedostaju stvarni argumentipozivu funkcije nedostaju stvarni argumenti

Ako se za neki argument podrazumijeva vrijednost, onda mora da se Ako se za neki argument podrazumijeva vrijednost, onda mora da se podrazumijeva i za sve preostale argumente deklarisane iza njegapodrazumijeva i za sve preostale argumente deklarisane iza njega

Prilikom poziva funkcije mogu da se izostave samo posljednji argumenti Prilikom poziva funkcije mogu da se izostave samo posljednji argumenti (nema preskakanja)(nema preskakanja)

Dozvoljeno je da se svi argumenti podrazumijevajuDozvoljeno je da se svi argumenti podrazumijevaju

Page 162: FSR - Uvod u c++

162

1.1.44. . FunkcijeFunkcije

podrazumijevane podrazumijevane vrijednostivrijednosti ? ?

Primjer:Primjer: #include <iostream.h>#include <iostream.h> #include <math.h>#include <math.h>

struct Tacka { double x,y; };struct Tacka { double x,y; }; const Tacka O = {0,0};const Tacka O = {0,0};

double daljina ( Tacka a, Tacka b=O )double daljina ( Tacka a, Tacka b=O ){ return sqrt(pow(a.x-b.x,2)+pow(a.y-b.y,2)); }{ return sqrt(pow(a.x-b.x,2)+pow(a.y-b.y,2)); }

main()main() {{ Tacka p={1,1}, q={-1,-1};Tacka p={1,1}, q={-1,-1}; cout << daljina(p,q) << endl; // udaljenost od p do qcout << daljina(p,q) << endl; // udaljenost od p do q cout << daljina(p) << endl; // udaljenost od p do Ocout << daljina(p) << endl; // udaljenost od p do O }}

2.828431.41421

Page 163: FSR - Uvod u c++

163

1.1.44. . FunkcijeFunkcije

function function overloadingoverloading ? ?

Preklapanje imena funkcija (function overloading)Preklapanje imena funkcija (function overloading)Srodnim funkcijama moguće je dati isto ime.Srodnim funkcijama moguće je dati isto ime.

Ako dvije funkcije imaju ista imena, kažemo da imamo funkcije sa Ako dvije funkcije imaju ista imena, kažemo da imamo funkcije sa preklopljenim imenima (function overloading).preklopljenim imenima (function overloading).

Prevodilac razlikuje preklopljene funkcije samo preko argumenataPrevodilac razlikuje preklopljene funkcije samo preko argumenata

Primjer:Primjer: ...... int int max (int i, int j) max (int i, int j) { return (i>j) ? i : j ; } { return (i>j) ? i : j ; } floatfloat max ( max (floatfloat i, i, floatfloat j) j) { return (i>j) ? i : j ; }{ return (i>j) ? i : j ; } char max (char i, char j) { return (i>j) ? i : j ; }char max (char i, char j) { return (i>j) ? i : j ; } ...... cout << max (2,6) << endl;cout << max (2,6) << endl; cout << max (’B’,’A’) << endl;cout << max (’B’,’A’) << endl; ......

6B

Page 164: FSR - Uvod u c++

164

1.1.44. . FunkcijeFunkcije

function function overloadingoverloading ? ?

Preklapanje imena funkcija (function overloading)Preklapanje imena funkcija (function overloading)Preklopljene funkcije ne moraju nuPreklopljene funkcije ne moraju nužno da imaju isti broj argumenata i žno da imaju isti broj argumenata i isto (slično) ponašanjeisto (slično) ponašanje

Primjer:Primjer:

#include <iostream.h>#include <iostream.h>

char max (char a, char b)char max (char a, char b) { return (a>b) ? a : b ; }{ return (a>b) ? a : b ; }

int max (int i=0, int j=0, int k=0)int max (int i=0, int j=0, int k=0) { return (i>j) ? (i>k)?i:k : (j>k)?j:k ; }{ return (i>j) ? (i>k)?i:k : (j>k)?j:k ; }

main()main(){ { cout << max ('b','a') << endl;cout << max ('b','a') << endl; cout << max (5, 10, 6) << endl;cout << max (5, 10, 6) << endl; cout << max (10,5) << endl; cout << max (10,5) << endl; }}

b1010

Page 165: FSR - Uvod u c++

165

1.1.44. . FunkcijeFunkcije

function function overloadingoverloading ? ?

Preklapanje imena funkcija (function overloading)Preklapanje imena funkcija (function overloading)Posebno treba paziti kod funkcija sa podrazumijevanim vrijednostima Posebno treba paziti kod funkcija sa podrazumijevanim vrijednostima argumenata!!!argumenata!!!

Primjer:Primjer:

#include <iostream.h>#include <iostream.h>

char fun (char c, int i=0) char fun (char c, int i=0) { return c+i ; }{ return c+i ; }

char fun (char c, double f=0)char fun (char c, double f=0) { return c + (int) f; }{ return c + (int) f; }

main()main(){ { cout << fun(’A’,1) << endl;cout << fun(’A’,1) << endl; cout << fun(’A’,2.5) << endl;cout << fun(’A’,2.5) << endl; // cout << fun(’A’) << endl; // cout << fun(’A’) << endl; }}

BC

Poziva se funkcija kojoj se Poziva se funkcija kojoj se šalje samo jedan argument, šalje samo jedan argument, drugi se podrazumijeva. drugi se podrazumijeva.

Međutim, ne može Međutim, ne može jednoznačno da se odredi jednoznačno da se odredi koja od funkcija treba da koja od funkcija treba da

se izvrši!!!se izvrši!!!

Page 166: FSR - Uvod u c++

166

1.1.55. . Domeni i memorijske klaseDomeni i memorijske klase

Domen identifikatora?Domen identifikatora?

Domen identifikatoraDomen identifikatoraDomen Domen (oblast definisanosti) identifikatora (promjenljive) je područje (oblast definisanosti) identifikatora (promjenljive) je područje programa u kojem je taj identifikator dostupan (vidljiv)programa u kojem je taj identifikator dostupan (vidljiv)

Osnovno pravilo:Osnovno pravilo:Identifikator je dostupan u bloku u kojem je definisan, kao i u svim ugnježđenim blokovima, osim ako u

njima nije maskiran drugim identifikatorom sa istim imenom!

Primjer:Primjer:

#include <stdio.h>#include <stdio.h>main()main(){{ int x=1;int x=1; printf(”Prije bloka: %dprintf(”Prije bloka: %d\n”,x);\n”,x); {{ int x=0;int x=0;

printf(”U bloku: %d\n”,x);printf(”U bloku: %d\n”,x); }} printf(”printf(”PoslijePoslije bloka: %d bloka: %d\n”,x);\n”,x);}}

Prije bloka: 1U bloku: 0Poslije bloka: 1

U ugnježđenom bloku je definisana

promjenljiva sa istim imenom, čime

je maskirana promjenljiva x iz funkcije main()

Page 167: FSR - Uvod u c++

167

1.1.55. . Domeni i memorijske klaseDomeni i memorijske klase

Memorijske klaseMemorijske klase??

Memorijske klase promjenljivihMemorijske klase promjenljivihU programskom jeziku C razlikujemo 4 memorijske klase promjenljivih:U programskom jeziku C razlikujemo 4 memorijske klase promjenljivih:

•• globalneglobalne

definišu se izvan svih funkcijadefinišu se izvan svih funkcija

•• statičkestatičke

definišu se korišćenjem ključne riječi definišu se korišćenjem ključne riječi staticstatic static tip ime=vrijednoststatic tip ime=vrijednost

•• automatskeautomatske

definišu se korišćenjem ključne riječi definišu se korišćenjem ključne riječi autoauto auto tip ime=vrijednostauto tip ime=vrijednost

podrazumijeva se da je promjenljiva automatska, ako se podrazumijeva se da je promjenljiva automatska, ako se drugačije ne navededrugačije ne navede

•• registarskeregistarske

definišu se korišćenjem ključne riječi definišu se korišćenjem ključne riječi registerregister register tip ime=vrijednostregister tip ime=vrijednost

Page 168: FSR - Uvod u c++

168

1.1.55.. Domeni i memorijske klaseDomeni i memorijske klase

AutomatskeAutomatske promjenljive?promjenljive?

AutomatskeAutomatske promjenljive promjenljiveAutomatske promjenljive definiAutomatske promjenljive definiššu seu se na početku tijela funkcije (glavnog programa na početku tijela funkcije (glavnog programa ili potprograma). Često se koristi i termin ili potprograma). Često se koristi i termin lokalna promjenljivalokalna promjenljiva..

Početna vrijednost im se ne podrazumijeva!!! (To znači da nije nula!!!)Početna vrijednost im se ne podrazumijeva!!! (To znači da nije nula!!!)

Mogu da se koriste samo u funkciji u kojoj su definisane. To znači da isto ime Mogu da se koriste samo u funkciji u kojoj su definisane. To znači da isto ime možemo da koristimo nezavisno u više različitih funkcija. Čak te promjenljive možemo da koristimo nezavisno u više različitih funkcija. Čak te promjenljive mogu da budu i različitih tipova.mogu da budu i različitih tipova.

Automatski nastaju prilikom ulaska u funkciju, a automatski nestaju nakon Automatski nastaju prilikom ulaska u funkciju, a automatski nestaju nakon izlaska iz funkcije.izlaska iz funkcije.

Podrazumijeva se da je promjenljiva automatska ako se drugačije ne navedePodrazumijeva se da je promjenljiva automatska ako se drugačije ne navede

Ne mora se eksplicitno navoditi da se radi o automatskoj promjenljivoj, ali može Ne mora se eksplicitno navoditi da se radi o automatskoj promjenljivoj, ali može pomoću ključne rijeći autopomoću ključne rijeći auto

auto tip ime=vrijednost;auto tip ime=vrijednost;

Page 169: FSR - Uvod u c++

169

1.1.55. . Domeni i memorijske klaseDomeni i memorijske klase

Automatske Automatske promjenljive?promjenljive?

Primjer:Primjer: Maniulacija automatskim promjenljivima.Maniulacija automatskim promjenljivima.

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

void f1 ()void f1 () {{ int i=1; int i=1; printf(printf(””f1: %df1: %d\n”\n”, i);, i); }}

void f2 ()void f2 () {{ int i=2; int i=2; printf(printf(””f2: %df2: %d\n”\n”, i);, i); i=10;i=10; }}

main()main(){{ int i=0; int i=0; printf(printf(””main: %dmain: %d\n”\n”, i);, i); f1();f1(); printf(printf(””main: %dmain: %d\n”\n”, i);, i); i=5;i=5; f2();f2(); printf(printf(””main: %dmain: %d\n”\n”, i);, i);}}

main: 0 f1: 1main: 0 f2: 2main: 0

Page 170: FSR - Uvod u c++

170

1.1.55. . Domeni i memorijske klaseDomeni i memorijske klase

Statičke promjenljive?Statičke promjenljive?

Statičke promjenljiveStatičke promjenljive

Definišu se navođenjem ključne riječi Definišu se navođenjem ključne riječi staticstatic static tip ime=vrijednoststatic tip ime=vrijednost

Vrijednost im se određuje prije početka izvršavanja programaVrijednost im se određuje prije početka izvršavanja programauzima se eksplicitna vrijednost kojom je inicijalizovana promjernljivauzima se eksplicitna vrijednost kojom je inicijalizovana promjernljivapodrazumijeva se početna vrijednost nula ako se ne navedepodrazumijeva se početna vrijednost nula ako se ne navede

Imaju trajan karakterImaju trajan karakterpostoje od početka do kraja izvršavanja programapostoje od početka do kraja izvršavanja programavrijednost ostaje sačuvana do sljedećeg poziva date funkcijevrijednost ostaje sačuvana do sljedećeg poziva date funkcije

Page 171: FSR - Uvod u c++

171

1.1.55. . Domeni i memorijske klaseDomeni i memorijske klase

Statičke promjenljive?Statičke promjenljive?

Primjer:Primjer: Maniulacija statičkom promjenljivom.Maniulacija statičkom promjenljivom.

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

void f ()void f () {{ static int brs=1;static int brs=1; auto int bra=1;auto int bra=1; printf(printf(””static brs=%d auto bra=%dstatic brs=%d auto bra=%d\n”\n”, brs, bra);, brs, bra); brs++;brs++; bra++;bra++; }}

main()main(){{ int i; int i; for (i=1; i<=3; i++)for (i=1; i<=3; i++) f();f();}}

static brs=1 auto bra=1 static brs=2 auto bra=1 static brs=3 auto bra=1

Page 172: FSR - Uvod u c++

172

1.1.55. . Domeni i memorijske klaseDomeni i memorijske klase

Globalne promjenljive?Globalne promjenljive?

Globalne promjenljiveGlobalne promjenljiveGlobalne promjenljive definišu se izvan svih funkcija. Globalne promjenljive definišu se izvan svih funkcija. Ako se u definiciji ne Ako se u definiciji ne navede početna vrijednost podrazumijeva se nula!!!navede početna vrijednost podrazumijeva se nula!!!

Globalna promjenljiva dostupna je u svim funkcijama koje su definisane nakon Globalna promjenljiva dostupna je u svim funkcijama koje su definisane nakon definicije date promjenljive.definicije date promjenljive.

Globalne promjenljive omogućavaju da više funkcija manipuliše istim skupom Globalne promjenljive omogućavaju da više funkcija manipuliše istim skupom podataka, pa omogućavaju efikasnu razmjenu podataka između funkcija (jer sve podataka, pa omogućavaju efikasnu razmjenu podataka između funkcija (jer sve funkcije pristupaju istim memrijskim lokacijama).funkcije pristupaju istim memrijskim lokacijama).

Treba ih izbjegavati jer se gubi univerzalnost funkcije i fleksibilnost primjene na Treba ih izbjegavati jer se gubi univerzalnost funkcije i fleksibilnost primjene na različite setove podataka.različite setove podataka.

Ako se u nekoj funkciji definiše promjenljiva sa istim imenom kao i neka globalna, Ako se u nekoj funkciji definiše promjenljiva sa istim imenom kao i neka globalna, tada ta lokalna promjenljiva maskira globalnu i globalnoj ne može da se pristupi.tada ta lokalna promjenljiva maskira globalnu i globalnoj ne može da se pristupi.

Ako se u nekoj funkciji koristi neka globalna promjenljiva to može da se Ako se u nekoj funkciji koristi neka globalna promjenljiva to može da se eksplicitno naglasi deklaracijom korišćenjem ključne riječi extern, iako ne postoji eksplicitno naglasi deklaracijom korišćenjem ključne riječi extern, iako ne postoji obaveza da se globalne promjenljive deklarišu u funkcijiobaveza da se globalne promjenljive deklarišu u funkciji

extern tip promjenljiva;extern tip promjenljiva;

Page 173: FSR - Uvod u c++

173

1.1.55. . Domeni i memorijske klaseDomeni i memorijske klase

Globalne promjenljive?Globalne promjenljive?

Primjer:Primjer: Maniulacija globalnom promjenljivom.Maniulacija globalnom promjenljivom.

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

void f1 ()void f1 () {{ int i=1; int i=1; printf(printf(””f1: %df1: %d\n”\n”, i);, i); }}

int i;int i;

void f2 ()void f2 () {{ extern int i; extern int i; printf(printf(””f2: %df2: %d\n”\n”, i);, i); i=10;i=10; }}

main()main(){{ printf(printf(””main: %dmain: %d\n”\n”, i);, i); f1();f1(); printf(printf(””main: %dmain: %d\n”\n”, i);, i); i=5;i=5; f2();f2(); printf(printf(””main: %dmain: %d\n”\n”, i);, i);}}

main: 0 f1: 1main: 0 f2: 5main: 10

globalna promjenljiva

i=0

Globalna promjenljiva i nije vidljiva u funkciji f1() jer je

definisana nakon funkcije.U funkciji f1() raspoloživa je

lokalna promjenljiva i.

U funkciji f2() koristi se globalna promjenljiva i.

Deklaracija extern int i mogla je da se izostavi

Page 174: FSR - Uvod u c++

174

1.1.55. . Domeni i memorijske klaseDomeni i memorijske klase

Registarske Registarske promjenljive?promjenljive?

Registarske promjenljiveRegistarske promjenljiveRegistarske promjenljive su automatske promjenljive za koje je izražena želja da Registarske promjenljive su automatske promjenljive za koje je izražena želja da se drže u registrima procesora, a ne u memoriji, kako bi se dobilo na brzini.se drže u registrima procesora, a ne u memoriji, kako bi se dobilo na brzini.

Poželjno je korišćenje registarskih promjenljivih kod promjenljivih koje se često Poželjno je korišćenje registarskih promjenljivih kod promjenljivih koje se često koriste (npr. brojač)koriste (npr. brojač)

Ne garantuje se da će promjenljiva stvarno i biti registarska. To zavisi i od Ne garantuje se da će promjenljiva stvarno i biti registarska. To zavisi i od konkretnog prevodioca, procesora , ukupnog broja registarskih promjenljivih do konkretnog prevodioca, procesora , ukupnog broja registarskih promjenljivih do trenutka deklaracije date promjenljive...trenutka deklaracije date promjenljive...

Broj registarskih promjenljivih je ograničen i malen.Broj registarskih promjenljivih je ograničen i malen.

Registarske promjenljive definišu se uz pomoć ključne riječi Registarske promjenljive definišu se uz pomoć ključne riječi registerregisterregister tip ime=vrijednostregister tip ime=vrijednost

Primjer:Primjer:register int i=10;register int i=10;register j;register j;

Page 175: FSR - Uvod u c++

175

1.6. 1.6. PokazivačiPokazivači

POINTERI?POINTERI?

Pokazivači (Pointeri)Pokazivači (Pointeri)Pokazivači obezbjeđuju indirektan pristup memoriji (putem adrese)Pokazivači obezbjeđuju indirektan pristup memoriji (putem adrese)

Pokazivač je promjenljiva koja sadrži memorijsku adresu nekog objektaPokazivač je promjenljiva koja sadrži memorijsku adresu nekog objektaako je u pitanju polje – tada je to adresa početnog elementa poljaako je u pitanju polje – tada je to adresa početnog elementa poljaako je u pitanju funkcija – tada je to adresa početka funkcijeako je u pitanju funkcija – tada je to adresa početka funkcije

Ako promjenljiva p sadrži adresu objekta q, kažemo da p pokazuje na qAko promjenljiva p sadrži adresu objekta q, kažemo da p pokazuje na q

Primjer: Primjer:

MEMORIJA

adresaadresa

101101

100100

9999

qq 6565

Deklaracija pokazivača:Deklaracija pokazivača:

tip *ime;tip *ime;

Primjer:Primjer:

int *pi;int *pi;

char *pc, *tekst;char *pc, *tekst;

100100pp

Page 176: FSR - Uvod u c++

176

1.6. 1.6. PokazivačiPokazivači

POINTERI?POINTERI?

Operatori za rad sa pokazivačimaOperatori za rad sa pokazivačimaAdresni operatorAdresni operator &&

daje adresu nekog objekta u daje adresu nekog objekta u memorijimemoriji

Ako je q neka promjenljiva tada Ako je q neka promjenljiva tada &q&q daje adresu te promjenljivedaje adresu te promjenljive

Ako želimo da pokazivač p pokazuje Ako želimo da pokazivač p pokazuje na promjenljivu q imamo na promjenljivu q imamo p=&qp=&q

MEMORIJA

adresaadresa

101101

100100

9999

qq 6565

Operator indirekcijeOperator indirekcije **

omogućava indirektan pristup promjenljivoj omogućava indirektan pristup promjenljivoj koristeći pokazivač na tu promjenljivukoristeći pokazivač na tu promjenljivu

Ako je s neka promjenljiva, a p pokazivač na Ako je s neka promjenljiva, a p pokazivač na isti tip, tada se može pisati isti tip, tada se može pisati s=*ps=*p . .To znači da će q dobiti vrijednost koja se To znači da će q dobiti vrijednost koja se nalazi na lokaciji koju pokazuje pnalazi na lokaciji koju pokazuje p

MEMORIJA

adresaadresa

101101

100100

9999

qq 6565

100100pp

p=&qp=&q 100100ppp=&qp=&q

6565ss

s=*ps=*p

Page 177: FSR - Uvod u c++

177

1.6. 1.6. PokazivačiPokazivači

POINTERI?POINTERI?

Operatori za rad sa pokazivačimaOperatori za rad sa pokazivačimaAdresni operatorAdresni operator & & i i operator indirekcijeoperator indirekcije * * su INVERZNIsu INVERZNI OPERATORIOPERATORI

y = *& xy = *& x iliili y = x y = x

iliiliint x,y,*z;int x,y,*z;z = &x;z = &x;y = *z;y = *z;

y = *z = *&x = xy = *z = *&x = x

Primjer:Primjer:

#include <stdio.h>#include <stdio.h>main()main(){{ int x, prom=5, *pokaz;int x, prom=5, *pokaz; pokaz = &prom;pokaz = &prom; x = *pokaz;x = *pokaz; printf(”prom=%dprintf(”prom=%d\n\nx=%dx=%d\n”,\n”,prom,xprom,x););}}

prom=5x=5

Page 178: FSR - Uvod u c++

178

1.6. 1.6. PokazivačiPokazivači

POINTER NA POINTER NA STRUKTURU?STRUKTURU?

Pokazivači na strukturePokazivači na strukture

Neka imamo strukturuNeka imamo strukturu

struct datum struct datum { { int dan;int dan; int mjesec;int mjesec; int godina;int godina; }; };

Tada moTada možežemo da mo da definišemo:definišemo:

struct datum struct datum rodjen,rodjen, *pokaz *pokaz ;;

Pokazivač na strukturu datum(još uvijek ne pokazuje

nikakav konkretan podatak)

Ako želimo da Ako želimo da pokazpokaz pokazuje pokazuje rodjenrodjen: : *pokaz = &rodjen ;*pokaz = &rodjen ;

pokaz sada pokazuje na promjenljivu rodjen (sadrži adresu promjenljive rodjen)

Page 179: FSR - Uvod u c++

179

1.6. 1.6. PokazivačiPokazivači

POINTER NA POINTER NA STRUKTURU?STRUKTURU?

Pristup elementima strukturePristup elementima struktureNeka imamoNeka imamo

struct datum struct datum { { int dan;int dan; int mjesec;int mjesec; int godina;int godina;

}} rodjenrodjen, , *pokaz = &rodjen ;*pokaz = &rodjen ;

Pristup elementima strukture:Pristup elementima strukture:

rodjen.dan = 1;rodjen.dan = 1; rodjen.mjesec = 4;rodjen.mjesec = 4; rodjen.godina = 1985;rodjen.godina = 1985;

Pristup elementima strukture preko pokazivača:Pristup elementima strukture preko pokazivača:

(*pokaz).dan = 1;(*pokaz).dan = 1; (*pokaz).mjesec = 4;(*pokaz).mjesec = 4; (*pokaz).godina = 1985;(*pokaz).godina = 1985;

iliili pokaz->dan = 1;pokaz->dan = 1;pokaz->mjesec = 4;pokaz->mjesec = 4;pokaz->godina = 1985;pokaz->godina = 1985;

Page 180: FSR - Uvod u c++

180

1.6. 1.6. PokazivačiPokazivači

POINTER NA POINTER NA STRUKTURU?STRUKTURU?

Pristup elementima strukturePristup elementima strukturePrimjer:Primjer:

#include <stdio.h>#include <stdio.h>main()main(){{ struct datum struct datum { int dan{ int dan, , mjesecmjesec, , godina;godina; }}; ; struct datum r, *p = &r;struct datum r, *p = &r; p->dan = 1;p->dan = 1; p->mjesec = 4;p->mjesec = 4; p->godina = 1985;p->godina = 1985; printf(”Datum: %02d.%02d.%d.printf(”Datum: %02d.%02d.%d.”,”, r.dan, r.mjesec, r.godina r.dan, r.mjesec, r.godina););}}

Datum: 01.04.1985.

Page 181: FSR - Uvod u c++

181

1.6. 1.6. PokazivačiPokazivači

POINTER U POINTER U STRUKTURI?STRUKTURI?

Pokazivač u strukturiPokazivač u strukturi

x=2 y=5

Pokazivač može da bude element strukturePokazivač može da bude element strukture

struct primjer struct primjer { int { int *p1, *p2*p1, *p2;; }} clan; clan;

Pristup pokazivaču u strukturiPristup pokazivaču u strukturi

*clan.p1 *clan.p1 odnosnoodnosno *clan.p2 *clan.p2

Primjer:Primjer:

#include <stdio.h>#include <stdio.h>main()main(){{ int x,y;int x,y; struct primjer struct primjer { int { int *p1, *p2*p1, *p2;; }};; struct primjer proba, *pok = &proba;struct primjer proba, *pok = &proba; proba.p1 = &x; *proba.p1 = 2;proba.p1 = &x; *proba.p1 = 2; pok->p2 = &y; *pok->p2 = 5;pok->p2 = &y; *pok->p2 = 5; printf(”x=%d y=%dprintf(”x=%d y=%d”,”, x,y x,y););}}

Page 182: FSR - Uvod u c++

182

1.6. 1.6. PokazivačiPokazivači

POVEZANE POVEZANE STRUKTURE?STRUKTURE?

Povezane strukturePovezane struktureKombinovanjem pokazivača na strukturu i strukture sa pokazivačem Kombinovanjem pokazivača na strukturu i strukture sa pokazivačem možemo da dobijemo možemo da dobijemo strukturu sa pokazivačem na istu strukturustrukturu sa pokazivačem na istu strukturu tj. tj. imamo imamo povezane strukturepovezane strukture

struct element struct element { { tiptip infoinfo;;

struct element *next;struct element *next;

}} prvi, drugi; prvi, drugi;

pokazivač na istu strukturu(omogućava povezivanje struktura i pravljenje liste – dinamičkog niza)

informaciono polje u strukturi

prviprvi

Aprvi.next = &drugiprvi.next = &drugi

prviprvi..infoinfo prviprvi..nextnext

drugidrugi

B

drugidrugi..infoinfo drugidrugi..nextnext

Page 183: FSR - Uvod u c++

183

1.6. 1.6. PokazivačiPokazivači

POVEZANE POVEZANE STRUKTURE?STRUKTURE?

Linearna jednostruko povezana listaLinearna jednostruko povezana lista

00glavaglava

linklinkinfoinfo

struct element struct element { { tiptip infoinfo;; struct element *link;struct element *link; }} *glava; *glava;

Linearna dvostruko povezana listaLinearna dvostruko povezana lista

glavaglava

DDinfoinfoLL

reprep00 00

Page 184: FSR - Uvod u c++

184

1.6. 1.6. PokazivačiPokazivači

POVEZANE POVEZANE STRUKTURE?STRUKTURE?

Binarno stabloBinarno stabločvor

korijenkorijen

LL DD

infoinfo

Lijevo podstablo

0 0Desno

podstablo

0

0 0 0 0

Page 185: FSR - Uvod u c++

185

1.6. 1.6. PokazivačiPokazivači

POINTER NA POINTER NA POLJEPOLJE??

Pokazivač na vektor (jednodimenzionalno polje)Pokazivač na vektor (jednodimenzionalno polje)Ime vektora (niza) predstavlja adresu početnog elementa vektora i već je Ime vektora (niza) predstavlja adresu početnog elementa vektora i već je samo po sebi pokazivač (statički pokazivač)samo po sebi pokazivač (statički pokazivač)

a[2]a[0] a[1]

00 0 0a[3]

0a[4]

int int aa[5][5]=={0};{0};

int *p, *q; int *p, *q;

p = a;p = a;iliili

p = &a[0];p = &a[0];

q = a+3;q = a+3;iliili

q = &a[3];q = &a[3];

Napomena:

a je statička promjenljivaNije dozvoljeno a=a+2; ili a++;

Napomena:

p je dinamička promjenljivaDozvoljeno je p=p+2; ili p++;

Page 186: FSR - Uvod u c++

186

1.6. 1.6. PokazivačiPokazivači

POINTER NA POINTER NA POLJEPOLJE??

Pokazivač na vektor (jednodimenzionalno polje)Pokazivač na vektor (jednodimenzionalno polje)

Primjer:Primjer:

#include <stdio.h>#include <stdio.h>static int xstatic int x[5] = {1,2,3,4,5};[5] = {1,2,3,4,5};main()main(){{ int int *p*p;; p = x;p = x; printf(”%d %dprintf(”%d %d %d\n”, %d\n”, x[0], x[1], x[2]);x[0], x[1], x[2]); printf(”%d %dprintf(”%d %d %d\n”, %d\n”, *p, *(p+1), *(p+2) );*p, *(p+1), *(p+2) );}}

1 2 31 2 3

Page 187: FSR - Uvod u c++

187

1.6. 1.6. PokazivačiPokazivači

POINTER NA POINTER NA POLJEPOLJE??

Prenos vektora u funkciju pPrenos vektora u funkciju poomomoću pokazivačaću pokazivačaPretpostavimo da imamo funkcijuPretpostavimo da imamo funkciju

int funkcija (niz, n)int funkcija (niz, n) int nizint niz[], n;[], n; { ... }{ ... }

pristup elementima u nizu

niz[indeks]

int funkcija (int funkcija (pp, n), n) int int *p, n;*p, n; { ... }{ ... }

pristup pomoću pointera

*(p+indeks)

iliili

Primjer:Primjer:

int suma (int suma (int int nizniz[][], , int int n)n) {{ int int s=0, is=0, i;; for (i=0; i<n; i++)for (i=0; i<n; i++) s += niz[i];s += niz[i]; return (s);return (s); }}

Primjer:Primjer:

int suma (int suma (int *pint *p, , int int n)n) {{ int int s=0, is=0, i;; for (i=0; i<n; i++)for (i=0; i<n; i++) s += *(p+i);s += *(p+i); return (s);return (s); }}

Page 188: FSR - Uvod u c++

188

1.6. 1.6. PokazivačiPokazivači

POINTER NA POINTER NA POLJEPOLJE??

Pokazivač na Pokazivač na matricumatricu ( (dvdvodimenzionalno polje)odimenzionalno polje)...0 1 j ... m-1

0

1

i

n-1

mat[i][j]

mat[0][0]

int *p; int *p;

p = mat;p = mat;iliili

p = &mat[0][0];p = &mat[0][0];

*( mat + m*i + j )*( mat + m*i + j )iliili

*( &mat[0][0] + m*i + j )*( &mat[0][0] + m*i + j )

Page 189: FSR - Uvod u c++

189

1.6. 1.6. PokazivačiPokazivači

ADRESNA ADRESNA ARITMETIKAARITMETIKA??

Adresna aritmetikaAdresna aritmetikaNeka je:Neka je: a a – vektor sa elementima tipa T– vektor sa elementima tipa T v v – izraz tipa T– izraz tipa T n n – cjelobrojni izraz– cjelobrojni izraz p, p, qq – pokaziva – pokazivači na tip T (pokazuju na elemente niza a)či na tip T (pokazuju na elemente niza a)

Tada važe sljedeća pravila:Tada važe sljedeća pravila: a a – – pokazivač na početak nizapokazivač na početak niza &a&a[0] [0] – poka– pokazzivaivačč na na početak nizapočetak niza *p *p – element niza a na koji pokazuje p– element niza a na koji pokazuje p *p=v *p=v – elementu na koji pokazuje p dodjeljuje vrijednost v– elementu na koji pokazuje p dodjeljuje vrijednost v ++p ++p – pokazuje na sljedeći element niza– pokazuje na sljedeći element niza --p --p – pokazuje na prethodni element niza– pokazuje na prethodni element niza *++p *++p – inkrementira p, pa pristupa tom (sljedećem) elementu– inkrementira p, pa pristupa tom (sljedećem) elementu *p++ *p++ - pristupa elementu na koji pokazuje p, a zatim pokazuje- pristupa elementu na koji pokazuje p, a zatim pokazuje na sljedeći elementna sljedeći element p+n p+n - pokazuje na n-ti naredni element niza- pokazuje na n-ti naredni element niza *(p+n)=v *(p+n)=v – dodjeljuje vrijednost v n-tom narednom elementu u nizu u– dodjeljuje vrijednost v n-tom narednom elementu u nizu u odnosu na element na koji pokazuje podnosu na element na koji pokazuje p q-p q-p - određuje broj elemenata niza smještenih između adresa na- određuje broj elemenata niza smještenih između adresa na koje pokazuju q i pkoje pokazuju q i p

Page 190: FSR - Uvod u c++

190

1.6. 1.6. PokazivačiPokazivači

ADRESNA ADRESNA ARITMETIKAARITMETIKA??

Primjer:Primjer:

#include <stdio.h>#include <stdio.h>main()main(){{ static char cstatic char c[] = {’a’,’b’,’c’,’d’};[] = {’a’,’b’,’c’,’d’}; static static intint i[] = { 1, 2, 3, 4};i[] = { 1, 2, 3, 4}; charchar *pc1=&c[0], *pc2=&c[3]*pc1=&c[0], *pc2=&c[3];; int *pi1=&i[0], *pi2=&i[3];int *pi1=&i[0], *pi2=&i[3]; printf(”printf(”*c=*c=%%cc *i= *i=%d%d\n”,\n”, *c, *i);*c, *i); printf(”printf(”*pc1=*pc1=%%cc *pi1= *pi1=%d%d\n”,\n”, *pc1, *pi1);*pc1, *pi1); printf(”printf(”*(pc1+1)=*(pc1+1)=%%cc *(pi1+2)= *(pi1+2)=%d%d\n”,\n”, *(pc1+1), *(pi1+2));*(pc1+1), *(pi1+2)); printf(”printf(”*++pc1=*++pc1=%%cc *++pi1= *++pi1=%d%d\n”,\n”, *++pc1, *++pi1);*++pc1, *++pi1); printf(”printf(”*pc1++=*pc1++=%%cc *pi1++= *pi1++=%d%d\n”,\n”, *pc1++, *pi1++);*pc1++, *pi1++); printf(”printf(”*pc1=*pc1=%%cc *pi1= *pi1=%d%d\n”,\n”, *pc1, *pi1);*pc1, *pi1); pc1-=2; pi1-=2;pc1-=2; pi1-=2; printf(”printf(”*pc1=*pc1=%%cc *pi1= *pi1=%d%d\n”,\n”, *pc1, *pi1);*pc1, *pi1); printf(”printf(”pc2-pc1=%dpc2-pc1=%d pi2-pi1= pi2-pi1=%d%d\n”,\n”, pc2-pc1, pi2-pi1);pc2-pc1, pi2-pi1);}}

*c=a *i=1*pc1=a *pi1=1*(pc1+1)=b *(pi1+2)=3*++pc1=b *++pi1=2*pc1++=b *pi1++=2*pc1=c *pi1=3*pc1=a *pi1=1pc2-pc1=3 pi2-pi1=3

Page 191: FSR - Uvod u c++

191

1.6. 1.6. PokazivačiPokazivači

REFERISANJEREFERISANJE??

Prenos argumenata u funkciju referisanjemPrenos argumenata u funkciju referisanjem

Argumenti se u funkciju standardno prenose putem vrijednostiArgumenti se u funkciju standardno prenose putem vrijednosti

Funkcija nema mogućnost da promijeni vrijednost stvarnog argumenta!!!Funkcija nema mogućnost da promijeni vrijednost stvarnog argumenta!!!

Da bi se omogućilo da funkcija mijenja vrijednost stvarnog argumenta:Da bi se omogućilo da funkcija mijenja vrijednost stvarnog argumenta:

1. Prilikom poziva funkcije treba slati adresu!1. Prilikom poziva funkcije treba slati adresu!

2. Formalni argument treba definisati kao pokazivač na tip!2. Formalni argument treba definisati kao pokazivač na tip!

3. U tijelu funkcije treba koristiti operator indirekcije!3. U tijelu funkcije treba koristiti operator indirekcije!

REFERISANJE = PRENOS ADRESE (REFERENCE) stvarnog argumentaREFERISANJE = PRENOS ADRESE (REFERENCE) stvarnog argumenta

Referisanje omogućava da funkcija mijenja vrijednost stvarnog argumenta!Referisanje omogućava da funkcija mijenja vrijednost stvarnog argumenta!

Page 192: FSR - Uvod u c++

192

1.6. 1.6. PokazivačiPokazivači

REFERISANJE?REFERISANJE?

Primjer:Primjer:

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

void suma ( niz, n, s )void suma ( niz, n, s ) int *niz, n, *s;int *niz, n, *s; {{ int i;int i; *s = 0; *s = 0; for (i=0; i<n; i++) for (i=0; i<n; i++) *s += *niz++ ;*s += *niz++ ; }}

main()main(){{ static static intint i[]={1,2,3,4};i[]={1,2,3,4};

int x;int x;

suma (i, 4, &x);suma (i, 4, &x);

printf(”Suma: %dprintf(”Suma: %d”,”, x x););}}

Suma: 10šalje se adresa

Formalni argument je pokazivač

Korišćenje operatora

indirekcije

Page 193: FSR - Uvod u c++

193

1.7. 1.7. Upućivači Upućivači

UPUĆIVAČ ?UPUĆIVAČ ?

Upućivači (reference)Upućivači (reference)Upućivač je alternativno ime za neki podatak (upućuje na podatak kojem je pridružen)Upućivač je alternativno ime za neki podatak (upućuje na podatak kojem je pridružen)

Ne zauzima prostor u memoriji i ne može da se dobije njegova adresaNe zauzima prostor u memoriji i ne može da se dobije njegova adresa

Mora da se inicijalizuje prilikom definisanja (mora da upućuje na neki stvarni objekat)Mora da se inicijalizuje prilikom definisanja (mora da upućuje na neki stvarni objekat)

Sve operacije djeluju na stvarne podatke, a ne na upućivačeSve operacije djeluju na stvarne podatke, a ne na upućivače

Veoma su slični pokazivačima, ali pokazivači fizički postoje a upućivači neVeoma su slični pokazivačima, ali pokazivači fizički postoje a upućivači ne

Glavna primjena upućivača: prenos argumenata u funkcijuGlavna primjena upućivača: prenos argumenata u funkciju

Primjer:Primjer:

int k=1; int k=1; // definisana promjenljiva k// definisana promjenljiva k

int &u=k; int &u=k; // definisan upućivač u na promjenljivu k// definisan upućivač u na promjenljivu k // i u i k predstavljaju isti podatak// i u i k predstavljaju isti podatak

int x=u; int x=u; // definisana promjenljiva x (x=u=k=1)// definisana promjenljiva x (x=u=k=1)

u=2; u=2; // k=2// k=2

u++; u++; // k++ -> k=3// k++ -> k=3

Page 194: FSR - Uvod u c++

194

1.7. 1.7. Upućivači Upućivači

UPUĆIVAČ ?UPUĆIVAČ ?

Upućivači (reference)Upućivači (reference)Glavna primjena upućivača: prenos argumenata u funkcijuGlavna primjena upućivača: prenos argumenata u funkciju

Primjer: Primjer:

(prenos pomo(prenos pomoću pokazivača)ću pokazivača)

#include <iostream.h>#include <iostream.h>

void invoid inkrementkrement ( (int int *a)*a) {{ *a += 1; *a += 1; }}

main()main() {{ int x=10;int x=10; inkrementinkrement (&x)(&x);; cout << x << endl;cout << x << endl;}}

Primjer: Primjer:

(prenos pomo(prenos pomoću upućivača)ću upućivača)

#include <iostream.h>#include <iostream.h>

void invoid inkrementkrement ( (int int &a)&a) {{ a += 1; a += 1; }}

main()main() {{ int x=10;int x=10; inkrementinkrement (x)(x);; cout << x << endl;cout << x << endl;}}

11 Korišćenje upućivača Korišćenje upućivača je “elegantnije”je “elegantnije”

Page 195: FSR - Uvod u c++

195

1.8. 1.8. StringoviStringovi

STRING?STRING?

Stringovi Stringovi String je jednodimenzionalni znakovni niz String je jednodimenzionalni znakovni niz

To je niz znakova koji završava nul-znakom (znak čiji je kod 0)To je niz znakova koji završava nul-znakom (znak čiji je kod 0) ’\0’’\0’

Deklaracija stringa:Deklaracija stringa:

char ime[duzina] = ”string” ;char ime[duzina] = ”string” ; iliili

char ime[duzina] = { znak, znak, … , znak } ;char ime[duzina] = { znak, znak, … , znak } ;

Primjer:Primjer:char grad1[] = ”char grad1[] = ”BANJA LUKABANJA LUKA” ;” ;

char grad2[] = { ’D’,’O’,’B’,’O’,’J’,’\0’ };char grad2[] = { ’D’,’O’,’B’,’O’,’J’,’\0’ };

OOznačavanje znakovnih i string konstanti:značavanje znakovnih i string konstanti:

’’D’D’ – ovo je znak – ovo je znak DD

””DD” ” – ovo je string – ovo je string ’D’’D’,,’\0’’\0’

Page 196: FSR - Uvod u c++

196

1.8. 1.8. StringoviStringovi

STRING?STRING?

Manipulacija stringomManipulacija stringomIspisivanje stringaIspisivanje stringa

ispisivanje pomoću funkcije ispisivanje pomoću funkcije

printf(printf(”%s”, string); ”%s”, string);

ispisivanje pomoću funkcije ispisivanje pomoću funkcije

putsputs((string); string);

Primjer:Primjer:

#include <stdio.h>#include <stdio.h>main()main(){{ charchar grad[]= ”grad[]= ”BANJA LUKABANJA LUKA”;”; printf(”%s\n”, grad);printf(”%s\n”, grad);}}

Primjer:Primjer:

#include <stdio.h>#include <stdio.h>main()main(){{ charchar grad[]= ”grad[]= ”BANJA LUKABANJA LUKA”;”; puts(grad);puts(grad);}}

BANJA LUKA BANJA LUKA

Page 197: FSR - Uvod u c++

197

1.8. 1.8. StringoviStringovi

STRING?STRING?

Manipulacija stringomManipulacija stringomUUččitavanjeitavanje stringa stringa

učitavanje pomoću funkcije učitavanje pomoću funkcije

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

učitavanje pomoću funkcije učitavanje pomoću funkcije

getgetss((string); string);

Primjer:Primjer:

#include <stdio.h>#include <stdio.h>main()main(){{ charchar tekst tekst[[5050];]; printf(”printf(”Unesi recenicu:Unesi recenicu:\n”);\n”); scanfscanf(”(”%s%s””,, teksttekst);); printf(printf(”%s”, tekst);”%s”, tekst);}}

Primjer:Primjer:

#include <stdio.h>#include <stdio.h>main()main(){{ charchar tekst tekst[[5050];]; printf(”printf(”Unesi recenicu:Unesi recenicu:\n”);\n”); getgetss((teksttekst);); printf(printf(”%s”, tekst);”%s”, tekst);}}

Unesi recenicu:MOSTAR

Unesi recenicu:MOSTARMOSTAR

Page 198: FSR - Uvod u c++

198

1.8. 1.8. StringoviStringovi

STRING?STRING?

Primjer:Primjer: Program koji uProgram koji učitava string, a zatim ispisuje njegovu dužinu.čitava string, a zatim ispisuje njegovu dužinu.

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

int strlen ( char *s )int strlen ( char *s ) {{ int i;int i; for (i=0; *s!=for (i=0; *s!=’\0’’\0’;; i++)i++);; return(i)return(i);; }}

main()main(){{ char grad[]=”char grad[]=”BANJA LUKABANJA LUKA”;”; pprintf(”rintf(”Broj slovaBroj slova: %d: %d”,”, strlen(grad) strlen(grad) ););}}

Broj slova: 10

Page 199: FSR - Uvod u c++

199

1.8. 1.8. StringoviStringovi

STRING?STRING?

Primjer:Primjer: Program koji uProgram koji učitava stringčitava string i pravi kopiju tog stringa i pravi kopiju tog stringa..

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

voidvoid str strcopycopy ( char *s ( char *s1, char *s21, char *s2 ) ) {{ while ( *s2++ = *s1++ );while ( *s2++ = *s1++ ); }}

main()main(){{ char original[100]=”char original[100]=”BANJA LUKABANJA LUKA”;”; char kopija[100];char kopija[100]; strcopy(original, kopija);strcopy(original, kopija); printf(”%s\n”, original);printf(”%s\n”, original); printf(”%s\n”, kopija);printf(”%s\n”, kopija);}}

MOSTAR / ŽEPČE