Molekylvikter


Du ska i denna uppgift skriva ett program som beräknar och skriver ut molekylvikter givet molekylformler. Programmet ska läsa in en molekylformel, skriva ut molekylvikten för denna, läsa in en ny molekylformel, osv.

Exempel på molekylvikter:

    Na2SO4      -> 142.04
    Ca(OH)2     ->  74.09
    (((H)12)2)  ->  24.19

Den sista raden är i och för sig inte en existerande molekyl, men illustrerar att det kan förekomma parenteser i flera nivåer. En molekylformel består alltså av atombeteckningar (en stor bokstav eventuellt följd av en liten bokstav), där varje atombeteckning kan följas av ett tal. Parentesuttryck kan också följas av tal.

Utgå från en datafil (finns på kursbiblioteket, se allmänna anvisningar) som har följande format (du får inte förutsätta att den är sorterad på något särskilt sätt):

    H  1.0079
    D  2.014102
    He 4.00260
    Li 6.941
    Be 9.01218
    B  10.81
    C  12.011
    N  14.0067
    O  15.9994

Programmet läser in filen en gång och lagrar dessa data i lämplig datastruktur. Observera att uppslagning av atom (dvs. finna atomvikt givet en atombeteckning) ska ske på logaritmiska tid eller bättre. Detta är i och för sig inte motiverat om man endast har ca. 200 grundämnen, men programmet ska kunna användas även om man t.ex. utökar med att ha ett stort antal "standardmolekyler", eller om man upptäcker 1000 grundämnen till.

Om användaren ger en syntaktiskt felaktig formel (parenteser stämmer ej, atom finns ej, edyl.) ska programmet upplysa om detta, samt ange vad det var som var fel (t.ex. atom Qz finns ej).