[x^2 for x in lst]

Textfrågor för addition

2014-06-23

Har nu implementerat textuppgifter för addition i Almas matteapp. Trodde att det skulle bli ganska enkelt innan jag började. Märkte dock ganska snart efter det att jag börjat implementera att det inte var så lätt som jag trott.

Jag hade tänkt att skapa tio stycken parametriserade strängar för att representera uppgifterna. Strängarna skulle inledas med en beskrivning och avslutas med en fråga. Exempel: Alma har tre glaskulor och Alice har fyra glaskulor. Hur många glaskulor har Alma och Alice tillsammans?. Vidare var tanken att ha ett antal namn, säg tio stycken, och att appen skall slumpa fram vilka som skall användas vid varje körningstillfälle. Detta för att göra det lite roligare för barnen att göra uppgifterna. På samma sätt skall objekten ("glaskulor") och antalen som ingår i uppgifterna slumpas fram.

Android har ett bra stöd för parametriserbara strängar. I strings.xml skapar man strängar som markörer av typen %1$s på det ställen man vill parametrisera. 1:an i %1$s står för att det är den första parametern och s:et för att det är ett strängvärde som skall sättas in. Det finns givetvis andra typparametrar än "s". Hade det stått ett d istället för ett s hade det betytt att ett heltal skulle stoppas in. Precis som i formatsträngen för C:s printf

När man vill använda en parametriserbar sträng från appens Java-kod använder man sig av varargs-metoden getString(int, Object...) i klassen Resources. En referens till Resources kan man få från sin Activity med hjälp av getApplicationContext().getResources(). Exempel: för att hämta strängen med id "addition_text_one" från strings.xml och binda "Alma" och "Alice" till de första parametrarna gör man följande innifrån en Activity:getApplicationContext().getResources().getString(R.strings.addition_text_one, "Alma", "Alice")

Jag hade alltså tänkt att skapa tio sådana strängar, parametrisera alla namn, objekt och antal för att sedan använda dessa strängar för att skapa uppgifter. Det gick till slut, men var avsevärt jobbigare än jag trott. Vad var det då som gjorde det jobbigt?

  1. Objekten skall ibland stå i singular ("glaskula") och ibland i plural ("glaskulor").
  2. I singlular måste det bestämmas om det skall stå "en" eller "ett" framför objektet.
  3. I listan med namn finns det både pojk- och flicknamn. Det måste därför bestämmas om det skall skall stå "han" eller "hon" i frågorna.
  4. Bonusjobbighet: Min fantasi är inte i världsklass, så jag fick anstränga mig lite för att hitta på tio basuppgifter som inte var mer eller mindre identiska.

Hur löstes då problemen ovan? För närvarande är de lösta så här:

  1. I strings.xml finns det två arrayer med "saker": en med sakerna i singular och en i plural. På stället i koden som slumpar fram tal till frågorna kollas det om singularformen eller pluralformen skall användas baserat på om det framslumpade talet är ett eller inte.
  2. Det finns i strings.xml ytterligare en array som innehåller med lika många items som det finns saker i arrayerna i 1). Denna array innehåller "en" eller "ett" beroende på om motsvarande substantivs genus.
  3. Även detta löstes med en extra array i strings.xml. Den här arrayen har samma längd som arrayen med namn och innehåller "male" resp "female" beroende på om motsvarande namn är maskulint eller feminint.
  4. Med ångest, vånda och uteblivet VM-tittande ;)

Är jag nöjd med lösningen? Så där. Det borde gå att hitta på något bättre. Samtidigt vill jag att strängliteralerna skall finnas i strings.xml och inte i Java-kod. Hade varit trevligt att definera namn och singularformer av sakerna i strings.xml och sedan anropa ett trevligt externt API för att bestämma reale/neutrum resp om ett namn är maskulint eller feminint. Fast å andra sidan vill jag inte att appen skall behöva komma åt nätverket...

Hade tänkt att gå vidare med att implementera textfrågor för subtraktion, men jag blev lite trött av strulet som var med de här uppgifterna så jag väntar nog ett tag med det. Skall kanske börja med uppgifter angående klockan istället. Vi får la se.


Leave a reply

Your name as it will be displayed when the comment is posted on the page. Your email address will not be published.