Programmeringsmetodik: Tentamen 2010-11-04

Det här är datortentan som går torsdag 4 november 2010 i kursen Programmeringsmetodik, kl 8:15-12:15. Lokal: T120, och vid behov T124 och T117.

Det här är inte en hemtenta, utan man måste göra den i tentasalen, ungefär som en vanlig salstenta.

Gäller som tentamen för:
DT2010 Datateknik B, Programmeringsmetodik, provkod 0100
DT2006 Datateknik B, Tillämpad datavetenskap B, provkod 0110

Ansvarig lärare är Thomas Padron-McCarthy (thomas.padron-mccarthy@oru.se), telefon 070-73 47 013.

Instruktioner

  1. Normalt används Visual Studio på era vanliga datorkonton, men man kan också använda en egen bärbar dator, om man har (egen, trådlös) nätuppkoppling på den. GCC under Linux går bra som alternativ till Visual Studio.
  2. Skicka in lösningarna till mig (thomas.padron-mccarthy@oru.se) senast klockan 12:15. Spara också själv en kopia, ifall det blir något fel med posten!
  3. Lämna också in den särskilda pappersblanketten, med dina lösta uppgifter förkryssade, så det finns på papper vilka som deltagit och vilka uppgifter de löst.
  4. Använd C eller C++.
  5. Packa ihop hela katalogen med applikationen i en Zip-fil, och skicka den som en bilaga. Men döp först om Zip-filen från nånting.zip till exempelvis nånting.info för att överlista överambitiösa virusfilter.
    Spara också själv en kopia, ifall det blir något fel med posten!
  6. För att en lösning på en uppgift ska bli godkänd krävs att den fungerar (utom möjligen för vissa konstiga specialfall) och att den inte strider mot specifikationen.
  7. För betyget 3 respektive G krävs godkänt på uppgift 1. För betyget 4 respektive VG krävs godkänt på både uppgift 1 och 2. För betyget 5 krävs godkänt på uppgift 1, 2 och 3.
  8. Godkänt resultat på denna tentamen ger betyget 3, 4 eller 5 (respektive G eller VG) på teoridelen av kursen. Tillsammans med godkända inlämningsuppgifter ger godkänt resultat på den här tentan ett godkänt betyg på hela kursen. Betyget på hela kursen blir samma som på tentan.

Hjälpmedel vid tentamen

  1. Uppgiften ska lösas enskilt, dvs inga grupper av två eller flera studenter.
  2. Du får använda datorn, böcker och vilka andra hjälpmedel som helst, men du får inte samarbeta eller fråga någon (utom mig). Det är alltså tillåtet att söka med Google, eller på frågeforum som Stack Overflow, men det är inte tillåtet att posta egna frågor.
  3. Om du behöver fråga något, så kontakta läraren. Jag finns på plats i datorsalarna, och man kan också ringa mig (se mobilnumret ovan).

Scenario

Vi ska bygga ett stort teleskop.

Ett stort teleskop. Originalet från Astro61 på en.wikipedia.

Som i alla moderna teleskop sitter man inte och tittar i det, utan man använder en sensor ungefär som i en digitalkamera. (Och nu börjar jag hitta på, så ni inte tror att det är så här teleskop fungerar på riktigt.)

Sensorn är fyrkantig, och kan ha ett mycket stort antal bildpunkter ("pixels"). Mätdata samlas på en fil:

8 47 0.73
144 19 0.74
8 47 0.02
100 93 0.66

Varje rad innehåller tre tal: två heltal som anger bildpunktens x- och y-koordinat, och ett reellt tal som anger mätvärde, dvs hur mycket ljus som mättes upp i just den bildpunkten. Samma bildpunkt kan förekomma flera gånger, och då ska mätvärdena summeras.

Vi ska leta efter stjärnor på bilderna från teleskopet. Därför behöver vi ett program som läser filen med mätdata, och som sen anger koordinaterna för den ljusstarkaste punkten, dvs den bildpunkt som har det högsta sammanlagda värdet. Med exempelfilen ovan blir det punkten (x=8, y=47), som har värdet 0.75.

På riktigt kommer filen att innehålla flera miljarder rader, med data om flera miljoner olika bildpunkter. Bilden från teleskopet är alltså ganska "gles": det är mest svart, och så finns det stjärnor här och där. Här är en liten del av en sådan bild, uppförstorad så man ser pixlarna tydligt:

En bit av himlen

Astronomerna har faktiskt redan löst problemet, säger de, med programmet matrix-brightest. Programmet använder en matris (dvs en "tvådimensionell array") för att lagra punkterna, och fungerar både snabbt och korrekt när de provkör det med simulerade data. Astronomerna är mycket stolta över sin prestation, så studera gärna det programmet.

Här är ett enkelt hjälpprogram som man kan använda om man vill slumpa fram testdata: make-some-data. (Programmet ger inte helt realistiska data, eftersom det sprider värdena jämt över bilden, och inte samlat i punkter som det kommer att bli på riktigt.)

1. Uppgift för betyget 3 respektive G

Lös denna uppgift först, och skicka in den. Spara också själv en kopia, ifall det blir något fel med posten! Börja inte med de andra uppgifterna innan du är klar med denna, och har skickat in den.

Astronomernas program matrix-brightest fungerade som sagt bra. Men den riktiga sensorn har en storlek på en miljon gånger en miljon (dvs totalt en biljon, 1012) bildpunkter. När astronomerna ändrar konstanten SENSOR_SIDE från 1024 till 1000000, får matrisen inte längre plats i minnet, och deras fina program går inte att köra.

Hjälp astronomerna, genom att göra en lösning med en länkad lista i stället! Söknyckeln ska vara koordinaterna (x och y) för en punkt.

Det ska vara en länkad lista specifikt för detta ändamål, så använd inte någon generell datatyp (som std::list).

De här kan kanske vara en ledtråd:

Utgå gärna från astronomernas program och modifiera det. Man behöver inte dela upp programmet i flera filer.

2. Uppgift för betyget 4 respektive VG

Lös först uppgift 1, och skicka in den. Därefter kan du lösa, och skicka in, den här uppgiften. Spara också själv en kopia, ifall det blir något fel med posten! Börja inte med uppgift 3 innan du är klar med denna, och har skickat in den.

Astronomerna är missnöjda med ditt program från uppgift 2 ovan. Det går visserligen att köra, vilket är bättre än deras eget program, men tyvärr går det inte så snabbt. Det fungerar bra på små exempeldata. Men med astronomernas riktiga datafil, som ju innehöll flera miljarder rader med data om flera miljoner olika bildpunkter, tar programmet flera veckor att köra.

Gör en ny version av programmet som använder en bättre datastruktur, förslagsvis en hashtabell eller ett binärt träd. Vi vill ha en enorm förbättring av körtiden.

Datastrukturerna som används ska vara skapade specifikt för detta ändamål, så använd inte någon generell datatyp.

3. Uppgift för betyget 5

Lös först uppgift 1 och 2, och skicka in dem. Därefter kan du lösa, och skicka in, den här uppgiften. Spara också själv en kopia, ifall det blir något fel med posten!

Gör om uppgift 2 med hjälp av en generell datatyp.

Skapa först den generella datatypen (till exempel hashtabellen GenericHashTable). Välj själv metod för att skapa en generell datatyp. Dela upp på lämpliga filer. Det är inte förbjudet att inspireras av existerande lösningar, men du ska lämna in en som du gjort själv.

Använd den därefter i programmet för att lagra punkterna.

Den här sista-uppgiften för betyget 5 kanske kan ta lite längre tid att lösa. Om den inte är helt klar när tentatiden tar slut, är det därför tillåtet att skicka in en preliminär lösning, som man sedan kan komplettera. Ange tydligt att det är en preliminär lösning. Kompletteringen ska skickas in senast en vecka efter tentan.


Thomas Padron-McCarthy (thomas.padron-mccarthy@oru.se), 3 november 2010