Labb 3 - Stränghantering

Laboration 3 – Stränghantering

Som yrkesverksam ingenjör möts du ofta av situationen att ett mätverktyg eller en webbplats har försett dig med mängder med mätdata i strängformat. Innan du kan göra en analys av datat behöver du konvertera dessa strängar till något mer användbart och efteråt behöver du använda minnet klokt för att genomföra analysen. Denna lab ger dig grunden för detta genom att låta dig träna på att manipulera strängar.

Fortsätt använda Github på samma sätt som i de tidigare laborationerna. För bonusdatum, se sidan kursöversikt i vänstermarginalen. När du är redo att redovisa: Skapa ett issue på Git med ämnet "Redovisning". En assistent kommer att rätta din labb och boka tid för redovisning med dig.

Mål för labben

  • Att kunna skriva funktioner som ger returvärden och särskilt textvärden ( str ).
  • Att kunna manipulera textsträngar och listor.
  • Att kunna importera och provköra egna funktioner i pythontolken.
  • Att kunna skriva ett enkelt program med som kan startas från ett kommandorandsgränssnitt (till exempel Bash, Powershell eller Zshell) som tar in indata och skickar ut en översättning som getts som kommandoradsparameter.

Förberedande uppgift

Skapa en fil, t.ex sprak.py och skriv in den första funktionen. Version 2 är lite mer effektiv, men om du bara använder strängar som maximalt är en rad långa så spelar detta ingen roll och den kan betraktas som överkurs. Metoden join förklaras nedan:

 

def stjarnsprak(inrad):
"""Returnerar inrad där vartannat tecken är en stjärna. Denna
implementation är innefektiv eftersom den skapar många strängobjekt
för långa strängar, så använd den bara om du kör rad för rad och
inte långa texter."""
translated = "*"
for tkn in inrad:
translated += tkn + "*"
return translated


def stjarnsprak2(inrad):
"""Returnerar inrad där vartannat tecken är en stjärna. Denna
implementation är mer effektiv eftersom den använder en förändringsbar
lista och inte längre och längre strängobjekt som är oföränderliga."""
letters = ['*']
for tkn in inrad:
letters.append(tkn)
letters.append('*')
return "".join(letters)


Starta sedan pythontolken för Python3 med:

python3

Filen med stjärnspråksfunktionen är en modul som kan importeras till pythontolken (eller till annan modul) så att alla funktionerna i filen blir tillgängliga för anrop. Importera sprakmodulen! Importera också modulen imp som behövs för att det ska gå att "ladda om" modulen sprak när ni ändrat i den.

>>> import sprak
>>> import imp

Funktionen stjarnsprak kan nu anropas direkt i pythontolken med t.ex.

sprak.stjarnsprak("Stjärnprogrammerare Stella")

Pythontolken svarar med det resultat funktionen returnerar, nämligen

'*S*t*j*ä*r*n*p*r*o*g*r*a*m*m*e*r*a*r*e* *S*t*e*l*l*a*'

Efter ev. ändring av modulen sprak gör man

>>> imp.reload(sprak)

i Pythontolken. Då får pythontolken tillgång till den uppdaterade filen.

 

Funktionerna join() och split()

Båda funktionerna anropas  en textsträng. Båda funktionerna är användbara i labben men det går att klara sig utan dem.

Funktionen split() delar upp en textsträng i ord. Skriv i Pythontolken t.ex.:

>>> "Jag diskar inte idag sa Muminmamman upprymd".split()

Det går förstås bra att tilldela texten till en variabel först och anropa split() via variabeln.

 

>>> citat = 'Vem vet kanske jag aldrig mera diskar'
>>> citat.split()

Studera resultatet av split(), funktionen är användbar i labben. Observera att citat inte ändras av att man anropar split().

Funktionen join kan ses som ett komplement till splitjoin anropas på ett strängobjekt med en lista av textsträngar som parameter. Om variabeln citat givits värde som i föregående exempel kan join anropas t.ex:

 

>>> " ".join(citat.split())

Vad blir resultatet?

Prova även

>>> "??".join(citat.split())

Experimentera själva tills ni förstår hur split och join fungerar!

 

Språkuppgifter

Vanlig svenska ska översättas till fem olika "hemliga språk" och dessutom ska (åtminstone) rövarspråket översättas tillbaka till svenska. Skriv en funktion för varje översättning där inparametern är en sträng som ska översättas och returvärdet den översatta strängen. För de tre sista språken (bebis, all, fikon) är det smidigast att meningen delas upp i ord före översättningen, översätts ord för ord och sedan sätts ihop igen.

För testning av alla språk utom rövarspråket rekommenderas att öppna filen med funktionerna i Idle och testa meningarna där.

Test av om tecken är vokal eller konsonant behövs i alla uppgifterna. Försök lista ut själv hur man gör. Om det är svårt så kolla här: Testa-vokal-tips.

Viskspråket

I viskspråket tas alla vokaler bort:

Indata: Får jag viska ditt namn?
Viskspråket: Fr jg vsk dtt nmn?

Rövarspråket

Alla konsonanter fördubblas och 'o' stoppas in emellan.

Indata: Att vara eller att inte vara
Rövarspråket: Atottot vovarora elolloleror atottot inontote vovarora

 

Översätt rövarspråket

Om du förutsätter att du har en text på grammatiskt korrekt rövarspråk så behöver du bara plocka bort två bokstäver efter varje konsonant för att översätta till svenska:

Indata: Atottot vovarora elolloleror atottot inontote vovarora
Översättning: Att vara eller att inte vara

 

Bebispråket

Bebisar säger bara första stavelsen i varje ord men de säger den tre gånger:

Indata: näringsrik mat är god
Bebisspråket: nänänä mamama äää gogogo

En stavelse är alla tecken i ett ord fram till och med första vokalen.

I bebisspråket, liksom för allspråket och fikonspråket kan meningen delas upp i ord innan översättning görs och de översatta orden sättas ihop igen till en översatt mening.

Allspråket

För varje ord: bokstäverna före första vokalen sätts sist och "all" läggs till på slutet.

Indata: frostig vinter
Allspråket: ostigfrall intervall

Fikonspråket

Ordet kuperas som i allspråket fast efter första vokalen. "fi" sätts först och "kon" sist.

Indata: anna och cissi springer en mil
Fikonspråket: finnaakon fichokon fissicikon fingersprikon finekon filmikon  

Du kuperar vid den första vokalen i språket. Exempel:
Jazzmusik -> fizzmusikJakon
boka -> fikabokon
Att redovisa för grunduppgift: Koden för varje funktion samt minst ett anrop per funktion. Funktionerna ska ha tydliga namn som talar om till vilket språk de översätter till.

När du har implementerat alla språk så behöver du bygga ihop programmet till ett program med kommandoradsgränssnitt Links to an external site.. Det ska ta in en parameter som representerar vilken översättning som ska utföras på indatan. Parametern ska bestå av den första bokstaven i språket som programmet ska översättas till. Exempelkörning:

$ echo "Landkrabborna försöker sänka oss med kanoner." | python3 oversattning.py -r 
LoLanondodkokrorabobboborornona foförorsosökokeror sosänonkoka osossos momedod kokanonononeror.
Programmet ska också kunna hantera hela filer och inte bara första raden om ni skriver:
$ cat oversattning.py | python3 oversattning.py -r

På redovisningen behöver du visa hur du med en (eventuellt lång) rad i bash kan översätta en översättning till ett annat språk direkt utan att klippa och klistra delresultat.
$ cat oversattning.py | python3 oversattning.py -r | python3 oversattning.py -b


Om du gjorde rätt så ska du kunna ta ett meddelande och översätta det till ett språk, översätta översättningen till ett annat språk ur listan ovan. Testa och visa på redovisningen att du har förstått!

 

 

Extrauppgift för betygshöjning

Extrauppgiften består av två delar.

Del 1: Flera språk i samma körning

Utvidga programmet så att den kan göra flera översättningar i en enda körning (vissa har redan gjort detta för att lösa grunduppgiften). Exempelkörning:

$ cat oversattning.py | python3 oversattning.py -v -a -r -f -ö -r

Del 2: Meny

Börja med att se till att alla språkfunktionerna finns i samma fil. Efter funktionerna, eller i en fil som importerar funkionterna, skriv programkod som visar en meny och låter användaren välja språk från menyn: Repetition av meny, inläsning och utskrift skall ske tills användaren väljer 6 enligt menyn. Då avslutas programmet.

En standardlösning använder sig av en kombination av if - elif ... elif - else för att testa det inlästa talet och anropa rätt funktion. En sådan lösning duger bra!

Det går dock att göra en lite elegantare lösning, utan de många testerna. Tips för detta finns här: elegantare. Detta är ett alternativ till standardlösningen och behöver inte utföras för att bli godkänd på extrauppgiften!

Här är ett exempel på dialogen som ska stämma vare sig man valt standardlösning eller elegantare lösning. Svart text skrivs av programmet, blå text markerar användarens inmatning.

Vilket språk önskas?
1 Visk 2 Rövar 3 Bebis
4 All 5 Fikon 6 Avsluta programmet
4
Din mening: det har slutat regna
Allspråket: etdall arhall utatslall egnarall
 
 
Vilket språk önskas?
1 Visk 2 Rövar 3 Bebis
4 All 5 Fikon 6 Avsluta programmet
3
Din mening: pappa måste tvätta
Bebisspråket: papapa måmåmå tvätvätvä
 
 
Vilket språk önskas?
1 Visk 2 Rövar 3 Bebis
4 All 5 Fikon 6 Avsluta programmet
6
Hej då

 

Att redovisa för extrauppgift: Ett program som använder grunduppgiftens språkfunktioner, låter användaren välja språk i en meny och producerar en dialog enligt exemplet ovan.