Göm meny

Introuppgift 3

Syftet med denna introuppgift är att ni ska öva er på att skriva klasser från grunden, samt skapa instanser av dessa klasser som sedan utför enklare kod. Fokus ligger både på syntax och modellering.

Gruppanmälan

Använd denna länk för att anmäla er grupp: Anmälan av pargrupp till Tema 3

Uppgifter och redovisning

För dessa övningsuppgifter ska ni använda en fil per uppgift. Den första uppgiften löser ni t.ex. i filen uppg1.py. All kod ska följa kodstandarderna PEP 8, samt PEP 257 och kontrolleras med programmen pep8 och pep257.

Vid redovisning kommer ni att få demonstrera ett urval av uppgifterna. Ni kommer också att få frågor om era lösningar.

Saker att fundera över medan ni gör introuppgiften

(dvs saker som ni eventuellt kan få frågor kring)

  • Finns det någon speciell fil man måste definiera sin klass i?
  • Vad säger PEP8 om namngivning av klasser och metoder?
  • Hur gör man för att använda en klass i en annan fil?
  • Vad gör metoden __init__?
  • Vad är self?
  • Vad är det för skillnad på instans och klass?

Allmänna instruktioner

Följande gäller för koden (dvs all kod ni skriver i denna labb):

  • Definiera klasserna till varje deluppgift i en fil och skriv koden som använder klasserna i en annan fil (t.ex. uppg1.py). Tänk på vad ni döper filerna med klasserna.
  • Användning av klasser till varje deluppgift sker i en egen fil.
  • Följ PEP8 och PEP257 och kontrollera er kod.
  • UML-diagram ritas till varje deluppgift.

Uppgifter

Denna introuppgift består av tre deluppgifter som handlar om att skapa egna klasser och använda dem. Varje deluppgift består av en del där ni definierar klassen/klasserna och en del där ni använder klassen/klasserna ni definierat.

Uppgift 1: Husdjur

Här ska ni skapa en klass som representerarar data om husdjur. Följande filer ska skapas till uppgift 1:

  • uppg1.py
  • pet.py

Klassbeskrivning och UML-diagram

  • Definiera klassen Pet för att representera ett husdjur
  • Instanser av Pet ska ha följande egenskaper:
    • namn som ni lagrar som en sträng i instansvariabeln name.
    • typ, t.ex. fisk, hund, katt etc, som ni lagrar som en sträng i instansvariabeln kind
    • leksaker den äger som ni lagrar som en lista av strängar i instansvariabeln toys. En Pet kan ha inga leksaker, en leksak, eller flera leksaker.
  • Namn anges som argument när en instans av Pet skapas, t.ex. p1 = Pet("Fido").
  • Instanser av Pet ska ha en följande metoder:
    • add_toy(toy): som används för att lägga till en leksak i taget (en sträng)
    • __str__() ska returnera sträng med en beskrivning av husdjuret i naturligt språk. Olika beskrivningar ska returneras beroende på om husdjuret har leksaker. Exempel "Fido är en hund som inte har några leksaker." eller "Fido är en hund som har följande leksaker: boll, nalle".

UML-diagram: Rita ett UML-diagram för klassen enligt ovanstående beskrivning.

Användning av klassen

OBS! Alla steg ska synas i koden som ni redovisar muntligt.

  1. Skapa 3 husdjurs-instanser
  2. Skriv ut beskrivningar av alla tre instanser.
  3. Lägg till 1 leksak till den första instansen
  4. Lägg till 2 leksaker till den andra instansen
  5. Lägg till 3 leksaker till den tredje instansen.
  6. Skriv ut beskrivningar av alla tre instanser igen.

Uppgift 2: Försöksdata

Här bestämmer ni namn på klasser och metoder själva.

Klasser och UML-diagram

Klass 1

  • Definiera en klass för att representera en serie mätvärden (siffror utan enhet)
  • Använd en lista av siffror som instansvariabel som representerar mätvärdena.
  • Konstruktorn skapar en instans utan mätvärden.
  • Klassen ska ha metoder för att ta fram antal mätvärden, högsta värdet i serien, minsta värdet i serien, snittet av mätvärdena i serien.
  • Klassen ska ha en metod för att ladda in mätvärden från en text-fil (i filen står ett mätvärde för sig själv på en rad)

Klass 2

Inga metoder för denna klass finns beskrivna. Bestäm själva vilka metoder ni behöver ha genom att titta på avsnittet “Användning av klasserna” för Uppgift 2 nedan.

  • Definiera en klass som representerar en försöksperson
  • en försöksperson ska innehålla följande information:
    • namn
    • födelseår
    • telefonnummer
    • kodifierad identitiet
    • ett godtyckligt antal mätserier

UML-diagram: Rita ett UML-diagram som visar hur ni definierat era klasser för Uppgift 2.

Användning av klassen

  1. Skapa tre försökspersoner med följande personuppgifter:
    • Tristan Stortå, 1995, 0701-11 11 11, kod: fp1
    • Ulla Vägval, 2000, 0702-22 22 22, kod: fp2
    • Willhelmina Xtra, 2005, 0703-33 33 33, kod: fp3
  2. Läs in mätvärden från följande filer till försökspersonerna: läs in filer som börjar med fp1 till försöksperson 1, filer som börjar med fp2 till försöksperson 2 etc. Mätvärdena är sparade i formatet “ett värde per rad”. Filerna hittar ni i ~729G75/kursmaterial/tema3/introuppgift3 (filnamnen har mönstret fpX-serieX.txt).
  3. Skriv ut information om varje försöksperson.

Följ nednastående mall för utskrifterna (nedanstående siffervärden stämmer inte med de ni ska få när ni laddar data från datafilerna):

Namn: Ulla Vägval
Födelseår: 2000 (16 år)
Kod: fp2
Antal mätserier: 2
Mätserie 1: 32 mätpunkter. Max: 105. Min: 4. Medel: 43,49 

Uppgift 3: Representation av text

I Uppgift 3 får ni de minst specificerade beskrivningarna. Skapa klasser och kod på bästa sätt (ni kommer kommer behöva berätta varför ni tyckte att de var det “bästa sättet” vid den muntliga redovisningen).

Tips till övning 3 finns längre ner på sidan.

Klassbeskrivningar

Följande klasser ska skapas:

  • en klass som representerar ett ord eller ett skiljetecken
  • en klass som representerar en mening
  • en klass som representerar ett stycke
  • en klass som representerar en text

En text-instans ska kunna innehålla flera stycken (instanser av styckesklassen). Varje styckes-instans ska kunna innehålla en eller flera meningar (instanser av meningsklassen). Varje mening ska kunna innehålla flera ord-instanser. Varje ord innehåller slutgitligen en sträng (ett ord eller ett skiljetecken).

Informationen kommer alltså att lagras på ett trädstrukturliknande sätt.

UML-diagram: Rita ett UML-diagram över era klasser.

Användning av klasserna

I uppg3.py skriver ni kod som skapar en instans av text-klassen som agerar rot-nod och innehåller följande stycken (varje stycke ligger på en enda rad):

Lorem ipsum dolor sit amet , consectetur adipisicing elit , sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua . Ut enim ad minim
veniam , quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
commodo consequat. Duis aute irure dolor in reprehenderit in voluptate
velit esse cillum dolore eu fugiat nulla pariatur . Excepteur sint occaecat
cupidatat non proident , sunt in culpa qui officia deserunt mollit anim id
est laborum . 

Lorem ipsum dolor sit amet , consectetur adipisicing elit , sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua . Ut enim ad minim
veniam , quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
commodo consequat. Duis aute irure dolor in reprehenderit in voluptate
velit esse cillum dolore eu fugiat nulla pariatur . Excepteur sint occaecat
cupidatat non proident , sunt in culpa qui officia deserunt mollit anim id
est laborum . 

Ni en textfil som innehåller ovanstående text hittar ni i ~729G75/kursmaterial/tema3/introuppgift3/. Instanserna ska självklart inte skapas manuellt, utan ni bör utgå från ovanstående text representerat som en sträng i er kod:

# strängen text_data innehåller ovanstående stycken
t = Text(text_data)

Nedanstående information ska sedan skrivas ut om texten som finns representerat med objekt. Endast ett anrop till t (om det är instansen av textklassen) ska göras för skriva ut nedanstående statistik (med rätt värden):

Texten innehåller totalt Q stycken.

Stycke 1 innehåller totalt X meningar.
Stycke 1 innehåller totalt Y ord.
Stycke 1 innehåller totalt Z tecken.

Stycke 2 innehåller totalt X meningar.
Stycke 2 innehåller totalt Y ord.
Stycke 2 innehåller totalt Z tecken.

Tips till Uppgift 3

  • klassen för ett stycke skulle kunna ha en metod eller konstruktor som tar in ett helt stycke som en sträng.
  • klassen för en mening skulle kunna ha en metod eller konstruktor som tar in en hel mening som sträng.
  • klassen för ord skulle kunna ha en konstruktor eller metod som tar in ett ord eller skiljetecken (utan mellanslag) som sträng.

Redovisning

Uppgiften redovisas muntligt.

  • Vid redovisning ska ni demonstrera er kod och även individuellt kunna svara på frågor kring det ni gjort (se frågorna ovan).
  • Flera möjliga lösningar finns för vissa delar av uppgifterna. Var beredda att motivera era beslut.

Sidansvarig: Jody Foo
Senast uppdaterad: 2017-04-19