Till KTH:s startsida Till KTH:s startsida

Laboration 5

Laboration 5 - Atomvikter

Ditt program ska bygga upp en hashtabell över alla grundämnens beteckningar och atomvikter så att det supersnabbt kan söka önskad information. Dialogen blir så här:

    Atombeteckning: Ag
    107.8682
    Atombeteckning: Au
    196.966569
    Atombeteckning: Q
    Okänd atom
    Atombeteckning: 

Du ska göra tre versioner av programmet:

  1. Använd Pythons inbyggda datastruktur dictionary som hashtabell.
  2. Implementera en egen hashtabell.
  3. Lägg till ett grafiskt gränssnitt.

1. Hashning med Pythons inbyggda dictionary

Skriv en klass Hashtabell som använder dictionary. Den ska ha metodernaput ochget.

Programmet hashtest.py innehåller data om alla atomer (namn och atomvikt). Lista ut vad det gör och hur det anropar hashtabellen. Modifiera det sedan för att kontrollera om din hashtabell fungerar.

Skriv sedan ett huvudprogram labb5.py där man kan ge ett atomnamn och få ut atomvikten, enligt dialogexemplet ovan.

2. En egen implementation av hashtabellen

Nu ska du göra en ny version av klassen Hashtabell (spara den i en ny fil) där du använder en Python-lista för att implementera en egen hashtabell. Krav:

  • Noderna måste innehålla både nyckel och värde
  • Hashtabellen ska vara lagom stor
  • Någon krockhantering måste ingå, t ex krocklistor eller probning
  • AnvändKeyError för att tala om att en nyckel inte finns
  • Skriv en egen hashfunktion
  • Ska klara testning med hashtest.py ovan

Låt nu labb5.py använda din egen hashtabell!

3. Grafiken

För att få till grafiken i labb5.py importerar du klasserna Molgrafik och Ruta från filen molgrafik.py.

Börja med att skapa ett Molgrafik-objekt;

  mg = Molgrafik()

Klassen Ruta har fyra attribut:
atom där du kan lägga in atomens namn
num där du kan lägga in atomens vikt
next ochdown som du kan strunta i för denna labb (dom används i labb 7).

Gör ett objekt av Ruta och använd sedan metoden show så här:

  mg.show(r)


Om programmet avslutas direkt hinner man inte se grafiken blinka förbi. Lägg en slinga runt huvudprogrammet för inmatning av flera atomer.

PS Provkör gärna programmet i ett Terminalfönster för att undvika ev problem med IDLE.

Betyg

betyg E: Ditt program ska lösa uppgifterna ovan.
Vid redovisningen ska du även kunna

  • motivera ditt val av hashfunktion, krockhantering och tabellstorlek,
  • skissa hashtabellen,
  • förklara varför hashning ger snabb sökning

betyg C: Kraven för E uppfyllda +  Labben inlämnad via KTH Social i tid och redovisad i tid (se datum under Laborationer).
Du ska också:

  • Provköra hashtabellen med större datamängder: I programmet storfil.py används en dictionary för att lagra en miljon artister och sånger.
    Kopiera programmet, byt ut "songtable" mot din egen hashtabell och se till att det fungerar!

    Om du kör hemma kan du ladda ner filen här: unique_tracks.txt (84MB)

betyg A: Kraven för C uppfyllda +

  • Förbättra hashtest.py med fler testfall
  • Skriv om hashtest.py med unittest

Alexander Baltatzis skapade sidan 23 januari 2015

kommenterade 14 februari 2015

Får följande fel när jag försöker läsa in unique_tracks.txt via storfil.py:

Traceback (most recent call last):
File "C:\Users\Tomas\Desktop\TILDA\storfil (1).py", line 20, in <module>
songtable = lasfil("unique_tracks.txt")
File "C:\Users\Tomas\Desktop\TILDA\storfil (1).py", line 6, in lasfil
for rad in fil:
File "D:\Python34\lib\encodings\cp1252.py", line 23, in decode
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 801: character maps to <undefined>

Kör Windows 7, 32.

En användare har tagit bort sin kommentar
kommenterade 10 mars 2015

Får man använda sig av indexerror i sin egna implementation?

kommenterade 27 mars 2015

Måste hashtabellens storlek vara ett primtal? 

Lärare kommenterade 27 mars 2015

@Miriam Nej, men det kan ge bättre spridning beroende på hur man implementerar hashtabellen.