Till KTH:s startsida Till KTH:s startsida

Laboration 6

Nyhet: Betaversion av parprogrammeringsverktyget parkour är igång!

Prova parkour, och lämna feedback till handledare eller kursledaren.

Laboration 6 - Formelkoll

I denna labb ska du

  • Lära dig att använda domaren Kattis, ett automatiskt system för rättning av labbar.
  • Skriva ett program som läser in molekylformler och kontrollerar om dom är syntaktiskt korrekta. Närmare instruktioner finns i Kattis - problemet heter formelkoll2.

Registrera dig på Kattis

Gör så här:

  1. Följ länken: Kattis
  2. Logga in (längst upp till höger) med ditt KTH-id
  3. Välj "COURSES" i övre  menyn
  4. Välj "tilda14" (långt ner i listan)
  5. Klicka på "I am a student taking this course and I want to register for it on Kattis."

Lär dig använda Kattis

Indata

Programmen du skickar till Kattis ska läsa indata från stdin. Det fungerar som att läsa från fil! Exempel:

from sys import stdin

inrad = stdin.readline()
while inrad:
    lista = inrad.split()
    tal1 = int(lista[0])
    tal2 = int(lista[1])
    ...
    inrad = stdin.readline()

Utdata

Utdata kan du skriva ut med print som vanligt.

Öva på två problem

Arbeta igenom följande enkla uppgifter

Formelkoll

Läs instruktionerna för problemet formelkoll2.

Ditt program ska läsa formeln tecken för tecken och med rekursiv medåkning kolla syntaxen. Rekursiv medåkning innebär att huvudprogrammet först gör anropet readformel(), varefter readformel() anropar readmol() som anropar readgroup() och sedan eventuellt sej själv (men inte om inmatningen är slut eller om den just kommit tillbaka från ett parentesuttryck).

Funktionen readgroup() anropar antingen readatom() eller läser en parentes och anropar readmol() etc - allt enligt grammatiken. När ett syntaxbrott upptäcks genereras en exception (raise Syntaxfel("Saknad högerparentes")) som fångas i huvudprogrammet och där skrivs hela resten av indataraden ut.

Man måste ofta tjuvtitta på nästa tecken för att veta vilken gren man ska följa i syntaxträdet. Inför metoden peek() i din köklass, så kan du titta på nästa tecken utan att plocka ut det ur kön.

Om du har flera programfiler måste du ange vilken som innehåller main (bortse från att det står "Java only" - detta gäller även Python!)

Betyg

betyg E: Ditt program ska godkännas av Kattis (och förstås av handledaren vid redovisningen).
Du även kunna

  • Beskriva hur rekursiv medåkning fungerar.
  • Visa hur dina funktioner speglar den givna syntaxen.
  • Förklara varför man inte måste räkna antalet parenteser.

betyg C: Kraven för E uppfyllda + Labben inlämnad och redovisad i tid (se tidsplanering för labbar) +
Du ska också:

  • Skriva en spec med namnen på alla funktioner du planerar att skriva och en kommentar för varje funktion som beskriver vad funktionen ska göra.
    Se exempelspec från programmeringsteknikkursen.

betyg A: Kraven för C uppfyllda +

  • Skriv ett eget testprogram som kontrollerar de exempeldata som ges i formelkoll2.


Den här labben ska redovisas tillsammans med labb 7.

Linda Kann skapade sidan 30 augusti 2014

En användare har tagit bort sin kommentar
En användare har tagit bort sin kommentar
kommenterade 29 september 2014

länken till hello world och a different problem är trasig!

mvh leonardo

Lärare kommenterade 29 september 2014

Hoppsan, dom hade visst flyttat på sig. Nu fixat!

kommenterade 16 oktober 2014

Är det verkligen tilda13 vi ska registrera oss på?

Lärare kommenterade 16 oktober 2014

Hoppsan, nu ändrat till tilda14!

Lärare kommenterade 16 oktober 2014

... men vänta en liten stund, tilda14 finns inte än :-)

kommenterade 6 november 2014

Förstår inte grejen med <mol>, <group>, <group><mol>....

Exempelvis har vi formeln Ca(H2PO4)2... Vad blir en <group> i formeln? Eller <group><mol>...? Och vad kommer (<mol>)<num> bli?

Tack

Lärare kommenterade 7 november 2014

Den här frågan hade passat bättre på labbtillfället!

    1. Ca(H2PO4)2<mol> ::= <group> | <group><mol>
    2. <group> ::= <atom> |<atom><num> | (<mol>) <num>

Punkt 1 säger att <mol> kan vara en <group> eller <group> följt av <mol>. Det första fallet <group> kan du se som basfall i rekursionen. Om inmatningen består av enbart en atom, t ex "Na" så kommer programmet att anropa mol, sen group, sen atom och där konstatera att "Na" är en giltig atom. Om det är fler atomer, t ex "NaOH" så kommer andra fallet <group><mol> se till att vi går vidare efter "Na" och tillämpar samma procedur för "O", och sedan för "H".

Punkt 2 säger att group är antingen en ensam atom som He, en arom följt av ett tal som He2, eller (<mol>)<num> som (He2)5. Här kan <mol> innaför parentesen vara vad som helst som räknas som en <mol> enligt punkt 1.

Hela formeln Ca(H2PO4)2 är <group><mol>

Ca är en <atom>

(H2PO4)2 är (<mol>)<num>

En användare har tagit bort sin kommentar