bild
Skolan för
elektroteknik
och datavetenskap

Uppgift 7 våren 2014

Uppgiften ska lämnas till din övningsledare på övningen den 28/3 (27/3 för pallinda14).

  • Uppgifterna ska lämnas in på papper. E-post accepteras ej.
  • Samtliga papper ska häftas samman eller lämnas in i en plastficka.
  • Handskriven text accepteras ej.

Lämna in uppgiften med rätt försättsblad:

För godkänt måste du ha gjort samtliga deluppgifter. Det är tillåtet att göra enstaka fel och misstag men det är viktigt att du försöker lösa samtliga uppgifter.

Föreberedelser

Du kommer åt senaste versionen av Go (1.2.1) på skolans Ubuntudatorer genom att logga in på ditt konto och ge följande kommando i ett terminalfönster:

    module initadd go

Om du vill så kan du enkelt installera Go på din egen dator.

För den här kursen så räcker det om du känner till kommandona go run som kompilerar och kör ett Go-program samt go fmt som formatterar programmet.

Hemuppgift

Bekanta dig med programspråket Go på sajten golang.org och ta en titt på Go for Java programmers, en snabbstart för Javaprogrammerare som vill komma igång med Go. Målet är att du ska skaffa dig en överblick, inte att du ska förstå allt på en gång.

Läs avsnitt 1 och 2 i Fundamentals of concurrent programming. De här avsnitten ska du läsa noggrant.

Överkurs

Om du vill skriva egna paket med tillhörande testkod så bör du organisera din kod på rätt sätt. Det viktigaste är att samla all kod på en plats, till exempel i katalogen $HOME/Private/mygo/src/, och lägga till

    export GOPATH=$HOME/Private/mygo

i din initieringsfil (som heter .profile i Ubuntu).

Skriftlig uppgift

Ta en tur med Go (sida 1-50) och lämna in korrekt formatterade skriftliga lösningar till följande uppgifter.

Väckarklocka

Skriv en funktion

    Remind(text string, paus time.Duration)

som skriver ut texten

    "Klockan är XX.XX: " + text
om och om igen med en paus av given längd före varje påminnelse, XX.XX ska bytas ut mot den aktuella tiden.

Skriv sedan ett komplett program som går för evigt och skriver ut följande påminnelser:

  • var 3:e timme: "Klockan är XX.XX: Dags att äta",
  • var 8:e timme: "Klockan är XX.XX: Dags att arbeta",
  • var 24:e timme: "Klockan är XX.XX: Dags att sova".

För att undvika att huvudprogrammet avslutas kan du använda satsen

    select {}

som gör att en gorutin stannar för evigt.

Den aktuella tiden får du från funktionen Now i paketet time. Där finns också en användbar metod Format som fixar formatteringen av tidsutskriften. Man kan till exempel få tiden i timmar, minuter och sekunder så här:

    time.Now().Format("15:04:05")

Man beskriver alltså formatet genom att ange hur en viss förutbestämd tid, som måste vara

    Mon Jan 2 15:04:05 -0700 MST 2006,

ska formatteras.

Lämna in koden för hela programmet. Glöm inte att göra "go fmt" innan du skriver ut ditt program.

Summa i två delar

Gör klart programmet nedan. Det adderar alla tal i en vektor genom att dela vektorn på mitten och låta två gorutiner göra halva jobbet var. Delresultaten skickas över en kanal. Lämna in koden för hela programmet. Glöm inte "go fmt".

package main

// Add adds the numbers in a and sends the result on res.
func Add(a []int, res chan<- int) {
    // TODO
}

func main() {
    a := []int{1, 2, 3, 4, 5, 6, 7}

    n := len(a)
    ch := make(chan int)
    go Add(a[:n/2], ch)
    go Add(a[n/2:], ch)

    // TODO: Get the subtotals from the channel and print their sum.
}
Copyright © Sidansvarig: Stefan Nilsson <snilsson@nada.kth.se>
Uppdaterad 2014-03-17