Till KTH:s startsida Till KTH:s startsida

Laboration 6

Mat

Laboration 6

Innehåll:

Läsa dokumentation, set, arv, filer

Läs om set och arv i kursboken, och repetera avsnittet om filer

Uppgift 1: Läxa

Uppgift 2

Definiera ny klass Foodset som ärver från set

  1. Definiera en egen klass Foodset som subklass till set
  2. Metoden __init__  behöver du inte definiera - klassen Foodset ärver den som finns i set.
  3. Metoden __str__ ska definieras (överlagras). Istället för utskriften {1, 2, 3} vill vi ha 1 2 3 dvs inga parenteser runt mängden och mellanslag istället för komma mellan elementen.
  4. Lägg också till en egen metod. Du får själv välja vad den ska göra, men elementen måste vara inblandade. Här är några förslag:
    • simple (returnerar True om antal element är mindre än 6)
    • order (returnerar en sorterad lista av elementen)
    • random_element (returnerar ett slumpmässigt element)
  5. Skapa ett Foodset-objekt och kontrollera att metoderna du skrivit fungerar.

Uppgift 3

Läs in från fil

  • Låt programmet läsa in data från filen ingredienser.txt
  • För varje maträtt ska ingredienserna läggas in i ett Foodset-objekt...
  • ...och maträtten och Foodset-objektet ska skrivas ut, så här:
     
Pannkakor innehåller vetemjöl gluten salt mjölk ägg smör mjölk
Rårakor innehåller potatis smör mjölk salt

Uppgift 4

Definiera klassen Recipe

Nu vill vi ha objekt som representerar en rad i filen. Öppna en ny fil och definiera klassen Recipe.

Lämpliga attribut är:

  • Maträttens namn (en sträng)
  • Ingredienser (en Foodset)

Du får själv bestäma vilka metoder klassen ska ha. Glöm inte att testa!

Uppgift 5

Lista av objekt

  1. Importera din klass Recipe till programmet från Uppgift 3 ovan.
  2. Skapa en tom lista.
  3. För varje rad du läser in från filen ska du ny skapa ett Recipe-objekt och lägga in i listan. Tips: Titta på hur du gjorde i förra labben. 
  4. Testa!

Uppgift 6

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 7

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
Pannkakor innehåller gluten ägg
Rårakor innehåller inga av dina allergener

...

Uppgift 8

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

Lägg upp ditt färdiga program i Dropbox

Testning

Glöm inte att testa att ditt program fungerar som det ska.

Krav

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.
    • Programfilen ska kopieras till gruppens Dropbox-katalog.

Instuderingsfrågor

  1. Går det att lagra ett eget objekt (t ex Land) i en set?
  2. Vilka av följande operatorer finns för set: & % * -
  3. Vad är det för skillnad på set och frozenset?
  4. Nämn någon operation som finns för set men inte för frozenset.
  5. Går det att sortera en set?
  6. Vad innebär det om set1 < set2 är True?
  7. Vilken sats motsvarar print vid utskrift på fil?
  8. Hur öppnar man en fil som man vill skriva till?
  9. Vad händer om filen redan finns när den öppnas för utskrift?
  10. Hur får man radbyte vid utskrift på fil?
  11. Var i Pythons dokumentation finns alla random-funktioner beskrivna?
  12. Hur används random.seed()?

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 en metod powerset (potensmängden) i din Foodset. Testa att den fungerar.
  • 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.