Hur man programmerar Exempel på problemlösning i Python
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.
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.
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
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
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)
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)
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)
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
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.
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:
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
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.
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
Delproblem 7: konsonant def konsonant(tecken): if vokal(tecken) or tecken == y : return False else: return True Testkör detta med några exempel!
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!
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!
Delproblem 3: likavokkons def likavokkons(word): if antalvok(word)==antalkons(word): return True else: return False Testkör detta med några exempel!
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.
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!
Sammanfattning Börja med en problemuppdelning Gör klart vilka funktioner som behövs Koda dem bottom up Testa i varje steg
Övningar Tillämpa detta på alla uppgifter på labbarna!