You are on page 1of 96

URP i

DOBRO DOŠLI NA

ELEKTROTEHNIČKI FAKULTET
U OSIJEKU
D. Fischer: URP 1
Uvod u računala i programiranje (2+1+2)

Literatura:
1.D. Fischer:Zbirka zadataka iz C programskog jezika, EFO
Osijek, štampano kao rukopis za studente EFO, Osijek, 1999.

2. Ortega. Grimshaw: An Introduction to C++ and Numerical


Methodes, Oxford University Press, New York 1999.

3.Motik, Šribar: Demistificirani C++, Element, Zagreb, 1997

4.B. Overland: C++ jasnim jezikom, Mikro knjiga Beograd,


Zagreb.

5. Kernighan, Ritchie: “ANSI C”, II. izdanje, Prentice Hall,


Engelwood Clifs, New Jersey, 1988
URP 2

Svrha predmeta:

1. Razviti način razmišljanja potreban za korištenje računala i


sličnih elektroničkih uređaja u koje su ugrađeni mikroprocesori.

2. Naučiti načela jednostavnih algoritama i načela korištenja


proceduralnog programskog jezika (C i C++)

3. Ovladati vještinom korištenja trenutno dostupnih računala


(osobna računala PC) i programskog okruženja (Windows
operacijski sustav, MS Visual studio programski paket)
URP 3

Odvijanje nastave:

1. Predavanja (2 sata/tjedno): Ex Catedra tumačenja.”Simplex”


veza predavača i slušača.

2. Auditorne vježbe (1 sat/tjedno): Rješavanje primjera uz


aktivno sudjelovanje studenata.

3. Laboratorijske vježbe: (2 sata/tjedno): Samostalan rad


studenata na uređajima (osobnim računalima)
URP 4

Sadržaj predmeta:

1. Osnovni računarski pojmovi


2. Algoritmi
3. Elementi proceduralnog progr.
4. Programski jezik C
URP 5

1. OSNOVNI RAČUNARSKI POJMOVI

a) INFORMATIČKO DRUŠTVO
Korištenje i obrada informacija ima
bitno povećan značaj
URP 6
Neke povijesne činjenice:

Oko 1900:

Herman Hollerith:
Popis stanovništva u SAD 1890,
bušena kartica,
IBM

Prva dioda, početak elektronike


OKO 1950: URP 7

Prvi John von Neumann


tranzistori (von Neumannov
stroj) ENIAC
OKO 1960: Velika (“Mainframe”) računala
OKO 1970: VLSI tehnologija,
mikroprocesor

Prvi mikroprocesor 4004

OKO 1980: Osobna računala


OKO 1990: Računalne mreže, mobilna telefonija
URP 8
4004 uspoređen s Celeron procesorom

• Broj tranzistora 2300 5 500 000


• Veličina tranzistora 10 0,35 mikrona
• Veličina pločice 12 196 mm2
• Brzina takta 0,75 2 GHz
• Adresibilna memorija 0,004 64 000 MB
• Broj priključaka 16 387
• Cijena $200 $100
URP 9

b) RAČUNALO:

Elektronički programirljiv automat (uređaj)


koji:

1. Prihvaća
2. Obrađuje
3. Prikazuje
4. Pohranjuje
5. Prenosi na daljinu
p o d a t k e i i n f o r m a c i je
c) PRIKAZ PODATAKA:
URP 10
1. analogan (neprekidan -kontinuiran)
f(x)

2. digitalan (od lat. digitus - prst, broj)

A B C 12 5 8 0101 0010

Dualni (binarni) prikaz bitovima (Binary Digit)


bit, byte (oktet), riječ
d) PRIKAZ ZNAKOVA I BROJEVA URP 11
BITOVIMA

Prikaz znakova (engl. character):


Dogovor o prikazu 8-bitni ASCII kod:

‘ ‘ 0010 0000 x’20’


‘0’ 0011 0000 x’30’
‘A’ 0100 0001 x’41’

“Code Page” – kodna stranica, znakovi nacionalnih alfabeta:

U hrvatskom: ČĆĐŠŽ ( najčešće “PC-852 Latin 2” kodna


stranica)
Cijeli brojevi: URP 12
Cijeli broj (engl. integer)

Prirodni brojevi (N), nula i negativni brojevi


Prikaz u 16 bita: [ -32 768 , 32 767 ] = [–215 , 215-1]
Prikaz u 32 bita: [ -2 147 483 648 , 2 147 483 647 ] =
[–231 , 231-1]
Dogovor o prikazu: Kod za cijele brojeve
Racionalni (realni) brojevi: URP 13
Broj “s kliznim zarezom” (engl. floating point)

Racionalni brojevi (približni prikaz realnih brojeva)


Prikaz u 32 bita: 3.4 *10-38 3.4 *1038
Prikaz u 64 bita: 1.7 *10-308 1.7 *10308
Dogovor o prikazu: Kod za realne brojeve
URP 14

e) von Neumannov stroj (automat):

Procesor
Sabirnica (bus)
Periferne
Memorija jedinice
f) Oprema: Uređaji i programska URP 15
podrška
(1)

1. Uređaji (“Hardware”)
Centralna Periferne
jedinica jedinice

Procesor Memorija Spore Brze

Glavni Pomoćni RAM ROM Ulazne Izlazne Magnetske Optičke (CD)

Translacijske, Rotacijske
(Sekvencijelne)

FDD HD
Oprema: Uređaji i programska podrška URP 16

(2) Programska podrška (software)


Programska podrška
Operacijski sustav Aplikacije

Uslužni Jezgra
programi (“Kernel”)
“Utilities” Programski paketi Pojedinačni
(“Projekti”) programi

Prevoditelji Programi za
i linkeri datoteke
URP 17
g) ALGORITAM i PROGRAM
Algoritam: Opis poslova i redslijed izvođenja koji će nakon
konačnog broja ponavljanja dovesti do suvislog rezultata
Primjer
Zadati (učitati) podatak N
Postaviti Nf=1
Za svaki i=1 do N pomnožiti Nf s i
Ispisati rezultat Nf

Program: Niz poslova koji se izvode određenim redoslijedom


U računalu je: program u memoriji, procesor automatski
izvodi program na “datoj adresi” memorije.
scanf (“%d”,&N);
Nf=1;
for (i=1;i<=N;i++) Nf *= i;
printf (“\nRezultat je %d”,Nf);
URP 18
h) PROGRAMSKI JEZIK

Dogovoreni (napravljeni) jezik u kojem se pišu programi.


Program prevodilac prevodi (“kompajlira”, engl. compile )
tekst napisan u programskom jezik ( engl. Source Code)
u zapis pisan u jeziku stroja (procesora, hardware-a, engl.
Object Code)

Program u
Prevodilac Program u
izvornom prevedenom
obliku
obliku

Poruke
URP 19
i) PROGRAMIRANJE

Postupak izrade programa:

- razrada logike
- pisanje izvornog oblika
- ispravljanje grešaka (debugging)
- izrada dokumentacije za primjenu
URP 20
2. ALGORITMI

Algoritam (po Muhammad ibn Musa al-Kwarizm):


opis postupka koji nakon konačnog broja radnji
daje suvisli rezultat .

Alogoritam je dio posla u procesu koji od uočenog


problema dovodi do rezultata (najčešće pomoću
računalnog programa).

U računarstvu algoritam treba biti prilagođen


mogućnostima njegove izvedbe na računalu
URP 21
Prikaz algoritma

a) Dijagram toka

Učitati

Računati

Da
Ako je
Ne
URP 22
Prikaz algoritma

b) Modularno stukturirani dijagram:

- sekvencija

- selekcija
uvjet

- iteracija
uvjet
URP 23
Prikaz algoritma

c) Pseudo-kod:

Rečenice pisane u govornom jeziku ali u obliku “naredbi”


Tako da su “slične” naredbama u programskom jeziku

Postaviti Nf=1
Zadati (učitati) podatak N Sekvencija
Ako je N>=0 onda Selekcija
Za svaki i=1 do N Iteracija
pomnožiti Nf s i
Ispisati rezultat Nf
U suprotnom
Ispisati poruku o pogreški
Kraj selekcije
URP 24
Primjer: Najveći broj

Zadano je:
Skup podataka u datoteci: Treba pronaći
PODACI.DAT najveći broj iz tog
23.04 skupa podataka!
2.005
12.45
-8.224 - nije poznato koliko podataka ima
- podacima se pristupa sekvencijalno
30.01
18.94
URP 25
Primjer: Najveći broj
- plan rješavanja (algoritam)

 otvoriti datoteku PODACI.DAT - fopen

 pročitati prvi podatak iz datoteke - fscanf


i postaviti ga za xmax xmax

 Ponavljati(do kraja podataka) - fscanf


 čitati iz datoteke u varijablu x
 ako je x veći od xmax onda - if (x>xmax)
postaviti xmax = x
 ispisati riješenje xmax na ekran - printf xmax
Primjer1: Najveći broj URP 26
Rješenje:

 float x, xmax; varijabla u koju ćemo


smjestiti najveći broj
varijabla u koju učitavamo
 fscanf( dat, “%f”,&xmax );
podatak iz datoteke

 while ( !feof( dat ) ) PODACI.DAT


 { xmax = 23.04

 fscanf( dat, “%f”, &x ); x= 2.005


x= 12.45
 if ( x > xmax ) xmax = x; x= -8.224

 } xmax = xmaxx== 30.01


x= 18.94
Primjer 2: Najveći broj i koliko ih ima URP 27
(algoritam Nxmax)
Rješenje:
Učitati xmax
Postaviti nmax=1
Sve dok ima podataka činiti
Učitati x
Ako je x=xmax povećati nmax za 1
Ako je x>xmax
Postavit xmax=x
Postaviti nmax=1
Kraj Ako je..
Kraj Sve dok...

RJEŠENJE NIJE POTPUNO ISPRAVNO !!


Primjer 2: Najveći broj i koliko ih ima URP 28
(algoritam Nxmax)
Poboljšano rješenje:
Učitati x
Postaviti xmax=x
Postaviti nmax=0
Sve dok ima podataka činiti
Ako je x=xmax povećati nmax za 1
Ako je x>xmax
Postavit xmax=x
Postaviti nmax=1
Kraj Ako je..
Učitati x
Kraj Sve dok...
Algoritmi s vektorima i matricama (1) URP 29

Skalarni produkt dva vektora


Fizikalna definicija:
y v2 v1*v2=v1*v2*cos(a)
a v1 a= a2- a1
a2 a1 v1*v2*cos(a)= v1*v2*cos(a2-a1)=
v1*cos(a1)*v2*cos(a2)+
x v1*sin(a1)*v2*sin(a2)=
v1x*v2x+v1y*v2y
Matematička definicija: Sp=S v1i*v2i
0 0
1 1
Algoritam:
2 2
3 3
4 4
Postaviti Sp=0
Za svaki i=0 do n-1 povećati
n-2 n-2
n-1 n-1
Sp za v1[i]*v2[i]
Algoritmi s vektorima i matricama (2) URP 30

Primjer: Naći srednju vrijednost uz uvjet V[i]>x

Postaviti S=0
Postviti m=0
Za svaki i=0 do n-1 činiti
Ako je V[i]>x činiti
Povećati S za V[i]
Povećati m za 1
Kraj Ako je ...
Kraj Za svaki i
Podijeliti S s m
Ispisati S
Algoritmi s vektorima i matricama (3) URP 31
Množenje matrica

* =

A n
B C
Definicija: cij=S ail*blj
l=1

Za svaki i=0 do m-1


Za svaki j=0 do k-1činiti
Postaviti C[i][j]=0
Za svaki l=0 do n-1
povećati C[i][j] za A[i][l]*B[l][j]
Kraj za svaki j
3. Elementi proceduralnog progr. (1) URP 32

a) Znakovi - Alfabetski A-Z, a-z, $, _


- Numerički 0-9
- Posebni + - * / = ( ) [ ] { }| \ < > . , “

b) Riječi: - Imena Podataka


Programskih struktura

- Podaci Konstante
Varijable

- Operatori Aritmetički
Logički
Relacijski
- Ključne riječi
Elementi proceduralnog progr. (2) URP 33

c) Rečenice - Komentari
- Naredbe

d) Naredbe - Deklarativne
- Izvršne

e) Izvršne naredbe - Sekvencija Unutrašnje programske


- Selekcija strukture
- Iteracija
Elementi proceduralnog progr. (3) URP 34

f) - Blokovi

e) - Vanjske programske strukture


- Funkcije
- Procedure

f) - Tekst (izvorni program)


Elementi proceduralnog progr. (4) URP 35

Svojstva podataka (konstanti i varijabli) (1)

a) Tip (konstante i varijable): - numerički - cjelobrojni


- realni

- znakovni

- adresni

- logički
Elementi proceduralnog progr. (5) URP 36

Svojstva podataka (varijabli) (2)

b) Oblik:(varijable) - skalari
- vektori, matrice
- apstraktne strukture, klase

c) Područje definiranosti (varijable)


- lokalne
- globalne

d) Vrijeme života (varijable) - statičke


- dinamičke
4. Sintaksa C programskog jezika URP 37
Konstante i imena

Konstante: -numeričke - cjelobrojne 12 -35


- realne 1.5 -3.8 2.5e-6
-znakovne - skalarne ‘a’ ‘0’
- Escape sequence ‘\n’ ‘\t’
- Oktalne ‘\ozzz’
- Heksadecimalne ‘\xhh’
- vektorske “ETF Osijek”
-adresne - NULL

Imena: - prvi znak mora biti alfabetski


- ostali znakovi ne smiju biti posebni
Sintaksa C programskog jezika (2) URP 38
- Ključne riječi (rezervirane riječi)
(neke od oko 55)

void class if switch


int struct else case
float static for default
char typedef do return
long public while break
double private goto continue
short union
Rečenice URP 39

1. Komentari:
Npr.
/* Ovo sve je
komentar */

// Zadnja promjena 23. 10. 2002.

2. Naredbe
a) Deklarativne
b) Izvršne
URP 40
1. Deklarativne naredbe (1)

a) predprocesorske #

- #include <datoteka>

npr. #include <stdio.h>


#include <math.h>

- #define varijabla izraz

npr. #define e 2.718282


#define Pi 4*atan(1)
URP 41
Deklarativne naredbe (2)

b) “Procesorske” - naredbe za prevodilac


- deklaracija vanjske programske strukture

void
int ime(popis parametara)
float
char

npr. void main() float SredVr (float V[], int n)


{ {
tekst main procedure tekst SredVr funkcije

} }
URP 42
Deklarativne naredbe (3)

c) Deklaracija tipa, oblika i početne vrijednosti varijabli (1)

int
float popis varijabli
char

popis varijabli(1): var1, var2,...;

npr. int i,j, Nsum; float x, xmax, Zbroj_1;

popis varijabli (2): var1[broj1], var2[broj2][broj3].... ;

npr. float V1[100], A_matr[20][40];


URP 43
Deklarativne naredbe (4)

d) Deklaracija tipa, oblika i početne vrijednosti varijabli (2)

popis varijabli (3): var1=izraz1, var2[broj2]={iz1,izr2...}.... ;

npr. float Suma=0, V[5]={7,12.4,0.5,2.3,-1};

e) Deklaracija adresnih tipova

Tip *ime varijable

npr: int *broj; FILE *dat1;

FILE je predefinirano ime tipa za datoteke.


2) Izvršne naredbe URP 44
2.1 Naredbe sekvencije

a) Naredba pridruživanja (engl. assigment


statement)

varijabla op. pridr. izraz ;


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

Primjer: y=2*a*sin(x+3.5);
Naredba pridruživanja (2) URP 45

Operatori:
-pridruživanja: = *= /= += -= &= |= ^=
-aritmetički: + - * / % ++ --
- za razdvajanje/grupiranje: . -> ( ) [ ] ::
- relacijski: < > == != <= >= ( ? :)
- logički: ! || &&
- adresni: * &
- bit-logički: ~ | & ^
Naredba pridruživanja ( izrazi) (3) URP 46

Razine operatora:
- (najviša) ( ) [ ] -> :: .
- ! ~ ++ -- & *
- * / %
- + -
- < <= > >=
- == !=
- &&
- ||
- (najniža) = *= /= += -= &= |= ^=
Za operatore iste razine vrijedi pravilo "s lijeva na desno"
Naredba pridruživanja (4) URP 47
Pretvorba operanada različitog tipa

Dijelovi izraza računaju se u cjelobrojnoj aritmetici


ako su svi operandi cjelobrojni. Npr.
float x; int a=5, b;
x=a/2; -> x=2.00
x=a/2.0; -> x=2.50
b=a/2.0; -> b=2
x=a/2 +3.0 -> x=5.00
x=a/2 *3.0 -> x=6.00
x=3.0*a/2 -> x=7.50

Casting: x= (int) (3.0*a/2) -> x=7.00


x=(float) a/2 *3.0 -> x=7.50
Naredba pridruživanja (5) - primjeri URP 48

a+ b
x= x=(a+b)/(2*a);
2a
-b + b2-4 a c
x1=(-b+sqrt(b*b-4*a*c))/(2*a);
x1=
2a

Povećati S za Vi i S+=V[i++];
povećati i za 1

Promijeniti predznak
podatka na adresi d (*d) = - (*d);
Naredba pridruživanja (5) - funkcije URP 49

Često korištene funkcije (definirane u math.h zaglavnoj datoteci)


x fabs ( x ) sin(x)
x sqrt ( x )
cos(x)
ex exp(x)
tan(x)
log(x) log10(x)
atan(x)
ln(x) log(x)

xa pow(x,a)
Naredba pridruživanja (6) - funkcije URP 50

Često korištene funkcije (definirane u stdio.h i conio.h datoteci):


Učitavanje podataka scanf("%f",&broj)
fscanf(dat,"%f",&broj)
getch( )
gets ( )
kbhit ( )

Ispis podataka: printf("%8.3f",broj)


fprintf(dat,"%8.3f",broj)
putch(znak)
puts(niz)

Korištenje datoteka fopen (datoteka)


feof (datoteka)
Izvršne naredbe - Naredbe sekvencije URP 51
b) Ulazno izlazne naredbe (1)

Standardni ulaz / izlaz (tastatura /ekran)

scanf (format,popis adresa);


npr. scanf("%d %f",&i,&x);

Format: % tip
Tip d cijeli broj (integer)
ld dugi cijeli broj (long)
f realni broj (float)
c znak
s niz znakova
Naredbe sekvencije URP 52
Standardni ulaz: Učitavanje znakovnog vektora

char vektor[n];
scanf("%s",vektor);

Tipičan primjer:

FILE *dat;
char imedat[20];
printf("Ime datoteke: "); "Podaci.dat"
scanf("%s",imedat);
P o d a c i . d a t \0
dat=fopen(imedat,"r");
Naredbe sekvencije URP 53
Naredbe za standardni izlaz
printf(format,popis izraza);
Format: % dužina tip dužina: u.d
npr. za x=312.463 i n=672 ispisi će biti

printf ("\nRezultat=%8.2f, za n=%4d.",x,n);


Rezultat= 312.46, za n= 672.

printf ("\nRezultat=%.1f, za n=%d.",x,n);


Rezultat=312.5, za n=672.

printf ("\nRezultat=%10.4f, za n=%2d.",x,n);


Rezultat= 312.4630, za n=672.
Naredbe sekvencije URP 54
Naredbe za nestandardni ulaz i izlaz

fscanf (datoteka,format,popis adresa);


npr. fscanf(uldat,"%d %f",&i,&x);

fprintf (datoteka,format,popis izraza);


npr. fprintf(uldat,"%d %.4f",i,x+2);

datoteka = fopen(vanjsko ime, radnja);


Radnja: "r" čitanje "w" pisanje

fclose(datoteka);
feof(datoteka);
2.2 Naredbe selekcije URP 55

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
Naredbe selekcije (2) URP 56

Primjer: Ako je Godina prestupna postaviti


Prestupna=1, suprotnom postaviti Prestupna=0
(Godina je prestupna ako je djeljiva s 400 ili je
djeljiva s 4 a nije djeljiva s 100).

if (Godina%400==0 || Godina%4==0 &&


Godina%100!=0) Prestupna=1;
else Prestupna=0;
Naredbe selekcije (3) URP 57
Prestupna godina (2)

if (!(Godina%400) || !(Godina%4) &&


Godina%100) Prestupna=1;
else Prestupna=0;

Prestupna= (!(Godina%400) || !(Godina%4)


&& Godina%100) ;
Naredbe selekcije (4) URP 58
switch naredba

switch (izraz) { popis case naredbi , default naredba}

Case naredba case konstanta: naredbe

Primjer:
switch (Godina_studija)
{ case 1: Uvjet=7; break;
case 2: Uvjet=8; break;
default: Uvjet=9 ;
}
Naredbe selekcije (5) URP 59
Ternarni operator ?

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

Npr: z=(a>b) ? 15: x+7;

znači isto što i


if(a>b) z=15;
else z=x+7;
Naredbe selekcije (6) URP 60
Primjer: Kvadratna jednadžba:

Rješenje jednadžbe ax2+bx+c=0


-b b2-4ac
X1,2=
2a

kvadjed.cpp
2.3 Naredbe iteracije URP 61

for (početne vrijednosti; krajnji uvjet; iterativne radnje)


blok (ili naredba)

Početne vrijednosti: popis naredbi pridruživanja


npr. i=0, sortiran=1;

Krajnji uvjet: uvjet - itraracija(petlja) se ponavlja


sve dok je ovaj uvjet ispunjen
npr. i<=n-1;

Naredba break uzrokuje skok na prvu naredbu iza bloka!


Naredbe iteracije (2) URP 62
Naredba for
iterativne radnje: popis naredbi
Npr. i++, printf("\n%d",nf)

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

for(i=2,nf=1; i<=n; nf*=i++, printf("%d %d\n", i-1,nf));

for (i=0;i<20;i++)
{fscanf(dat,"%d %f",&k,&x);
if(feof(dat)) break;
Suma+=x;
}
Naredbe iteracije (2) URP 63
Naredba while

1.) while (uvjet) blok


Uvjet se ispituje prije izvođenja prve narebe u bloku.
Ako je uvjet ispunjen, blok se izvodi i nakon toga
ponavlja se ispitivanje uvjeta
2) do blok while (uvjet)
Uvjet se ispituje nakon izvođenja zadnje naredbe u
bloku. Ako je uvjet ispunjen, blok se izvodi ponovo.
Naredba break uzrokuje skok iz petlje.
Naredbe iteracije (2) URP 64
Naredba while - primjeri

while (N>0 )
{S+=N%10;
N/=10;
i++;
if(i==7) break;
}

do
{S2+=V[i]*V[i];
fscanf (dat,"%f",&V[i++]);
}while (i<20 && !feof(dat));
Naredbe iteracije URP 65
Naredba while - primjeri (3)
Računanje sin (x) iterativnom metodom:
Koristiti činjenice: sin(x) x ; x<<
sin(2x)=2sin(x)cos(x)
cos(2x)=cos2(x)-sin2(x)
1-x2 1-x2/2
Osnovna zamisao: Zadani kut a pretvoriti u kut x u
radijanima i svesti na interval [0,2p]. Uzastopnim
dijeljenjem s 2 smanjiti x na manje od 10-5 tako da
je sin(x)  x a zatim usastopnim udvostručavanjem i
računanjem funkcija sin i cos za dvostruki kut naći
traženu vrijednost
Naredbe iteracije URP 66
Naredba while - primjeri (4)
Računanje sin(x) iterativnom metodom, algoritam:
Učitati kut alpha
Iz alpha naći x u radijanima u intervalu [0,2p]
Postaviti n=0
Sve dok je x>10-5 činiti
Podijeliti x s 2 Program:
Povećati n za 1 siniter.cpp
Postaviti sinx=x i cosx=1-x*x/2
Sve dok je n>0
Naći sin2x=2*sinx*cosx
Naći cos2x=cosx*cosx-sinx*sinx
Postviti sinx=sin2x
Postaviti cosx=cos2x
Smanjiti n za 1
Ispisati alpha i sinx
Naredbe iteracije, vektori i matrice URP 67
"Insert sort".

Zadatak: Podatke x koji dolaze proizvoljno poredati u rastućem


redoslijedu ubacivanjem u vektor V

x=55.7
51.7
51.6 51.6
52.8 52.8
54.3 54.3
56.2 55.7
59.8 56.2
59.8
Naredbe iteracije, vektori i matrice URP 68
"Insert sort". Algoritam

Definirati vektor V
Postaviti n=0
Učitati x
Programi
Sve dok ima podataka činiti inssort.cpp
Postaviti i=n inssortc.cpp
Sve dok je i>0 i x<V[i-1] činiti
Postaviti V[i]=V[i-1];
Smanjiti i za 1
Kraj sve dok
Postaviti V[i]=x;
Povećati n za 1
Učitati x
Kraj sve dok ima podataka
Ispisati sve elemente vektora V
Naredbe iteracije, vektori i matrice URP 69
Trag matrice i produkt sporedne dijagonale.

Zadatak:

U datoteci, čije ime se zadaje preko tastature,


postoji n redova s n realnih brojeva (između dva broja
je jedna ili više praznina. Učitati date brojeve u
kvadratnu matricu A te naći i ispisati trag matrice
(sumu članova glavne dijagonale) i produkt članova
sporedne dijagonale.
Naredbe iteracije, vektori i matrice URP 70
Trag matrice i produkt sporedne dijagonale - algoritam

Definirati matricu A[100][100],


Postaviti n=0, trag=0 i prod=1
Otvoriti datoteku
Učitati znak iz datoteke
Sve dok je znak!='\n' činiti
Sve dok je znak = ' ' učitati znak iz datoteke
Povećati n za 1
Sve dok je znak!=' ' i znak !='\n' učitati znak iz datoteke
Kraj sve dok je znak != '\n'
Zatvoriti datoteku
Otvoriti datoteku Program
Za svaki i=0 do n-1 činiti
Za svaki j=0 do n-1 učitati A[i][j] tragiprod.cpp
Za svaki i=0 do n-1 povećati trag za A[i][i]
i pomnožiti prod s A[i][n-1-i]
Ispisati trag i prod
URP 71
Procedure
Funkcije

Funkcije su procedure koje nisu void tipa, u njima treba biti


return naredba koja “vraća” vrijednost proceduri iz koje je
obavljen poziv.

Procedura koja poziva: Pozvana funkcija:


float SredVr(float p[],int k)
{float Rezultat;
float V[100],y; ....
int n; Rezultat = ....p[..] k .....;
....
y= SredVr (V, n) return Rezultat;
}
URP 72
Procedure
Funkcije (2)

Primjer 1:

U glavnom programu učitati podatke iz datoteke


Podaci.dat u vektor V. Pomoću funkcije SredVr naći
srednju vrijednost učitanih podataka. Ako podataka
ima više od 50, naći pomoću iste funkcije srednju
vrijednost prvih 10 i prvih 50 podataka.
Ispisati dobivene srednje vrijednosti.
URP 73
Procedure
Funkcije (3)

Algoritam za primjer 1:

Definirati vektor V od 1000 brojeva


Otvoriti datoteku Podaci.dat
Postaviti n=0
Ponavljati
Učitati V[n] iz datoteke
Povećati n za 1
Sve dok ima podataka u datoteci. Program
Postaviti Sr=SredVr(V,n) SredVr.cpp
Ispisati Sr
Ako je n>50 ispisati SredVr(V,10) i SredVr(V,50)
URP 74
Procedure
Funkcije (4) Primjer 2

Riješiti jednadžbu (x-a)2=e-bx za zadane a i b.


Koristiti Newtonovu metodu tangente
y
tg(a)= f’(x0)=f(x0 )/(x0- x1)

x1 = x0 - f(x0) / f’(x0)

xi+1 = xi - f(xi) / f’(xi)


a
x1 x0 x Za zadani primjer treba staviti:
f(x)=(x-a)2 - e-bx
URP 75
Procedure
Funkcije (5) Primjer 2 (nastavak)

Algoritam Newtonove metode

Definirati globalne varijable a i b


Definirati funkciju f(x)
Definirati funkciju df(x)
Učitati a i b
Učitati početni x, broj ponavljanja N i dozvoljenu grešku eps
Postaviti i=0
Sve dok je |f(x)| >eps i i<N činiti
Postaviti x=x-f(x)/df(x)
Povećati i za 1
Program
Kraj sve dok Newton.cpp
Ako je i<N ispisati rješenje x
U suprotnom ispisati poruku da rješenje nije nađeno
URP 76
Procedure
Funkcije (6) Primjer 3
Zadatak: Naći parametar a u
y
funkciji y2=(x-a)2 tako da ta
funkcija i y1=ln(x) omeđuju
površinu P0
y2=(x-a)2

y1=ln(x) P0

x1 a x2 x
URP 77
Procedure
Funkcije (7) Primjer 3 (nastavak)

Načelno rješenje:
Definirati funkcije Px(a) i naći nultočku funkcije P(a)=Px(a)-P0.
Funkcija Px(a) ovisi o sjecištima x1(a) i x2(a).Oba sjecišta kao i
nultočka funkcije P(a) nalaze se Newtonovom metodom.
Derivacija funkcije P(a) računa se približno kao
P(a+Da)-P(a)
dP(a)= za Da dovoljno malo
Da

Program
Area.cpp
URP 78
Procedure
Funkcije (8) Primjer 4 :Simpsonova metoda
Nalazi se površina ispod krivulje f(x) tako da se krivulja
aproksimira parabolama
Površina P ispod parabole

f3
f2

f1
dx dx

x1 x3 x2 x
P= dx /3*(f1+4*f3+f2)
URP 79
Procedure
Funkcije (9) Primjer 4 :Algoritam “Simpson”
Definirati funkciju f(x)
Zadati x1, x2, broj iteracija N i točnost eps.
Postaviti dx=(x2-x1)/2
Postaviti f1=f(x1), f2=f(x2), f3=f(x1+dx)
Postaviti P0=dx/3*(f1+4*f3+f2)
Za svaki i=1 do n činiti
Podijeliti dx s 2
Postaviti f4=0
Za svaki x=x1+dx do x2-dx u koraku po 2*dx povećati
f4 za f(x)
Postaviti P=dx/3*(f1+4*f3+f2+2*f4)
Ako je |P-P0|<eps ispisati rezultat P i završiti
Povećati f3 za f4
Postaviti P0=P
Kraj za svaki x Program
Ispisati poruku o pogreški Simpson.cpp
URP 80
Procedure - void funkcije

Prazne ili "void" funkcije su procedure koje ne "vraćaju"


vrijednost proceduri koja ih je "pozvala". Razmjena podataka
obavlja se preko globalnih varijabli i/ili parametara.
Procedura koja poziva: Pozvana procedura:

float a[100], t; void Proc1(int k, float x)


void main( ) {
{ ....
int n; a[k]= .…x …;
float z; ....

Proc1(n,z); }
URP 81
Procedure (2) - void funkcije
Primjer 1: Razvoj u Fourierov red
Periodska funkcija f(x)=f(x+T) može se prikazati kao:
a0 2*p*i* x 2*p*i* x
f(x) = 2 S (ai*cos( T
)+bi*sin( ))
i=1 T

Ovdje su koeficijenti ai i bi dati izrazima


2 T 2*p*i* x
ai = T *  f ( x) * cos( )*dx
0
T

T
2*p*i* x
* f ( x) * sin(
2
bi = )*dx Program
T 0 T
Fourier.cpp
URP 82
Procedure (3) - void funkcije
Primjer 1: Razvoj u Fourierov red - algoritam
Definirati globalne varijable a[20],b[20] i T
Definirati funkciju f(x) za koju se računa Fourierov red
Definirati funkciju fs(x,i)=f(x)*sin(2*x*i*Pi/T)
Definirati funkciju fc(x,i)=f(x)*cos(2*x*i*Pi/T)
Učitati broj harmonika n i period funkcije T
Pozvati proceduru Fourier (n)
Zadati broj točaka m za ispis funkcije dobivene razvojem u red
Za svaki x=0 do x=T u koraku po T/(m-1) činiti
Postaviti f_aprox=a[0]/2
Za svaki i=1 do n povećati f_aprox za
a[i]*cos(2*Pi*i*x/T) + b[i]*sin(2*Pi*i*x/T)
Ispisati f_aprox
Kraj za svaki x
URP 83
Procedure (4) - void funkcije
Primjer 1: Algoritam Fourier procedure

Za svaki harmonik i=0 do n činiti


Simpsonovom metodom naći a[i] kao integral funkcije
fc(x,i)*dx ( x je u intervalu [0,T])
Ako je i>0 Simpsonovom metodom naći b[i ] kao
integral funkcije fs(x,i)*dx (x je u intervalu [0,T]
Kraj za svaki i
URP 84
Procedure (4) Predaja argumenata po vrijednosti i adresi

1. Argument koji je skalar predaje se pozivajućoj proceduru


po vrijednosti tako da se napiše njegovo simboličko ime.
Pozvana procedura dobiva kopiju te vrijednosti. Promjena
parametra koji u pozvanoj proceduri dobiva vrijednost argumenta
ne mijenja vrijednost "originala" u pozivajućoj proceduri.

2. Argument koji je vektor predaje se pozivajućoj proceduru


po adresi isto preko simboličkog imena. Promjena parametra,
koji je vektor, u pozvanoj proceduri mijenja vrijednost
vektora i u pozivajućoj proceduri.
URP 85
Procedure (5) Predaja argumenata po vrijednosti i adresi

3. Skalari se mogu predati po adresi ako se koristiti ad


operator &. U pozvanoj proceduri treba naznačiti da se radi o
adresi (pointeru) pomoću adresnog operatora *.
Primjer: Pozvane procedure
void Bubble(float P[], int k)
{…..
Pozivajuća procedura P[i]=x;
k--;
Bubble(V,n); }

void Swap(float *x, float *y)


Swap (&a, &b) {
*x=t;

}
URP 86
Procedure (6) Bubble sort s procedurama

Glavni program

Pozovi proceduru Ucitaj(V,&n)


Pozovi proceduru Bubble (V,n)
Pozovi proceduru Ispis (V,n)

Procedura Bubble(V,n)
Postaviti sortiran=0
Sve dok nije sortiran činiti
Postaviti sortiran=1
Za svaki i=0 do n-1 činiti
Ako je V[i] > V[i+1] činiti
Zamijeniti V[i] s V[i+1]
Postaviti sortiran=0
Kraj Ako je
Kraj Za svaki i
Smanjiti n za 1 Program
Kraj sve dok Bubble_p.cpp
URP 87
Parametri iz operacijskog sustava
Operacijski sustav predaje glavnom - main programu dva parametra:

1. Cijeli broj ( int npar): broj parametara u popisu. Adresa vektora s popisom
je u drugom parametru.

2. Adresna znakovne matrice(char *lpar[ ]) u kojoj je npar preostalih


parametara.

lpar[0] je ime pozvanog programa


lpar[i] je i-ti parametar kojeg dobiva main program

Npr. Komandni red (naredba operacijskog sustava)


Bsort ulaz.dat,izlaz.dat
npar=2
lpar[0]=Bsort
lpar[1]= ulaz.dat
lpar[2]= izlaz.dat
Pokazivači (pointeri) URP 88

float x; skalarna varijabla 8.45


&x adresa varijable x 0065FDF4
float *p; Pokazivač na realnu (float) varijablu;
p adresa 0065FDF4 NULL
*p vrijednost na adresi p 8.45
float A[20,10]; matrica A
A adresa (početka) matrice A; ==&A[0][0]==&A[0]
void NEKA_PROC(float (*NEKA_FUN)(parametri funkcije),ostali param.)
*NEKA_FUN Pokazivač na funkciju
Operatori: new delete Procedure: malloc() realloc()

Moguća pridruživanja:
p=NULL;
p=(*float ) A; *(p+3)=5.5; <==> A[0][3]=5.5; p=p+1;
p=&x; p=new; float[20];
p=&A[2]; printf(“\nAdresa početka matice je %p”,&A[0]);
Pokazivači (pointeri) URP 89
Pokazivači i funkcije
Funkcija se može predati proceduri preko parametra koji je pokazivač (adresa)
na tu funkciju. To omogućuje da ista procedura koristi različite funkcije. Npr.

float Simpson (float (*fun) (float x), float x1, float x2)
{float f1,f2,f3,f4,dx,p0,p;
f1=fun(x1); f2=fun(x2); f3=fun(x1+dx);
dx=(x2-x1)/2; p=dx/3*(f1+f2+4*f3);
do {p0=p; dx/=2; f4=0;
for (float x=x1+dx; x<x2; x+=2*dx) f4+=fun(x);
p=dx/3*(f1+f2+4*f4+2*f3);
f3+=f4;
}while (fabs(p-p0)>0.01);
return p;
}
Pokazivači (pointeri) URP 90
Pokazivači i funkcije (2)

Ako postoji procedura Simpson(float (*fun) (float x), float x1, float x2),
može se pozivom te procedure numerički integrirati svaka prethodno
definirana funkacija, ako se preda kao prvi argument u pozivu procedure
Simpson . Na primjer:

#include <stdio.h>
Procedura Simpson spremljena
#include “Simpson.h” kao zaglavna datoteka
#include <math.h>
#define Pi 4*atan(1)
float Gauss (float x) Program
{return 1/sqrt(2*Pi)*exp(-x*x/2);} simpson.h
void main ( )
{printf(“\nIntegral ispod normalne krivulje od 0 do 0.8 je %6.4f\n”
, Simpson(Gauss,0,0.8));}
Pokazivači (pointeri) URP 91
Pokazivači i stukture

Struktura je skup podataka koji mogu biti različitog tipa Npr.

Takmičari: struct takmicari

Ime: Kostelić Janica {char ime[30]; }


Zemlja Hrvatska char zemlja[20];
Bodovi 456 int bodovi;
Vrijeme 54.32 float vrijeme; }skijasice,skijasi;

strcpy(skijasice.ime,“Kostelic Janica”);
strcpy(skijasice.zemlja,“Hrvatska”);
skijasice.bodovi=456;
skijasice.vrijeme=54.32;
Pokazivači (pointeri) URP 92
Pokazivači i stukture (2)

Elementi stukture (zapisi) mogu se povezivati pokazivačima. Dobiva se


povezani popis (engl. linked list).

Podaci Pokazivač Podaci Pokazivač Podaci Pokazivač


idući idući idući

prvi NULL
struct takmicari Adresiranje:
{char ime[30]; ...(*prvi).bodovi
char zemlja[20];
int bodovi; t=(*prvi).iduci;
float vrijeme;
struct takmicari *iduci;}skijasice,skijasi; t=(*t).iduci;
struct takmicari *prvi,*t;
Pomakni se na idući zapis
Pokazivači (pointeri) URP 93
Pokazivači i stukture (3) Dinamička dodjela memorije

Funkcija sizeof(t) daje veličinu memorije potrebnu za varijablu ili tip t.


Funkcija malloc(vel) daje adresu slobodnog prostora u memoriji veličine vel.
Npr.

struct takmicari
{char ime[30];
char zemlja[20];
int bodovi;
float vrijeme;
struct takmicari *iduci;}skijasice,skijasi;
struct takmicari *prvi,*t;
t=malloc(sizeof(takmicari));

strcpy((*t).ime,”Kostelić Janica”);
(*t).iduci=NULL;
Pokazivači (pointeri) URP 94
Pokazivači i matrice
*(A+1)
*A Ako je poznata adresa početka
matrice A i ako je poznat broj
stupaca matrice (pretpostavka je
da tip mora biti poznat) onda je
*(A+5) svaki element matrice dohvatljiv
(adresibilan) . To omoguća izradu
procedura, kojima se veličina matrice
predaje kao parametar.
void main()
{float A[20][10]; void PROC
(float *Matr, int n)
PROC(&A[0][0],10); {
Program
Mulmatp.cpp
PROC(A[0],10);
} }
Pokazivači (pointeri) URP 95
Pokazivači i matrice: Dinamičko pridruživanje (2)
Operator new daje adresu pokazivaču na mjestu gdje postoji
slobodan prostor u memoriji. Deklaracija tip[n] definira (zauzima)
prostor za n podataka tipa tip. Operator delete oslobađa memoriju
zauzetu s operatorom new.
Primjer:

int n,i; float *p;


p=new;.
cin >> n ;
float[n];

for (i=0;i<n;i++)
cin >>p[i];
delete n;

You might also like