Hur man
programmerar
Exempel på problemlösning i Python
Wednesday, October 21, 2009
Problemet
Som
vokaler
i
engelska
språket
räknar
vi
i
denna
uppgift
bokstäverna
aeuio,
och
som
konsonanter
alla
andra
bokstäver
utom
y
(y
fungerar
ibland
som
konsonant
och
ibland
som
vokal
och
därför
struntar
vi
i
den
just
nu).
Skriv
ett
program
som
räknar
ut
hur
många
engelska
ord
har
precis
lika
många
konsonanter
som
vokaler.
En
lista
av
engelska
ord
Ainns
i
Ailen
words.txt.
Wednesday, October 21, 2009
Problemlösninsstrategi
När jag ser ett problem funderar jag först om det är så lätt
att jag kan lösa det omedelbart, därför att:
+ Det är så lätt att jag inser lösningen bums, eller
+ Jag kan snabbt leta upp en funktion i något bibliotek, eller
+ Jag har löst detta tidigare.
I annat fall, funderar jag på hur problemet kan delas upp i
delproblem: Om jag löser delarna kan jag kombinera ihop
en lösning till det urprungliga.
Delproblemen behandlas med samma strategi. Till slut har
jag bara enkla problem kvar.
Wednesday, October 21, 2009
Ursprungsproblemet
Kan jag inte lösa bums. Men det sönderfaller i två delar:
1. Läs in alla orden från filen till en datastruktur som jag kan
jobba med
2. Räkna ut hur många ord i den strukturen som har lika
många vokaler som konsonanter
Wednesday, October 21, 2009
Delproblem 1
Kan jag lösa bums eftersom jag har gjort det förut. För att
läsa in ord från en fil till en lista och ta bort avslutande
radbyten kopierar jag kod från någon lab, tex
def getlinesinfile():
radlista = []
fileobj = open("words.txt")
lines = fileobj.readlines()
for line in lines:
line = line.strip()
radlista.append(line)
return radlista
Wednesday, October 21, 2009
Delproblem 2
Räkna ut hur många ord i en lista som har
lika många vokaler som konsonanter
Kan jag inte lösa bums. Vilket delproblem
skulle kunna hjälpa mig?
Anta att jag har en funktion som avgör, för
ett visst ord, om det har lika många vokaler
som konsonanter. I så fall är det bara att gå
igenom listan och räkna upp en räknare för
varje sådant ord. Alltså behöver jag lösa
följande delproblem: (forts)
Wednesday, October 21, 2009
Delproblem 3
Avgör om ett ord har lika många vokaler
som konsonanter
Kan jag inte lösa bums. Vilka delproblem
skulle kunna hjälpa mig?
Anta att jag har funktioner som räknar ut
antalet vokaler och antalet konsonanter. I så
fall behöver jag bara jämföra om antalen är
lika. Alltså behöver jag lösa följande
delproblem: (forts)
Wednesday, October 21, 2009
Delproblem 4,5
Räkna antalet vokaler i ett ord
Räkna antalet konsonanter i ett ord
Kan jag inte lösa bums. Vi börjar med
vokalerna.Vilket delproblem skulle kunna
hjälpa mig?
Anta att jag har en funktion som avgör om
ett tecken är en vokal. I så fall behöver jag
bara gå igenom ordet och räkna upp en
räknare för varje vokal. Alltså behöver jag
lösa följande delproblem: (forts)
Wednesday, October 21, 2009
Delproblem 6
Avgör om ett tecken är en vokal
En vokal är något av tecknen aeuio. Detta är så
lätt att jag kan lösa det bums, genom att använda
konstruktionen tecken in ”aeuio”
Wednesday, October 21, 2009
Delproblem 7
Avgör om ett tecken är en konsonant
En konsonant är något som inte är en vokal och inte
heller tecknet ”y”. Detta kan jag lösa bums, genom
att använda lösningen till delproblem 6 kombinerat
med en jämförelse om tecken är ”y”.
Wednesday, October 21, 2009
OBS
Nu finns inga svåra delproblem kvar. Så här långt har jag
kommit utan att röra tangentbordet. Problemuppdelning gör
man bäst innan man börjar själva programmeringen. Den är
i stort oberoende av vilket programmeringsspråk som
används. Använd papper och penna i detta arbete och skriv
upp de funktioner som behövs. Till slut har jag en karta över
dem:
Wednesday, October 21, 2009
Fullständig uppdelning
vokal(tecken): avgör om tecken är vokal
konsonant(tecken): avgör om tecken är konsonant
antalvok(word): räknar vokaler i ett ord
antalkons(word): räknar konsonanter i ett ord
likavokkons(word): avgör om antalet v och k är lika
antallika(wordlist): räknar antal ord med lika
många v som k i wordlist
Wednesday, October 21, 2009
Syntes
Nu är det dags att att börja programmera. Det gör jag
”bottom up”, dvs jag börjar med de minsta delproblemen.
För vart och ett gör jag en funktion. Varje funktion testas
innan jag går vidare.
Wednesday, October 21, 2009
Delproblem 6: vokal
def vokal(tecken):
if tecken in ”aeuio”:
return True
else:
return False
Testkör detta med några exempel!
Anm: Precis samma sak görs av följande mer kompakta funktion:
def vokal(tecken):
return tecken in ”aeuio”
Wednesday, October 21, 2009
Delproblem 7: konsonant
def konsonant(tecken):
if vokal(tecken) or tecken == ”y”:
return False
else:
return True
Testkör detta med några exempel!
Wednesday, October 21, 2009
Delproblem 4: antalvok
def antalvok(word):
res = 0
# räknare för vokaler
for tecken in word:
if vokal(tecken):
res += 1
# ökas för varje vokal
return res
Testkör detta med några exempel!
Wednesday, October 21, 2009
Delproblem 5: antalkons
def antalkons(word):
res = 0
# räknare för konsonanter
for tecken in word:
if konsonant(tecken):
res += 1
# ökas för varje kons
return res
Testkör detta med några exempel!
Wednesday, October 21, 2009
Delproblem 3: likavokkons
def likavokkons(word):
if antalvok(word)==antalkons(word):
return True
else:
return False
Testkör detta med några exempel!
Wednesday, October 21, 2009
Delproblem 2: antallika
def antallika(wordlist):
res = 0
# räknar antal likaord
for word in wordlist:
if likavokkons(word):
res += 1
# ökas för varje likaord
return res
Testkör detta med några exempel! Definiera några enkla
ordlistor först.
Wednesday, October 21, 2009
Huvudprogram
def uppgift():
wordlist = getlinesinfile()
return antallika(wordlist)
Testkör, helst genom att först ta en
ordlista i en mindre fil
Bonus: Mitt program består av ett antal
små (max 6 rader) funktioner och är
därför lättbegripligt!
Wednesday, October 21, 2009
Sammanfattning
• Börja med en problemuppdelning
• Gör klart vilka funktioner som behövs
• Koda dem bottom up
• Testa i varje steg
Wednesday, October 21, 2009
Övningar
Tillämpa detta på alla uppgifter på labbarna!
Wednesday, October 21, 2009