uvod u programiranje - · pdf fileprogramiranje •razrada logike (konstrukcija algoritma)...

79
C/C++ sintaksa UVOD U PROGRAMIRANJE 1 Odjel za matematiku

Upload: trinhcong

Post on 15-Feb-2018

239 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

C/C++ sintaksa

UVOD U

PROGRAMIRANJE

1 Odjel za matematiku

Page 2: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

PROGRAMIRANJE

uvod

Odjel za matematiku 2

Page 3: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Programiranje

• Razrada logike (konstrukcija algoritma)

• Pisanje izvornog oblika (implementacija algoritma u

programski jezik)

• Ispravljanje grešaka (debugging)

• Izrada dokumentacije za primjenu

3 Odjel za matematiku

Page 4: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Algoritam

• Algoritam – opis postupka koji nakon konačnog broja

koraka dovodi do rezultata

Primjer 1: “Popij mlijeko”

1. Otvori hladnjak.

2. Provjeri ima li mlijeka.

3. Ako ima, natoči u čašu i popij

inače, odi u trgovinu i kupi.

5. Ponovi korake 2.,3. sve dok nisi

zadovoljan količinom popijenog

mlijeka.

6. Spremi mlijeko u hladnjak

Primjer 2: “Babilonsko računanje ”

putadovoljnokorakponavljaj

yyypostavi

ypostavi

.2.3

)2

(2

1:.2

0.1:.1

2

4 Odjel za matematiku

Page 5: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Prikaz algoritma

Učitati

Računati

Ako je Da

Ne

Dijagram toka Strukturni dijagram tipova naredbi

- sekvencija

- selekcija uvjet

- iteracija uvjet

5 Odjel za matematiku

Page 6: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Prikaz algoritma Pseudo-code

Rečenice pisane u govornom jeziku ali u obliku “naredbi” tako da su “slične” naredbama u programskom jeziku

Zadati (učitati) podatak n Ako je n>=0 onda Za svaki i=1 do n postavi n=n * i

Ispisati rezultat n U suprotnom Ispisati poruku o pogreški Kraj selekcije

Sekvencija Selekcija

Iteracija

6 Odjel za matematiku

Page 7: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Elementi proceduralnog jezika

Odjel za matematiku 7

funkcije i procedure

deklarativne, izvršne komentari, naredbe

Imena, podaci,

operatori, ključne

riječi

alfanumerički,

numerički, posebni

znakovi riječi

rečenice naredbe

Elementi

blokovi

vanjske programske

strukture

tekst

Page 8: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Tipovi podataka

Odjel za matematiku 8

tipovi podataka u C++

Tipovi podataka

ugrađeni tipovi

osnovni tipovi

cjelobrojni tip

boolean tip

bool

znakovni tip

char

unsigned

char

signed

char

wchar_t

cjelobrojni tip

short int

unsigned

short int

signed

short int

int

long int

realni tip

float

double

long

double

prazan tip izvedeni

tipovi

Nizovi Pokazivači reference

user-defined tipovi

pobrojani tip strukturirani

tip

klase strukture unije

Page 9: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Prijevod programskog koda

Računala razumiju samo strojni jezik stoga je programski kod potrebno prevesti na strojne instrukcije.

3 programa pretvaraju izvršni kod u izvršni kod: 1. Preprocessor –program koji u izvršni kod ubacuje predprocesorske direktive

2. Compiler – program koji izvršni kod zajedno s predprocesorskim direktivama pretvara u strojni jezik odnosno objektni kod (.obj datoteka). Izvršni kod mora zadovoljavati sintaktičke, leksičke i logičke norme da bi se kod mogao transformitati.

3. Linker – program koji povezuje objektni kod s izvršnim biblotekama kako bi se mogao generirati izvršni kod .exe

Page 10: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

naredbe pridruživanja

ulazno-izlazne funkcije

Odjel za matematiku 10

1.1. NAREDBE

SEKVENCIJE

Potrebno predznanje:

tipovi podataka

formatiranje upisa/ispisa

operatori

Page 11: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Naredbe pridruživanja

Odjel za matematiku 11

Operatori:

-pridruživanja: = *= /= += -= &= |= ^=

-aritmetički: + - * / % ++ --

- za razdvajanje/grupiranje: . -> ( ) [ ] ::

- relacijski: < > == != <= >= ( ? :)

- logički: ! || &&

- adresni: * &

- bit-logički: ~ | & ^

varijabla operator izraz ;

izraz: konstante, varijable, (poziv) funkcije, operatori

Primjer: y=2*a*sin(x+3.5);

Page 12: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Upis i ispis na konzolu

Odjel za matematiku 12

Neke od funkcija za unos i ispis podataka (sadržani u stdio.h i conio.h datotekama) koje ćemo koristiti

učitavanje podataka scanf(“%format”,&var)

fscanf(dat,”%format”,&var)

getch()

gets()

upisivanje podataka printf(“%format”,broj)

fprintf(dat,”%format”,broj)

putch();

puts()

%format – predstavlja oblik podatka koje

unosimo odnosno ispisujemo.

Format: d cijeli broj(integer) ld dugi cijeli broj(long) f realni broj (float) c znak s niz znakova

&var – predstavlja adresno mjesto

varijable u kojoj spremamo podatak

Page 13: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

“Hello, World”

Odjel za matematiku 13

Primjer 1.1A: “Hello, World” u C-u

# include <stdio.h> /*predprocesorska naredba*/

int main() /* funkcija main()*/

{

printf(“Hello, World!”); /*izvršna naredba*/

}

predprocesorska naredba koja u izvršenje našega programa uključuje datoteku za rad s konzolom. funkcija main – sve naredbe sadržane u ovoj funkciji se izvršavaju printf(“%s”,%var) – ispis u konzolu vrijednost varijable var

Page 14: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

“Hello, World”

Odjel za matematiku 14

Primjer 1.1B: “Hello, World” u C++-u

#include <iostream> /*predprocesorska naredba*/

using namespace std;

int main() /* funkcija main()*/

{

cout << “Hello, world!” <<endl;

}

predprocesorska naredba koja u izvršenje našega programa uključuje datoteku za rad s konzolom: iostream.h funkcija main – sve naredbe sadržane u ovoj funkciji se izvršavaju. cout – objekt koji nam pomaže da ispisujemo tekst na konzolu

Page 15: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

“Dobrodosli, %s u ...”

Odjel za matematiku 15

Primjer 1.2A: “Moje ime ” u C-u

#include <cstdlib>

#include<stdio.h>

int main()

{

char ime[20];

printf("Upišite svoje ime: ");

scanf("%s",&ime);

printf("Dobrodosli, %s u svijet programiranja\n ",ime);

system("PAUSE"); /*(ako konzola nema pauzu)*/

}

“%s” – format ispisa u konzolu

Page 16: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Zadaci

Odjel za matematiku 16

Primjer 1.3A: “MojKalkulator” u C-u

#include<cstdlib>

#include<stdio.h>

int main(){

float a,b;

printf("---------------MojKalkulator--------------------\n");

printf("Upišite I. broj: ");

scanf("%f",&a);

printf("Upišite II. broj: ");

scanf("%f",&b);

printf("\n Zbroj ta 2 broja je %3.2f",a+b); /**/

printf("\n Razlika ta 2 broja je %3.2f",a-b);

printf("\n Umnozak ta 2 broja je %3.2f",a*b);

printf("\n Kvocijent ta 2 broja je %3.2f \n",a/b);

system("PAUSE");

}

Page 17: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

1.2. NAREDBE SELEKCIJE if ... else ...

switch

Odjel za matematiku 17

Potrebno predznanje:

operatori

Page 18: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

If ... else ...

Odjel za matematiku 18

if (uvjet) blok1; else blok2; uvjet: Jednostavni uvjet izraz1 relacijski operator izraz2 npr. x +5 != exp(z) Složeni uvjet uvjet1 logički operator uvjet2 npr. b==0 && (a+x)/2 > t

U C/C++ sintaksi: if (uvjet){

naredba1;

naredba2;

...

}

else {

naredba 1’

naredba 2’

...

}

ternarni operator: varijabla=(logički izraz) ? izraz1:izraz2;

Naredba koje nam omogućuje ovisno o vrijednosti varijable

odrediti tok programa.

Page 19: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Switch

Odjel za matematiku 19

switch (varijabla){ case vrijednost1: naredba1.1; naredba1.2; case vrijednost2: naredba2.1; naredba2.2; ... }

U C/C++ sintaksi: switch (varijabla){

case vrijednost1:

naredba1;

naredba2;

...

}

case vrijednost2:

naredba 1’

naredba 2’

...

}

U slučaju više mogućnosti nad nekom

varijablom koristimo ključnu riječ switch.

Page 20: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

1.3. NAREDBE ITERACIJE while

Do...while

for

Odjel za matematiku 20

Potrebno predznanje:

operatori

Page 21: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

For petlja

Odjel za matematiku 21

For(inicijalizacija,terminacija,modifikacija)

blok (ili naredba) inicijalizacija: popis naredbi pridruživanja npr. i=0, sortiran=1;

terminacija: uvjet - iteracija(petlja) se ponavlja sve dok je ovaj uvjet ispunjen npr. i<=n-1;

modifikacija: povećavanje vrijednosti varijable: Npr. i++; i--;

U C/C++ sintaksi: for(i=1;i<=n;i++){

naredba1;

naredba2;

...

}

Napredne kontrolne naredbe: Break – uzrokuje prekid petlje.

Continue – preskače dio naredbi i prelazi na slijedeću iteraciju

Page 22: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

For petlja

Odjel za matematiku 22

Primjer 3.1A: “Zbroj prvih n brojeva” u C-u

#include<cstdlib>

#include<stdio.h>

int main(){

int n,sum=0;

printf("Upišite prirodni broj: ");

scanf("%d",&n);

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

sum+=i;

}

system("PAUSE");

}

Page 23: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

While

Odjel za matematiku 23

while (uvjet) blok pre-test Uvjet se ispituje prije izvođenja prve naredbe u bloku. Ako je uvjet ispunjen, blok se izvodi i nakon toga ponavlja se ispitivanje uvjeta

do blok while (uvjet) post-test Uvjet se ispituje nakon izvođenja zadnje naredbe u bloku. Ako je uvjet ispunjen, blok se izvodi ponovo. Naredba break uzrokuje skok iz petlje.

U C/C++ sintaksi: while (uvjet){

naredba1;

naredba2;

...

}

do {

naredba 1’

naredba 2’

...

} while (uvjet)

Page 24: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

While

Odjel za matematiku 24

Primjer 3.6A: “Zbroj s konzole” u C/C++-u

#include<cstdlib>

#include<stdio.h>

int main(){

float x;

float sum=0.0;

while(cin>>x) // izlaz: <CTRL>+<D>

sum +=x;

scanf("%d",&n);

cout<<“Zbroj je ”<<sum<<endl;

}

Page 25: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

// Program koji aproksimira eksponencijalnu funkciju e^x

/*

Program koristi niz sukcesivnih aproksimacija oblika E_n=1+x+x^2/2!+...+x^n/n!

koji se zaustavlja nakon zadovoljenja uvjeta |x^n|(n!<=eps

*/

#include<iostream>

using namespace std;

#include<math.h>

#include<cstdlib>

#include<iomanip>

int main(){

float x, eps, E=1.0, slijedeci=1.0,n=1.0;

cout<<"x=";

cin>>x;

cout<<"eps=";

cin>>eps;

cout<<"Program aproksimira za dani x="<<x<<" funkciju exp(x) uz uvjet pogreske eps"<<endl;

while(fabs(slijedeci)>eps){

slijedeci=(x*slijedeci)/n;

E+=slijedeci;

cout<<"E= "<<E<<setw(5)<<" n="<<n<<endl;

n++;

}

system("PAUSE");

}

Primjenom iterativnih metoda aproksimirajte exp(x) funkciju

While

Odjel za matematiku 25

Numerički problem 1:

Page 26: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

2. FUNKCIJE Funkcije i procedure

Odjel za matematiku 26

Potrebno predznanje:

Operatori

Naredbe iteracije i

selekcije

Page 27: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Funkcije

Odjel za matematiku 27

U C/C++ sintaksi: int func(formalni parametri){

naredba1;

naredba2;

...

return vrijednost;

}

void swap(int& x,int& y){ //procedura

float t=x;

x=y;

y=t;

}

Funkcije su potprogrami koji se izvršavaju prilikom poziva unutra neke druge funkcije. Funkcije koje ne vraćaju vrijednost zovemo procedure (funkcije praznog tipa).

Modularizacija programa

Funkcija se deklarira prije poziva po tipu, imenu i listom parametara. Proslijeđivanje parametra može biti po vrijednosti ili po referenci.

Page 28: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Funkcije

Odjel za matematiku 28

Primjer 2.1: “Faktoriel” u C/C++-u

#include<iostream>

using namespace std;

#include<cstdlib>

#include<iomanip>

int factorial(int n){

int f=1;

assert(n>=0);

if (n<2) return 1;

while(n>1)

f*=n--;

return f;

}

int main(){

cout<<factorial(5)<<endl;

system("PAUSE");

}

Page 29: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Funkcije

Odjel za matematiku 29

Primjer 2.2: “Power funkcija” u C/C++-u

#include<cstdlib>

#include<stdio.h>

double power(double y, int n){

double x=1.0;

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

y*=x;

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

y/=n;

return y;

}

int main(){

cout << power(7.4,3)<<endl;

cout<<power(7.4,-3)<<endl;

}

Page 30: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Proslijeđivanje argumenata u funkciju

Odjel za matematiku 30

Proslijeđivanje parametara funkciji preko vrijednosti.

Sadržaj proslijeđenih varijabli se kopira u sadržaj formalnih varijabli.

int addition(int a,int b){

return a+b;

}

int x=5, y=3, z;

z = addition ( x , y );

Page 31: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Proslijeđivanje argumenata u funkciju

Odjel za matematiku 31

Proslijeđivanje parametara funkciji preko referenci.

U funkciju se proslijeđuju adrese varijabli, pa u funkciji možemo mijenjati sadržaj proslijeđene varijable.

void swap(int& x,int& y)

{ temp=x;

x=y;

y=temp;

}

a=2; b=3;

swap(a,b);

Page 32: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

3. POLJA Jednodimenzionalna i višedimenzionalna polja

Odjel za matematiku 32

Potrebno predznanje:

Naredbe iteracije

Funkcije

Page 33: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Polja

Odjel za matematiku 33

Niz je slijed elemenata istog tipa smješteni slijedno u memoriji koji se dohvaćaju putem cjelobrojnog indeksa.

Pristupanje elementu polja se događa tako da

sustav izračuna koliko je mjesta podatak

odmaknut od adrese početnog elementa.

cout<<"Adresa od polja "<<&polje<<endl;

cout<<"Adresa od "<<i<<". elementa u polju: "<<&(polje[i])<<endl;

void *offset=&(polje[0])+i;

Page 34: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Polja

Odjel za matematiku 34

Prilikom statičkog definiranja niza veličina polja mora biti konstanta.

Deklaracija polja

Polja mogu biti bilo kojeg tipa u C++:

float a[100] = {3.0,4.1,6.2} // float tip

int b[5] = {0}; // cjelobrojnog tipa

char rijeci[10]=“abc” // string (o tome poslije)

bool sudovi[4]={1,0,0,1} // boolean tip

float a[100] = {3.0,4.1,6.2} // polje koje sadrži konstante

Page 35: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Polja

Odjel za matematiku 35

Primjer 3.1: “Suma vektora” u C++-u

Napravite program koji će za unesena 2 niza brojeva ispisati u 3. niz

sumu prethodna 2 niza.

//Program definira proceduru koja će za dva unesena niza ispisati treći niz

koji je zbroj ta dva niza.

void suma_vektora(float a[ ], float b[ ], float c[ ], int n) {

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

c[i] = a[i] + b[i];

}

Polja mogu biti argumenti funkcijama i proslijeđeni su po referenci, što znači da je

njihova adresa proslijeđena funkciji.

Element polja kao parametar funkciji može biti proslijeđen po sadržaju ili referenci.

Page 36: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Dvodimenzionalna polja

Odjel za matematiku 36

U C/C++ sintaksi: int M[3][6];

M[0][4]={88};

M[2][1]=44;

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

M[3][6]={{77,55,11,33,88},{99},{66,44,22}};

Dvodimenzionalni niz je niz koji ima 2 nezavisna indeksa. Sintaksa deklaracije je

<type> <name> [<num-rows>][<num-coloms>]

inicijalizacija

Page 37: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Dvodimenzionalna polja

Odjel za matematiku 37

Dvodimenzionalni polja u memoriji

2D nizovi u C++ se spremaju u row-major stilu – slijedno se sprema

prvi redak, zatim slijedeći redak itd.

]2,2[]1,2[]0,2[

]2,1[]1,1[]0,1[

]2,0[]1,0[]0,0[

AAA

AAA

AAA

A[2,2]A[2,1]A[2,0]A[1,2]A[1,1]A[1,0]A[0,2]A[0,1]A[0,0]

&A[i][j]= &A[0][0]+(m*i+j)*sizeof(element)

Adresa (i,j) elementa u polju A možemo

računati preko pomaka

Dvodimenzionalno polje se sprema u memoriji na sličan

način kao i jednodimenzionalno polje.

Page 38: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Dvodimenzionalna polja

Odjel za matematiku 38

Primjena: matrice i vektori

Polja mogu biti argumenti funkcijama i proslijeđeni su po referenci, što znači da je

njihova adresa proslijeđena funkciji.

Element polja kao parametar funkciji može biti proslijeđen po sadržaju ili referenci.

Dvodimenzionalna polja i funkcije

Množenje matrice s vektorom. Skalarni produkt

Page 39: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Nizovi

Odjel za matematiku 39

Zadatak. 3.10: “Gaussova eliminacija” u C++-u

Implementirajte Gaussovu eliminaciju za sustav Ax=b, gdje je A n x n matrica

vektori x,b dimenzije n.

Isprobajte vaš program na slijedećem sustavu:

Rješenje: x = (0.75,0.25,0.625)

Page 40: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

4. STRINGOVI I DATOTEKE stringovi

ulaz/izlaz s datototeke

Odjel za matematiku 40

Potrebno predznanje:

nizovi

funkcije i procedure

Page 41: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Znakovi i stringovi

Odjel za matematiku 41

Osim numeričkih podataka, u C++ postoje nenumerički tip podataka – znakovi

(characters)

char c;

c=‘a’;

Znakove kodiramo na temelju ASCII tablice.

sizeof(char) = 1 veličina memorije za jedan znak

Tip char dozvoljava aritmetičke operacije:

char c;

c=‘a’+5; // c = ‘f’

Page 42: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Stringovi

Odjel za matematiku 42

‘Ja sam string’ // string veličine 13 znakova

Na analogan način kao i polja drugih tipova podataka inicijaliziramo stringove.

char rijec[]={‘a’,’b’,’c’,0};

stringovi su polja čiji su elementi tipa char.

deklaracija & incijalizacija

char rijec[4]; // ili

char rijec[4]={‘a’,’b’,’c’};

char rijec[]={‘a’,’b’,’c’};

Stringovi sadrže znak terminacije \0 - automatski pridodano.

Page 43: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

<cstring> biblioteka

Odjel za matematiku 43

<cstring> Library

#include<cstring> //C++ sintaksa

#include<string.h> //C sintaksa

C++ naslijeđuje iz C-a kolekciju posebnih funkcija koji rade s C-stringovima.

Funkcije opis

strcap() Dodaje string s2 stringu s1.

strchr() vraća pokazivač na prvu pojavu

znaka c u stringu s

strcmp() Uspoređuje string s1 leksigrafski sa

podstringom s2.

strcpy() Zamijenjuje string s1 sa stringom s2.

strlen() vraća veličinu stringa

Neke od funkcija koje se nalaze u <cstring> biblioteci. Detaljnije na

http://www.cplusplus.com/reference/clibrary/cstring/

Napredniji rad sa stingovima uključeno je u bibliotekama:

Page 44: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Stringovi i datoteke

Odjel za matematiku 44

C-stringovi

//Program racuna broj velikih slova u C-stringu

int caps(char* s){

int c=0;

while(*s++) //povecavaj indeks adresnog mjesta

if (*s>=‘A’ && *s<=‘Z’) ++c;

return c;

}

C-stringovi se predaju kao parametri funkciji preko reference char*.

Page 45: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Primjeri

Odjel za matematiku 45

Primjer

#include<cstring>

int main(){

char* s1="peer";

char* s2="peech";

int cmp=strcmp(s1,s2);

cout<<"cmp= "<<cmp<<endl;

if (cmp<0)

cout<<s1<<"<"<<s2<<endl;

else if(cmp==0)

cout<<s1<<"="<<s2<<endl;

else cout<<s1<<">"<<s2<<endl;

}

Primjena nekih funkcija iz <cstring> biblioteke

#include<cstring>

int main(){

char* s1="peer";

char* s2="peech";

strcpy(s1,s2);

cout<<s1<<“ ”<<strlen(s1);

cout<<s2; //kopirani sadrzaj s1

}

Page 46: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Primjeri

Odjel za matematiku 46

Primjer

#include<cstring>

int main(){

char* s1="peer";

char* s2="peech";

int cmp=strcmp(s1,s2);

cout<<"cmp= "<<cmp<<endl;

if (cmp<0)

cout<<s1<<"<"<<s2<<endl;

else if(cmp==0)

cout<<s1<<"="<<s2<<endl;

else cout<<s1<<">"<<s2<<endl;

}

Primjena nekih funkcija iz <cstring> biblioteke

#include<cstring>

int main(){

char* s1="peer";

char* s2="peech";

strcpy(s1,s2);

cout<<s1<<“ ”<<strlen(s1);

cout<<s2; //kopirani sadrzaj s1

}

Page 47: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Stringovi i datoteke

Odjel za matematiku

47

<string> biblioteka

string sl; // sl sadrzi 0 znakova

string s2 = “MATH OS"; // s2 sadrzi 7 znakova

string s3 (60, '*'); // s3 sadrzi 60 asteriksa

string s4 = s3; // s4 sadrzi 60 asteriksa

string s5(s2, 5, 2); // s5 sadrzi string od 2 znaka "Yo"

Standardni C++ definira tipove string koje se nalaze u biblioteci

<string.h>

Funkcije koje podržavaju stringovi tipa string:

http://www.cplusplus.com/reference/string/string/

Page 48: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Odjel za matematiku 48

Stringovi i datoteke

<string> biblioteka

string sl; // sl sadrzi 0 znakova

string s2 = “MATH OS"; // s2 sadrzi 7 znakova

string s3 (60, '*'); // s3 sadrzi 60 asteriksa

string s4 = s3; // s4 sadrzi 60 asteriksa

string s5(s2, 5, 2); // s5 sadrzi string od 2 znaka "Yo"

Standardni C++ definira tipove string koje se nalaze u biblioteci

<string.h>

Funkcije koje podržavaju stringovi tipa string:

http://www.cplusplus.com/reference/string/string/

Page 49: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Standardni ulazi i izlazi

Odjel za matematiku 49

<iostream> Library

#include<iostream>

Standardna C++ biblioteka koja nam je omogućava ulaze i izlaze s konzole

Funkcije opis

cout ispisuje operand na konzolu

cin s konzole unosi vrijednost u operand. Terminira

nakon praznog mjesta ili novog reda.

cout.get() metoda objekta cout koji učitava znakove zajedno sa

razmacima.

cout.getline() metoda objekta cout koji učitava neformatirani niz znakova uključujući i prijelaz u novi red.

cin.put() metoda objekta cin koja ispisuje znak na konzolu.

Neke od funkcija koje se nalaze u <iostream> biblioteci.

Page 50: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Ulazi i izlazi s datoteke

Odjel za matematiku 50

Datoteke

#include<fstream>

U C rad s datotekama osigurano je s 2 vrste funkcija iz <stdio.h>

biblioteke: fprintf() – upis u datoteku fscanf() - ispis iz datoteke getc() - uzima jedan znak iz

datoteke putc() - stavlja jedan znak u

datoteke

#include<stdio.h>

U C++ rad s datotekama osigurano je s 2 vrste objekata: ifstream – omogućuje ulaz iz datoteke ofstream – omogućuje ulaz u datoteku.

Page 51: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Stringovi i datoteke

Odjel za matematiku 51

<stdio.h> biblioteka

#include<cstdlib>

#include<stdio.h>

int main(){

int n,i=0,duljina=0;

FILE *ulaz;

FILE *izlaz;

char imedat[20];

int podaci[100];

if(fopen("input.txt","r")==NULL) printf("Nema datoteke!\n");

else {

ulaz=fopen("input.txt","r");

izlaz=fopen("output.txt","w");

while(!feof(ulaz)){

duljina++;

fscanf(ulaz,"%d",&podaci[i++]);

}

for(int i=0;i<duljina;i++) fprintf(izlaz,"%d ",podaci[i]%2);

system("PAUSE");}

}

Osnovni upis iz datoteke i upis u datoteku. Iz datoteke učitavamo podatke kao brojeve i ispisujemo ostatke pri dijeljenju sa 2 u drugu datoteku.

Page 52: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Stringovi i datoteke

Odjel za matematiku 52

<fstream> biblioteka

#include<fstream> //ulaz iz datoteke

#include<iostream>

using namespace std;

int main(){

ifstream infile("input.txt"); //definiraj ulaznu datoteku

ofstream outfile("output.txt"); // -||- izlazna datoteka

string word; //tip string

char c;

while (infile>>word)

{

if (word[0]>='a' && word[0]<='z')

word[0]=word[0]+'A'-'a';

outfile<<word;

infile.get(c); //uzmi razmak iza svake rijeci

outfile.put(c); //upisi razmak u novu datoteku

}

system("PAUSE");

}

Program iz ulazne datoteke uzima riječi i ispisuje ih u izlaznu datoteku s velikim početnim slovima riječi.

Page 53: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

POKAZIVAČI

Odjel za matematiku 53

Pokazivači, dinamička alokacija memorije

VJEŽBE 1

Page 54: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Pokazivači

Odjel za matematiku 54

Ponovimo …

Svakoj varijabli u programu pridružena je memorijska lokacija (ili blok lokacija)

čija veličina ovisi o tipu varijable.

Svakoj memorijskoj lokaciji pridružena je jedinstvena adresa.

adresa varijable = adresa prve lokacije u bloku memorijskih lokacija koji

predstavljaju varijablu.

Varijabli se može pristupiti korištenjem:

imena varijable — prevoditelj “zna” adresu,

adrese varijable — pokazivačem na tu varijablu.

VJEŽBE 1

Page 55: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Pokazivači

Odjel za matematiku 55

Deklaracija pokazivača

Pokazivač na tip je varijabla koja sadrži adresu varijable tog tipa:

tip *p;

int *pi //pokazivač tipa int

char *pc // pokazivač tipa char

float *f // pokazivač tipa float

void *p //generički pokazivač

*p=NULL //prazan pokazivač

Primjer

VJEŽBE 1

Page 56: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Pokazivači

Odjel za matematiku 56

Operatori pokazivača

Adresni operator &x= //adresa varijable x

Operator

referenciranja

*ptr= // vrijednost spremljena u memorijsku

lokaciju na koju pokazuje ptr

VJEŽBE 1

Page 57: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Pokazivači

Odjel za matematiku 57

Inicijalizacija pokazivača

int i=5; //cjelobrojna varijabla sa sadržajem 5

int *pi=&i;

VJEŽBE 1

Page 58: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Pokazivači

Odjel za matematiku 58

Operacije nad pokazivačima

Dozvoljene operacije nad pokazivačima:

svakom pokazivaču možemo dodati ili oduzeti cijeli broj

oduzimanje pokazivača istog tipa

uspoređivanje pokazivača istog tipa relacijskim

operatorima

++px --px px + n px – n

//px pokazivač i n varijabla cjelobrojnog tipa

VJEŽBE 1

Page 59: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Pokazivači

Odjel za matematiku 59

Primjer 1:

int main(){

float x[]={1.0,2.0},*px=x; // px=&x[0]

printf("Vrijednosti: x[0]=%g,x[1]=%g\n",x[0],x[1]);

printf("Adrese: x[0]=%p, x[1]=%p\n",px,px+1);

}

Vrijednosti: x[0]=1.0,x[2]=2.0 Adrese: &x[0]=0012FF44, &x[1]=0012FF48

Pristupanje elementima polja pokazivačem.

VJEŽBE 1

Page 60: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Pokazivači

Odjel za matematiku 60

Primjer 2:

#include <stdio.h>

int main(void)

{

double x[] = {10.0, 20.0, 30.0, 40.0}, *px;

px=&x[0];

printf("%g, %g\n", *px+1, *px+2); /* 11, 12 */

px=&x[0];

printf("%g, %g\n", *px++, *px+2); /* 10, 22 */

return 0;

}

Po pokazivačima i vrijednostima na koji pokazuju može se

inkrementirati.

VJEŽBE 1

Page 61: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Pokazivači

Odjel za matematiku 61

Primjer 3:

int d(int a[]) {

int *pa = a;

while (*pa != 0) ++pa;

return pa - a; /* razlika pokazivaca */

}

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

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

int x[5] = {3, 2, 0, 0, 4};

...

printf("%d\n", d(x)); //output: 2

Pokazivači istog tipa mogu se oduzimati.

VJEŽBE 1

Page 62: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Pokazivači i jednodimenzionalna polja

Odjel za matematiku 62

Neka je p bilo koji pokazivač osim generičkog.

Onda p možemo interpretirati kao:

1. pokazivač na prvi element u polju odgovarajućeg tipa, p=&p[0]

2. Pristupanje elementima polja uključuje aritmetiku nad pokazivačem p.

Veza između aritmetike pokazivača i indeksiranja elemenata polja je : p+i=&p[i], *(p+i)=p[i]

gdje je i cijeli broj.

char *px, x[28]={‘a’,’b’,...,’z’};

px = &x[0]; /* Isto kao px = x; */

*(px + 3) = ’d’; /* Isto kao x[3] = ’d’; */

px++; /* Isto kao px = &x[1]; */

*(px + 1) = ’b’; /* Isto kao px[1] = ’b’;

ekviv. s x[2] = ’b’; */

*(px + 30) = ’z’; /* NIJE GRESKA,

ali prelazimo po memoriji! */

VJEŽBE 1

Page 63: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Nizovi

Odjel za matematiku 63

Zadatak. 1 “Zbroj elemenata” primjenom pokazivača

Napravite program koji će za uneseni niz realnih podataka ispisati sumu

njegovih elemenata primjenom pokazivača.

VJEŽBE 1

Page 64: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Pokazivači i funkcije

Odjel za matematiku 64

Polje može biti argument funkcije. Funkcija tada ne dobiva kopiju čitavog

polja, već samo kopiju pokazivača na prvi element polja.

void funkcija(float v[]) ili void funkcija (float *v)

Zadatak 2 “Aritmetička sredina” primjenom pokazivača

Napravite funkciju koji će za uneseni niz realnih podataka ispisati

aritmetičku sredinu njegovih podataka. Primjenite pokazivače.

VJEŽBE 1

Page 65: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Pokazivači i funkcije

Odjel za matematiku 65

Osim pokazivača na osnovne tipove podataka postoje i pokazivači na

funkcije.

int (*fptr)(int)

Definiran je pokazivač fptr na funkciju koja prima jedan int argument i

vraća int vrijednost.

Primjer 3:

double integracija(double a, double b, double (*f)(double))

{

return 0.5*(b-a)*((*f)(a)+(*f)(b));

}

printf("Sinus: %f\n",integracija(0,1,sin));

VJEŽBE 1

Page 66: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Pokazivači i višedimenzionalna polja

Odjel za matematiku 66

Indeksiranje jednodimenzionalnog polja

Indeksiranje po dvodimenzionalnom polju:

VJEŽBE 1

Page 67: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Pokazivači i stringovi

Odjel za matematiku 67

Analogija jednodimenzionalnog polja – string je niz tipa char.

Indeksiranje po stringu:

Primjer 4:

void strcpy(char *s, char *t){ //kopiranje stringova

while((*s=*t)!='\0') {

s++;t++;

}

}

VJEŽBE 1

Page 68: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Dinamička alokacija memorije

Odjel za matematiku 68

Rezerviranje memorije za objekte (varijable) može biti:

statički – prilikom definicije i inijializacije varijabli memorija se

automatski rezervira.

Nakon završetka programa memorija se oslobađa automatski.

dinamički – proizvoljna veličina memorije može se staviti na

raspolaganje varijablama i bude tako alocirana sve dok je eksplicitno

ne oslobodimo.

VJEŽBE 1

Page 69: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Dinamička alokacija memorije

Odjel za matematiku 69

Dinamička memorija – upotreba:

- polja za koje nije unaprijed zadana dimenzija

- dinamičke strukture: povezane liste, stabla, matrice …

Funkcije za alokaciju i delokaciju memorije su deklarirane u biblioteci <stdlib.h>:

- alokacija: funkcije malloc, calloc (C) operator new (C++)

- delokacija: funkcija free (C)

operator delete (C++)

VJEŽBE 1

Page 70: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Dinamička alokacija u C-u

Odjel za matematiku 70

size_t cjelobrojni tip bez predznaka

n - ukupan broj bajtova koje treba rezervirati

Funkcija malloc rezervira blok memorije od n bajtova. Vraća:

• pokazivač na rezervirani blok memorije, ili

• NULL, ako zahtjev nije mogao biti ispunjen.

Vraćeni pokazivač je generički, tipa void* — prije upotrebe treba ga eksplicitno

konvertirati u potrebni tip pokazivača (cast operatorom).

malloc

VJEŽBE 1

Page 71: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Dinamička alokacija u C-u

Odjel za matematiku 71

Funkcija calloc rezervira blok memorije za spremanje:

nobj objekata, od kojih svaki pojedini objekt ima veličinu size, tj. ukupan broj

rezerviranih bajtova je nobj * size.

inicijalizira cijeli rezervirani prostor na nule, preciznije, na nul-znakove (’\0’).

Vraćeni pokazivač je generički, tipa void* — prije upotrebe treba ga eksplicitno

konvertirati u potrebni tip pokazivača (cast operatorom).

calloc

VJEŽBE 1

Page 72: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Dinamička alokacija u C-u

Odjel za matematiku 72

double *p;

p=(double *) malloc(128*sizeof(double)); // ili ...

p = (double *) calloc(128, sizeof(double));

if(p==NULL)

{

printf("Greska: alokacija nije uspjela!");

exit(-1);

}

Primjer 5:

Alokacija bloka memorije od 128 objekata tipa double.

VJEŽBE 1

Page 73: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Dinamička alokacija u C-u

Odjel za matematiku 73

Alociranu memoriju, nakon upotrebe, možemo osloboditi funkcijom free.

Funkcija free uzima pokazivač p na početak alociranog bloka memorije i

oslobađa taj blok memorije.

Funkcija free ne mijenja pokazivač p. Nakon poziva free(p); taj pokazivač i

dalje pokazuje na (sad) oslobođeni dio memorije i ne smije se koristiti.

Najbolje je odmah iza poziva free(p); staviti i p = NULL;.

free

VJEŽBE 1

Page 74: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Dinamičko alokacija u C-u

Odjel za matematiku 74

Primjer 6:

#include<cstdlib>

#include<stdio.h>

int main(){

int *a;

int i, n, zbroj;

printf("Upisi broj elemenata polja a: ");

scanf("%d",&n);

if ((a=(int*) calloc(n,sizeof(int)))==NULL){

printf("Alokacija nije uspjela"); exit(-1);

}

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

printf("Upisi element polja: ");

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

}

zbroj=0;

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

zbroj=zbroj+a[i];

printf("%d ",zbroj);

free(a);

}

Program dinamički stvori polje a tipa int s tim da se duljina polja n

učitava. Ispisuje zbroj elemenata.

VJEŽBE 1

Page 75: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Dinamičko alokacija u C++-u

Odjel za matematiku 75

float tip podatka

n - ukupan broj bajtova koje treba rezervirati

Operator new rezervira blok memorije od n bajtova. Vraća:

pokazivač na rezervirani blok memorije, ili

NULL, ako zahtjev nije mogao biti ispunjen.

Ukoliko se ne može rezervirati memorijski prostor C++ podiže iznimku.

new

float *b=new float[n]

VJEŽBE 1

Page 76: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Dinamičko alokacija u C++-u

Odjel za matematiku 76

Operator delete oslobođa rezervirani blok memorije od n bajtova. Premda

vraća alocirane blokove memorije na ponovo raspologanje korisno je i pokazivač

koji je pokazivao na alocirani memorijski sadržaj postaviti na NULL kako bi se

izbjegli problemi memorijske redundacije.

delete

delete [ ]b;

delete [ ]b;

b=NULL;

VJEŽBE 1

Page 77: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Dinamičko alokacija u C++-u

Odjel za matematiku 77

Primjer 7:

#include<cstdlib>

#include<iostream.h>

int main(){

cout<<"Upisite n:";

int i,n;

cin>>n;

float *a=new float[n];

float suma=0;

cout<<"Upisite elemente polja: "<<endl;

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

cin>>a[i];

suma=suma+a[i];

}

cout<<"Zbroj elemenata polja je "<<suma;

delete []a;

system("PAUSE");

}

Program dinamički kreira polje a tipa float s tim da se duljina polja n

učitava. Ispisuje zbroj elemenata.

VJEŽBE 1

Page 78: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Dinamička alokacija u C++-u

Odjel za matematiku 78

Primjer 8:

void matvec(float **A, float *b, float *x, int n){

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

float temp=0;

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

temp=temp+A[i][j]*x[j];

}

}

int main(){

int n;

int i;

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

float *b=new float[n];

float *x=new float[n];

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

float **A; //A je pokazivac na pokazivac;

A=new float*[n]; // alociraj spremanje za n pokazivača

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

A[i]=new float[n]; //alociraj spremanje za matricu

for(i=0;i<n;i++) // inicijalizacija vrijednosti

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

A[i][j]=i+j;

matvec(A,b,x,n);

printf("%3.2f %3.2f",&b[0],&b[1]);

system("PAUSE");

}

Množenje matrice s vektorom.

VJEŽBE 1

Page 79: UVOD U PROGRAMIRANJE - · PDF fileProgramiranje •Razrada logike (konstrukcija algoritma) •Pisanje izvornog oblika (implementacija algoritma u programski jezik) •Ispravljanje

Zadaci

Odjel za matematiku 79

Napiši program koji će koristiti funkciju locate(s,c) gdje je s string, a c

znak za koji želimo znati na kojem se mjestu stringu pojavio prvi puta.

Napiši C++ program koji će izračunati duljinu stringa pomoću funkcije strlen(const char* s) (Potrebno je definirati takvu funkciju)

Zadatak. 5.2: “strlen” u C++

Zadatak. 5.1: “Nadji znak” u C++

Napiši C++ funkciju strcat koja će za 2 stringa s1,s2 izvršiti konkatenaciju s2 na

s1; char* strcat (char* sl, const char* s2)

Zadatak. 5.3: “strcat” u C++-u

VJEŽBE 1