Laboration 6: Set och arv
- Inlämningsdatum 24 nov 2024 av 12:00
- Poäng 1
- Lämnar in en filuppladdning
- Filtyper py, pdf och txt
- Tillgänglig efter 30 sep 2024 kl 0:00
Innehåll:
Läsa dokumentation, set, arv, filer
Läs om set och arv i kursboken, och repetera avsnittet om filer.
Bägge gruppmedlemmarna ska lämna in labben.
Översikt av uppgiften
I denna labb ska du skriva ett program som talar om för användaren vilka allergener som finns i givna maträtter. Du kommer att
- definiera klassen Foodset som ärver från set
- definiera klassen Recipe som har en Foodset som attribut
- läsa in namn på maträtter och ingredienser från fil, och lagra dessa i en lista med Recipe-objekt
- fråga användaren vad den är allergisk mot
- skriva ut allergi-information för varje maträtt
- även skriva ut denna information på fil
Uppgift 1: Definiera ny klass Foodset
Ingredienser till en maträtt kan lagras i en set Links to an external site. (som är inbyggd i Python). Men om vi också vill ha egna metoder kan vi skapa en egen klass som ärver från set.
- Definiera en egen klass Foodset som subklass till set.
- Metoden __init__ behöver du inte definiera - klassen Foodset ärver den som finns i set.
- Metoden __str__ ska definieras (överlagras). Istället för utskriften {'ris', 'lax', 'lök'} vill vi ha ris lax lök Tips: se Föreläsning 10
- Skapa ett Foodset-objekt och kontrollera att metoderna du skrivit fungerar.
Uppgift 2: Läs in från fil
- Skapa ett nytt program Labb6.py (en ny programfil). Låt programmet läsa in data från filen ingredienser.txt Download ingredienser.txt
- På varje rad i filen står en maträtt följt av ingredienser, t ex Pannkakor;vetemjöl;gluten;salt;mjölk;ägg;smör;mjölk
- För varje maträtt ska ingredienserna (dvs allt utom första strängen) läggas in i ett Foodset-objekt.
- Namnet på maträtten (dvs första strängen på raden) och Foodset-objektet ska skrivas ut, så här:
Pannkakor innehåller vetemjöl gluten salt mjölk ägg smör Rårakor innehåller potatis smör mjölk salt |
Uppgift 3: Definiera klassen Recipe
Nu vill vi lägga till objekt som representerar ett recept. Definiera klassen Recipe i en ny programfil (klassen ska senare importeras till Labb6.py)
Attributen i Recipe ska vara:
- Maträttens namn: dish (en sträng)
- Ingredienser: ingredients (en Foodset)
Du får själv bestämma vilka metoder klassen ska ha. Glöm inte att testa att metoderna fungerar.
Uppgift 4: Lista av Recipe-objekt
Här kan du utgå från det program Labb6.py som du skrev i Uppgift2, och lägga till följande:
- Importera din klass Recipe till Labb6.py.
- Skapa en tom lista.
- I slingan som läser rader från filen ska du:
- skapa ett Recipe-objekt (med maträttens namn och ingredienserna från den inlästa raden)
- lägga in Recipe-objektet i listan
- Skriv sedan ut listan så att du ser att det fungerade.
Uppgift 5: Fråga användaren
- Lägg till en fråga till användaren om vad hen inte äter, till exempel så här:
Vad är du allergisk mot? ägg gluten selleri |
- Läs in svaret och skapa ett nytt Foodset-objekt.
- Skriv ut objektet så att du ser att det fungerar.
Uppgift 6: Skriv ut allergener
- Ändra utskriften från programmet så att det bara skriver ut allergenerna, alternativt texten "inga av dina allergener" Använd lämpliga set-operationer. Körexempel:
Vad är du allergisk mot? ägg gluten selleri |
Uppgift 7: Skriv ut på fil
- Öppna en ny fil för utskrift och låt programmet skriva ut all information på filen.
- Låt användaren välja filnamnet för utfilen. Körexempel:
Vad är du allergisk mot? ägg gluten selleri Vilken fil vill du skriva ut på? matkoll.txt Utskriften finns nu på filen matkoll.txt |
Filen matkoll.txt ska nu innehålla samma text som du skrev ut tidigare:
Adas Polo innehåller inga av dina allergener |
Testning
Glöm inte att testa att ditt program fungerar som det ska.
Krav (se Peer review Links to an external site.)
Krav för programmen i labb 6:
- Klasserna Foodset och Recipe ska definieras
- Klassen Foodset ska vara subklass till set
- Programmet ska använda set-operationer för att kolla allergener.
- Programmet ska läsa in data från en fil och skapa en lista med objekt.
- Programmet ska fråga användaren om allergener.
- Programmet ska skriva ut data på fil.
- ... och dessutom ska programmet uppfylla följande krav från tidigare labbar:
- Programmet ska ha en kommentar överst med författarnas namn och datum.
- Programmet ska vara uppdelat i funktioner med lämpliga parametrar och returvärden.
- Varje funktion/metod ska ha en förklarande kommentar.
- Inga globala variabler får förekomma (i funktioner eller metoder).
- Variabel-/funktions-/attribut-namn ska göra programmet lättare att förstå.
- Klasser och funktioner ska stå överst i programfilen, övriga satser ska stå längst ner (blanda inte).
- Testdata ska finnas med i kommentar sist i programmet.
Efter labben
Hur gör du när du löser ett problem med programmering? Har du någon strategi? Skissar du på papper först eller skriver kod direkt? Hur ofta provkör du?
Frivilliga extrauppgifter:
- Lägg till metoden simple i din Foodset som ska returnera True om antal element är mindre än 6
- Lägg till metoden ordered som ska returnera en sorterad lista av elementen
- Lägg till en metod powerset som returnerar potensmängden (svår!)
- Skriv ett nytt program MasterChefHelper som
- Läser in en rad ingredienser,
- skapar potensmängden av ingredienserna,
- går igenom potensmängden...
- ...och kontrollerar om det finns något/några recept i filen som matchar någon av mängderna.
Matris
Kriterier | Bedömningar |
---|---|
Vilka metoder har klassen Foodset?
|
|
Vilka metoder har klassen Recipe?
|
|
Lagras ingredienserna i ett Foodset-objekt?
|
|
Lagras raderna i Recipe-objekt som läggs i en lista?
|
|
Ser utskriften bra ut?
|
|
Vilka set-operationer används?
|
|
Fungerar utskriften på fil?
|
|
Hur är programmet uppdelat i funktioner? Föreslå en alternativ uppdelning!
|
|
Finns det en kommentar överst med författarnas namn och datum?
|
|
Är variabelnamnen lämpliga? Föreslå förbättringar!
|
|
Titta på testdata. Skulle du ha testat något mer?
|
|
Tips till arbetet med den individuella P-uppgiften
|