• No results found

index=2;

primtal=1;

while (index <= sqrt(x)) kvot = x / index;

rest = x - index*floor(kvot);

% om rest ¨ar noll g˚ar divisionen j¨amnt ut if(rest==0)

primtal=0;

break;

end

index=index+1;

end

3.5 Funktioner

Det finns m˚anga uppgifter som vi vill utf¨ora ofta i olika sammanhang, i den h¨ar kursen kommer vi till exempel ofta att vilja ber¨akna en normalf¨ordelning med ett givet medelv¨arde och standardavvikelse. Ist¨allet f¨or att skriva den kod som beh¨ovs f¨or att utf¨ora detta, och sedan kopiera in den i varje m-fil d¨ar vi har behov av den kan vi skriva en s˚a kallad funktion som vi med ett enkelt anrop kan k¨ora i vilken m-fil som helst. Det kan ju ocks˚a vara s˚a att vi vill g¨ora samma sak p˚a flera olika st¨allen i en stor m-fil, d˚a ¨ar det enklare att kalla en funktion

¨

an att upprepa koden p˚a flera st¨allen i samma fil. En annan f¨ordel med en funktion ¨ar att alla variabler ¨ar lokala, det vill s¨aga en funktion delar inte workspace med det program som anropar funktionen. Detta ¨ar en stor f¨ordel i stora program d¨ar det annars kan vara sv˚art att h˚alla reda p˚a alla variabler som anv¨ands till exempel f¨or index i slingor eller x-koordinater i plottar (man kan inte anv¨anda samma variabelnamn i tv˚a olika betydelser!)

F¨or att detta skall fungera v¨al m˚aste vi dels f¨olja en viss syntax f¨or hur en funktion skall kodas i MATLAB, men ocks˚a skriva koden som skall rymmas i funktionen p˚a ett klokt s¨att. Vi m˚aste f¨ors¨oka g¨ora funktionen s˚a allm¨an som m¨ojligt s˚a att den verkligen g˚ar att

˚ateranv¨anda. Vi skall exemplifiera med att skissa hur man kan skriva en funktion som f¨or en given in-vektor x ber¨aknar en y-vektor med normalf¨ordelningens v¨arde i motsvarande punkter. Vi skall kunna ange vilket medelv¨arde och standardavvikelse f¨ordelningen skall ha, men om vi utel¨amnar dessa argument s˚a skall standard normalf¨ordelningen, det vill s¨aga den med medelv¨arde 0 och standardavvikelse 1 ber¨aknas. Vi f˚ar allts˚a om vi definierar en vektor x, och sedan skriver y=normal(x,medel,sigma) en y-vektor som inneh˚aller v¨ardet f¨or normalf¨ordelningen i varje punkt x som vi anger n¨ar vi anropar funktionen.

3.5.1 Syntaxen f¨or funktioner

En funktion inleds alltid med en rad som b¨orjar med function och sedan ger syntaxen f¨or hur funktionen anropas. I v˚art fall b¨orjar funktionen allts˚a:

function y=normal(x, mean, sigma)

H¨ar ¨ar y resultatet av funktionen, de variabler som ges inom parantes ¨ar funktionens ar-gument. Aven om funktionen inte beh¨¨ over n˚agra argument s˚a m˚aste man ge parantesen efter funktionsnamnet: idag = date(). Eftersom en funktion har en separat workspace s˚a ¨ar enda s¨attet att utbyta information mellan en funktion och det program som anropar funktionen genom argumenten och de v¨arden som kommer ut ur funktionen.

F¨orutom f¨orsta raden f¨oljer en funktion samma regler som vilken annan m-fil som helst vad g¨aller syntax. Har man bara designat gr¨anssnittet mot omv¨arlden korrekt s˚a att all n¨odv¨andig information finns tillg¨anglig s˚a ¨ar det sedan ”bara” att koda den ¨onskade algoritmen. Vi

m˚aste dock se till att spara den fil som inneh˚aller funktionen med samma namn som vi ger i f¨orsta raden, med till¨agget (engelska extension) .m .

3.5.2 help f¨or en funktion

En speciell sak med en funktion ¨ar att om vi skriver ett block med kommentarer efter f¨orsta raden s˚a kommer dessa att skrivas ut i kommandof¨onstret n¨ar vi skriver help funktionsnamn.

Detta g¨aller bara det f¨orsta blocket av kommentarer, ingen av de kommentarer som kommer l¨angre ned i koden syns. H¨ar skall vi allts˚a skriva in den information som kan beh¨ovas f¨or att f¨orst˚a hur man skall anv¨anda funktionen. Vi kan se massor av exempel p˚a hur det kan g¨oras, i sj¨alva verket ¨ar det precis det som h¨ander varje g˚ang vi skriver help i kommandof¨onstret, vi l¨aser d˚a helt enkelt det f¨orsta blocket med kommentarer i den fil som utf¨or funktionen.

V˚ar funktion f¨or normalf¨ordelningen b¨or d˚a b¨orja n˚agonting i stil med

% NORMAL Normalf\"ordelningsfunktionen

% y=normal(x,m,s)

% Indata: x av typ vektor

% m medelv\"ardet

% s varians

%

% om m utel\"amnas s\"atts m=0

% om s utel\"amnas s\"atts s=1

%

prova att koda detta och sedan skriva help normal (normal.m m˚aste sparas n˚agonstans i MATLABs s¨okv¨ag).

3.5.3 Testa antalet argument

Vi har sett fler exempel p˚a funktioner som accepterar olika antal argument, och som ocks˚a levererar litet olika resultat beroende p˚a hur m˚anga utvariabler man anger, ett exempel p˚a det ¨ar kommandot hist (se avsnit 6.3.2) som kommer att bli en av v˚ara favoriter. Det h¨ar

¨

ar ett s¨att att inte beh¨ova introducera ett stort antal funktioner som g¨or n¨astan samma sak, men inte riktigt. Det ¨ar mer ekonomiskt att i st¨allet l˚ata en funktions beteende variera litet beroende p˚a hur man anropar den, och hur man formaterar resultaten fr˚an funktionen.

Rent tekniskt ¨ar det ju inte s˚a sv˚art att l˚ata en funktion g¨ora litet olika saker med hj¨alp av villkors-satser, det g¨aller bara att veta hur funktionen har blivit kallad. F¨or detta finns kommandona nargin och nargout som talar om hur m˚anga argument som gavs n¨ar funk-tionen anropades, och hur m˚anga ut-argument som angavs i anropet. Genom att testa p˚a antalet argument kan vi styra villkoren f¨or hur funktionen skall bete sig.

if nargin < 3, s=1; end if nargin < 2, m=0; end

en svaghet i denna konstruktion ¨ar att man m˚aste utesluta argument ”bakifr˚an”, dvs vi f¨oruts¨atter att om ett argument ¨ar utel¨amnat s˚a ¨ar det standardavvikelsen, och inte medelv¨ardet i exemplet ovan. Det finns v¨agar runt detta5men det kr¨aver en hel del arbete och komplicerad kodning, s˚a det l¨amnar vi till den som ¨ar speciellt intresserad.

P˚a motsvarande s¨att kan man testa hur m˚anga ut-argument som gavs i anropet, i v˚art fall om normal kallades med y=normal(x,m,s) eller med normal(x,m,s). Att kommandot som g¨or det heter nargout kommer v¨al knappast som en ¨overraskning?

5Man anv¨ander kommandot varargin och t¨anker ut tester som kan avg¨ora vilka argument som faktiskt amnades.

3.5. FUNKTIONER 41 Exempel p˚a funktion

Vi visar h¨ar ett exempel p˚a hur en funktion kan anv¨andas. Funktionen total r¨aknar ut hur stor summa man m˚aste betala f¨or ett l˚an taget till olika r¨antor:

function total=interest(belopp, rantesats, manader, period)

%

% total ber¨aknar totalt ˚aterbetalat belopp.

%

% utdata total - total skuld

%

% indata belopp - l˚anat belopp

% rantesats - r¨antesatsen i procent

% manader - l˚anets l¨optid i m˚anader

% period [’m’/’y’] - period

% f¨or vilken r¨antesatsen g¨aller

% m˚aste vara antingen ’m’ f¨or m˚anad

% eller ’y’ f¨or ˚ar.

% om period utl¨amnas antas ˚ar

%

% Sten Hellman 030211

if (nargin == 3); period=’y’; end;

if (period == ’y’)

total = belopp * (1 + rantesats/100) ∧ (manader / 12);

elseif (period == ’m’)

total = belopp * (1 + rantesats/100) ∧ (manader);

else

disp(’ perioden m˚aste anges som m eller y’);

total = -99;

end

Denna funktion kan man sedan kalla fr˚an ett program d¨ar man l¨agger in olika m¨ojliga alter-nativ f¨or att kunna best¨amma vilket som ¨ar mest f¨orm˚anligt:

% kreditkort ett ˚ar till 4.3% i m˚anaden kredit = interest(10000, 4.3, 12, ’m’)

% bank ett ˚ar till 23% per ˚ar bank = interest(10000, 23, 12)

3.6 Ovningsuppgifter ¨

1. Skriv en funktion som returnerar ett slumptal mellan 1 och 100. Talet skall vara ett heltal, dvs inga decimaler skall finnas med. F¨orsta raden i filen kan se ut s˚a h¨ar:

function y = slumptal()

2. Skriv ett program som genererar en slumpm¨assig tipsrad. Anta att sannolikheten f¨or 1, x och 2 alla ¨ar 1/3, och l˚at programmet skriva ut tipsraden (en tipsrad best˚ar av tretton stycken tecken). Ett exempel p˚a en k¨orning kan se ut s˚a h¨ar:

>> tipsrad 2

x 2 1 2 1 2 x 2 1 x 2 2

3. En metod f¨or att approximera kvadratroten av ett tal ¨ar Newtons metod som ger

√x ≈ yk med yk+1 = 12yk+yx

k

 och y1 = 1. Skriv en funktion y=Newton(x) som anv¨ander denna metod f¨or att ber¨akna kavdratroten ur ett godtyckligt positivt tal.

Kadratroten skall anges korrekt avrundad med tre decimalsiffrors noggrannhet.

Ledning: eftersom vi inte har n˚agot facit m˚aste vi i funktionen sj¨alva avg¨ora n¨ar serien har konvergerat tillr¨ackligt f¨or att vi skall ha den s¨okta noggrannheten.

Vi m˚aste dessutom hitta p˚a ett trick f¨or att runda av korrekt, de rutiner vi har till hands rundar ju bara av heltal. Detta kan vi komma runt genom att transformera v˚art decimaltal till ett l¨ampligt heltal som vi sedan rundar av och d¨arefter transformerar tillbaks till ett decimaltal.

Kapitel 4

Ordbehandling med Microsoft Word

4.1 Allm¨ anna kommentarer

Du startar Word genom att f¨orst trycka p˚a knappen som det st˚ar ”Start” p˚a, och som har Windows-loggan p˚a sig, som sitter i nedre v¨anstra h¨ornet. I den meny som sedan kommer upp trycker du p˚a alternativet ”Programs”, och till sist ”Microsoft Word” i den meny som d˚a kommer upp. Oftast ligger det ¨aven en ikon m¨arkt ”MicroSoft Word” p˚a skrivbordet, i s˚a fall ¨ar det naturligtvis enklare att bara dubbelklicka p˚a den. L¨angst upp p˚a Word-f¨onstret som ¨oppnas finns en bl˚a list. Om du tar musen och trycker med v¨ansterknappen p˚a listen och h˚aller den nedtryckt s˚a kan du flytta runt f¨onstret tills det att du sl¨apper knappen. Under listen finns Words menyer som heter ”Arkiv”, ”Redigera”, ”Visa” och s˚a vidare. Om du trycker p˚a ett av dessa ord kommer en meny att ¨oppna sig d¨ar du kan v¨alja mellan menyns alternativ. Under raden med menyer finns det som kallas ”verktygsf¨altet”. I verktygsf¨altet finns en m¨angd knappar och vi kommer att n¨amna de viktigaste som du b¨or k¨anna till i detta dokument. Om du f¨or musen ¨over en knapp och h˚aller den still d¨ar utan att trycka p˚a n˚agon musknapp s˚a kommer en liten gul hj¨alpruta att visa sig d¨ar det st˚ar vad knappen g¨or. Testa detta! Under verktygsf¨altet sitter n˚agot som ser ut som en linjal, denna anv¨ands f¨or att s¨atta bredden p˚a marginalerna p˚a det dokument du ska skriva. Under denna ”linjal”

finns slutligen sj¨alva f¨onstret d¨ar du kan skriva in din text. N¨ar du startar Word ser det bara ut som ett tomt papper. P˚a det tomma pappret kan du se ett blinkande vertikalt streck ”|”

som kallas f¨or ”mark¨or”. Mark¨oren talar om var den text du skriver in kommer att hamna.

Du kan flytta runt mark¨oren med hj¨alp av piltangenterna, eller genom att klicka med musen p˚a det st¨alle du vill att mark¨oren ska flytta sig till.