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