Göm menyn

TDP007 Konstruktion av datorspråk

Seminarie 1: Introduktion till Ruby

Syftet med det första seminariet är att ni ska bli bekanta med språket Ruby och arbetssättet för laborationer och seminarier i kursen.

Vad ska man tänka på?

Innan ni börjar med uppgifterna, läs igenom Seminariesidan. Den förklarar hur ni ska redovisa era lösningar och hur ni ska förbereda er för seminaret. Förutom lösningar på uppgifter ska ni även lämna in enhetstester och utvecklarblogg. Läs igenom anvisningarna för dessa också.

Inför det första seminariet ska ni lösa ett antal mindre uppgifter i Ruby. Alla uppgifter ska vara huvudsakligen lösta så som ni har tolkat dem.


Avsnitt 1: Iteratorer

I dessa uppgifter ska ni använda eller konstruera iteratorer, d.v.s. funktioner som tar block av programkod och applicerar på varje element i en array, hash eller liknande datastruktur. Ni kan läsa mer om iteratorer i kursbokens kapitel 4.

Uppgift 1: Skriv en iterator-funktion n_times(n) som anropar det givna blocket n gånger. Skriv dessutom en iterator-klass Repeat som instansieras med ett tal. Klassen ska ha en metod each som tar ett block och anropar det så många gånger som angavs när objektet skapades. Exempel:

>> n_times(3) { puts "Hello!" } Hello! Hello! Hello! => 3 >> do_three = Repeat.new(3) #<Repeat:0xe7288 @n=3> >> do_three.each { puts "Hooray!" } Hooray! Hooray! Hooray! => 3

Uppgift 2: Skriv en funktion find_it som tar en array av strängar och ett block. Blocket ska ta två parametrar och returnera ett sanningsvärde. Funktionen find_it ska kunna användas för att implementera longest_string, shortest_string och andra liknande funktioner enbart genom att ändra blocket som man skickar in. Exempel på hur man löser samma problem som longest_string men med find_it:

>>> find_it(["apelsin", "banan", "citron"]) { |a,b| a.length > b.length } => "apelsin"


Avsnitt 2: Utökning av existerande klasser

I dessa uppgifter ska ni få öva på att utöka klasser med nya metoder. Alla klasser i Ruby kan utökas, även de inbyggda, och man kan också göra utökningar enbart för enskilda objekt.

Uppgift 3: Utöka klassen Integer med en metod fib som beräknar motsvarande Fibonacci-tal. Fibonacci-serien fungerar så att tal nummer n är summan av talen n-1 och n-2. De två första talen är båda 1.

Uppgift 4: Utöka klassen Array med en metod rotate_left som roterar innehållet i arrayen åt vänster (d.v.s. flyttar element från början till slutet). Metoden ska kunna ta ett heltal som anger antalet steg, med 1 som default. Exempel:

>> [1,2,3].rotate_left => [2, 3, 1] >> [1,2,3].rotate_left(3) => [1, 2, 3]


Avsnitt 3: Reguljära uttryck

I dessa uppgifter ska ni använda reguljära uttryck som är ett slags mönster för att matcha innehållet i strängar. Läs mer om reguljära uttryck i lärobokens kapitel 5.

Uppgift 5: Skriv en funktion som hämtar namnen på alla HTML-taggar i ett dokument. Varje tag som förekommer i arrayen skall endast förekomma en gång, det skall alltså vara en unik array. Exempel:

>> require 'open-uri.rb' => true >> html = URI.open("http://www.google.com/") { |f| f.read } => "<html><head><title>Google</title> ..." >> tag_names(html) => [["html"], ["head"], ["title"], ...]

De två första raderna i exemplet ovan ser till att hela webbsidan läses in till en enda sträng som man sedan kan bearbeta med funktionen tag_names.

Uppgift 6: Konstruera en funktion som tar reda på om en sträng innehåller ett godkänt svenskt registreringsnummer. Ni behöver inte ta hänsyn till att vissa kombinationer är förbjudna, utan det räcker om ni ser till att endast godkända bokstäver är med. Funktionen ska returnera det giltiga registreringsnumret, alternativt false om inget sådant finns. Exempel:

>> regnr("Min bil heter FMA297.") => "FMA297" >> regnr("XQT784") => false

Reglerna för registreringsnummer finns på t.ex. på Wikipedia.


Avsnitt 4: Demonstrera funktionalitet

Uppgift 7: Designa och lös en egen programmeringsuppgift som kräver användning av en delmängd av tekniker som du lärt dig i tidigare kurser (TDP001-TDP005), men nu i programspråket Ruby. Lämplig omfattning på lösning är upp till 40 rader kod, men stor frihet ges i denna uppgift. Följande ska finnas med:

  • Beskrivning av uppgiften (valfritt text-format (e.g. txt-fil eller som kommentar i början av kodfilen))
  • Eventuell given fil
  • Lösningsförslag
  • Vad är syftet med uppgiften? Vad ska denna uppgift lära en student/ge dem möjlighet att visa att de kan?
  • Kort motivation av varför denna uppgift är en bra uppgift för syftet.

Sidansvarig: Pontus Haglund
Senast uppdaterad: 2025-01-20