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:
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 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
Efter ev. ändring av modulen sprak
gör man
i Pythontolken. Då får pythontolken tillgång till den uppdaterade filen.
Funktionerna join() och split()
Båda funktionerna anropas på 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.:
Det går förstås bra att tilldela texten till en variabel först och anropa split()
via variabeln.
>>> 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 split
. join
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:
Vad blir resultatet?
Prova även
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
Jazzmusik -> fizzmusikJakon
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.
$ 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.
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å