01.08.2013 Views

Svar till instuderingsfr˚agor II

Svar till instuderingsfr˚agor II

Svar till instuderingsfr˚agor II

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Introduktion <strong>till</strong> datavetenskap HT 2009<br />

<strong>Svar</strong> <strong>till</strong> <strong>instuderingsfr˚agor</strong> <strong>II</strong><br />

Tobias Wrigstad<br />

1. Skriv ett Python-program som läser in det korta lexikonet fr˚an Nian och skriver ut<br />

det baklänges.<br />

<strong>Svar</strong> Det finns naturligtvis m˚anga sätt att göra detta p˚a. Ett sätt är följande:<br />

f = open("dict-test.txt") # Öppna dict-test.txt i f<br />

list = f.readlines() # Läs in raderna i f som en lista i list<br />

f.close() # Stäng f<br />

list.reverse() # Vänd listan list baklänges<br />

for el in list: # För varje element el i listan list ...<br />

print el, # ... skriv ut el<br />

Ett annat är:<br />

list = [] # Skapa en tom lista i list<br />

f = open("dict-test.txt") # Öppna dict-test.txt i f<br />

for el in f.readlines(): # För varje rad el i filen f ...<br />

list.insert(0,el) # ... stoppa in el först i list<br />

f.close() # Stäng f<br />

for el in list: # För varje element el i listan list ...<br />

print el, # ... skriv ut el<br />

2. Varför kan man vilja dela upp ett Python-program i ett antal separata funktioner?<br />

<strong>Svar</strong> En funktion är ett sätt att abstrahera bort hur en funktion utför ett arbete och<br />

”dölja det” bakom ett behändigt namn. T.ex. används funktionen open(...) i b˚ada<br />

kodexempel ovan utan att vi m˚aste först˚a hur koden för att öppna en fil egentligen<br />

ser ut. Att läsa kod som är skriven i termer av funktioner är lättare eftersom funktionsnamnen<br />

ger en bild av vad koden gör. (Om man istället klistrade in koden skulle<br />

man behöva läsa den för att skapa en bild av vad den gjorde.) Dessutom s˚a kan en och<br />

samma funktion, t.ex. open(...) ˚ateranvändas i m˚anga olika program för att öppna<br />

m˚anga olika filer, men koden är bara skriven en g˚ang.<br />

(Det finns m˚anga andra fördelar ocks˚a, t.ex. m.a.p. testning. Men det kommer vi <strong>till</strong><br />

p˚a senare kurser.)<br />

3. Ni vill leta upp Curt Jalmo i en hypotetisk telefonkatalog med 1000 sidor. Jag r˚akar<br />

veta att Jalmo st˚ar p˚a sidan 20, men det vet inte ni. Att bläddra fram honom tar<br />

s˚aledes ca 20 bläddringar (fr˚an start och för att se om han är p˚a nästa sida). Beskriv<br />

en algoritm för att leta fram rätt sida som kräver färre än 20 bläddringar och som<br />

även skulle fungera för att leta upp Paul Paljett (som st˚ar p˚a sidan 789) fortare än<br />

att g˚a igenom varje sida för sig (även bakifr˚an).<br />

Ni kan anta att katalogen är sorterad i bokstavsordning och att fördelningen mellan<br />

bokstäverna är ungefär som i en vanlig katalog.<br />

<strong>Svar</strong> Ett sätt är att använda den binärsökningsalgoritm som togs upp p˚a föreläsning 3<br />

(Algoritmer):<br />

1 av 4


Introduktion <strong>till</strong> datavetenskap<br />

HT 2009<br />

<strong>Svar</strong> <strong>till</strong> <strong>instuderingsfr˚agor</strong> <strong>II</strong><br />

Inlämnas:<br />

(a) Sl˚a upp telefonkatalogen p˚a mitten och titta p˚a vad det är för namn först och<br />

sist p˚a sidan.<br />

(b) Om Jalmo är före det första namnet i alfabetet, riv bort alla efterföljande sidor.<br />

(c) Om Jalmo är efter det första namnet, riv bort alla föreg˚aende sidor istället.<br />

(d) Om du bara har en sida kvar nu, s˚a har du hittat rätt sida. Annars, g˚a <strong>till</strong>baka<br />

<strong>till</strong> steg (a) med din halverade telefonkatalog.<br />

Detta sätt att leta halverar storleken p˚a den katalog man m˚aste söka i varje g˚ang man<br />

”g˚ar ett varv i loopen.” Efter 8 varv har man halverat katalogen 8 g˚anger och är nere<br />

i ca 4 sidor. Det betyder att även om man skulle bläddra igenom alla sidorna p˚a det<br />

vanliga sättet skulle man bara behöva titta p˚a 12 sidor (8 för 8 halveringar plus vanlig<br />

linjär bläddring i de ˚aterst˚aende 4 sidorna).<br />

4. Ni skall summera talen 1 <strong>till</strong> 100. Fundera ut ˚atminstone ett snabbare sätt att göra<br />

det än 1+2+3+4+...+99+100? Fungerar det även p˚a 1 <strong>till</strong> 101 och 10 <strong>till</strong> 1000?<br />

<strong>Svar</strong> Ett klassiskt sätt att göra detta p˚a är att inse att det finns ett mönster i talserien.<br />

Om man adderar det minsta talet med det största, det näst minsta med det näst<br />

största, etc. f˚ar man samma tal, 101 i v˚art exempel ovan. Om det finns 100 tal kan vi<br />

göra 50 s˚adana additioner och svaret blir allts˚a 50×101 = 5050. Den generella formeln<br />

blir följande (för en talserie med ett jämnt antal tal):<br />

(minsta talet + största talet) × (antal tal/2)<br />

Om man har ett udda antal tal s˚a blir det kvar i mitten efter att man adderat samtliga<br />

kringliggande tal. Detta är fallet för 1 + 2 + 3 + ...99 + 100 + 101. Detta tal m˚aste<br />

följaktligen läggas <strong>till</strong> svaret, s˚a den generella formeln blir (för talserie med udda antal<br />

tal):<br />

(minsta talet + största talet) × (antal tal/2 avrundat ned˚at) + mittersta talet<br />

För 1 + 2 + 3 + ...99 + 100 + 101 allts˚a (1 + 101) × 50 + 51 = 5151<br />

5. Varför skiljer m˚anga programmeringsspr˚ak mellan talet 1 och strängen 1?<br />

<strong>Svar</strong> M˚anga skiljer mellan dem för att hjälpa programmeraren att ”inte blanda ihop<br />

äpplen och päron,” samt för att det är flexibelt och effektivt.<br />

Överkurs: strängar och tal representeras olika i datorns minne – strängar är representerade<br />

p˚a ett sätt som gör att vanliga operationer p˚a strängar g˚ar fort och tal är<br />

representerade p˚a ett annat sätt men av samma anledning. Om man ville <strong>till</strong>˚ata operationer<br />

mellan strängar och tal där strängarna faktiskt innehöll tal skulle man vara<br />

tvungen att undersöka strängarnas inneh˚all hela tiden vilket är rysligt ineffektivt.<br />

6. Vad är en (data)typ i programmeringssammanhang?<br />

<strong>Svar</strong> En datatyp är helt enkelt en typ (klass, sort, slags) av data, t.ex. heltal, strängar,<br />

etc. Data (värden) av en viss typ stöder olika former av operationer. Därför är det<br />

i Python t.ex. inte <strong>till</strong>˚atet att göra sort() p˚a en sträng men p˚a en lista, trots att<br />

strängar egentligen är listor av tecken.<br />

2 of 4


Introduktion <strong>till</strong> datavetenskap<br />

HT 2009<br />

7. Vad är en variabel i programmeringssammanhang?<br />

<strong>Svar</strong> <strong>till</strong> <strong>instuderingsfr˚agor</strong> <strong>II</strong><br />

Inlämnas:<br />

<strong>Svar</strong> En variabel är ett namn p˚a ett värde i programmet. T.ex. correctAnswer =<br />

True i Python skapar en variabel med namnet correctAnswer och binder den <strong>till</strong><br />

värdet True. Som namnet antyder kan värdet i en variabel ändra (variera) mellan<br />

olika tidpunkter i programmets körning.<br />

8. Är det n˚agon skillnad mellan matematikens √ x och Pythons motsvarande funktion<br />

sqrt(x) 1 ?<br />

<strong>Svar</strong> Ja. Matematikens √ x är en precis beskrivning av roten ur x, medan Pythons<br />

motsvarande funktion är en samling instruktioner för att räkna fram ett numeriskt<br />

värde som motsvarar roten ur vad det nu var för värde i x.<br />

9. Förklara hur bubbelsort fungerar. <strong>Svar</strong>a ocks˚a p˚a om det alltid räcker att g˚a igenom<br />

en lista med n element n g˚anger för att den skall vara sorterad? (Varför/varför inte?)<br />

<strong>Svar</strong> En bubbelsort p˚a en lista med element e1, e2, . . . , en fungerar s˚a att man jämför<br />

varje element med dess högra granne och byter plats p˚a dem om värdet p˚a den högra<br />

grannen var mindre. Vi g˚ar igenom listan fr˚an början <strong>till</strong> slut p˚a detta sätt <strong>till</strong>s vi<br />

kan g˚a igenom listan utan att n˚agonsin hitta tv˚a in<strong>till</strong>iggande värden som borde byta<br />

plats. Om varje element ex är mindre än sitt högra värde ey i en lista följer att alla<br />

element i listan är sorterade i stigande ordning.<br />

Det räcker alltid med n genomg˚angar av en lista med n element. Man kan enkelt<br />

förvissa sig om detta p˚a följande sätt: Varje genomg˚ang av en lista med bubbelsort<br />

kommer alltid att lägga det största elementet som ännu inte sorterats in p˚a rätt plats.<br />

Det betyder att varje g˚ang vi g˚ar genom listan kommer (˚atminstone) ett element att<br />

hamna p˚a rätt plats. Eftersom vi sorterar i fallande ordning (det största elementet<br />

sorteras rätt först, sedan det näst största, etc.) s˚a kommer efterföljande genomg˚angar<br />

aldrig att flytta p˚a ett större element som är p˚a rätt plats. Följaktligen minskar antalet<br />

osorterade element med (˚atminstone) 1 för varje genomg˚ang varvid vi kan dra<br />

slutsatsen att n genomg˚angar av en listan med n element räcker för att lägga de n<br />

elementen p˚a rätt plats i sorteringsordning.<br />

10. Om man vill sortera en lista i fallande ordning (d.v.s., 6,5,4,. . . ) istället för i stigande<br />

ordning (1,2,3,. . . ) med bubbelsort, hur m˚aste man ändra algoritmen?<br />

<strong>Svar</strong> Byt plats p˚a elementen s˚a det mindre elementet hamnar <strong>till</strong> höger istället för <strong>till</strong><br />

vänster.<br />

11. Vad är skillnaden mellan en akademisk utbildning och en yrkesutbildning? Var passar<br />

DVK in?<br />

<strong>Svar</strong> En yrkesutbildning syftar <strong>till</strong> att utbilda studenter <strong>till</strong> ett specifikt yrke medan<br />

en akademisk utbildning syftar <strong>till</strong> att göra studenterna <strong>till</strong> akademiker. DVK syftar<br />

<strong>till</strong> att vara en akademisk utbildning.<br />

12. Hur förh˚aller sig begreppen ”tidskomplexitet” och ”algoritm”?<br />

<strong>Svar</strong> Tidskomplexitet avser hur mycket längre tid det tar att utför algoritm/operation<br />

när storleken p˚a indatat växer. En sökning som g˚ar fr˚an vänster <strong>till</strong> höger i en lista<br />

1 Om ni vill experimentera med Python, observera att man m˚aste göra from math import sqrt för att<br />

kunna skriva sqrt(x) i Python, där x är ett tal eller en variabel. Detta är dock oväsentligt för fr˚agan.<br />

3 of 4


Introduktion <strong>till</strong> datavetenskap<br />

HT 2009<br />

<strong>Svar</strong> <strong>till</strong> <strong>instuderingsfr˚agor</strong> <strong>II</strong><br />

Inlämnas:<br />

och letar efter ett element har en s.k. linjär tidskomplexitet, d.v.s., om antalet element<br />

dubblas som tar det dubbelt s˚a l˚ang tid att söka i listan i det generella fallet. Olika<br />

algoritmer har olika tidskomplexitet. Ett klassiskt exempel är olika sökalgoritmer –<br />

t.ex. s˚a kräver en binärsökning i en ordnad lista med 1.000 element 10 ”hopp” i listan.<br />

Om listan vore 2.000 skulle det bara krävas 11 ”hopp.”<br />

13. Förklara begreppen syntax och semantik och vad skillnaden är mellan dem.<br />

<strong>Svar</strong> Syntaxen är ett programmeringsspr˚aks regler för att skapa välformade (grammatiskt<br />

korrekta) satser. Semantik betyder betydelse och avser vad en sats betyder.<br />

Ett exempel som tagits upp en föreläsning är ”färglösa gröna ideer sover ursinnigt,”<br />

vilken är en syntaktiskt korrekt mening men semantiskt är den rent nonsens.<br />

14. Förklara begreppet abstraktion i programmeringssammanhang.<br />

<strong>Svar</strong> Abstraktion handlar om att dölja detaljer om hur n˚agot utförs och istället tänka<br />

p˚a en operation i vidare termer. T.ex. är operationen reverse() p˚a en lista en abstraktion<br />

av ett antal kortare operationer som byter plats p˚a enskilda element.<br />

15. Kan ni n˚agra programmeringsspr˚ak sinsemellan i gruppen? Vilka? (Denna fr˚aga kan<br />

naturligtvis knappast rättas.)<br />

<strong>Svar</strong> n/a.<br />

4 of 4

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!