Programmeringsmetodik: Tentamen 2011-11-03

Det här är datortentan som går torsdag 3 november 2011 i kursen Programmeringsmetodik, kl 8:15-12:15. Lokal: T120 och T124.

Gäller som tentamen för:
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.

Tillägg: Lösningsförslag till uppgift 1 och 2

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

Luffarschack går ut på att två spelare omväxlande gör markeringar på ett rutat papper, och den som först får fem i rad vinner.

Ett pågående parti luffarschacksparti

Vi håller på att skriva ett luffarschacksprogram, och som en del av det ska vi hantera "ställningar" eller "luffarschacksbräden", dvs en spelplan med ett antal kryss och ringar. På bilden ovan ser vi ett exempel.

Ett program som ska spela luffarschack på ett bra sätt måste hantera många sådana luffarschacksbräden: inte bara den aktuella ställningen på spelplanen, utan också ett stort antal olika möjliga framtida bräden, som programmet behöver utvärdera och välja mellan.

I luffarschack kan flera olika sekvenser av drag leda fram till samma bräde:

Det blir samma bräde

För att programmet ska slippa upprepa analyser och val av bräden som är likadana, är det bra om programmet kan jämföra bräden för att se om de är lika, och sen komma ihåg bara de unika brädena. Nu ska vi skriva och provköra den del av luffarschacksprogrammet som gör detta.

1. Uppgift för betyget 3 respektive G

Luffarschacksbräden lagras på textfiler. Varje bräde lagras på det här formatet:

begin
- - - - - - - - - -
- - - x o - - - - -
- x o x - - - - - -
- o - - - - - - - -
- - x o x - - - - -
- x o - - - - - - -
x o x - - - - - - -
- o - - - - - - - -
- - - - - - - - - -
- - - - - - - - - -
end

Brädet är alltså 10 gånger 10 rutor stort, innehåller kryss (x), ringar (o) och tomma rutor (-), och avgränsas med orden begin och end.

En fil innehåller noll, ett eller flera bräden.

Skriv ett program som läser en sådan fil, och sedan talar om dels hur många bräden som fanns på filen, dels hur många av dem som var unika.

Programmet måste kunna hantera åtminstone 1000 unika bräden. Det finns inga krav på felhantering.

Programmet behöver lagra de unika bräden det hittar. Använd en array eller en länkad lista. 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.

Exempelfiler som man kan provköra med:

Tillägg: Dessa bräden finns även som en zip-fil: testfiler.zip

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.

När ett luffarschacksprogram ska välja vilket drag det ska spela, genererar det och undersöker ett stort antal möjliga bräden. Det kan vara miljontals bräden.

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.

Ytterligare en exempelfil som man kan provköra med om man vill:

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.

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), 5 november 2011