Till KTH:s startsida Till KTH:s startsida

Laboration 10

Laboration 7 - Molekylgrafik

Läsning

Förberedelse: Rita syntaxträd

Titta på 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

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 via git 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 nästa period.

Alexander Baltatzis created page 18 January 2016

commented 5 April 2016

Hej! 

När vi når en "(" gör vi ett rekursivt anrop till readFormel igen. Men när vi når en ")" vet vi inte hur vi ska få anropet att återvända till "rätt nivå" så att säga. 

Vi skrev en weight som räknar ut massan på molekyler utan parenteser, men den anropar bara sig själv och inte andra funktioner, så det är inte lika lätt att "gå vilse". 

Hur borde man tänka för att kunna "gå tillbaka"?

Tack!

commented 19 April 2016

Hej! Vi har problem med importen av tkinter i molgrafik. PyCharm ger oss felmeddelandet "No module named tkinter". Den känner av att vi har Python 3 och försöker importera tkinter med litet t, men vi får som sagt ett "ImportError". Något förslag på vad vi kan ta oss till?

Teacher commented 22 April 2016

Är det på er egen dator?

Vad händer om ni bara startar python-prompten och importerar:

> python3
Python 3.4.3 (default, Oct 14 2015, 20:28:29)
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tkinter
>>>