Svar till instuderingsfr˚agor II
Svar till instuderingsfr˚agor II
Svar till instuderingsfr˚agor II
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