Programmeerparadigma's

Programmeerparadigma's

Introductie Programmeerparadigma's

Eindopdrachten Elm

De bedoeling is dat zowel docenten als leerlingen voor deze eindopdrachten gaan werken in een on-line ontwikkelomgeving.

Als voorbeeld is hiervoor goloca.org/elmit opgezet. Je kunt in deze omgeving als docent inloggen met als docent1 en als leerling van docent1 als:

  • elm0000001
  • elm0000002
  • elm0000003
  • elm0000004

Voor allen geldt als wachtwoord: welkom12.

Je kunt de omgeving bekijken maar geen veranderingen aanbrengen. Je kunt de elm programma's uitvoeren met Ctrl-S.

 

 

Algemeen

Je kunt alle voorbeelden bekijken op:

goloca.org:443/examples

Je kunt je code maken door in te loggen op:

goloca.org/elmit

Vraag je docent hoe je inlogt in ICEcoder en hoe je daarin elm code kunt maken.

Je ziet alle bestanden die in het vervolg genoemd worden en met my beginnen als je in ICEcoder ingelogd bent in het mapje met je id staan. Als je een elm bestand geopend hebt, kun je dit in elm uitvoeren met Ctrl-S.

Boxplot

Wat gaan we maken?

We gaan een boxplot maken. Als je niet weet wat een boxplot is lees dan de uitleg op:

http://www.dr-aart.nl/Statistiek-boxplot.html

Start het elm programma boxplotdatadraw.elm. Je ziet het volgende

In het vakje links boven kun je de waardes voor een boxplot invullen. Vul daar de volgende waardes in uit het voorbeeld van Dr. Aart:

7,3,8,6,8,5,4,5,3,6,2,6,9,1,2,7,5,8,7,6 (Let op zet geen spaties na de komma’s).

Druk op Enter en je ziet deze boxplot:

 

 

Hoe pakken we het aan?

We gaan het vorige programma in Elm programmeren. Dit doen we met de volgende stappen.

  1. Maak een recursieve functie mergesort om de lijst te sorteren.
  2. Maak functie boxplotdata om de gegevens voor een boxplot te bepalen
  3. Maak functie boxplotdatadraw om op basis van de gegevens van een boxplot een boxplot te tekenen

Maak mergesort functie

Je gaat een recursie functie mergesort maken.  Deze functie mergesort heeft als invoer een lijst en als uitvoer een gesorteerde lijst. Je gebruikt de functie mergesort later om de gegevens voor een boxplot te bepalen. Start het elm programma mergesort.elm. Vul in het vakje links boven het volgende in:

7,3,8,6,8,5,4,5,3,6,2,6,9,1,2,7,5,8,7,6

Als uitkomst zie je nu een gesorteerde lijst.

Start het elm programma mymergesort.elm dat je gekregen hebt. Elm geeft als foutmelding dat de functie mergesort ontbreekt. Dat klopt want dat is nu juist de functie die je zelf moet schrijven.

Voeg de functie mergesort toe aan mymergesort.elm. Op de site elm-lang.org vind je bij Examples een voorbeeld van een mergesort functie.

Je moet deze als volgt aanpassen:

  • Verander de naam van de functie split in divide

Bekijk ook de functies checkedStringToFloat en listStringToListFloat.

De functie checkedStringToFloat heeft als input een String en geeft als output een Float terug.  Als  de String niet omgezet kan worden geeft de functie 0 terug.

De functie listStringToListFloat heeft als input een List van Strings en geeft als output een List van Floats terug. Daarbij maakt de functie gebruik van de standaard elm functie map. Deze functie past een functie die als parameter meegegeven wordt toe op alle elementen in een als parameter meegegeven List. In dit geval is dit de functie checkedStringToFloat.

Maak boxplotdata

Je gaat een functie boxplotdata maken.  Deze functie boxplotdata heeft als invoer een String met getallen gescheiden door komma’s en als uitvoer  een List van Floats met getallen gescheiden door komma’s op basis waarvan je een boxplot kunt tekenen.  Je gebruikt de functie boxplotdata later om  een boxplot te tekenen.

Start het elm programma boxplotdata.elm. Vul in het vakje links boven het volgende in:

7,3,8,6,8,5,4,5,3,6,2,6,9,1,2,7,5,8,7,6

Als uitkomst zie je nu een lijst met de gegevens voor de boxplot. Hierin staan achtereenvolgens:

  • kleinste getal
  • eerste quartiel
  • tweede quartiel (mediaan)
  • derde quartiel
  • grootste getal

Start het elm programma myboxplotdata.elm dat je gekregen hebt. Elm geeft als foutmelding dat de functie boxplotdata ontbreekt. Dat klopt want dat is nu juist de functie die je zelf moet schrijven.

Voeg de functie boxplotdata  toe aan myboxplotdata.elm. Deze functie boxplotdata heeft als invoer een String en als uitvoer een  lijst van Floats op basis waarvan je een boxplot kunt tekenen. In deze lijst staan achtereenvolgens het kleinste getal, het eerste kwartiel, het tweede kwartiel(mediaan), het derde kwartiel en het grootste getal.

Je kunt dit als volgt aanpakken.  Maak met split een lijst van de String die je als invoer krijgt. Zet deze lijst van Strings om naar een lijst van Floats en sorteer deze lijst. Maak van deze lijst een Array. Je kunt nu op basis van dit Array de kleinste een de grootste bepalen. Schrijf aparte functies om op basis van het Array het eerste, tweede en derde kwartiel te bepalen.  Zet de resultaten in een lijst van Floats en geef deze terug.

Maak boxplotdatadraw

Kopieer je bestand myboxplotdata.elm naar myboxplotdatadraw.elm.

Voeg  bovenaan in myboxplotdatadraw.elm het volgende toe:

 

import Svg exposing (..)

import Svg.Attributes exposing (..)

 

Vervang in boxplotdatadraw.elm:

 

view model =

  div []

  [ input [onKeyDown KeyDown, onInput Input] []

  , div [] [ text (toString model.outputData) ]

  ]

 

door:

 

view model =

  let

  a  = Array.fromList model.outputData

  kl = withDefault 0 (Array.get 0 a)

  k1 = withDefault 0 (Array.get 1 a)

  k2 = withDefault 0 (Array.get 2 a)

  k3 = withDefault 0 (Array.get 3 a)

  gr = withDefault 0 (Array.get 4 a)

  s = 200/(gr-kl)

  h = 12

  line1 = pointsListToString [kl*s, 100, k1*s, 100]

  box1 = pointsListToString [k1*s, 100-(s*((gr-kl)/h)), k2*s, 100-(s*((gr-kl)/h)), k2*s, 100+(s*((gr-kl)/h)), k1*s, 100+(s*((gr-kl)/h)), k1*s, 100-(s*((gr-kl)/h))]

  box2 = pointsListToString [k2*s, 100-(s*((gr-kl)/h)), k3*s, 100-(s*((gr-kl)/h)), k3*s, 100+(s*((gr-kl)/h)), k2*s, 100+(s*((gr-kl)/h)), k2*s, 100-(s*((gr-kl)/h))]

  line2 = pointsListToString [k3*s, 100, gr*s , 100]

  in

  div []

  [ input [onKeyDown KeyDown, onInput Input] []

  , div [] [ Html.text ("kl: " ++ toString kl) ]

  , div [] [ Html.text ("q1: " ++ toString k1) ]

  , div [] [ Html.text ("q2: " ++ toString k2) ]

  , div [] [ Html.text ("q3: " ++ toString k3) ]

  , div [] [ Html.text ("gr: " ++ toString gr) ]

  , svg [ viewBox "0 0 500 400", width "800px" ]

     [

       polyline [ fill "none", stroke "black", points line1 ] [],

       polyline [ fill "none", stroke "black", points box1 ] [],

       polyline [ fill "none", stroke "black", points box2 ] [],

       polyline [ fill "none", stroke "black", points line2 ] []

     ]

  ]

Uitleg

De gegevens voor de boxplot staan in model. outputData. Deze gegevens worden hier uit gehaald en in de volgende Floats gezet:

  • kl, kleinste
  • k1, eerste quartiel
  • k2, tweede quartiel
  • k3, derde quartiel
  • gr, grootste

Deze Floats worden gebruikt om binnen een svg tag de volgende polylines aan te maken:

  • line1
  • box1
  • box2
  • line2

 

Zie https://www.w3schools.com/graphics/svg_polyline.asp als je meer over svg en polyline wilt weten.

Polynoom

Wat gaan we maken?

Start het elm programma powfuncpointsdraw.elm. Je ziet het volgende:

In het vakje links onder kun je de a, b en c invullen voor functies van de vorm:

y = ax2 + bx + c

Vul in het vakje links onder  5 in en druk op Enter.

Je ziet nu de grafiek voor de functie y=5 voor -100 =< x =< 100.

 

Vul in het vakje links onder  1,0 in en druk op Enter.

Je zie nu de grafiek voor de functie y=x voor -100 =< x =< 100.

 

Vul in het vakje links  onder 1,2 in en druk op Enter.

Je zie nu de grafiek voor de functie y=x+2 voor -100 =< x =< 100.

 

Vul in het vakje links  onder 1,0,0 in en druk op Enter.

Je zie nu de grafiek voor de functie y=x2 voor -100 =< x =< 100.

 

Vul in het vakje links  onder 1,0,-4 in en druk op Enter.

Je zie nu de grafiek voor de functie y=x2-4 voor -100 =< x =< 100.

 

Vul in het vakje links  onder 1,2,-4 in en druk op Enter.

Je zie nu de grafiek voor de functie y=x2+2x-4 voor -100 =< x =< 100.

 

Vul  nog wat andere waardes in voor a, b en c in en kijk wat er gebeurt.  Als je een half wilt invullen moet dat met 0.5 en een tiende met 0.1.

 

Vul vier getallen in en kijk wat er gebeurt.

Hoe pakken we het aan?

We gaan het vorige programma in Elm programmeren. Dit doen we met de volgende stappen.

  1. Maak een recursieve functie pow die een macht berekent
  2. Maak een recursieve functie powfunc die de waarde van  y berekent voor de waarde van x.
  3. Maak een recursieve functie powfuncpoints die de waarden van y berekend met powfunc voor -10 <= x <= 10
  4. Gebruik het resultaat van powfuncpoints om een grafiek te tekenen voor -100 <= x <= 100

Maak pow

Je gaat een recursie functie pow maken.  Deze functie pow heeft als invoer twee getallen g en m en geeft als uitvoer gm.  Je gebruikt de functie pow later om functies te bereken van de vorm y = ax2 + bx + c. Daarom is de functie pow goed genoeg als je voor m alleen gehele positieve getallen mag gebruiken. De functie pow heeft als uitkomst een getal dat gm weergeeft.

Start het elm programma pow.elm. Vul in het vakje 2,3 in. Je vraagt nu om 23 te berekenen en het resultaat is 8. Vul nog wat meer waarden voor g en m in en check de uitkomst.

Start het elm programma mypow.elm dat je gekregen hebt. Elm geeft als foutmelding dat de functie pow ontbreekt. Dat klopt want dat is nu juist de functie die jij zelf moet schrijven.

Voeg de functie pow toe aan mypow.elm volgens de volgende omschijving. Pow heeft als invoer twee getallen g en m. Daarvan is g het grondtal en m de macht. Pow geeft als resultaat gm terug.

Gebruik daarbij recursie volgens dit schema:

 

Maak powfunc

Je gaat een recursieve functie powfunc maken voor functies van de vorm y = ax2 + bx + c. Deze functie powfunc heeft als invoer een waarde voor x en een lijst met de waarden voor a, b en c. In deze lijst zijn a, b en c opgeslagen als Floats. De functie powfunc heeft als uitkomst een getal dat de waarde van y weergeeft.

Start het elm programma powfunc.elm. De test in dit programma werkt met een vaste waarde voor x die 2 is. Vul in het vakje 2,3 in. Dit staat voor y=2x+3. Als x dus 2 is, komt hier 7 uit. Vul nog wat meer waarden voor a,b en c in en check de uitkomst.

Start het elm programma mypowfunc.elm dat je gekregen hebt. Elm geeft als foutmelding dat de functie powfunc ontbreekt. Dat klopt want dat is nu juist de functie die jij zelf moet schrijven.

Voeg de functie powfunc toe aan mypowfunc.elm volgens de volgende omschijving. Powfunc heeft als invoer een getal x en een lijst van Floats l. Daarvan is x de waarde van x en bevat l de waarden van a, b en c voor een functie van de vorm y = ax2 + bx + c. Powfunc geeft als resultaat de uitkomst terug van y voor de functie y = ax2 + bx + c waarbij x, a, b en c zijn ingevuld.

Gebruik daarbij recursie volgens dit schema:

Maak powfuncpoints

Je gaat een recursieve functie powfuncpoints maken om een List van Floats met x en y waarden voor functies van de vorm y = ax2 + bx + c te maken. Deze functie powfuncpoints heeft als invoer  drie getallen c, s en e en een lijst met de waarden voor a, b en c. In deze lijst zijn a, b en c opgeslagen als Floats. De getallen c, s en e zijn achtereenvolgens de beginwaarde voor x, de stap waarmee x wordt opgehoogd en de eindwaarde van x. De functie powfuncpoints heeft als uitkomst een List van Floats  met  x en y waarden voor een bepaalde range van x.

Start het elm programma powfuncpoints.elm. De test in dit programma werkt met vaste waarden voor c, s en  e. Deze waarden zijn -10, 1 en 10. Vul in het vakje 2,3 in. Dit staat voor y=2x+3.  Je krijgt nu een lijst met waardes voor x en y voor -10 <= x <= 10.. Vul nog wat meer waarden voor a,b en c in en check de uitkomst.

Start het elm programma mypowfuncpoint.elm dat je gekregen hebt. Elm geeft als foutmelding dat de functie powfuncpoints ontbreekt. Dat klopt want dat is nu juist de functie die jij zelf moet schrijven.

Voeg de functie powfuncpoints toe aan mypowfuncpoints.elm volgens de volgende omschijving. Powfuncpoints heeft als invoer drie getallen c, s en e en een lijst met de waarden voor a, b en c. In deze lijst zijn a, b en c opgeslagen als Strings. De getallen c, s en e zijn achtereenvolgens de beginwaarde voor x, de stap waarmee x wordt opgehoogd en de eindwaarde van x. De functie powfuncpoints heeft als uitkomst een String met paren van x en y waarden met de door c, e en s opgegeven range van x.

Gebruik daarbij recursie volgens dit schema:

Maak powfuncpointsdraw

Kopieer je bestand mypowfuncpoints.elm naar mypowfuncpointsdraw.elm.

Voeg  bovenaan in mypowfuncpointsdraw.elm het volgende toe:

 

import Svg exposing (..)

import Svg.Attributes exposing (..)

 

Vervang in mypowfuncpointsdraw.elm:

 

view model =

  div []

  [ input [onKeyDown KeyDown, onInput Input] []

  , div [] [ text ("Result: " ++ model.outputData) ]

  ]

 

door:

 

view model =

  div []

  [ input [onKeyDown KeyDown, onInput Input] []

  , svg [ viewBox "0 0 200 200", width "400px" ]

     [ g [ transform "translate(100, 100) scale(1,-1)" ]

           [ polyline [ fill "none", stroke "black", points model.outputData] []

             , polyline [ fill "none", stroke "black", points(pointsListToString (powfuncpoints -100 1 100 [0]))] []

             , polyline [ fill "none", stroke "black", points "0,-100 0,100"] []

           ]

     ]

  ]

 

Pas powfuncpointsTest zo aan dat de test gaat voor -100 <= x <= 100.

 

Uitleg

In het view model maak je een svg tag.  Binnen deze svg tag maak je een polyline aan met als punten de uitkomst van:

 

model | outputData = powfuncpointsTest model.inputData

 

De andere twee polylines zijn de x-as en de y-as.

 

Zie https://www.w3schools.com/graphics/svg_polyline.asp als je meer over svg en polyline wilt weten.

ijskristallen

Wat gaan we maken?

We gaan een eigen ijskristal maken:

Zoek op het internet plaatjes van ijskristallen zodat je weet hoe deze er uit zien.

Start het elm programma ijskristal.elm. Je ziet het volgende:

Links boven kun je selecteren hoeveel maal het ijskristal verdeeld moet worden. Selecteer daar 4. Je ziet het volgende:

 

Hoe pakken we het aan?

Open het elm bestand myijskristal.elm. Deze  code staat in het view model daarvan.

       path =

           [ koch startP1 startP2 model.passes []

           , koch startP2 startP3 model.passes []

           , koch startP3 startP1 model.passes []

           ]

In deze regel worden de punten voor de tekening in een lijst gezet­­­. Dit gebeurt door 3 lijnen te bepalen en deze verder te bewerken zoals je hier ziet:

Daarvoor wordt de functie koch aangeroepen met als parameters:

  • Het startpunt van de lijn
  • Het eindpunt van de lijn
  • Het aantal stappen waarin de lijn bewerkt wordt
  • De lijst van punten die tot en met deze stap bepaald zijn

In kock worden de drie nieuwe punten p1, p2 en p3 berekend om de lijn kunnen te tekenen.

Het begin en het eind punt heten binnen koch a en b. Het begin en eindpunt worden als parameters meegegeven.

Als het aantal stappen niet meer dan 1 is geeft de functie koch het volgende terug:

a :: p1 :: p2 :: p3 :: b :: points

Als het aantal stappen meer dan 1 is roept roep de functie koch zichzelf 4 keer aan met als te bewerken lijnen:

  • De lijn tussen de punten a en p1
  • De lijn tussen de puntern p1 en p2
  • De lijn tussen de punten p2 en p3
  • De lijn tussen de punten p3 en b

Bij deze aanroepen verlaagt koch het aantal stappen met 1. Alle resulterende lijsten van deze 4 aanroepen zet koch in een gezamenlijke lijst en geeft deze terug.

Opdracht

Maak je eigen ijskristal door de code van myijskristal.elm aan te passen.

  • Het arrangement Programmeerparadigma's is gemaakt met Wikiwijs van Kennisnet. Wikiwijs is hét onderwijsplatform waar je leermiddelen zoekt, maakt en deelt.

    Laatst gewijzigd
    2018-05-31 17:27:35
    Licentie

    Dit lesmateriaal is gepubliceerd onder de Creative Commons Naamsvermelding 4.0 Internationale licentie. Dit houdt in dat je onder de voorwaarde van naamsvermelding vrij bent om:

    • het werk te delen - te kopiëren, te verspreiden en door te geven via elk medium of bestandsformaat
    • het werk te bewerken - te remixen, te veranderen en afgeleide werken te maken
    • voor alle doeleinden, inclusief commerciële doeleinden.

    Meer informatie over de CC Naamsvermelding 4.0 Internationale licentie.

    Aanvullende informatie over dit lesmateriaal

    Van dit lesmateriaal is de volgende aanvullende informatie beschikbaar:

    Eindgebruiker
    leerling/student
    Moeilijkheidsgraad
    gemiddeld

    Gebruikte Wikiwijs Arrangementen

    themateam_paradigmas. (2018).

    Eindopdrachten

    https://maken.wikiwijs.nl/124499/Eindopdrachten

    themateam_paradigmas. (2018).

    Introductie Programmeerparadigma's

    https://maken.wikiwijs.nl/124806/Introductie_Programmeerparadigma_s

  • Downloaden

    Het volledige arrangement is in de onderstaande formaten te downloaden.

    Metadata

    LTI

    Leeromgevingen die gebruik maken van LTI kunnen Wikiwijs arrangementen en toetsen afspelen en resultaten terugkoppelen. Hiervoor moet de leeromgeving wel bij Wikiwijs aangemeld zijn. Wil je gebruik maken van de LTI koppeling? Meld je aan via info@wikiwijs.nl met het verzoek om een LTI koppeling aan te gaan.

    Maak je al gebruik van LTI? Gebruik dan de onderstaande Launch URL’s.

    Arrangement

    IMSCC package

    Wil je de Launch URL’s niet los kopiëren, maar in één keer downloaden? Download dan de IMSCC package.

    Meer informatie voor ontwikkelaars

    Wikiwijs lesmateriaal kan worden gebruikt in een externe leeromgeving. Er kunnen koppelingen worden gemaakt en het lesmateriaal kan op verschillende manieren worden geëxporteerd. Meer informatie hierover kun je vinden op onze Developers Wiki.