Programmeringsmetodik: Tentamen 2012-11-08

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

Gäller som tentamen för:
DT2020 Datateknik B, Programmeringsmetodik, provkod 0100
DT2022 Datateknik B, Tillämpad datavetenskap, provkod 0110
DT2011 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. Det här är inte en hemtenta, utan man måste göra den i tentasalen, ungefär som en vanlig salstenta.
  2. 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.
  3. 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!
  4. 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.
  5. Använd C eller C++.
  6. Packa ihop hela katalogen med applikationen i en Zip-fil (eller motsvarande), 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!
  7. 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.
  8. 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.
  9. 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, eller via mobilnumret ovan.

Scenario

Finns det liv i universum? För att ta reda på det lyssnar vi med radioteleskop efter svaga radiosignaler från rymden:

Very Large Array. Fotograf: Hajor, Wikipedia. Licens: Creative Commons Attribution-Share Alike 2.0 Generic.

Eftersom rymdvarelserna bor så långt bort, är de signaler som når fram till jorden mycket svaga. De drunknar i störningar av olika slag. För att filtrera bort störningarna lyssnar vi med många radioteleskop, och vi är bara intresserade av de signaler som tas emot av flera olika teleskop samtidigt.

Vi gör många miljarder observationer. De samlas på en fil, med en observation per rad. På raden står vilket observatorium som tog emot signalen, en tidpunkt, och två koordinater som anger vilken riktning signalen kom från. Exempel:

17 18:22:03 149 268
17 18:22:05 149 268
13 18:22:03 149 268

Här har observatorium 17 tagit emot en signal klockan 18:22:03 från riktning 149 268. Två sekunder senare tog samma observatorium emot en annan signal från samma riktning. Den första av dessa signaler togs dessutom emot av observatorium 13. I det här exemplet är det alltså den signalen som vi vill filtrera fram: klockan 18:22:03 från riktning 149 268.

Alla tal är heltal. En och samma signal kan observeras från ett eller flera observatorier. Om tiden och riktningskoordinaterna stämmer överens, räknas det som samma signal.

Vi behöver ett program som läser filen med observationsdata, och som talar om vilka signaler som observerats av flera observatorier samtidigt. Som utdata från programmet vill vi ha en lista på dessa signaler, med en notering om vid vilka observatorier var och en togs emot. Exempel på hur utmatningen kan se ut med exempelfilen ovan:

Tid: 18:22:03 Riktning: 149 268 Observatorier: 17 13

Ordningen spelar ingen roll, vare sig på signalerna eller på observatorierna.

Exempelfiler

Filerna är textfiler i Windows-format. (De finns också i Linux-format.)

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.

Skriv ett program som först tar emot namnet på en textfil, antingen som ett kommandoradsargument eller genom att läsa in det. Textfilen ska innehålla observationer enligt scenariot ovan. Därefter ska programmet läsa den angivna textfilen, och lista de signaler som observerats mer än en gång. Numren på de observatorier som observerade signalen ska listas.

Använd länkade listor eller arrayer. Det ska vara datastrukturer gjorda specifikt för detta ändamål, så använd inte någon generell datatyp som till exempel std::list. Man får, men behöver inte, dela upp programmet i flera filer.

Övriga krav på lösningen:
Programmet måste kunna hantera minst en miljon signaler, som var och en kan ha observerats upp till tio gånger. Det finns inga krav på felhantering.

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.

Med stora filer (som testfil-1M.txt) blir en lösning med länkade listor eller osorterade arrayer mycket långsam.

Gör en ny version av programmet i uppgift 1, men med snabbare datastrukturer. Vi vill ha en enorm förbättring av prestanda.

Datastrukturerna som används ska vara skapade specifikt för detta ändamål, så använd inte någon generell datatyp. Man får, men behöver inte, dela upp programmet i flera filer.

Övriga krav på lösningen:
Programmet måste kunna hantera godtyckligt många signaler och observationer, bara med de begränsningar som följer av minnesstorleken. Det finns inga krav på felhantering.

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 trädtypen GenericTree). 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.

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), 7 november 2012