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