78
Računalništvo Računalništvo Proceduralno programiranje Danijel Skočaj Univerza v Ljubljani Fakulteta za pomorstvo in promet

Proceduralno programiranje

  • Upload
    others

  • View
    9

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Proceduralno programiranje

Računalništvo

Računalništvo

Proceduralno programiranje

Danijel Skočaj

Univerza v Ljubljani

Fakulteta za pomorstvo in promet

Page 2: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 2

Cilj

Naučiti se analizirati problem, poiskati proceduro za njegovo rešitev

Algoritmični način razmišljanja

Spoznati se z Matlabom kot primerom proceduralnega programskega jezika

Page 3: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 3

Algoritem

Algoritem je navodilo, s katerim rešujemo določen problem. Običajno je zapisan kot seznam korakov, ki nas pripeljejo do rešitve problema.

Beseda algoritem izhaja iz imena perzijskega matematika in pisca Al-Hvarizmija, ki je v 9. stoletju postavil algoritme za osnovne matematične operacije. Njegova najbolj pomembna knjiga, Kitab al-Jabr wal-Muqabala (Pravila reintegracije in redukcije), je bila osnova za standardizacijo arabskih številk v evropski matematiki.

[Wikipedia]

Page 4: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 4

Zapis algoritma

Algoritem lahko zapišemo na več načinov:

v naravnem jeziku

grafično s pomočjo diagrama poteka

s pomočjo psevdokode

kot program v enem od programskih jezikov

če (število > 4)

povečaj število za 1

sicer

končaj_program

if (stevilo > 4)

stevilo = stevilo + 1;

else

exit(0);

Povečuj vrednost števila dokler

ne doseže vrednosti N.

Page 5: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 5

Diagram poteka

začetek

parametri

pravi?NE

DA

operater vnese

parametre

inicializiraj naprave

postavi ploščico pod

kamero

zajemi sliko

analiziraj sliko

ploščica

OK?signal OK signal NOKDA NE

konec

dela?

izklopi naprave

konec

DA

NE

poišči robove ploščice

poišči premice

poišči vogale

izračunaj dolžine

stranic

izračunaj kote med

stranicami

Page 6: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 6

Primeri algoritmov

Kuharski recepti

Videoteka

Zamenjava gume

Izbira partnerja

Izpis prvih desetih števil

Izračun vsote prvih desetih števil

Izračun fakultete

Izračun histograma

Seštevanje dveh števil

Množenje dveh števil

Pretvarjanje iz decimalnega v dvojiški zapis

Page 7: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 7

Računalniški program

Algoritem, ki se izvaja na računalniku

Algoritem se zapiše v določenem programskem jeziku

Pretvori se ga v zaporedje ukazov tega programskega jezika

Koraki morajo biti logično pravilni

Zapisani morajo biti v skladu s sintakso jezika

Tipično program na vhodu dobi podatke, jih obdela in vrne rezultate

Razvoj programske opreme je precej več kod kodiranje

Page 8: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 8

Razvoj programske opreme

Postopek razvoja programa:

1. Definicija problema Potrebno natančno določiti namen programa, podatke s katerimi naj bi

operiral, pričakovane rezultate, itn.

Specifikacija zahtev uporabnika

2. Groba zamisel ustreznega algoritma Sestavimo algoritem na logičnem nivoju, neodvisno od implementacije

Specifikacija zahtev strojne in programske opreme

3. Podroben načrt Dovolj podroben načrt

Prilagojen specifičnem računalniškem sistemu

4. Kodiranje Algoritem zapišemo v programskem jeziku

Sproti testiramo in popravljamo

5. Testiranje (preizkušanje) Program temeljito preizkusimo na ciljnem računalniku

Pripravimo testne podatke za katere poznamo pravilni rezultat

6. Uporaba in vzdrževanje Program uporabljamo in vzdržujemo

Page 9: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 9

Klasični življenjski cikel

Analiza

Načrtovanje

Kodiranje

Testiranje

Vzdrževnje

Page 10: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 10

Programiranje kot pisanje besedil

Postopki pri pisanju besedila:

Viharjenje (brainstorming), zbiranje misli

Raziskovanje

Okvirna zgodba

Osnutek

Popravljanje

Poliranje

Pregled

Ponovitev po potrebi

Page 11: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 11

Programiranje

Viharjenje (brainstorming), zbiranje misli

Ne začni takoj s programiranjem!

Dobro premisli o vsem!

Analiziraj problem

Zapisuj si ideje, možne rešitve

Prej kot začneš programirati, dlje traja (narediš več napak)

Raziskovanje

Išči samostalnike (s čim je treba delati), kaj je vhod, kaj bo izhod, kaj so značilnosti

Išči glagole: kaj naj bi program delal, kako naj bi se obnašal

Specifikacija: natančno določi kaj naj bi program delal

Poglej, če je kaj podobnega že narejenega, katero orodje/ prog. jezik uporabiti

Page 12: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 12

Programiranje

Okvirna zgodba

Sestavi algoritem, ki reši problem

Sestavi recept za rešitev problema!

Uporabljaj pseudokodo

Postopoma razbij problem na manjše in bolj detajlne dele in jih reši

Reši enostavne probleme in jih sestavi v celoto

Natančno premisli vse sestavne dele

Poglej kje bi se dalo poiskati bolj učinkovito rešitev

Page 13: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 13

Programiranje

Osnutek, Popravljanje, Poliranje

Kodiraj (napiši program)

Popravi napake (razhrošči program)

Testiraj program, če pravilno dela

Popravi logične napake

Počisti program

Zadokumentiraj program

Napiši navodila za uporabo

Pregled in ponovitev po potrebi

Preglej končni izdelek (s stranko)

Ugotovi še vse preostale napake

Ponovi postopek, če je potrebno

Page 14: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 14

Matlab

Programski jezik in programersko okolje Matlab

Zakaj Matlab?

Tipičen proceduralni jezik

Ima vse glavne osnovne programske konstrukte kot C, Java, ipd. jeziki

Enostaven za uporabo

Hitro učenje

Priročno programsko okolje

Tolmač (interpreter) in ne prevajalnik (compiler)

Interaktivno izvrševanje ukazov

Hitro pisanje prototipnih programov

Enostavno dodajanje uporabniškega vmesnika

Enostavna vizualizacija

Ni potrebno definirati podatkovnih tipov

Olajšano razhroščevanje

Page 15: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 15

Programersko okolje Matlab

Page 16: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 16

Matlab urejevalnik

Page 17: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 17

Matlab pomoč

Page 18: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 18

Prvi program

Naj izpiše ‘Hello world!’

Poženemo program:

function prviProg

disp('Hello world!');

>> prviProg

Hello world!

Page 19: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 19

Računalniški program

Definirati je natančno potrebno

Vhodne podatke

Funkcijo, ki naj jo program izvrši

Pričakovani rezultat, ki ga program vrne

PROGRAMVhod Izhod

Page 20: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 20

Primer

Program, ki izračuna ploščino kroga

Vhod: polmer kroga r

Izhod: ploščina kroga pl=¼ r2

Uporaba programa (funkcije):

function pl=plKroga(r)

pi=3.14;

pl=pi*r*r;

>> pl2=plKroga(1)

pl2 =

3.1400

>> pl2=plKroga(2)

pl2 =

12.5600

vhodni parameter

rezultat

ime funkcije telo funkcije

spremenljivka

Page 21: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 21

Spremenljivke

Spremenljivke hranijo vrednosti

Ime spremenljivke se mora začeti s črko, lahko vsebuje tudi cifre

Uporabljaj imena, ki nekaj pomenijo

Spremenljivke so lahko različnih tipov Števila

Logične spremenljivke

Znakovni nizi

Matrike števil

Bolj kompleksne spremenljivke…

Z Operatorjem = dodeljujemo spremenljivkam vrednosti (najprej se evaluira desna stran, vrednost se nato dodeli spremenljivki)

>> x=5;

>> y=8;

>> str='Dober dan.';

>> x

x =

5

>> y

y =

8

>> str

str =

Dober dan.

Page 22: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 22

Primer

Zaporedje izvajanja ukazov (dodeljevanja vrednosti) je pomembno:

Kakšne so vrednosti spremenljivk na koncu?

>> a=1;

>> b=2;

>> c=a*b;

>> b=3;

>> d=2*b;

>> a

a =

1

>> b

b =

3

>> c

c =

2

>> d

d =

6

Page 23: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 23

Funkcije

Matlab ima veliko vgrajenih funkcij

Lahko pa pišemo in nato kličemo tudi svoje funkcije

>> a=sin(pi/2)

a =

1

>> b=round(1.1)

b =

1

>> c=abs(-3.2)

c =

3.2000

>> prviProg

Hello world!

>> pl=plKroga(abs(-2))

pl =

12.5600

Page 24: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 24

Komentarji

Znak % označuje komentar – vrstico, ki se ne izvaja

Komentar naveden na začetku funkcije se nam izpiše kot pomoč:

Vedno je potrebno pisati komentarje!

function pl=plKroga(r)

%pl=plKroga(r) izracuna polmer kroga.

%r - polmer kroga

%pl - ploscina kroga

pi=3.14; %definiramo vrednost pi

pl=pi*r*r;

>> help plKroga

pl=plKroga(r) izracuna polmer kroga.

r - polmer kroga

pl - ploscina kroga

Page 25: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 25

Pogojne vejitve

IF stavek

Kaj če…

Če pogoj drži, se izvedejo stavki1

Če pogoj ne drži, se izvedejo stavki2

IF pogoj

stavki1

ELSE

stavki2

END

Page 26: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 26

Primer

Dopolni program za izračun ploščine kroga, da izpiše

‘Velik’, če je ploščina kroga večja od 10

‘Majhen’, sicer

function pl=plKroga(r)

pi=3.14; %definiramo vrednost pi

pl=pi*r*r;

if pl>10 %če je ploščina večja od 10

disp('Velik');

else

disp('Majhen');

end;

Page 27: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 27

Relacijski operatorji

< manjši

> večji

<= manjši ali enak

>= večji ali enak

== enak

~= različen

Page 28: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 28

Primer

Ali ta dva fragmenta kode vrneta enak rezultat?

Ne, razlika se pojavi, če je x=y

if x>y

disp('Velik');

else

disp('Majhen');

end;

if y>x

disp(‘Majhen');

else

disp(‘Velik');

end;

Page 29: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 29

Primer

Ali ta dva fragmenta kode vrneta enak rezultat?

Da.

if x>y

disp('Velik');

else

disp('Majhen');

end;

if y>=x

disp(‘Majhen');

end;

if y<x

disp(‘Velik');

end;

Page 30: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 30

Sestavljeni pogoji

Pogoj je lahko sestavljen iz več podpogojev

Uporaba logičnih operatorjev

&& in (and)

|| ali (or)

~ ne (not)

A B A&&B

0 0 0

0 1 0

1 0 0

1 1 1

A B A||B

0 0 0

0 1 1

1 0 1

1 1 1

A ~A

0 1

1 0

Page 31: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 31

Primer

Dopolni program za izračun ploščine kroga, da izpiše

‘Velik’, če je ploščina kroga večja od 10

‘Srednji, če je ploščina kroga med vključno 5 in 10

‘Majhen’, sicer

function pl=plKroga(r)

pi=3.14; %definiramo vrednost pi

pl=pi*r*r;

if pl>10

disp('Velik');

end;

if pl<=10 && pl>=5

disp('Srednji');

end;

if pl<5

disp('Majhen');

end;

Page 32: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 32

Splošni IF-stavek

Elegantnejša rešitev s splošnim if-stavkom

stavki1 se izvedejo, če drži pogoj1

stavki2 se izvedejo, če ne drži pogoj1 in drži pogoj2

stavki3 se izvedejo, če ne drži ne pogoj1 ne pogoj2

IF pogoj1

stavki1

ELSEIF pogoj2

stavki2

ELSE

stavki3

END

Page 33: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 33

Primer

Elegantnejša rešitev:

function pl=plKroga(r)

pi=3.14; %definiramo vrednost pi

pl=pi*r*r;

if pl>10

disp('Velik');

elseif pl>=5

disp('Srednji');

else

disp('Majhen');

end;

Page 34: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 34

Primer

Napiši program, ki za dolžine stranic a, b, c pove ali je trikotnik pravokoten ali ne

function pt=pravTrik(a,b,c)

if a^2+b^2==c^2

pt=1;

disp('Da.');

else

pt=0;

disp('Ne.');

end;

>> pravTrik(1,2,3);

Ne.

>> pravTrik(3,4,5);

Da.

>> pravTrik(3,5,4);

Ne.

Page 35: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 35

Primer

Popravek programa

function pt=pravTrik(a,b,c)

if a^2+b^2==c^2 || a^2+c^2==b^2 || ...

c^2+b^2==a^2

pt=1;

disp('Da.');

else

pt=0;

disp('Ne.');

end;

>> pravTrik(3,5,4);

Da.

Page 36: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 36

Iteracije

Ponovi določen ukaz večkrat, za različne parametre

Primer: Izpiši kvadrate prvih petih števil

Neumna rešitev:

Kaj če bi bilo potrebno izpisati kvadrate prvih 100 števil?

disp(1^2);

disp(2^2);

disp(3^2);

disp(4^2);

disp(5^2);

Page 37: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 37

FOR zanka

Struktura for stavka:

spr: spremenljivka kateri se spreminja vrednost

zacVr: začetna vrednost spremenljivke

korak: korak za katerega se povečuje vrednost spremenljivke

če ga ne navedemo se privzame vrednost 1

konVr: končna vrednost spremenljivke

stavki: stavki, ki se izvajajo v zanki (in upoštevajo osveženo vrednost spremenljivke)

for spr=zacVr:korak:konVr

stavki

end

Page 38: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 38

Primer

Elegantna rešitev:

For zanka spreminja vrednosti spremenljivke i: 1, 2, 3, 4, 5

for i=1:5

disp(i^2);

end

Page 39: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 39

Primeri

Kaj izpišejo naslednji For-stavki?

for i=1:5

disp(i);

end

for i=1:2:5

disp(i);

end

for i=1:.5:5

disp(i);

end

for i=2:-.5:-1

disp(i);

end

for i=4:-2:-1

disp(i);

end

for i=1:-1:3

disp(i);

end

1, 2, 3, 4, 5 privzeta vrednost koraka je 1

1, 3, 5 vrednosti povečuje za 2

1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5 korak je lahko tudi realno število

2, 1.5, 1, 0.5, 0, -0.5, -1 korak je lahko tudi negativen

4, 2, 0 konVred je meja, lahko ne doseže te vrednosti

noben pogoj ne ustreza, progam ne vstopi v zanko

Page 40: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 40

Primer

Napiši program, ki izračuna fakulteto nekega števila

function fak=fakult(n)

fak=1;

for i=1:n

fak=fak*i;

end;

Page 41: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 41

WHILE zanka

Podoben efekt lahko dosežemo tudi z WHILE zanko

Potrebno je skrbeti za inicializacijo in povečevanje vrednosti spremenljivke

while pogoj

stavki

end

%inicializiraj spremenljivko

i=1;

%zanka

while i<=n

stavki

%povečuj vrednost spremenljivke

i=i+1;

end

Page 42: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 42

Primer

Izračun fakultete nekega števila

function fak=fakult(n)

fak=1;

i=1; %inicializiraj spremenljivko

while i<=n %pogoj

fak=fak*i;

i=i+1; %povečuj vrednost spremenljivke

end;

Page 43: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 43

Mrtva zanka

Izogibati se je potrebno mrtvi zanki!

Pogoj ni nikoli dosežen

Zanka se izvaja v nedogled

Program prekinemo s CTRL-c

i=1;

n=5;

while i<=n

disp(i)

end;

Page 44: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 44

FOR in WHILE zanki

Kdaj uporabljamo katero zanko?

FOR zanko uporabljamo, ko natančno poznamo število korakov in je korak fiksen

WHILE zanko uporabljamo, ko je poznan samo pogoj, natančno število iteracij pa ne, ali ko se korak lahko spreminja

Page 45: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 45

Primer

Napiši program, ki izračuna vsoto kvadratov prvih n števil

postavi vsoto na 0

za vsak i od 1 do N

prištej i2 k vsoti

vsota=0

za vsak i od 1 do N

vsota=vsota+i2

• Pseudo koda:

ali

• Diagram poteka:

S=0

START

i=1

S=S+i2

i<=N

i=i+1

KONEC

DA

NE

S=0

START

i=1

S=S+i2

i<=N

i=i+1

KONEC

DA

NE

Page 46: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 46

Primer

Rešitev s for zanko

Rešitev z while zanko

function vsota=vsotaKvad(n)

S=0;

for i=1:n

S=S+i^2;

end;

function vsota=vsotaKvad(n)

S=0;

i=1;

while i<=n

S=S+i^2;

i=i+1;

end;

Kaj je narobe?

Izhodni parameter vsota ni nikjer definiran!

Page 47: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 47

Pravilna rešitev

Rešitev s for zanko

Rešitev z while zanko

function S=vsotaKvad(n)

S=0;

for i=1:n

S=S+i^2;

end;

function S=vsotaKvad(n)

S=0;

i=1;

while i<=n

S=S+i^2;

i=i+1;

end;

function vsota=vsotaKvad(n)

S=0;

for i=1:n

S=S+i^2;

end;

vsota=S;

function vsota=vsotaKvad(n)

S=0;

i=1;

while i<=n

S=S+i^2;

i=i+1;

end;

vsota=S;

Page 48: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 48

Polja oz. vektorji

Polje je podatkovna struktura, ki hrani več vrednosti istega tipa do katerih lahko dostopamo z indeksi

V Matlabu poljem pravimo tudi vektorji

Lahko operiramo s celotnim poljem naenkrat ali pa samo s posameznimi elementi

Primer: >> a=[3 5 2 6];

>> a

a =

3 5 2 6

>> a(2)

ans =

5

>> a(3)=4;

>> a

a =

3 5 4 6

3 5 2 6

1 2 3 4 indeksi:

vrednosti:

vektor a

3 5 4 6

Page 49: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 49

Primer

Napiši program, ki na vhodu prejme polje števil, na izhodu pa poda polje s kvadrati teh števil

V Matlabu sicer obstaja bolj elegantna rešitev:

function kv=kvadr(st)

dolz=length(st);

kv=zeros(1,dolz);

for i=1:dolz

kv(i)=st(i)^2;

end

polje vhodnih števil

polje z rezultatom

vrne dolžino polja

inicializira elemente polja na 0

kv=kvadr(1:5)

kv =

1 4 9 16 25

1 2 3 4 5

1 4 9 16 25

st:

kv:

>> [1:5].^2

ans = 1 4 9 16 25

Page 50: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 50

Primeri

Kakšne so vrednosti spremenljivk na koncu?

a=[4 8 33 2 4];

b=a(3);

a(3)=2;

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

d=a(a(4));

e=1:2:5;

f=kvadr(e);

f(2)=f(1);

f(1)=f(2);

g=a(e(f(1)));

a=[4 8 2 2 4]

b=33

c=10

d=8

e=[1 3 5]

f=[1 1 25]

g=4

Page 51: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 51

Podprogrami

Spremeni program za računanje fakultete, da lahko sprejme na vhodu polje (vektor) števil in vrne vektor fakultet

Uporabi funkcijo fakult kot podprogram!

function fakv=fakultv(nv)

dolz=length(nv);

fakv=zeros(1,dolz);

for i=1:dolz

fakv(i)=fakult(nv(i));

end;

Funkcija fakultv kliče funkcijo fakult

Vse spremenljivke v funkciji so notranje spremenljivke

Dosegljive (vidne) so samo v tej funkciji!

Spremenljivki i sta drugi,

čeprav imata isto ime

Spremenljivki n v funkciji fakult se priredi vrednost nv(i) iz funkcije fakultv

Spremenljivki fakv(i) pa

nato vrnjena vrednost

function fak=fakult(n)

fak=1;

for i=1:n

fak=fak*i;

end;

Page 52: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 52

Primer

Kličemo lahko funkcijo fakult s skalarnim vhodnim

parametrom

ali funkcijo fakultv z vektorskim vhodnim parametrom (ki nato sama kliče funkcijo fakult)

>> fakult(4) ans = 24 >> fakult(8) ans = 40320

>> fakultv([4 8 3 2]) ans = 24 40320 6 2 >> fakultv(1:8) ans = 1 2 6 24 120 720 5040 40320

Page 53: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 53

Vgnezdene zanke

Rešitev z eno samo funkcijo

Vgnezdene zanke

function fakv=fakultv(nv)

dolz=length(nv);

fakv=zeros(1,dolz);

for i=1:dolz

n=nv(i);

fak=1;

for j=1:n;

fak=fak*j;

end;

fakv(i)=fak;

end;

zunanja zanka

notranja zanka

Page 54: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 54

Vnos podatkov

Funkcija input

Primer: Program, ki prebere število na vhodu in izpiše njegov kvadrat

>> a=input('Vnesi število a:');

Vnesi število a:

Vnesi število a:3

>> a

a =

3

function kvad=kvadrat

st=input('Vnesi število: ');

kvad=st*st;

fprintf('Kvadrat števila: %d\n',kvad);

>> kvadrat;

Vnesi število: 2

Kvadrat števila: 4

Page 55: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 55

Formatiran izpis podatkov

S funkcijo fprintf lahko izpis uredimo

Primeri:

>> fprintf('Število je: %d\n',a);

Število je: 4

znak za pretvorbo: • %d – celo število • %g – realno število

posebni znak ‘\n’ “new line” – skok v novo vrstico

>> fprintf('Celo število %d ', -209);

fprintf('Realno število %g\n',6.25);

Celo število -209 Realno število 6.25

>> fprintf('Prvo število je %d,...

drugo je %g in tako naprej.\n', 303, -2.16);

Prvo število je 303, drugo je -2.16 in tako

naprej.

Page 56: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 56

Zaokroževanje števil

Funkcije round, floor in ceil

round zaokroži na najbližje celo število

floor zaokroži navzdol

ceil zaokroži navzgor

>> round(4.2)

ans =

4

>> floor(4.2)

ans =

4

>> ceil(4.2)

ans =

5

>> round(4.6)

ans =

5

>> floor(4.6)

ans =

4

>> ceil(4.6)

ans =

5

Page 57: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 57

Naključna števila

Funkcija rand vrne naključno število z intervala med 0 in 1

ceil(rand*n) vrne naključno število z intervala med 1 in n

>> rand

ans =

0.9058

>> rand

ans =

0.1270

>> ceil(rand*5)

ans =

5

>> ceil(rand*5)

ans =

1

>> ceil(rand*5)

ans = 3

Page 58: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 58

Matematične funkcije

Matlab ima vgrajenih zelo veliko matematičnih funkcij, npr.:

sin – izračuna sinus števila

sqrt – izračuna kvadratni koren števila

mod – izračuna ostanek pri deljenju

>> sin(pi/2)

ans =

1

>> cos(0)

ans =

1

>> sqrt(256)

ans =

16

>> sqrt(2)

ans =

1.4142

>> mod(6,3)

ans =

0

>> mod(7,3)

ans =

1

>> mod(8,3)

ans =

2

>> mod(9,3)

ans =

0

Page 59: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 59

Seznam nekaterih funkcij

INPUT – vnos podatkov: inp=input(‘Niz’)

DISP – izpis podatkov: disp(‘Niz’)

FPRINTF – izpis formatiranih podatkov: fprintf(‘Fniz’,A,...)

LENGTH – dolžina polja: dolz=lenghth(polje)

ZEROS – inicializira polje števil na 0: polje=zeros(1,dolz)

RAND – generiranje naključnega števila: st=rand

ROUND – zaokroževanje na najbližje celo št.: cst=round(st)

FLOOR – zaokroževanje navzdol: cst=floor(st)

CEIL – zaokroževanje navzgor: cst=ceil(st)

SIN – sinus števila: sinst=sin(st)

COS – cosinus števila: cosst=cos(st)

SQRT – kvadratni koren števila: koren=sqrt(st)

MOD – ostanek pri deljenju: ost=mod(st1,st2)

HELP – izpiše pomoč o funkciji: help ime_funkcije

Page 60: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 60

Naloga 1

Napiši program, ki na vhodu prejme dve polji, zmnoži istoležne elemente, ter vrne polje s produkti.

function C=poljeProd(A,B)

dolz=length(A);

C=zeros(1,dolz);

for i=1:dolz

C(i)=A(i)*B(i);

end

function C=poljeProd(A,B)

dolzA=length(A);

dolzB=length(B);

if dolzA==dolzB

C=zeros(1,dolzA);

for i=1:dolzA

C(i)=A(i)*B(i);

end

else

C=[];

disp('Napaka!');

end

Page 61: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 61

Naloga 2

Isto kot Naloga 1, s tem, da ne vrne polja s produkti, ampak vsoto produktov.

function sum=prod(A,B)

dolz=length(A);

C=zeros(1,dolz);

for i=1:dolz

C(i)=A(i)*B(i);

end

sum=0;

for i=1:dolz

sum=sum+C(i);

end

function sum=prod(A,B)

dolz=length(A);

sum=0;

for i=1:dolz

sum=sum+A(i)*B(i);

end

function sum=prod(A,B)

dolz=length(A);

C=poljeProd(A,B);

sum=0;

for i=1:dolz

sum=sum+C(i);

end

Page 62: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 62

Naloga 3

Program prejme na vhodu polje števil in vrne polje z istimi števili v obratnem vrstnem redu

function B=obrni(A)

dolz=length(A);

B=zeros(1,dolz);

for i=1:dolz

k=dolz+1-i;

B(k)=A(i);

end;

Page 63: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 63

Naloga 4

Program prejme na vhodu polje števil, na izhodu pa vrne polje z istimi števili urejenimi po velikosti.

function B=sort(A)

dolz=length(A);

B=zeros(1,dolz);

for i=1:dolz

j=maxInd(A);

B(dolz+1-i)=A(j);

A(j)=0;

end;

function maxI=maxInd(A)

dolz=length(A);

maxI=1;

for i=2:dolz

if A(i)>A(maxI)

maxI=i;

end

end;

Page 64: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 64

Naloga 5

Program prejme na vhodu polje števil in vrne najmanjši in največji element tega polja

function [maxEl,minEl]...

=maxMinEl(A)

dolz=length(A);

maxI=1;

for i=2:dolz

if A(i)>A(maxI)

maxI=i;

end

end;

minI=1;

for i=2:dolz

if A(i)<A(minI)

minI=i;

end

end;

maxEl=A(maxI);

minEl=A(minI);

function [maxEl,minEl]...

=maxMinEl(A)

dolz=length(A);

maxEl=A(1);

minEl=A(1);

for i=2:dolz

if A(i)>maxEl

maxEl=A(i);

elseif A(i)<minEl

minEl=A(i);

end

end;

Page 65: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 65

Naloga 6

Program prejme na vhodu polje števil in vrne drugi največji element tega polja

function max2el=drugiMax(A) dolz=length(A);

B=sort(A);

max2el=A(dolz-1);

function max2el=drugiMax(A)

B=sort(-A);

max2el=A(2);

function max2=drugiMax(A)

dolz=length(A);

if A(1)>A(2)

max1=A(1);

max2=A(2);

else

max1=A(2);

max2=A(1);

end

for i=3:dolz

if A(i)>max1

max2=max1;

max1=A(i);

elseif A(i)>max2

max2=A(i);

end

end

Page 66: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 66

Naloga 7a

Program izračuna povprečno vrednost prvih n števil.

function srVr=srednjaVrednost(n)

vsota=0;

for i=1:n

vsota=vsota+i;

end;

srVr=vsota/n;

Page 67: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 67

Naloga 7b

Program izračuna povprečno vrednost elementov podanega polja.

function srVr=srednjaVrednost(A)

n=length(A);

vsota=0;

for i=1:n

vsota=vsota+A(i);

end;

srVr=vsota/n;

Page 68: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 68

Naloga 8

Program vrne mediano števil podanih na vhodu v polju.

function med=mediana(A)

B=sort(A);

dolz=length(A);

imed=ceil(dolz/2);

med=B(imed);

Page 69: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 69

Naloga 9

Program vrne seštevek prvih desetih naravnih števil deljivih s 3.

function vsota=prvih10

vsota=0;

count=0;

i=1;

while count<10

if mod(i,3)==0

vsota=vsota+i;

count=count+1;

end

i=i+1;

end

Page 70: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 70

Naloga 10

Napiši program, ki izpiše prvih 100 števil in namesto števil, ki so deljive s 4 naj izpiše ‘limona’, če pa je deljivo tudi s tri, naj izpiše ‘jabolko’.

1

2

3

limona

5

6

7

limona

9

10

11

jabolko

13

14

15

limona

17 ...

function sadje

for i=1:100

if mod(i,4)==0

if mod(i,3)==0

disp('jabolko');

else

disp('limona');

end;

else

disp(i);

end;

end

Page 71: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 71

Naloga 11

Program prejme na vhodu polje z ocenami študentov pri izpitu, na izhodu pa vrne histogram ocen, to je polje, v katerem vsak element predstavlja število posameznih ocen (npr. prvi element polja pove koliko študentov je dobilo oceno 1, drugi element koliko študentov je dobilo 2 itn. do desetega elementa (št. študentov, ki je dobilo 10)).

>> O=[ 10 8 9 5 7 5 8 8 5 9 10 9]

>> H=histOcen(O)

H =

0 0 0 0 3 0 1 3 3 2

function H=histOcen(O)

H=zeros(1,10);

n=length(O);

for i=1:n

H(O(i))=H(O(i))+1;

end;

Page 72: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 72

Naloga 12a

Program na vhodu prejme dve polji. V prvem polju so navede ocene študentov, v drugem polju pa spol študenta, ki je dobil oceno v istoležnem elementu.

1) Napiši program, ki izpiše vse ocene študentk.

>> O=[ 10 8 9 5 7 5 8 8 5 9 10 9];

>> S=[ 1 2 2 1 1 2 1 2 1 2 1 1];

>> ocene1(O,S)

10

5

7

8

5

10

9

function ocene1(O,S)

n=length(O);

for i=1:n

if S(i)==1

disp(i);

end

end

Page 73: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 73

Naloga 12b

3) Napiši program, ki pove koliko študentov oz. študentk je pisalo izpit.

>> [stM,stZ]=ocene2(O,S)

stM =

5

stZ =

7

function [stevM,stevZ]=ocene2(O,S)

n=length(O);

stevM=0;

stevZ=0;

for i=1:n

if S(i)==1

stevZ=stevZ+1;

elseif S(i)==2

stevM=stevM+1;

end

end

Page 74: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 74

Naloga 12c

3) Napiši program, ki napiše koliko študentov oz. študentk je naredilo izpit (ocena vsaj 6).

>> [stM,stZ]=ocene3(O,S)

stM =

4

stZ =

5

function [stevM,stevZ]=ocene3(O,S)

n=length(O);

stevM=0;

stevZ=0;

for i=1:n

if S(i)==1 && O(i)>=6

stevZ=stevZ+1;

elseif S(i)==2 && O(i)>=6

stevM=stevM+1;

end

end

Page 75: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 75

Naloga 12d

2) Napiši program, ki izračuna povprečno oceno študentov in študentk.

>> [poM,poZ]=ocene4(O,S)

poM =

7.8000

poZ =

7.7143

function [poM,poZ]=ocene4(O,S)

n=length(O);

vsotaM=0;

vsotaZ=0;

stevM=0;

stevZ=0;

for i=1:n

if S(i)==1

vsotaZ=vsotaZ+O(i);

stevZ=stevZ+1;

else

vsotaM=vsotaM+O(i);

stevM=stevM+1;

end

end

poM=vsotaM/stevM;

poZ=vsotaZ/stevZ;

Page 76: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 76

Naloga 13

Program na vhodu prejme dva vektorja enake dolžine. Vrne naj vektor enake dolžine, pri čemer naj za vsak element izpiše 1, če je večji element v prvem vektorju in 2, če je večji drugi ter 0, če sta enaka.

>> A=[1 3 5 4 3 7 8 4 5 6 4 4];

>> B=[6 3 4 5 2 9 5 8 3 6 7 3];

>> C=vekt1(A,B)

C = 2 0 1 2 1 2 1 2 1 0 2 1

function C=vekt1(A,B)

n=length(A);

C=zeros(1,n);

for i=1:n

if A(i)>B(i)

C(i)=1;

elseif A(i)<B(i)

C(i)=2;

else

C(i)=0;

end

end

Page 77: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 77

Naloga 14

Program prejme na vhodu vektor in število. Vrne naj 1, če je število manjše od vsaj polovice elementov v vektorju in 0 sicer.

>> c=vekt2(A,3) c =

1

>> c=vekt2(A,4)

c =

0

function ret=vekt2(A,b)

n=length(A);

count=0;

for i=1:n

if A(i)>b

count=count+1;

end

end

if count>n/2

ret=1;

else

ret=0;

end

Page 78: Proceduralno programiranje

Računalništvo, Proceduralno programiranje 78

Naloga 15

Program prejme na vhodu dva vektorja enake dolžine. Za vsak element naj izpiše 1, če je element v prvem vektorju manjši od vsaj polovice elementov v drugem vektorju

>> C=vekt3(A,B)

C =

1 1 0 1 1 0 0 1 0 0 1 1

function C=vekt3(A,B)

n=length(A);

C=zeros(1,n);

for i=1:n

C(i)=vekt2(B,A(i));

end