Uppgift 3 ­ PM1/PK HT-02


Uppgift 3 måste lämnas senast tisdag 15/10 kl. 08:00. Lämna in den med hjälp av inlämningssystemet i slutet av denna sidan. Se till att läsa igenom kodkonventionerna innan du börjar. Dessa skall följas.

Efter denna laboration ska du kunna...

Före laborationen

Din inlämning

Överst i din fil ska följande finnas (inom kommentartecken):

Skriv svaren på uppgifterna 1 och 6 inom kommentartecken!

Se till att du gett ett svar på varje deluppgift.

SML-biblioteksfunktioner

Förutom de SML-biblioteksfunktioner du använt tidigare kommer du att behöva funktionen String.substring. Den fungerar enligt följande specifikation:

String.substring(s,p,l) : string*int*int->string
PRE: 0 <= p <= size(s), 0 <= l <= size(s)-p
POST: Delsträngen med längd l som börjar på plats p i strängen s. Första tecknet i s har plats 0.
SIDE-EFFECTS: (none)
EXAMPELS: String.substring("abcd",1,2) = "bc"

Uppgiften

Problem 1

Gör helst denna uppgift utan att provköra den, som en övning i att läsa SML-kod. Om du inte alls lyckas gissa, mata då in den till SML och försök komma på vad den gör.

Betrakta nedanstående procedurdefinition.

fun foo(x, y, z) =
    if size(x) < 2 then
      str(y) ^ str(z)
    else
    if (String.sub(x, 0) = y andalso String.sub(x, size(x)-1) = z) then
       str(z) ^ String.substring(x, 1, size(x)-2) ^ str(y)
    else
      str(y) ^ str(z);
  1. Beskriv, med ord, vad proceduren gör.
  2. Beskriv, med ord, hur proceduren gör det den ska.
  3. Ge argumenten x, y och z lämpliga namn.
  4. Vad har x, y och z för typ? Vad har foo för typ?

Problem 2

Skriv en funktion num2month som får ett heltal som argument och returnerar en sträng som är det korresponderande månadsnamnet utskrivet med bokstäver. 1 motsvarar januari och 12 motsvarar december. Skriv funktionen med matchning i definitionen (inte case).!

Här nedan ses exempel på hur den ska fungera.

- num2month(1);
> val it = "januari" : string
- num2month(7);
> val it = "juli" : string
- num2month(13);
> val it = "felaktig månad" : string

Värdet över 12 eller under 1 returnerar alltså värdet "felaktig månad".

Problem 3

Skriv en procedur sqrts som givet ett positivt flyttal returnerar båda kvadratrötterna till detta tal (dvs både 3.0 och -3.0 är möjliga rötter till 9.0) som en tupel.

Problem 4

A.

I engelska är (uttalsmässigt) endast bokstäverna a, e, i, o och u vokaler. Predikatet isVowel är sant för tecken som är en engelsk vokal (versal eller, gemen). Skriv en procedur isVowel : char -> bool som beräknar isVowel. Använd matchning!

    Exempel: 
    isVowel(#"I") = true 
    isVowel(#"f") = false 

B.

Predikatet beginsWithVowel är sant för strängar vars första tecken är en vokal (versal eller gemen). Skriv en procedur beginsWithVowel som beräknar beginsWithVowel. Vad som händer om er procedur appliceras på en tom sträng ("") behöver ni inte bry er om, men kolla gärna! Det är ingen nackdel om det ger en paniksituation (exception).

Exempel:

        beginsWithVowel("I") = true 
        beginsWithVowel("f") = false 
        beginsWithVowel("ape") = true 

C.

För att i engelskan få obestämd form av ett substantiv på grundform skriver man artikeln 'a' före substantivet försåvitt det ordet inte börjar med en (uttalsmässig) vokal då man skriver 'an' i stället. Funktionen indetermined tar ett ord med ett substantiv i grundform och ger ett ord med substantivet i obestämd form.

Skriv en procedur indetermined : string -> string som beräknar indetermined (den skall förutsätta att den givna strängen verkligen är ett substantiv på grundform).

Exempel:

        indetermined("accident") = "an accident" 

Problem 5

Skriv en procedur isEven som returnerar sant om dess argument är ett jämnt tal.

Några exempel på vad vi vill att proceduren ska returnera:

- isEven(42);
> val it = true : bool
- isEven(4711);
> val it = false : bool

Problem 6

Betrakta nedanstående fem funktionsdefinitioner.

fun test1(v) =
    let
        val x = v + v;
        val y = x + x;
    in
        y + y
    end;

fun test2(v) =
    let 
        fun x(a) = a + a;
        fun y(a) = x(a) + x(a);
    in
        y(v) + y(v)
    end;
    
fun test3(v) =
    let 
        fun x(a) = a + a;
        fun y(a) =
           let 
              val b = x(a);
           in
              b + b
           end;
    in
        y(v) + y(v)
    end;

local
    fun x(a) = a + a;
    fun y(a) = x(a) + x(a);
in
    fun test4(v) =
        y(v) + y(v);
end;

local
    val x = v + v;
    val y = x + x;
in
    fun test5(v) =
        y + y;
end;

Är dessa fem deklarationer av funktionerna test1 - test5 alla riktiga i den meningen att de är korrekt ML? Om någon inte är riktig - varför inte? (Prova gärna att köra deklarationerna i ML).

Gå för hand igenom beräkningen av ett anrop till varje test-funktion (med t.ex. argumentet 1). Hur många additioner utförs vid ett anrop till respektive funktion?

Inlämning

Hämta ett formulär för att lämna in uppgiften genom att fylla i fälten nedan.

ID:
PIN:
formulär för inlämning

lhe@csd.uu.se
The page has been accessed [an error occurred while processing this directive] times.

Valid HTML 4.01!