Till KTH:s startsida Till KTH:s startsida

Laboration 2

Laboration 2 - Kortkonst

"Trollkarlen tar ut de tretton spaderna ur leken, håller dem som en
kortlek med baksidan upp och lägger ut dem på följande sätt: Översta
kortet stoppas underst, nästa kort läggs ut med framsidan upp, nästa
kort stoppas underst, nästa kort läggs ut osv.  Till publikens
häpnad kommer korten upp i ordning ess, tvåa, trea...

Utförande: Man ordnar i hemlighet korten enligt följande."

Ja, här bryter vi citatet ur Liberg: Trolleri för alla.
I labbuppgiften ingår nämligen att ta reda på kortkonstens hemlighet! Du ska därför göra ett program där man kan simulera korttricket så här:

  Vilken ordning ligger korten i? 3   1   4   2   5 
De kommer ut i denna ordning: 1 2 3 5 4

Uppgifter

  1. ListQ - en kö med Pythons lista

    Med den abstrakta datastrukturen kö kan man göra tre saker: stoppa in något sist, plocka ut det som står först och kolla om kön är tom. Det motsvarar anropen
    • put(x)
    • x = get()
    • isEmpty()

    Skriv en egen klass ListQ där du implementerar en kö med hjälp av pythons inbyggda lista. Till din hjälp har du Pythons listmetoder. Du ska använda TDD - testdriven utveckling under arbetet.

  2. Första version av testprogrammet

    Här är ett första testprogram som kontrollerar om metoden isEmpty fungerar som den ska. Fortsätt att lägga nya testfall (både positiva och negativa) under utvecklingen. Spara alla versioner av testprogrammen - dom ska visas upp vid redovisning.
       q = ListQ()
       if q.isEmpty():
    print("q.isEmpty() ger rätt svar.")
    else:
    print("q.isEmpty() ger FEL svar".)
  3. Skriv Trollkarlsprogrammet

    Skriv ett program som simulerar korttricket (se exemplet överst i labben).

    Inmatningstips är att använda input() för att läsa in hela raden och sen split() för att dela upp den. Experimentera sedan med olika inmatade ordningar och lista ut i vilken ordning korten ska ligga innan man börjar trolla för att man ska få ut alla tretton i rätt ordning!

    Programmet ska även fungera om man skriver in kortens namn som text.

  4. Skapa en ListQ-modul

    Gör nu så här: klipp ut klassen från ditt program och klistra in i en ny fil listQFile.py
    Importera klassen till huvudprogrammet med raden
    from listQFile import ListQ
    Nu går det att använda klassen utan att den syns i programmet.
  5. LinkedQ - en kö av noder (länkad lista)

    Nu ska du istället implementera kön som en länkad lista. Då behövs två klasser:Node ochLinkedQ, som kan ligga i samma fil. Noderna i listan är objekt som vardera innehåller två attribut: ett värde (value) och en referens till nästa objekt (next).

    Själva LinkedQ-klassen har två attribut: first som håller reda på den första noden i kön och last som pekar ut den sista. Här är en del av koden - resten får du fylla i själv. Använd samma gränssnitt som i uppgift 1:

    • put(x)
    • x = get()
    • isEmpty()

    Som inspiration kan du titta på stack.py från Övning 1.

    Det är extra knepigt att programmera put(x) eftersom det blir två fall, beroende på om kön är tom eller inte. Rita upp bägge fallen (lådor med pilar) innan du skriver koden!

  6. Trollkarlsprogrammet med LinkedQ

    Ändra import-satsen i trollkarlsprogrammet så att du importerar klassenLinkedQ istället förListQ. Provkör. Fungerade det? Då har du lyckats implementera den abstrakta datastrukturen kö på två olika sätt.

När allt fungerar som det ska bör du ta en extra titt på koden. Är den kommenterad och begriplig? Hur har du testat programmet för att se att det fungerar
Den här labben ska redovisas tillsammans med labb 3 och 4.

Betyg

betyg E:

  • Ditt program löser uppgifterna ovan,
  • du kan rita och förklara hur metoderna fungerar,
  • du kan visa upp de olika versionerna av testprogrammet.

betyg C:

  • Kraven för E uppfyllda
  • Perfekt program
  • Labben inlämnad via KTH Social i tid och redovisad i tid (se datum under Laborationer).

betyg A: Kraven för C uppfyllda + en av följande extrauppgifter:

  • Bakfram kortkonst:
    Det är tidskrävande att experimentera sej fram till rätt utgångsordning på korten. En genial metod är förstås att göra kortkonsten baklänges, och det ska du programmera. Tricket här är att använda en stack som hjälp för att kunna vända på kortens ordning.
  • Misslyckad blandning:
    Korthajarnas riffelblandning går till så att leken delas på mitten och de båda halvlekarna rifflas ihop så att undre halvlekens översta kort hamnar överst och övre halvlekens understa kort hamnar underst. Ryktet säger att den här blandningen inte får göras för många gånger, för då är korten tillbaka i ursprunglig ordning. Kan det stämma?

    För att programmera det här behöver du tre köer. Ditt program ska fråga efter antal kort (ett jämnt tal) och antal blandningar och skriva ut hur ordningen blir efteråt. Testa med 6 kort och tre blandningar eller 62 kort och sex blandningar. Hur många behövs för vår vanliga kortlek med 52 kort?

                                                     Fler avslöjanden från trolleriprofessorn.

Alexander Baltatzis skapade sidan 23 januari 2015

kommenterade 9 februari 2015

Hej!

Jag undrar om de krav som ställs på "bakfram kortkonst" för betyg A.

Måste man använda sig utav linkedQ i uppgiften? Eller är det ok att använda sig av listQ? Eller får man göra precis som man vill?

Lärare kommenterade 9 februari 2015

Ni ska använda eran egen lista, LinkedQ

kommenterade 10 februari 2015

Ok. Är det tillåtet att skriva in nya funktioner i den?

kommenterade 10 februari 2015

MÅSTE man använda sig av en stack för att genomföra korttricket baklänges?

kommenterade 11 februari 2015

Undrar också om man måste använda sig av stacks för att genomföra korttricket baklänges. Om man har hittat en annan lösning, menar jag?

kommenterade 12 februari 2015

Vi som läser tilpro vill kunna lämna in uppgiften! 

Det finns ingen "tilda labb2 (vårterminen" under Inlämningsuppgifter på DD1321 sidan...

kommenterade 12 februari 2015

Tack! Nu gick det att lämna in under DD1321 sidan :)

Lärare kommenterade 13 februari 2015

@Linnea och @Ali Kortleken kan ni i det här problemet se som en kö. Ni plockar från ena änden och lägger till i andra änden. Använd en riktig kortlek (eller klipp till en A4) för att simulera korttricket framlänges och baklänges. När ni gör det baklänges så börjar ni med det kort ni sist lade ut. Stacken behöver ni bara som ett sista steg.

Ett testprogram skulle kunna se ut så här:

def bratestnamn( braparameter_istallet_for_hardkodade_daliga_variabelnamn_nedan):
  L1 = list(range(7))
  L2 = funktionen_som_gör_korttrick_baklänges(L1)
  L3 = trolleri_funktionen(L2)
  # Nu borde L1 och L3 vara lika
  for (x, y) in zip(L1, L3):
     if x != y:
         print("ACHTUNG ")
         return false
  return true