Örebro universitet
Institutionen för teknik
Thomas Padron-McCarthy
(Thomas.Padron-McCarthy@tech.oru.se)
Tentamen i
Programmeringsmetodik
för D2, SDU2 m fl
lördag 13 december 2008 kl 14:00 - 18:00
Gäller som tentamen för:
DT2010 Datateknik B, Programmeringsmetodik, provkod 0100
DT2006 Datateknik B, Tillämpad datavetenskap B, provkod 0110
Hjälpmedel:
|
Inga hjälpmedel.
|
Poängkrav:
|
Maximal poäng är 40.
För godkänt betyg (3 respektive G) krävs 20 poäng.
|
Resultat:
|
Meddelas på kursens hemsida eller via e-post senast lördag 3 januari 2009.
|
Återlämning av tentor:
|
Efter att resultatet meddelats kan tentorna hämtas på institutionen.
Man kan också få sin rättade tenta hemskickad.
|
Examinator och jourhavande:
|
Thomas Padron-McCarthy, telefon 070-73 47 013.
|
-
Skriv tydligt och klart.
Lösningar som inte går att läsa kan naturligtvis inte ge några poäng.
Oklara och tvetydiga formuleringar kommer att misstolkas.
-
Skriv den personliga tentamenskoden på varje inlämnat blad.
Skriv inte namn eller personnummer på bladen.
-
Skriv bara på en sida av papperet.
Använd inte röd skrift.
-
Antaganden utöver de som står i uppgifterna måste anges.
-
Skriv gärna förklaringar om hur du tänkt.
Även ett svar som är fel kan ge poäng,
om det finns med en förklaring som visar att huvudtankarna var rätt.
LYCKA TILL!
Prioritet och associativitet hos operatorerna i C
Den fullständiga tabellen, med alla operatorer som finns i C:
Prioritet | Kategori | Operator | Associativitet |
Högsta | Unära postfixoperatorer | (), [], ->, ., ++, -- | vänster |
| Unära prefixoperatorer | !, ~, ++, --, +, -, *, &, sizeof, (typ) | höger |
| Multiplikation mm | *, /, % | vänster |
| Addition mm | +, - | vänster |
| Bitvis skift | <<, >> | vänster |
| Jämförelser | <, <=, >=, > | vänster |
| Likhetsjämförelser | ==, != | vänster |
| Bitvis OCH | & | vänster |
| Bitvis XOR | ^ | vänster |
| Bitvis ELLER | | | vänster |
| Logiskt OCH | && | vänster |
| Logiskt ELLER | || | vänster |
| Villkorsoperatorn | ?: | höger |
| Tilldelning | =, +=, -=, *=, /=, %=, >>=, <<=, &=, ^=, |= | höger |
Lägsta | Komma-operatorn | , | vänster |
Uppgift 1 (1 p)
Följande namn läggs in i ett binärt sökträd, i den här ordningen:
Nixon, Ford, Carter, Reagan, Clinton, Bush, Obama
Den jämförelsefunktion som används är vanlig bokstavsordning.
Rita upp hur trädet ser ut när namnen är inlagda.
Uppgift 2 (1 p)
Samma namn som i uppgiften ovan, i samma ordning,
läggs in i en osorterad enkellänkad länkad lista,
där nya element läggs till i slutet.
Rita upp hur listan ser ut när namnen är inlagda.
Uppgift 3 (1 p)
Följande tal läggs in i en hashtabell, i den här ordningen:
664, 116, 780, 1000, 850, 566, 64, 492, 249, 31
Hashtabellen har 10 positioner.
Som hashfunktion använder vi h(x) = x mod 10.
(C-programmerare kanske hellre skulle skriva den som h(x) = x % 10.)
Kollisioner hanteras med länkade listor.
Rita upp hur hashtabellen ser ut när talen är inlagda.
Uppgift 4 (2 p)
Man brukar ange tidskomplexiteten för olika algoritmer,
till exempel att sökning i ett binärt träd är O(log n).
Antag att variabeln m är en tredimensionell matris med NxNx7 flyttal:
float m[N][N][7];
a) Vi vill summera talen i matrisen m, med de här programraderna:
summa = 0;
for (int i = 0; i < N; ++i)
for (int j = 0; j < N; ++j)
for (int k = 0; k < 7; ++k)
summa += m[i][j][k];
Vilken tidskomplexitet har den summeringen?
b) Vi provkör programmet med N = 1000.
och ser att summeringen av matrisen m tar 5 sekunder.
Hur lång tid kan vi räkna med att den summeringen tar om N = 2000?
c) Hur lång tid kan vi räkna med att summeringen tar om N = 1 miljon?
Uppgift 5 (1 p)
Vi skapar tre char-variabler:
char c1 = 1, c2 = 3, c3 = 4;
Vilka värden har c1, c2 och c3 när följande satser körts?
c1 = c2 & c3;
c2 = c2 | c3;
c3 &= 7;
Scenario till uppgift 6 och 7
Det finns ett spel som går ut på att man placerar ut robotar på en spelplan.
Här har vi till exempel placerat ut roboten C3PO i punkten med koordinaterna (x=1, y=2),
roboten R2-D2 i punkten (x=2, y=4),
och så vidare.
Koordinaterna är heltal.
Vi ska hantera robotar och spelplaner i ett C-program.
Uppgift 6 (15 p)
Vi ska skapa den abstrakta datatypen Robot,
som används för att representera robotar enligt scenariot.
Datatypen ska bestå av en posttyp ("struct")
som innehåller x- och y-koordinaterna,
och dessutom ett namn på roboten.
Namn är textsträngar som kan vara högst 10 tecken långa.
-
init_robot,
som initierar en Robot-post.
Man skickar med x-värdet, y-värdet och robotens namn till funktionen.
-
save_robot,
som sparar en Robot-post på en öppen textfil.
Man skickar med en FILE*, och en post.
-
fetch_robot,
som läser in en Robot-post från en öppen textfil.
Man skickar med en FILE*.
-
distance,
som tar två Robot-poster som argument, och returnerar avståndet mellan robotarna
som ett flyttal.
(Använd Pythagoras sats.)
-
is_collision,
som jämför två Robot-poster och returnerar ett sant värde om robotarna befinner sig på samma position.
(Beroende på hur man väljer att göra funktionerna,
kan man behöva skicka med fler parametrar än de angivna.)
a) (4p) Skriv (hela) include-filen Robot.h.
b) (8p) Skriv (hela) implementationsfilen Robot.c.
c) (3p) För att provköra Robot-paketet skapar vi ett program,
på filen test_robots.c, som gör följande:
-
Skapar tre Robot-poster för robotarna Cameron, Cromartie och WALL-E.
Robotarna ska ges lämpliga koordinater, och initieras med hjälp av funktionen init_robot.
-
Använder distance för att beräkna avståndet mellan Cromartie och WALL-E,
samt skriver ut resultatet.
Skriv (hela) filen test_robots.c.
Uppgift 7 (19 p)
En spelplan är helt enkelt en samling robotar, med olika (eller, om de krockat, samma) koordinater.
Vi ska nu skapa den abstrakta datatypen Board,
som används för att representera en spelplan.
Välj själv hur spelplanen ska lagras.
Det ska gå att skriva följande funktioner, som ska finnas med:
-
init_board,
som initierar en spelplan så den blir tom, dvs inte innehåller några roboter.
-
put_robot,
som placerar ut en robot på spelplanen.
Funktionen måste kolla att det inte uppstår en kollision med någon robot som redan finns på planen,
och om det gör det ska den inte placera ut den nya roboten.
-
find_robot,
som tar en x-koordinat och en y-koordinat som argument,
och som returnerar den robot som eventuellt finns på den positionen på spelplanen.
-
remove_robot,
som tar en x-koordinat och en y-koordinat som argument,
och som tar bort den robot som eventuellt finns på den positionen från spelplanen.
-
walk_robots,
som flyttar alla robotar på spelplanen ett steg i en slumpmässig riktning (upp, ner, vänster eller höger).
Om en robot (A) flyttar sig till en position där en annan robot (B) redan står,
ska roboten B tas bort från planen.
Några krav på implementationen:
-
Spelplanens storlek är inte begränsad (annat än av storleken på datatypen heltal),
så även om man från början placerar alla robotarna i närheten av origo,
så kan de vandra iväg mycket långt.
-
Inte heller antalet robotar på spelplanen är begränsat
(annat än av vad som får plats i minnet på datorn.)
-
Vi har inga särskilda krav på prestanda,
och vi accepterar att programmet kan gå långsamt om antalet robotar blir stort.
-
Tips: Funktionen rand ger ett slumpmässigt heltal, som är större än eller lika med noll.
a) (4p) Skriv (hela) include-filen Board.h.
b) (8p) Skriv (hela) implementationsfilen Board.c.
c) (4p) För att provköra Board-paketet skapar vi ett program,
på filen test_board.c, som först skapar en tom spelplan,
och sen läser in hundra robotar från filen robots.txt med hjälp av funktionen fetch_robot,
och också placerar ut var och en av dem på spelplanen med funktionen put_robot.
Som avslutning ska funktionen walk_robots anropas en gång.
d) (3p)
Vilken tidskomplexitet har de tre funktionerna
find_robot,
put_robot och
walk_robots?
Vad händer om vi vill placera ut flera miljoner robotar?
Skulle din lösning behöva ändras, och i så fall hur?