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.
Programmet ska läsa en textfil som innehåller några enkla kommandon, ett på varje rad i filen, och utföra dessa kommandon. Kommandona är till för att skapa, ta bort och öka värdet på räknare:
C heltalTill exempel:
C 817Detta innebär att programmet ska skapa en räknare, som identifieras av heltalet 817, och som har ett initialt värde på 0.
Programmet ska ge ett varningsmeddelande om man försöker skapa en räknare med ett nummer som redan har skapats (men inte tagits bort). Sen ska programmet ignorera det kommandot, och fortsätta.
R heltalTill exempel:
R 99682Detta innebär att programmet ska radera räknare nummer 99682.
Programmet ska ge ett varningsmeddelande om man försöker ta bort en räknare som inte har skapats eller som redan har tagits bort. Sen ska programmet ignorera det kommandot, och fortsätta.
I heltalTill exempel:
I 302122(Bokstaven "I" står för "increment", som betyder "öka" på engelska.) Detta innebär att programmet skall öka värdet på räknaren som identifieras med talet 302122. Om räknaren just hade skapats, så att dess värde var 0, kommer den nu att få värdet 1. Om den hade värdet 1, kommer den nu att få värdet 2, och så vidare.
Programmet ska ge ett varningsmeddelande om man försöker öka en räknare som inte har skapats eller som redan har tagits bort. Sen ska programmet ignorera det kommandot, och fortsätta.
Efter bearbetning av textfilen ska programmet skriva ut nummer och värde på alla räknare som då finns.
Här nedan ser vi hur utmatningen från programmet kan se ut, när det körs med dessa tre filer som data. Dialogen och varningsmeddelanden behöver inte se ut exakt så här, men de data som skrivs ut för räknarna ska vara desamma.
Med filen counters1.txt:
Med filen counters2.txt:Ge filens namn: counters1.txt Det finns 4 räknare: 2: 4 3: 1 1000: 1 1: 0
Med filen counters3.txt:Ge filens namn: counters2.txt Det finns 7 räknare: 101: 10 103: 12 104: 10 105: 8 10000: 10 107: 10 110: 10
Ge filens namn: counters3.txt Varning: Räknare 1000 fanns redan, så den skapades inte. Varning: Räknare 1001 fanns inte, så den kunde inte ökas. Varning: Räknare 1000 fanns inte, så den kunde inte ökas. Varning: Räknare 1000 fanns inte, så den kunde inte tas bort. Varning: Räknare 1000 fanns redan, så den skapades inte. Varning: Räknare 1002 fanns inte, så den kunde inte tas bort. Det finns 2 räknare: 1003: 0 1000: 1
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 räknarprogrammet. Gör en lösning där räknarna lagras i en länkad lista. Söknyckeln ska vara räknarnas nummer.
Det ska vara en länkad lista specifikt för detta ändamål, så använd inte någon generell datatyp (som std::list).
Alla positiva heltal (som går att representera med den vanliga datatypen int) kan användas som nummer på räknare. Det ska gå att lagra många miljoner räknare i listan, även om programmet då kommer att gå ganska långsamt.
Man får, men behöver inte, dela upp programmet i flera filer.
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. |
Programmet från uppgift 1 ovan fungerar bra på små exempeldata, som våra exempelfiler, men om man har flera miljoner räknare tar programmet mycket lång tid 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. Man får, men behöver inte, dela upp programmet i flera filer.
Programmet generate-big-test-file.c kan användas för att generera en fil, "counters4.txt", som först skapar 100000 räknare, sen räknar upp alla dessa med ett, och till sist tar bort alla utom den sista (med nummer 100000). På min dator tog den drygt en minut att köra med länkad-liste-programmet från uppgiften ovan, och det ska alltså gå enormt mycket snabbare med programmet från den här uppgiften.
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 1 eller 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 räknar-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. |