Utførelse av programmer, funksjoner og synlighet av variabler (Matl.) Av Jo Skjermo (basert på Alf Inge Wang sin versjon om JSP). 1. Utførelse av kode i kommando/kalkulatormodus Et dataprogram består oftest av en rekke programlinjer som gir instruksjoner til datamaskinen om hva som skal utføres. Slike instruksjoner brukes typisk til å: Opprette variabler Gi verdier til variabler Teste på verdi av variabler Utføre ulike beregninger Behandle ulike typer data Presentere data for bruker (lyd og bilde) Registrere og håndtere input fra bruker (mus, tastatur, joystick). Når en datamaskin skal tolke et program er den normale framgangsmåten å begynne med første linje i programmet og gå igjennom programmet linje for linje. For små programmer kan hele programmet være samlet i en fil eller skrives direkte i kommandomodus. For større programmer, fordeles programkoden i flere filer (logisk fordeling av kode i flere filer kan dere lære mer om i andre programmeringsfag). Program 1 under viser et enkelt matlab-program skrevet i kommandomodus som skriver ut det største tallet av to tall. Program 1: skriver ut det største av to tall >>; >>svar=0; >>if(x>y); > svar=x; > else > svar=y; > >>disp(['stoerste tall: ', num2str(svar)]); Stoerste tall: 5 >>x=7; >>y=3; >>if(x>y) > svar=x; > else > svar=y; > >>disp(['stoerste tall: ',num2str(svar)]); Stoerste tall: 7 Koden vil bli utført etter hvert som man skriver den inn, linje for linje. If-else- blokkene vil bli utført først når man trykker linjeskift etter >>, og om svar=x; eller svar=y; vil bli utført er avhengig om x>y eller ikke. Legg merke til at variablene x og y kan få nye verdier.
2. Utførelse av kode med skript I program 2 under gjør man akkurat det samme som i program 1, men her bruker vi ett skript (stoerst.m) til å utføre testen av hvem av variablene som er størst. Program 2: skript (stoerst.m) som skriver ut det største av to tall s1 s2 s3 s4 s5 s6 s7 s8 s9 Skriptet %filen stoerst.m %skript som finner den største av variablene x og y (sett før du kaller scriptet) svar=0; if(x>y) svar=x; else svar=y; disp(['stoerste tall: ',num2str(svar)]); Program 2: bruk av skriptet fra kommandomodus k8 0 kommandomodus >>; >>stoerst stoerste tall: 5 >>x=7; >>y=3; >>stoerst stoerste tall: 7 >>svar svar = 7 Ved blir skriptet kjørt og linje s1-s9 blir utført, utskrift fra s9 kommer på linje Ved blir skriptet kjørt og linje s1-s9 blir utført, utskrift fra s9 kommer på linje k8 0 utskrift av Her ser man at man igjen utfører koden man skriver inn i kommandomodus linje for linje. Når man kommer til link vil skriptet bli kjørt. s1 til s9 i skriptet vil da bli utført. Legg merke til at man har full tilgang til variablene x og y i skriptet, selv om disse ble opprettet i kommandomodus. Legg videre merke til (i linje -0) at man også har tilgang til variabelen svar i kommandomodus, selv om denne ble opprettet inne i skriptet. Slik sett er det ingen forskjell på hvilke variabler man har tilgang til i kommandomodus og i skript. Som vi ser av eksempelet i program 2, så vil ikke datamaskinen gå igjennom koden i skriptfilen før man kaller skriptet i kommandomodus. Vi ser også fra dette eksempelet at ett skript kan kalles flere ganger, som fører til at de samme programlinjene blir utført flere ganger. NB! Dersom man oppretter en variabel i kommandomodus med samme navn som et skript, vil man om man forsøker å kjøre skriptet kun få skrevet ut verdien i variabelen i stedet for at skriptet blir utført. Bruke kommandoen clear for å fjerne variabelen før du prøver å utføre skriptet.
3. Synlighet av variabler ved bruk av funksjoner I enkle matlab-skript uten egefinerte funksjoner kan du ikke definere flere variabler som har samme variabelnavn. Hvis vi ser på koden i Program 1, så opprettes variablene x,y og svar. Det er da ikke mulig å opprette nye variabler med navnene x, y eller svar da disse allerede eksisterer. Men, man kan opprette variabler med samme navn i en funksjon. I program 3 (se under), viser vi en egefinert funksjon som bruker samme navn på variablene som variabler brukt i kommandomodus. Program 3: egefinert funksjon som returnerer de største tallet av input x og y f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 Funksjonen %filen stoerst.m %funksjon som finner den største av input variablene (kalt x og y ) function stoersttall=stoerst(x,y) stoersttall=0; if(x>y) stoersttall=x; else stoersttall=y; disp(['stoerste tall: ', num2str(stoersttall)]); Program 3: eksempel på bruk av egefinert funksjon i kommandomodus. k8 0 1 2 3 kommandomodus >>; >>a=7; >>svar=0; >>svar=stoerst(x,y); stoerst tall: 5 >>x=9; >>svar=stoerst(y,a) stoerst tall: 7 >>x 9 >>svar 7 Ved blir funksjonen kjørt og linje f1-f11 blir utført, utskrift fra f10 kommer på linje Ved k8 blir funksjonen kjørt og linje f1-f11 blir utført, utskrift fra f10 kommer på linje. Legg merke til at funksjonen nå mottar verdiene fra y og a, og verdien i variabelen x i kommandomodus ikke blir brukt (0-1) 2-3 viser at variabelen svar har mottatt ny verdi fra funksjonen. I program 3 brukes x og y både i funksjonen stoerst og i kommandomodus. Selv om variablene x og y har samme navn på begge plasser er de totalt uavhengige. For å forklare bruk av variabler på en enkel måte kan vi benytte metaforen huskelapp. En datamaskin trenger en huskelapp for å
utføre sine programmer. På denne huskelappen noteres alt som trengs å holde orden på for å kunne kjøre programmet. En slik huskelapp vil inneholde alle variablene som blir brukt i et program. Hvis vi tar for oss koden i kommandomodus i program 3, så vil denne huskelappen inneholde fire variabler: x,y,a, og svar. Etter at programlinjene - har kjørt vil denne huskelappen se ut som vist til høyre. a=7 svar=0 I programlinje kalles den egefinerte funksjonen stoerst med parametrene x og y. Når en funksjon blir kalt i matlab vil ikke variablene bli overført direkte, men det er verdien eller innholdet til variablene som blir overført til funksjonen. I vårt tilfelle vil kallet av funksjonen tilsvare: storst(1,5). Hva skjer med programmets huskelapp med alle variablene når vi kaller en funksjon? Saken er at funksjonen bruker sine egne post-it-lapper for å huske sine variabler. For program 3, vil denne post-itlappen inneholde variablene x,y og storsttall. stoersttall=5 Selv om variablene x og y i funksjonen stoerst har samme navn som de variablene som finnes i kommandomodus har de ingen ting med hverandre å gjøre. I dette programmet vil a=7 også x og y få samme verdi etter som verdien av x og y i hovedprogrammet overføres til de nye variablene x og y i funksjonen stoerst. En måte å visualisere hva som skjer med variabler når svar=0 stoersttall=5 man kaller en funksjon er å se for oss at post-it-lappen som funksjonen bruker for å huske sine variabler blir klistret over huskelappen for hovedprogrammet som illustrert til her. Bruken av post-it-lappen illustrerer at datamaskinen nå ikke kan se variablene i kommandomodus etter som den nå bruker en ny klistrelapp. Dette betyr at under kjøring av funksjonen stoerst vil datamaskinen ikke kunne bruke variablene a og svar som er definert i kommandomodus. Når datamaskinen er ferdig med å utføre funksjonen stoerst og returnerer det største tallet som er lagret i variabelen storsttall, vil post-it-lappen datamaskinen brukte for å huske variabler i funksjonen kastes! Dette betyr at hvis man kaller samme funksjon på nytt, vil datamaskinen ikke bruke den samme post-it-lappen på nytt og vil ikke huske verdiene av variablene (f.eks. at storsttall hadde verdien 5 sist gang). Ved et nytt funksjonskall, vil man bruke en ny post-it-lapp og alle variablene blir deklarert og gitt verdier helt på nytt. Når en datamaskin er ferdig med å utføre et funksjonskall og returnerer, vil den bruke huskelappen som ligger under post-it-lappen som ble fjernet.
Hvis man kaller en funksjon inne i en annen funksjon vil man få flere post-it-lapper oppå hverandre. Dette vil fungere akkurat på samme måte som illustrert ovenfor. Når man er ferdig med å utføre en funksjon, kaster man post-it-lappen og bruker lappen som ligger under. På denne måten kan man ha mange nivåer av funksjonskall som bruker egne post-it-lapper for å ta vare på funksjonens variabler. Man kan bruke funksjonen med lapper og post-it-lapper når man vil gå igjennom et program for å sjekke om programmet gjør oppgaven sin riktig. På samme måte som man overfører parametere til en funksjon, kan man også returnere parametere. Når funksjonen er ferdig utført, vil kun verdien i storsttall bli overført tilbake til variabelen svar i kommandomodus. Vi har sett i dette eksempelet, at funksjoner har sine egne huskelapper som kastes etter bruk og at den eneste måten å få overført noe mellom et kall av en funksjon, og selve funksjonen, er igjennom parametere.