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
Run het elm programma myboxplotdata.elm in de volgende cell. 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.
import Html exposing (text, div, input, Attribute)
import Html exposing (beginnerProgram)
import Html.Events exposing (on, keyCode, onInput)
import Json.Decode as Json
import String exposing(..)
import List exposing(..)
import Array exposing(..)
import Maybe exposing(..)
checkedStringToFloat : String -> Float
checkedStringToFloat s =
Result.withDefault 0 (String.toFloat s)
listStringToListFloat : List String -> List Float
listStringToListFloat ls =
List.map checkedStringToFloat ls
mergesort : List comparable -> List comparable
mergesort list =
case list of
[] ->
list
[_] ->
list
_ ->
let
(xs, ys) = divide list
in
merge (mergesort xs) (mergesort ys)
divide : List a -> (List a, List a)
divide list =
case list of
[] ->
([], [])
x :: rest ->
let
(xs, ys) = divide rest
in
(ys, x :: xs)
merge : List comparable -> List comparable -> List comparable
merge xs ys =
case (xs, ys) of
(x :: xBack, y :: yBack) ->
if x < y then
x :: merge xBack ys
else
y :: merge xs yBack
([], rest) ->
rest
(rest, []) ->
rest
main =
beginnerProgram
{ model =
{ outputData = []
, inputData = ""
}
, view = view
, update = update
}
view model =
div []
[ input [onKeyDown KeyDown, onInput Input] []
, div [] [ text (toString model.outputData) ]
]
onKeyDown : (Int -> msg) -> Html.Attribute msg
onKeyDown tagger =
on "keydown" (Json.map tagger keyCode)
type Msg
= NoOp
| KeyDown Int
| Input String
update msg model =
case msg of
NoOp ->
model
KeyDown key ->
if key == 13 then
{ model | outputData = boxplotdata model.inputData }
else
model
Input text ->
{ model | inputData = text }
-- insert your code here
boxplotdata : String -> List Float
-- compile-code