Programmeringsmetodik: Tentamen 2012-12-15

Det här är datortentan som går lördag 15 december 2012 i kursen Programmeringsmetodik, kl 8:15-12:15. Lokal: T120 och vid behov även T124.

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

Sodexo, som driver flera restauranger på universitetet, misstänker att det härjar en liga med förfalskare. De har nämligen fått in flera matkuponger med samma nummer.

Här pågår förfalskning

Alla äkta matkuponger har ett unikt nummer, som består av upp til tio siffror eller bokstäver. Det kan till exempel vara 251392 som på bilden. Andra exempel på kupongnummer är ABC123456R och KGX193.

På en fil finns numren på alla inlämnade matkuponger. Varje rad består av numret på en kupong, numret på den restaurang där den lämnades in, ett datum och ett klockslag. Exempel:

25132 2 2012-12-12 11:22:03
KGX193 1 2012-12-12 12:10:19
25132 1 2012-12-14 11:27:24

Det vi är intresserade av är att hitta om samma kupongnummer förekommer flera gånger. I exemplet ovan har två olika kuponger med numret 25132 lämnats in. Minst en av dem måste vara förfalskad!

Vi behöver ett program som läser filen med inlämnade kuponger, och som talar om vilka kupongnummer som förekommer mer än en gång. I exemplet ovan vill vi få en utmatning bestående av numret 25132.

Om flera olika kupongnummer förekommer flera gånger spelar ordningen mellan dem i utskriften ingen roll, men varje kupongnummer ska bara skrivas ut en gång.

Exempelfiler

Filerna är textfiler i Windows-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 rader enligt scenariot ovan. Därefter ska programmet läsa den angivna textfilen, och lista de kupongnummer som observerats mer än en gång.

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 olika kupongnummer, och minst en miljon rader på filen. 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.

Om man använder en länkad lista eller en osorterad array för att lagra alla observerade kupongnummer, och söker igenom den länkade listan eller den osorterade arrayen för varje ny kupongrad från filen, kan programmet bli mycket långsamt för stora filer (som testfil-1M.txt).

Gör en ny version av programmet i uppgift 1, där alla de observerade kupongnumren lagras i en hashtabell eller ett binärt träd. 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 rader, 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), 13 december 2012