Programmeringsmetodik: Tentamen 2011-08-18

Det här är datortentan som går torsdag 18 augusti 2011 i kursen Programmeringsmetodik, kl 8:15-12:15. Lokal: T201.

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.

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

På filen avstand.txt finns en lista med 10024 vägavstånd mellan olika platser:

Alingsås - Arboga: 277 km
Alingsås - Arjeplog: 1179 km
Alingsås - Arlanda: 421 km

och så vidare ända ner till

Östersund - Örnsköldsvik: 257 km

Vi misstänker att det kan finnas fel i listan med avstånd, och nu ska vi skriva ett program som gör en rimlighetskontroll av avstånden i listan. Vi ska kolla att de angivna vägavstånden inte är kortare än avståndet fågelvägen.

På filen tatorter.txt finns data om alla svenska tätorter, 1956 stycken, med namn, vilken kommun de ligger i, folkmängd, SCB:s tätortskod, latitud, longitud och höjd över havet:

Stockholm:Stockholms kommun:1372565:336:59.332580:18.064900:20
Göteborg:Göteborgs kommun:549839:4368:57.707160:11.966790:6
Malmö:Malmö kommun:280415:3604:55.605870:13.000730:10
Uppsala:Uppsala kommun:140454:656:59.858500:17.645430:10

och så vidare ända ner till

Östraby:Hörby kommun:200:3836:-9999.000000:-9999.000000:-9999

Värdet -9999 på en uppgift i filen betyder att den uppgiften saknas.

Det är alltså inte säkert att alla tätorterna har koordinater. Det är inte heller säkert att alla platserna i avståndstabellen finns med i listan med tätorter.

Kontrollen

Eftersom vi har latitud och longitud för (åtminstone vissa av) platserna som avstånden gäller, kan vi räkna ut hur långt det är fågelvägen mellan dem. Om det angivna vägavståndet är kortare än fågelvägen, är det förmodligen något skumt.

Jorden är rund, så om man vill räkna ut avståndet mellan två punkter på jordytan som man angett med latitud och longitud, räcker det inte med enkel plangeometri och Pythagoras sats. Men i närheten av Örebro kan man använda den här approximationen:

En formel för approximation av avstånd i Örebro

lat1 och long1 är den första punktens position, och lat2 och long2 den andras. Avståndet blir i kilometer.

Hjälp

Om man vill kan man läsa från de två textfilerna, men om man tycker att det är enklare finns samma information också som färdiga källkodsfiler att ha med i sitt C- eller C++--program. Först avstånden: Och tätorterna:

Man kan använda dem om man vill, men måste inte.

Mera hjälp

När jag provkörde hittade jag 24 konstiga avstånd. Det första av dem var Arjeplog - Haparanda, 355 kilometer, som var mindre än beräknade fågelvägen, 357.29 kilometer. (En gissning är att det vägavståndet egentligen är rätt, men att formeln ger dåliga värden så långt upp i Sverige som vid Arjeplog och Haparanda.)

Ännu mera hjälp

Så här kan man göra:

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 går igenom listan med vägavstånd, och beräknar avståndet fågelvägen i de fall det går. Om detta beräknade fågelvägsavstånd är kortare än det angivna vägavståndet, är vägavståndet konstigt, och ett meddelande om det ska skrivas ut.

Exempel på hur en utskrift skulle kunna se ut:

Konstigt avstand: Arjeplog - Haparanda, 355 kilometer, är mindre än beräknade fågelvägen, 357.29 kilometer.

Alla upptäckta konstiga avstånd ska skrivas ut.

Det finns inga krav på några särskilda datastrukturer. Man kan använda arrayerna som finns med i filerna ovan, eller placera datat i egna datastrukturer. Om man gör egna datastrukturer ska det dock 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.

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.

Programmet från uppgift 1 ovan fungerar bra, det går någorlunda snabbt att köra, och vi ska bara köra det en gång så prestanda spelar egentligen inte så stor roll. Men nu vill vi i alla fall snabba upp det.

Gör en datatstruktur för tätorterna där det går snabbt att hitta en ort med ett visst namn. Förslagsvis en hashtabell eller ett binärt träd. Använd sedan denna snabbare datastruktur för att slå upp tätorterna när avstånden ska kollas.

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.

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), 17 augusti 2011