bild
Skolan för
elektroteknik
och datavetenskap

Laboration 5 - Atomvikter

Ditt program ska bygga upp en databas över alla grundämnens beteckningar och atomvikter så att det supersnabbt kan söka önskad information. I terminalfönstret ställs frågorna, t ex
    Atombeteckning: Ag
    Atombeteckning: Au
    Atombeteckning: Q
    Atombeteckning: 
och i ett annat fönster skriver programmet ut informationen (dvs atomnamnet och atomvikten) överskådligt och tjusigt! Om atomen inte finns dyker felmeddelandet Okänd atom: Q upp i fönstret istället.

Du ska göra två versioner av programmet. Först löser du det med Pythons inbyggda datastruktur dictionary och sedan genom att själv implementera en hashtabell.


Hashning med Pythons inbyggda dictionary

Datafilen atoms.dat består av rader av typen
    Ag  107.868
I den första varianten av programmet ska du läsa in filen i en dictionary atomlist med atombeteckningen som nyckel och atomvikten som värde, alltså enligt principen
   atomlist["Ag"] = 107.868
Några tips:
  • Kolla med atomlist.has_key() om atomnamnet finns.
  • Filen har atomvikterna som textsträngar, men float(vikt) gör om dom till tal att räkna med. Detta vill du fixa i laboration 7 där du ska räkna ut molekylvikter.

Grafiken

För att få till grafiken importerar du klassen molgrafik från filen molgrafik.py och skapar en instans av den: mg = molgrafik(). Dessutom behövs en klass Ruta (som du kan lägga överst i ditt program eller i en egen fil som du importerar):
class Ruta:          
    def __init__(self):
        self.atom = "( )"
        self.num = 1    
        self.next=None
        self.down=None

Ditt objekt mg kan visa rutor. (Det ska du använda i laboration 7 också.) Gör ett objekt r av Ruta och sätt attributet atom till det du vill ska synas i grafikfönstret (atomnamn och -vikt). Använd sedan metoden show så här: mg.show(r)
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 atomer...


Egen hashtabell

I den andra versionen av programmet ska du byta ut Pythons inbyggda dictionary mot en egen hashtabell. På kursens webbsida kan du hämta ett programskelett hashtable.py att utgå från (men du måste inte använda det). Krockproblemet ska lösas med kvadratisk probning.

Hur stor bör hashvektorn vara? Konstruera ett objekt av klassen Hashtable.

from hashtable import Hashtable
...
atomtable = Hashtable(17) #...men sjutton är fel
Gör en kopia av första versionen av programmet och använd din Hashtable: hasha in alla atomer i atomtabellen med atomtable.put(...), kolla om de finns där med atomtable.has_key(...) och hämta innehållet med atomtable.get(...).
Kör hashtest.py för att kontrollera om hashtabellen fungerar.

































Lysande genomfört av................................. menar............................ den ...............

Sidansvarig: Linda Kann <lk@csc.kth.se>
Uppdaterad 2010-10-12