Professional Documents
Culture Documents
Gmail 33 Korisna Saveta
Gmail 33 Korisna Saveta
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.
Svrha predmeta:
Odvijanje nastave:
Sadržaj predmeta:
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
b) RAČUNALO:
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)
A B C 12 5 8 0101 0010
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
Translacijske, Rotacijske
(Sekvencijelne)
FDD HD
Oprema: Uređaji i programska podrška URP 16
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 u
Prevodilac Program u
izvornom prevedenom
obliku
obliku
Poruke
URP 19
i) PROGRAMIRANJE
- razrada logike
- pisanje izvornog oblika
- ispravljanje grešaka (debugging)
- izrada dokumentacije za primjenu
URP 20
2. ALGORITMI
a) Dijagram toka
Učitati
Računati
Da
Ako je
Ne
URP 22
Prikaz algoritma
- sekvencija
- selekcija
uvjet
- iteracija
uvjet
URP 23
Prikaz algoritma
c) Pseudo-kod:
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)
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
- 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
f) - Blokovi
- znakovni
- adresni
- logički
Elementi proceduralnog progr. (5) URP 36
b) Oblik:(varijable) - skalari
- vektori, matrice
- apstraktne strukture, klase
1. Komentari:
Npr.
/* Ovo sve je
komentar */
2. Naredbe
a) Deklarativne
b) Izvršne
URP 40
1. Deklarativne naredbe (1)
a) predprocesorske #
- #include <datoteka>
void
int ime(popis parametara)
float
char
} }
URP 42
Deklarativne naredbe (3)
int
float popis varijabli
char
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
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
xa pow(x,a)
Naredba pridruživanja (6) - funkcije URP 50
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
fclose(datoteka);
feof(datoteka);
2.2 Naredbe selekcije URP 55
if (uvjet) blok1;
else blok2;
Složeni uvjet
uvjet1 logički operator uvjet2
npr. b==0 && (a+x)/2 > t
Naredbe selekcije (2) URP 56
Primjer:
switch (Godina_studija)
{ case 1: Uvjet=7; break;
case 2: Uvjet=8; break;
default: Uvjet=9 ;
}
Naredbe selekcije (5) URP 59
Ternarni operator ?
kvadjed.cpp
2.3 Naredbe iteracije URP 61
Primjeri: for(i=0;i<=n-1;i++)
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
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".
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:
Primjer 1:
Algoritam za primjer 1:
x1 = x0 - f(x0) / f’(x0)
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
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
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
}
URP 86
Procedure (6) Bubble sort s procedurama
Glavni program
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.
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
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)
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
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:
for (i=0;i<n;i++)
cin >>p[i];
delete n;