Laboration 10

tiles

Läsning

Förberedelse: Rita syntaxträd

Titta på syntaxen i förra labben, och rita med hjälp av den upp syntaxträd för följande molekyler:

   O
   CO2
   (CH3)2(CH2)4

Uppgift

Det här programmet ska fullborda det som den föregående labben har påbörjat. Det gör formelkoll som tidigare och ritar sedan upp molekylen. På skärmen kan det se ut så här (användarens inmatning i fetstil):

   Molekyl: Si(C3(COOH)2)4(H2O)7
   Molekyl:

och i molekylfönstret ritar programmet ut formelstrukturen: molekylträd

Låt ditt program bygga ett molekylträd

Du ska komplettera formelkollsprogrammet till att samtidigt bygga ett träd som ser ut som ovan. Varje ruta motsvaras av ett objekt:

class Ruta:
    def __init__(self, atom="( )", num=1):
        self.atom = atom
        self.num = num
        self.next = None
        self.down = None

Funktionen readgroup skapar först en sådan tomruta med

   rutan = Ruta() 

och anropar readatom och readnum för att kunna sätta in rätt värden på atom och num. Om det är en parentesgrupp ska readgroups anrop till readmol returnera en delmolekyl som sätts under rutan.down.

När readgroup är klar returnerar den rutan till anropet

    mol = readgroup()

som görs allra först i readmol. Vad som ska göras med mol.next får du själv tänka ut. Slutligen returnerar readmol den färdiga strukturen till readformel som returnerar den till huvudprogrammets anrop

    mol = readformel()

där mol pekar högst upp till vänster på syntaxträdet.

Rita molekylträdet

Huvudprogrammet ska nu rita upp den färdiga molekylen. Använd molgrafik.py. Skapa ett objekt av klassen Molgrafik:

   mg = Molgrafik()

Sedan ska

   mg.show(mol)

rita upp molekylbilden i ett eget fönster. Bilden ritas förstås rekursivt, och du ska formulera den rekursiva tanke som används. Om du inte kommer på den själv kanske det hjälper att kolla molgrafikkoden. Om programmet avslutas direkt hinner man inte se grafiken blinka förbi. Se därför till att ha en slinga för inmatning av flera formler.

Molekylvikten

Molekylvikten ska beräknas rekursivt med anropet weight(mol). Formulera först en mycket rekursiv tanke för vikten och programmera den sedan! Låt programmet skriva ut vikten av molekylen i terminalfönstret.


Redovisning

Labben lämnas in på kurswebbsidan (se Inlämningsuppgifter i vänstermenyn) och redovisas muntligt av bägge gruppmedlemmarna.

Vid redovisningen ska du kunna

  • Rita hur syntaxträdet byggs upp av funktionsanropen.
  • Visa med ett exempel hur funktionen weight() beräknar molekylvikten.
  • Förklara hur ditt anrop till molgrafikens show() fungerar (men du behöver inte kunna förklara hur Tkinter fungerar).

Betyg

Denna labb kan endast ge betyg E. Du måste lämna in den och redovisa den i tid för att få göra labbarna för högre betyg i period 2.

Linda Kann skapade sidan 12 juli 2016

Lärare Linda Kann ändrade rättigheterna 12 juli 2016

Kan därmed läsas av lärare och ändras av lärare.

Lärare Linda Kann ändrade rättigheterna 7 oktober 2016

Kan därmed läsas av alla och ändras av lärare.
kommenterade 7 november 2016

Är det ett krav att programmet behåller funktionaliteten för felmeddelanden från förra labben? T.ex. "felaktig gruppstart vid radslutet..." och "för litet tal vid radslutet..."

Lärare kommenterade 8 november 2016

Ja! Bygg vidare på programmet från labb 9 så kommer det med automatiskt.

kommenterade 10 november 2016

Hur ska trädet se ut om det blir ett felmeddelande? Ska allt fram tills felet fortfarande ritas upp, eller ska man inte rita upp något träd alls?

kommenterade 14 november 2016

För att beräkna molekylvikten, måste vi utgå från periodiska systemet eller något liknande?

kommenterade 14 november 2016

@Joel: Det finns en lista med atomer och dess vikter i filen hashtest.py från Lab 7

kommenterade 14 november 2016

@Thony Tack!

Lärare kommenterade 15 november 2016

@Holly: Om det blir syntaxfel ska du inte rita upp något träd alls.

kommenterade 15 november 2016

Ska man lagra alla atomer i hashtabellen som hashtable.put(namn, float(vikt)) eller hashtable.put(namn,nyAtom(namn,vikt))? Spelar det någon jättestor roll om man endast använder den för att summera vikten?

Lärare kommenterade 15 november 2016

@Josefine:

Jag skulle vilja svara att det inte spelar någon roll hur ni gör. Men jag ser att ditt första förslag hashtable.put(namn, float(vikt)) kan ge problem med krockhanteringen.

Lärare kommenterade 15 november 2016

Alltså: hur ni gör för att få fram vikten för en viss atom spelar ingen roll, bara det blir rätt vikt.

kommenterade 15 november 2016

finns det någon extra hjälp idag på allmänhandelningen eller imorgon? Vi förstår inte labinstruktionen och har inte lyckats rita ut något än, som bäst kommer en ruta med vikt men inga atomer, känner inte att vi kmr klara dethär på egen hand hur länge vi än sitter idag och imorgon och försöker själva, står redan många i kö för tilda i stayawhile idag och vet inte om han Christian är insatt i vår kurs.

Lärare kommenterade 15 november 2016

Det är bara två i kö för tilda i stay-a-while. Christian är en av labbassarna på tilda-kursen.

Feedback Nyheter