Wiki2
CodeWorld (Rev #3, changes)

Showing changes from revision #2 to #3: Added | Removed | Changed

Programmering med funktioner

Vad är en funktion?

Inom matematiken används funktioner hela tiden …

Exempelvis + (addition) är en funktion

Skickar man in två värden 3 och 5 så matar + ut ett nytt värde 8

3
   [ + ]  8 
5

Andra vanliga funktioner inom matematiken är - (subtraktion), * multiplikation och / (division)

3
   [ - ]  -2 
5

Vad är värden?

Värden är de “saker” eller “objekt” som går in och ut från funktioner

Exempel på värden är

  • Hela tal 1, 2, -1 …
  • Negativa tal -12, -1 …
  • Jämna tal 2, 4, 6, 102
  • Decimal tal 3.14, 2.4, -12.4

Hur många värden kan funktioner hantera?

Vi såg att + tar två varden och ger tillbaka ett värde

Men det finns funktioner som tar och ger tillbaka fler eller färre värden

Vissa funktioner tar bara ett värde. Exempelvis ++ som lägger till 1 till in värdet.

5   [ ++ ]   6

Andra tar hur många värden man vill. Exempelvis en funktion som räknar hur många värden man matar in.

1, 4, 5, 3   "antal värden"   4

99, 1003     "antal värden"   2

Funktioner kan även ge tillbaka flera värden. Exempelvis en funktion som byter plats pa två värden

4, 76    "byt plats"    76, 4

434, 33  "byt plats"    33, 434

Namngivna värden (konstanter) kan man också se som funktioner som alltid ger samma värde utan in värde

pi = 3.14159 ...

-        "pi"    3.14159 ...

Hur skriver man funktioner?

Addition skriver man normalt med in värdena på var sida om funktionen

3 + 5 = 8

Man kan också ge en funktion ett namn och då kan man skriva funktionen först med värdena inom paranteser

addera(3, 5) = 8
dividera(16, 2) = 8

Ofta skriver man en funktion med värden som okända variabler

addera(a, b)

Detta betyder att funktionen addera tar två okända värden (variabler) a och b

Om vi bestämmer värdena på in variablerna så har funktionen ett ut värde

addera(a, b) = 8 om a = 3 och b = 5
addera(a, b) = 10 om a = 5 och b = 5

Man kan själv skapa funktioner som kan räkna ut mer komplicerade saker

Exempelvis kan vi skriva funktionen for volymen av en kub med sidan, s, såhär

kubens_volym(s) = s*s*s

kubens_volym(1) = 1*1*1 = 1
kubens_volym(3) = 3*3*3 = 27

I funktionen kubens_volym återanvänder vi funktionen * (multiplikation) för att räkna ut volymen.

Andra typer av värden

Funktioner behöver inte bara hantera siffror

Exempelvis när man målar och blandar färg kan man se som en funktion

blanda(gult, grönt) = grönt   

Funktioner kan ocksa jobba med bokstäver

Exempelvis en funktion som gör om text till stora bokstaver (versaler)

versaler(“Hej hopp!”) = “HEJ HOPP!”

Man kan se former som värden.

Exmepelvis funktionen circle(r) ger tillbaka en cirkel med radien r

circle(r) = IMAGE

Typer av värden

Olika värden kan delas upp i olika typer (eller klasser) av värden

  • Heltal är en typ
  • Decimaltal är en typ
  • Farger är en annan typ
  • Bilder är en annan typ

Vissa värden ingår i flera typer

Exempelvis heltal finns ocksa bland decimaltal

13 ar samma tal som 13.0000

Funktioner kan ta och ge tillbaka olika typer av värden

Exempelvis funktionen avrunda(x) tar ett decimaltal och ger tillbaka ett heltal

avrunda(3.14159) = 3

Kan man programmera med funktioner?

Programmering och funktioner har mycket gemensamt.

Vi kan testa programmering webben på:

Du kan testa programmering genom att skriva in funktioner direkt i browsern.

λ 3+8 [Enter]
11

λ 3*8 [Enter]
24

λ floor(3.14159) [Enter]
3

λ sort("peter") [Enter]
"eeprt"

Programmera bilder!

Man kan även skapa bilder direkt genom programmering

Vi ska göra detta på en annan hemsida som heter http://code.world

Ett mycket enkelt program ser ut så här:

main = drawingOf(sol)

sol = circle(1)

sol är en funktion som ger tillbaka en bild av en cirkel med radien 1

main är en speciell (huvud) funktion som alltid måste finnas i ett program.

Värdet som kommer ut från main är resultatet när man kör programmet.

  1. Testa att skiva in programmet
  2. Testa att köra programmet genom att trycka på Run (kör)
  3. Vad är resutatet från programmet när du kör det?

Mer avancerade program - Solsystemet!

Nu är vi redo för mer avancerade program.

Vi ska skriva ett program som simulerar solsystemet!

Till vår hjälp har vi lite dokumentation.

Färger

Först ska vi byta ut cirkeln mot en fylld cirkel.

sol = solidCircle(1)

Man kan skapa en färgad cirkel genom att skicka cirkeln genom en ny funktion som färgar cirkeln.

sol = colored(solidCircle(1), yellow)

Olika typer

Vad är händer egentligen när man anropar funktionen colored()?

colored() tar två parametrar:

  1. En bild (Picture) som i det här fallet är solidCircle(1)
  2. En färg (Color) som i det här fallet är yellow

Det värde som kommer ut från funktionen är en ny bild (Picture) dvs. en gul fyllt cirkel.

Det är viktigt att alltid skicka in värden av rätt typ i funktioner annars kommer programmet inte att fungera.

Testa exempelvis att byta plats på typerna bild och färg i funktionen colored() och kör programmet (Run).

Line 3, Column 15: error:
    • Couldn't match expected type Picture with actual type Color
    • In the expression: yellow
      In the parameter(s) of colored, namely
        (yellow, solidCircle (1))
      In the expression: colored (yellow, solidCircle (1))

Line 3, Column 23: error:
    • Couldn't match expected type Color with actual type Picture
    • In the expression: solidCircle (1)
      In the parameter(s) of colored, namely
        (yellow, solidCircle (1))
      In the expression: colored (yellow, solidCircle (1))

Detta är ett felmeddelande som talar om att funktionens första parameter yellow inte passar (match) med den förväntade typen, Picture. Det samma gällar andra parametern som inte matchar typen Color.

Det står också på vilken rad felet är.

Fler funktioner och typer

Liksom funktionen colored finns många andra funktioner som förändrar bilden som skickas in.

Funktionen translated tar en bild som första parameter, sedan ett tal (Number), sedan ett tal till och resultatet är en ny bild där bilden är flyttat (translated) i x och y led.

Så här skriver man vilka typer som funktionen tar. Sista typen är resultatet.

translated :: Picture -> Number -> Number -> Picture

Man kan få hjälp med vilka typer en funktion tar i code.world.

Tryck tr och sedan Ctrl+Space

Titta också på funktionen colored genom att trycka co och Ctrl+Space

Planeter

Nu är det dags för solen att få sällskap av nya planeter.

Vi skapar fler planeter vid sidan om solen i solsystemet

På wikipedia kan man se att planeterna storlek anges om andel av jorden storlek.

Vi bestämmer att jorden storlek ska vara 1/5 av solens.

au = 0.2

Sedan skapar vi planeter.

merkurius = solidCircle(au*0.4)
venus = solidCircle(au*0.4)
jorden = solidCircle(au*1)
mars = solidCircle(au*1.5)

Testa att rita ut en av planeterna.

main = drawingOf(venus)

Flera planeter

Hur kan vi rita ut flera planeter samtidigt?

Det finns en funktion & som tar två bilder och skickar ut summar av dessa bilder i retur.

& :: Picture -> Picture -> Picture

Testa genom att rita ut både solen och jorden.

main = drawingOf(sol&jorden)

Vad hände? Jorden syns inte.

Fixa det genom att flytta jorden ut 4 steg i x-led från solen.

jorden = translated(solidCircle(au*1), 4, 0)

Ett solsystem

main = drawingOf(solsystem)

au = 0.2

sol = colored(solidCircle(1), yellow)

merkurius = translated(solidCircle(au*0.4), 2, 0)
venus = translated(solidCircle(au*0.7), 3, 0)
jorden = translated(solidCircle(au*1), 4, 0)
mars = translated(solidCircle(au*1.5), 5, 0)

solsystem = sol & merkurius & venus & jorden & mars

References

LatexTest