Till KTH:s startsida Till KTH:s startsida

Laboration 6

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 "Kurser" i övre blå menyn
  4. Välj "tilda13" (långt ner i listan)
  5. Klicka på "Jag är student på den här kursen och vill registrera mig på 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 via KTH Social senast 11 november kl 20.00 och redovisad på labbtillfället 21 november.
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 exempel från prgi12 (förel 12) alternativt prgcl13.

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.

Teacher Linda Kann created page 21 October 2013

commented 4 November 2013

Vad exakt skall specen handla om för betyg C? Är det för den här labben? (Och varför skall vi då skriva den efter vi har gjort programmet?)

Teacher commented 4 November 2013

Ja, det är en spec för programmet i denna labb. Det är tänkt att man ska skriva den i förväg, inte efteråt! Hade du redan gjort beyg E-delen innan du läste uppgiften för betyg C?

commented 4 November 2013

Ok, då förstår jag. För C skulle man ju ha gjort allt för E, men då gör vi det lite rekursivt, det också.

Teacher commented 4 November 2013

:-)

commented 4 November 2013

Ska Kattis klara av att läsa t.ex 100 som atomnummer? Om den klarar 332 känns det som att den borde klara 100 men BNF'en innehåller bara 2-9.

Na332 accepteras som korrekt syntax, ska Na311 fungera? Struntar vi helt i siffrorna 0 och 1?

Teacher commented 4 November 2013
<num>   ::= 2 | 3 | 4 | ...

ska läsas som 2 eller 3 eller 4 eller ... eller 99 eller 100 eller 101 ...

commented 5 November 2013

Hej.

Jag försöker förstå lite hur KATTIS jobbar...

Kollar hon bara att hennes hemliga input blir rätt output, eller kollar hon hela programmet?

Jag menar... spelar det någon roll om man programerar fult eller snyggt så länge output blir ok?

Mvh

Teacher commented 5 November 2013

Kattis struntar fullständigt i hur din kod ser ut (men assen du redovisar för kommer nog att klaga om du har fulkodat).

commented 5 November 2013

Det finns grader...

Tack.

commented 8 November 2013

"Inför metoden peek() i din köklass" ska vi använda oss av köer i labben? Är det tänkt att varje tecken i den inhämtade molekylen ska läggas i en kö? Vilken lista på molekyler ska vi använda oss av? Är det dem från exemplena? :)

Teacher commented 8 November 2013

Ja, det är tänkt att de tecken du läser in (t ex H2O) ska läggas i en kö.

Börja att provköra programmet med de molekyler som finns i problemlydelsen på Kattis (Sample Input 1 och 2).

Sen är det bara att använda fantasin för att hitta på egna formler (både korrekta och felaktiga) att testa med!

commented 8 November 2013

En fråga i förtydligande syfte: Är situationen sådan att alla formler man vill testa inte är kända (det finns fler än i sample input i Kattis) och vår uppgift blir att lista ut alla formler som behöver testas?

Teacher commented 8 November 2013

Ja, precis så är det!

De första två omgångarna med testformler som Kattis kör är "Sample Input 1" och "Sample Input 2". Sen finns det ytterligare två omgångar kvar efter det...

commented 8 November 2013

Hej!

Vi har läst in sample input 1 både från en fil och skrivit in det manuellt via kommandoraden. Vi får till synes korrekt output med stdout.write(). Vi har även jämfört med personer som får rätt av kattis och vår output är till synes identisk för sample input 1. Vi får dock "Wrong Answer" på första testet. Idéer?

commented 8 November 2013

Hej!

Vi har gett inputten från Sample Input 1 och Sample Input 2 till ett godkänt program och till vårt icke godkända program, sparat respektive output till två olika textfiler och sedan kört diff på resultatet, vilket ger att filerna är identiska. Hur är detta möjligt?

Teacher commented 8 November 2013

Kan det vara så att ni skickat en annan version av programmet till Kattis?

Enligt Kattis så godkänner ert program inte Si(C3(COOH)2)4(H2O)7

Jag har också provkört och det ser ut så här:

dator>python3 formelkoll2.py 
Si(C3(COOH)2)4(H2O)7
Saknad högerparentes vid radslutet )2)4(H2O)7
#

            
commented 8 November 2013

Hej!

Ok, löste det. Det stod "  if q.peek() is not ")":  " vilket jag bytte till " if q.peek() != ")":  "Intressant nog fungerade is not versionen på http://repl.it/languages/Python, på windows 7 kommandoraden med python 3.3.2 och min vän fick samma fungerande beteende på sin linux med samma pythonversion. Vad händer hemma hos kattis egentligen? :)

commented 8 November 2013

Hej, Linda!

Innebär "testprogram" ett program med unittest, eller bara ett program som testar exempeldatan och avgör om detta är korrekt eller inte (likt Kattis)?

Teacher commented 8 November 2013

@Johan:

Det är Kattis som har rätt - operatorn "is" används för att jämföra om två objekt är samma, inte om värdena är lika/olika; det använder man "==" resp "!=" för (se http://docs.python.org/3.0/reference/expressions.html#id10).

Teacher commented 8 November 2013

@Stephan:

Testprogrammet behöver inte använda unittest!

commented 9 November 2013

Vad menar du att testprogrammet ska testa?

commented 10 November 2013

Min gissning är att testprogrammet ska testa ifall mitt första program ger korrekt output av en given input? På samma sätt som Kattis kollar ifall mitt program fungerar. Korrekt?

Om ja, visst är det väl okej att jag låter testprogrammet testa en version där jag läser inputen från en fil på vanligt vis

fil = open('textfil.txt', 'r')

rad = fil.readline()

istället för att använda stdin som Kattis vill ha?

commented 10 November 2013

För övrigt är länkarna till föreläsnings-pdferna på prgi12 borttagna vad jag kan se.
http://www.csc.kth.se/utbildning/kth/kurser/DD1315/prgi12/Forelasningsmaterial/

commented 10 November 2013

Test-programmet skall bara skicka in input(t.ex. läsa från fil, som du föreslog), "köra programmet" och kontrollera att rätt output kommer(kanske även där matcha mot en fil?). Mer testprogram än så verkar inte efterfrågas!

indata:C(Xx4)5 -> *syntaxkoll* -> utdata från programmet -> Matcha mot förväntad utdata(dvs kattis "sample outputs") -> Om de två är samma har testet lyckats!

commented 10 November 2013

Måste testprogrammet skicka inputen till formelprogrammet?

Just nu har jag gjort så att testprogrammet kör formelprogrammet -> formelprogrammet läser själv in inputen från en fil och skickar outputen tillbaka till testprogrammet -> testprogrammet kollar om outputen stämmer med förväntad output (läst från en fil)

commented 10 November 2013

Jag gjorde alltså en ny version av formelkoll-programmet där jag ersatte stdin med att läsa från en fil, dvs ersatte stdin.readline() med fil=open('fil.txt'), fil.readline() osv.

commented 10 November 2013

Det är nog kanske mer av en Linda-fråga förstås, men generellt skall man bara veta vilka tester man skall köra(dvs den indata du mycket riktigt läser in) och vilken utdata/vilket resultat som förväntas.

Jag tycker din test-algoritm låter bra iallafall!

commented 10 November 2013

Ok, tack för hjälpen!

Teacher commented 10 November 2013

Ja, det är precis som Fredrik skriver - testa att formelkoll ger Sample Output 1 när man ger Sample Input 1 som indata, och samma för indata/utdata 2.

commented 10 November 2013

Så jag behöver inte använda stdin alltså?

Teacher commented 10 November 2013

I programmet som du skickar in till Kattis så måste du använda stdin, men inte i ditt eget testprogram.

commented 11 November 2013

Finns det någom möjlighet att få veta vad kattis inte tycker är korrekt med mitt svar? Sitter och famlar i mörkret då alla exempel och mina svar är lika(?), och jag inte har någon aning om i vilken ordning felmeddelandena ska komma.

Tack på förhand!

Teacher commented 11 November 2013

Du löste tydligen problemet själv medan jag sov :-)

commented 11 November 2013

Is there any way of finding out what KATTIS dosen't like about my Program ? Because i get Accepted for the first two Test Cases but an Run Time Error for Test Case 3. And I have no idea what i should change anymore.

Teacher commented 11 November 2013

Invent some more test cases to try the following

  • numbers: 0 and 1 are not OK but 10 is
  • endings: lines that end with different errors

commented 11 November 2013

Nja, det där godkända svaret är när jag körde formelkoll, inte formelkoll2 som det står att man ska göra. Så formatet på min text verkar inte vara problemet. En liten hint skulle vara mycket uppskattad!

Teacher commented 11 November 2013

OK: C0 och C1 är inte OK, men t ex C10 ska godkännas!

commented 11 November 2013

How should I understand a line that ends with a diffrerent Error ? An Error appart from the Errors i have defined ?

One user removed his/her comment
commented 11 November 2013

A quick guess is that some line gives a different error output than it should. For example, some line could have two errors, and then it's supposed to catch the first occurring error and not the second.

commented 11 November 2013

Hej! Tänkte bara höra om det är OK att istället för att printa ut felmeddelandena i huvudprogrammet bara returnera dessa så att man kan ta till vara på dessa i testprogrammet för betyg A? I annat fall sitter vi nämligen och brottas med "None Type Object" som vad vi vet inte går att jämföra med det vi vet att vi borde få ut av programmet.

commented 11 November 2013

Med felmeddelanden menar jag egentligen också om tex "Formeln är syntaktiskt korrekt"

Teacher commented 11 November 2013

@Nils:

Here is an example

  1. (CO2)
  2. (CO2)H

First line is missing a number after ")"

Second line is too, but that is not at the end of the line...

Teacher commented 11 November 2013

@Michaela:

Javisst, testprogrammet kan ni lägga upp på önskat sätt!

commented 11 November 2013

Tack !
Äntligen ....
:)

commented 11 November 2013

Hej!

Vi får "Wrong Answer" som svar när vi lämnar in vårt program till Kattis. Dock fungerar det utan problem när vi kör sample input 1 och 2 från textfiler i idle. Men Kattis godkänner ingenting för oss, vad gör vi för fel?

/Emanuel

Teacher commented 11 November 2013

@Emanuel:

Har ni talat om för Kattis vilken fil som innehåller main? 

commented 11 November 2013

Ja det har vi gjort. Har provat att läsa in sample indata från en fil och vår output blir då rätt.

Trots det får vi fel på test case 1 av Kattis, domarstatus "Wrong answer". Har provat säkert 50 olika varianter men får det ej att fungera. VAD gör vi fel?:)  id nr 459298.

Teacher commented 11 November 2013

Ert program verkar ge "För litet tal vid radslutet" alltför ofta...

commented 11 November 2013

 Finns det något sätt att veta vad som går fel på de olika stegen? Nu fungerar alla sample output som de ska (Och massa andra som jag försöker med) men vi får ändå wrong answer i steg 2... ID 459349.

commented 11 November 2013

Hittade felet, det var ett stavfel bara :-)