You are on page 1of 15

Mathcad Modul # 8

Programiranje

Programiranje u Mathcad-u je definisano preko programske palete (Programming)

Ova paleta omoguava pisanje "programa" tj. formiranje programskih regiona i bazirana je na
najosnovnijim konceptima svih programskih jezika. Ako ste prouavali prethodene module i shvatili
naina rada Mathcad-a onda bi, najprostije reeno, program u Mathcad-u bila funkcija (ili
promenljiva) za iju je definiciju potrebno vie koraka. Za razumevanje koritenja ove palete i
pisanje programa tj. vielinijskih funkcija je neophodno poznavanje funkcionisanja bilo kog
programskog jezika.

Uzmimo na primer, funkciju koja daje vrednost 1 ako je promenljiva T tj. temperatura manja od 23,
vrednost -1 ako je temperatura vea od 25 a 0 ako je temperatura izmeu 23 i 25. Jadan od
naina za definisanje ove funkcije je

termostat ( T) := if ( T < 23 , 1 , if ( T > 25 , 1 , 0 ) )

Proverimo da li "radi"
T1 := termostat ( 10) T1 = 1

T2 := termostat ( 30) T2 = 1

T3 := termostat ( 24) T3 = 0

T4 := termostat ( 23) T4 = 0

T5 := termostat ( 25) T5 = 0

Napiite prethodno funkciju na drugaiji nain i proverite da li daje iste rezultate

Ovo je primer gde pomenuta if funkcija moe da nam zada glavobolje pogotovo ako ima vei broj
logikih izraza. U takvim sluajevima je praktinije koristiti programsku paletu (primetite da u toj
paleti postoji operator if). Za formiranje ove funkcije preko programske palete potrebni su sledei
koraci

1. Definiemo ime funkcije Termostat sa jednim fiktivnim argumentom T (kao i do sada).


2. Kada dobijemo plejsholder za definiciju upotrebimo operator Add Line iz programske palete

Sada dobijamo vertikalnu liniju sa dva plejsholdera. Ako ponovo izaberemo Add line dobiemo vei
broj plejsholdera. Svaki plejsholder predstavlja jednu liniju programa i pri pozivu ove funkcije se
izvravaju regioni u plejsholderima redom odozgo na dole. Ponete sa unosom od prvog pa kad
vam zatreba dodajte ih. Ako ih imate previe, briu sa sa tipkom BACKSPACE ili DELETE.
Formirajmo etiri plejsholdera i u te plejsholdere unosimo sledei program
Termostat( T) := R0
R 1 if T < 23
R 1 if T > 25
return R

Proverimo da li radi pozivom novostvorene funkcije sa stvarnim argumentom.

T1 := Termostat( 10) T1 = 1

T2 := Termostat( 30) T2 = 1

T3 := Termostat( 24) T3 = 0

T4 := Termostat( 23) T4 = 0

T5 := Termostat( 25) T5 = 0

Nota Primetite prvu liniju R 0 . Ovo je dodela vrednosti promenljivoj tj. promenljiva R dobija
vrednost 0. Meutim, dodelu vrednosti promenljivoj smo ve spomenuli i to je operator :=. U
programskom regionu se za dodelu vrednosti koristi operator iz programske palete (strelica ulevo)
a ne :=. S druge strane ova dodela se zove "lokalna" jer vai samo u programskom regionu gde je
ta promenljiva definisana i nema veze sa promenljivom istog imena van ovog regiona. Na primer,

A := 10

C := A 100
return A

C = 100

A = 10

Vidite da definicija A (lokalna definicija) unutar definicje promenljive C nema nikakve veze sa A van
te definicije.
Druga i trea linija programa su dobijene izborom opratora if iz preogramske palete tj

if
Ovaj operator ima dva operanda i to je operator odluivanja. Levi plejsholder predstavlja izraz koji se
izvrava samo ako je logiki izraz u desnom plejsholderu taan.
Druga linija programa kae:"R dobija vrednost 1 ako je T manje od 23".
Trea linija programa k ae:"R dobija vrednost -1 ako je T manje vee od 25".
etvrta linija je dobijena izborom return iz programske palete (ne kucanjem slovo po slovo) operatot
ima jedan argument tj.
return

U plejsholder se unosi ime promenljive ili izraz iji se rezultat vraa kao rezultat poziva
funkcije. Ovaj operator se ne mora navesti ako funkcija vraa samo poslednje izraunat izraz tj.
u ovom sluaju smo umesto return R mogli samo ostaviti R jer bi vrednost ove promenljive bila
i vrednost koju vraa funkcija. Ipak je jasnije uvek koristiti operator return . to se tie
promenljivih, da jo jednom naglasimo, kao i ranije funkcija ima fiktivne argumente koji se pri
pozivu zamenjuju stvarnim argumentima.
Unutar programskog regiona se mogu definisati i lokalne promenljive. Promenljive koje nisu
fiktivni argimenti ili lokalne promenljive moraju biti prethodno definisane van regiona. Na primer,
prethodna funkcija bi mogla da se napie na sledei nain (varijacija na temu).

Tladno := 23

Ttoplo := 25

Termostat( T) := R "stoji"
R "ukljuen" if T < Tladno

R "iskljuen" if T > Ttoplo

return R

T1 := Termostat( 10) T1 = "ukljuen"

T2 := Termostat( 30) T2 = "iskljuen"

T3 := Termostat( 24) T3 = "stoji"

T4 := Termostat( 23) T4 = "stoji"

T5 := Termostat( 25) T5 = "stoji"

Paleta Programming sadri osnovne operatore za pisanje programa. Principijelno, svaki


program tj. programski jezik ima
1. ulazne podatke
2. izlazne podatke
3. operacije nad podacima
4. strukture odluivanja
5. strukture ponavljanja

Da bi smo poeli program u Mathcad-u moramo koristiti operator Add Line

1. Ulazni podaci se dobijaju preko liste fiktivnih argumenata, lokalnih promenljvih i prethodno
definisanih promenljivih. U naem primeru je T fiktivna promenljiva, R lokalna promenljiva
(operator ), T ,T prethodno definisane promenljive
(operator ), Tladno, Ttoplo prethodno definisane promenljive

2. Izlaz je u naem primeru vrednost promenljive R kao operand operatora


return
3. Operacije nad podacima se u Mathcad-u predstavljaju primenu operatora i funkcija i figuriu u
izrazima (u naem primeru se nita ne rauna)
4. Struktura odluivanja izvrava regione u zavisnosti od postavljenog logikog uslova. Za to
slui ve spomenut operator if Region u levom plejsholderu se izvrava samo ako je logiki
izraz u desnom plejsholderu taan. U kombinaciji sa ovim operatorom je i operator otherwise
koji izvrava region u plejsholderu ako uslov u if strukturi nije taan. Na primer

plusminus( broj) := vrati "pozitivan" if broj > 0


vrati "negativan ili nula" otherwise
return vrati

plusminus( 34.5) = "negativan ili nula"


plusminus( 100 ) = "pozitivan"
plusminus( 0 ) = "negativan ili nula"

Nota Pogledajte iznad definiciju funkcije Termostat. Ima jedna neloginost (a moda i vie) a to je
da se ispituje promenljiva T dva puta tj. da li je T < 23 i da li je T > 25. Pa ako je T manje od 23
onda T sigurno nije vee od 25. Moe li to drugaije? Moe! Evo drugaije napisanog programa
koji radi istu stvar

Termostat( T , T1 , T2 ) := "Proveravamo da li je T1 manje od T2"


return "pogreno zadate T1,T2" if T1 > T2
R "iskljuen" if T > T2
otherwise
R "ukljuen" if T < T1
R "stoji" otherwise
return R

Nota Moete komentare unositi pod navodnicima. Primetite da se u plejsholder moe ubaciti vie
linija, naravno sa Add line. Obratite panju na vizuelni efekat tj vertikalnu liniju ispod otherwise.

T1 := 23

T2 := 25

(
T1 := Termostat 10 , T1 , T2 ) T1 = "ukljuen"

(
T2 := Termostat 30 , T1 , T2 ) T2 = "iskljuen"

(
T3 := Termostat 24 , T1 , T2 ) T3 = "stoji"

T4 := Termostat( 23 , T1 , T2 ) T4 = "stoji"
(
T5 := Termostat 25 , T1 , T2 ) T5 = "stoji"

Nota Treba biti veoma obazriv jer se lako moe pogreiti. Struktura if u kombinaciji sa otherwise
se mora dobro shvatiti da bi se mogla koristiti. Najjednostavnije reeno, otherwise e se izvriti
ukoliko logiki izraz kod prvog if iznad othewise nije zadovoljen. Jedini nain je da se ovo isproba
na raznoraznim primerima.

5. Mathcad ima dve strukture ponavljanja for , while koje se dobijaju izborom for ili

while iz programske palete.

-Struktura for slui za ponavljanje regiona unutar strukture odreen broj puta. Na primer,
programski napisana funkcija vektor koja vraa kao rezultat vektor ekvidistantnih vrednosti sa
maksimalnim indeksom niza broj poevi od vrednosti poc sa korakom korak

vektor( broj , poc , korak) := for i 0 .. broj


x poc + korak i
i
return x

Region x poc + korak i e se izvravati za vrednost intervalne promenljive i koja uzima


i
vrednosti 1,2,...,broj. Primetite da je taj region malo uvuen da se uoi pripadnost for
strukturi.

3
3.5

y := vektor( 5 , 3 , 0.5) y =
4
4.5
5

5.5

Sada da programski odradimo funkciju koja trazi srednju vrednost elemenata vektora

srednjav( v) := sr 0
for i 0 .. last( v)
sr sr + v
i
sr
sr
length ( v)
return sr

sr := srednjav( y) sr = 4.25 Ova funkcija postoji ugraena u Mathcad-> mean( y) = 4.25

Nota Pre nego to se upustite u pravljenje funkcije, proverite da suajno ve takva funkcija ne
postoji u Mathcad-u

-Struktura while slui za ponavljanje odreenog regiona dok god je zadovoljen zadati logiki
uslov. Jasno je da uslov mora postati netaan unutar petlje da bi se iz petlje izalo. Na primer,
funkcija negativan daje kao rezultat vrednost prvog negativnog elementa vektora i njegov
negativan
indeks.
negativan ( vec) := j 0
while vec 0
j
j j +1
vecj

j
return

Iz ovog primera se vidi da se kao rezultat funkcije moe vratiti i vektor, odnosno matrica

0
3

z :=
5
6

2

9
5

3
rez := negativan ( z) rez =

U strukturama ponavljanja mogu figurusati operatori break i/ili continue


Operator break slui da se iz strukture ponavljanja izae dok continue nastavlja sledee
ponavljanje kod for odnosno while
Na primer, prethodnu funkciju negativan smo mogli da napiemo ovako

0
3
negativan_1 ( vec) := for j 0 .. last( vec)
break if vec < 0
5
z :=
j

vecj 5
6
3
rez := negativan_1 ( z) rez =
return
j 2

9
Struktura for e se prekinuti (break) kad se zadovolji zadati uslov u if strukturi.

Veoma lako moemo da iskomplikujemo stvari (namerno ili sluajno). Na primer, elimo da
izraunamo proizvod elemanata vektora koji su razliiti od 0. Moemo to da uradimo programski,
odnosno

proiz_1( vec) := proiz 1 proiz_1( z) = 1.62 10


3

for j 0 .. last( vec)


continue if vec = 0
j
proiz proiz vec
j
return proiz

U proizvodu figuriu samo oni elementi vektora koji nisu jednaki 0. To se omoguava sa continue
kada je dati element vektora manji od nule tj. linija ispod continue sa ne izvrava ako je zadati
uslov taan ve for nastavlja da "vrti" (uzima sledee j). Ovo je poprilino jednostavan i
for
besmislen programski primer ali bi svi studenti, koji dobiju ovakav problem, napisali isti program
(nekako ispada da svi na isti nain razmisljaju). "Nezgodno" je to to se isti problem moe reiti
na razliite naine.

proiz_2( vec) := proiz 1 proiz_2( z) = 1.62 10


3

for j 0 .. last( vec)


proiz proiz vec if vec 0
j j
return proiz

proiz_3( vec) := j 0 proiz_3( z) = 1.62 10


3

proiz 1
while j last( vec)
proiz proiz vec if vec 0
j j
j j +1
return proiz

if (vecj = 0 , 1 , vecj)
last( vec)
proiz_4( vec) := proiz proiz_4( z) = 1.62 10
3

j =0
return proiz

Ne morate ak ni da koristite programski definisanu funkciju u ovom sluaju jer je problem


poprilino jednostavan

if (zj = 0 , 1 , zj)
last( z)
proiz_5 := proiz_5 = 1.62 10
3

j =0
Poslednji operator je operator on error koji omoguava da vam funkcija vrati neki rezultat kada bi
se u protivnom deslila nega greka koju Mathcad ne tolerie. Na ako podelite dva broja moete da
izaete van opsega najmanjeg i najveeg broja s kojim Mathcad barata. Da bi spreili Mathcad da
vam prijavi greku (utim pravougaonikom sa porukom) moete se koristiti operatorom on error da
vam se vrati eljeni rezultat u sluaju greke

"greska pri deljenju"


deli ( a , b ) := on error a

a

b
b

"greska pri deljenju"



( 307
, 10
5
) = 1 10
307


deli 10

1 10
5

Ovo je korisno kada elite da otkrijete greke koje inite pri pisanju programa tj. gde vam program
"puca" jer vam, u principu, Mathcad prijavi greku za ceo region koji cesto nije ni od kakve pomoi.
Pored toga moete i vi da odglumite Mathcad i da ubacite vae poruke kad se desi greka pomou
error funkcije

F( x) := error( "x mora biti pozitivno" ) if x 0


1
return otherwise
x

Tako pozivom prethodne funkcije sa negativnim argumentom Mathcad "pocrveni".

F( 5 ) =

Oni koji su pisali neki program u nekom programskom jeziku znaju da se u pisanju programa
veoma esto grei i znaju koliko je vano da programski jezik ima mogunosti detekcije i
prikazivanja gde su greke u programu. Ako u prethodnom primeru (ili u bilo kom pozivu koji
prijavljuje greku za programski napisane funkcije) kliknete desnim tasterom dobiete sledee

Ako izaberete opciju Trace Error dobiete sledei dijalog prozor

Tako da moete u definiciji funkcije da se prebacujete sa greke na greku (ako ih ima vie) i da
otkrijete "u kom zecu lei grm". Ovo dobro zvui, ali u praksi je poprilino nekorisno i Mathcad nije
ba najsjajniji na ovom polju.
Ukoliko niste obeshrabreni ovim "programiranjem" i imate potrebu da se time bavite u Mathcad-u moe vam
pomoi klasian sistem koji je prisutan u svim "ozbiljnim" programskim jezicima i zove se "debugger", odnosno
sistem za pronalaenje greaka (bubica, bagova) i koristi se kada program, funkcija "rade" ali ne daju dobre
rezultate. Za to je u Mathcadu zaduen Debug paleta

Evo prostih primera kako se ona koristi. Pogledajte definisanu funkciju ispod
f ( n ) := x0
for i 1 .. n

xi + x
2

trace( x)
return x

Nova funkcija koju nismo spomenuli je trace. Da bi smo videli emu ona slui, aktivirajmo tzv Trace window iz
menija View=>Trace Window ili aktiviranjem iz Debug palete.

Na dnu ekrana e se pojaviti Trace Window. Da bi smo videli emu slui trace funkcija omoguiemo da Trace
Window radi, tj pokrenuemo debagovanje opcijom iz menija Tools=>Debug=>Toggle Debugging ili
aktiviranjem iz Debug palete

Sada kada je Trace prozor otvoren i aktiviran debuger, pozivamo funkciju f(n)
f ( 5 ) = 55

I evo ta vidimo u Trace prozoru. Izvrila se funkcija f(n), gde je n=5

Kako se trace funkcija nalazi u for petlji, ona e prikazati onu vrednost koja je u zagradi, a to je trenutna
vrednost promenljive x i ispisati tu vrednost u Trace prozor. Trace prozor je tekstualni prozor i njega moemo
da kopiramo delove ili sve iz njega da obriemo. Evo jo samo jednog primera gde smo malo promenili funkciju
da nam ispie i eljeni teskt na ekranu

f ( n ) := x0
for i 1 .. n

xi + x
2

pause( "Vrednost x = {0}, petlja vrti i = {1}" , x , i )


trace( "Van petlje i = {0}" , i )
return x

Pozovimo funkciju i pogledajmo ta se nalazi u Trace prozoru

f ( 6 ) = 91

Najei problem je kada se Mathcad "zakuca" odnosno kada vidite lampicu koja trepe

Mathcad je zastao kod nekog regiona (uokviren zelenim) i lampica koja trepe vam govori da on neto rauna.
Moda je proraun obiman ili je moda negde zabrljano. Kako ga prekinuti? Jenostavno pritisnite ESC i
dobiete pitanje na ekranu

Moete ga zaustaviti sa OK ili nastaviti dalje sa Cancel. Ukoliko ga zaustavite, region gde ste ga zaustavili e
pocrveneti i dobiete poruku
Jasno vam se kae da je proraun prekinut. Ako elite da se nastavi pritisnite F9.
Kako ovo zaustavljane moemo ostvariti u naem programu, funkciji? Umesto trace koristimo pause
funkcjiu. Evo korigovane prethodne funkcije (Debuger je aktiviran)

f ( n ) := x0
for i 1 .. n

xi + x
2

pause( "Vrednost x = {0}, petlja vrti i = {1}" , x , i )


trace( "Van petlje i = {0}" , i )
return x

Kada ovu funkciju pozovemo, zaustavie se kad naleti na pause. Sada moemo da nastavimo (Resume)

Ili u nekom momentu i da prekinemo (Interrupt ili ESC)

Sve ovo nam slui da proverimo na odreenim mestima u programu gde sumnjamo da se neto pogreno
rauna trenutnim zaustavljanjem i prikazom rezultata u Trace prozoru. Kada otkrijemo gde je problem (treba
nam malo i sree za to) jednostavno izbriemo trace i pause linije.
Interesantna je ova primena kod numerikih prorauna, recimo kada traite nulu funkcije pomou root, moete
da vidite vrednosti u svakoj iteraciji, na primer

Ovde funkcija root poziva f(x) i pri tome prikazujete vrednosti x u svakoj iteraciji.

Za ostale detalje (nema ih jo mnogo), pogledajte Help sistem

Nota Sve u svemu, Mathcad ne treba koristiti za komplikovane programski definisane funkcije.
Njegov programski deo je namenjen za kratke funkcije i jednostavnije probleme. Prihvatite se
programiranja jedino ako ste prinueni a i tada ako ste suoeni sa komplikovanim problemom
ralanite ga na vie jednostavnijih funkcija koje lake moete da kontroliete.

_____________________________________________________________________Kraj

You might also like