Till KTH:s startsida Till KTH:s startsida

Laboration 7

Laboration 7 - Molekylgrafik

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

Förberedelse: Rita syntaxträd

Plocka fram syntaxen i labb 6, och rita med hjälp av den upp syntaxträd för följande molekyler:

O
CO2
(CH3)2(CH2)4

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 från labb 5. Skapa ett objekt av den klassen:

   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.

betyg E: Du ska ha löst uppgifterna ovan, och kunna

  • Rita hur trä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 C: Kraven för E uppfyllda +

  • Labben inlämnad via KTH Social senast 20 november kl 20.00 och redovisad på labbtillfället 21 november.

betyg A: Kraven för C uppfyllda +

  • Modifiera molgrafiken så att vikten skrivs ut i samma fönster.

Gratulerar till avklarad labbkurs! Glöm inte att fylla i kursenkäten

Tryck här för att hämta kursenkäten:

Teacher Linda Kann created page 6 November 2013

commented 13 November 2013

Är det nödvändigt att kunna skriva flera molekyler under samma körning av programmet. Eller är det okej att att starta om programmet imellan?

Teacher commented 13 November 2013

Man ska kunna mata in flera formler utan att starta om programmet emellan!

commented 14 November 2013

Är det bara följande molekyler som behöver visas upp på redovisningen?:

O
CO2
(CH3)2(CH2)4

Teacher commented 14 November 2013

Nej, den du redovisar för kan testa med helt andra molekyler.

commented 15 November 2013

Ska syntaxträd ritas upp även om syntaxen inte är korrekt?

Teacher commented 15 November 2013

Nej, då räcker det med en felutskrift!

commented 16 November 2013

Är det meningen att hela molekylen ska skickas till weight(mol) eller kan man beräkna vikten del för del?

Teacher commented 17 November 2013

@Sofie:

Det var en bra fråga som visar att du är på rätt spår. Hela molekylen ska skickas till weight, som sen gör rekursiva anrop för att beräkna delarnas vikter.

commented 17 November 2013

Hur menar du att man ska rita syntaxträden i förberedelseuppgiften? Det korta exemplet i föreläsningsanteckningarna är inte särskilt klargörande och boken verkar inte ta upp det.

commented 17 November 2013

Ska de bara se ut som det som molgrafik sen ritar upp?

Teacher commented 18 November 2013

@Martin:

Ja - rita som bilden i labben ovan! Tanken är att det ska bli enklare att se att det ditt program sen ritar är rätt.

commented 18 November 2013

Hej ! 

Redovisningstiderna till 13-11-21 är slut, kommer det komma upp fler? :)

Teacher commented 18 November 2013

Jag tror att jag fixade det samtidigt som du skrev och frågade :-)

commented 18 November 2013

Hej, 
När vikten ska skriva ut i samma ruta, krävs det bara att den skrivs ut i samma ruta? Får den vara ihopkopplad med molekylen med ett rött sträck exempelvis?

Teacher commented 18 November 2013

@Bálint:

Vikten ska skrivas ut i samma fönster, inte i en av atomrutorna! Titta i koden på

http://www.csc.kth.se/utbildning/kth/kurser/DD1320/tilda13/labbar/molgrafik.py