Till KTH:s startsida Till KTH:s startsida

Laboration 9

I denna labb ska du

  • Skriva ett program som läser in molekylformler och kontrollerar om dom är syntaktiskt korrekta, med hjälp av rekursiv medåkning.

Förberedelser

  1. Läs instruktionerna för problemet formelkoll.
  2. Skriv ett testprogram med unittest för den första omgången med testdata (Sample Input 1/Sample Output 1).
  3. Skriv ett testprogram för den andra omgången med testdata (Sample Input 2/Sample Output 2).

Formelkoll

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 i kön (med peek()) för att veta vilken gren man ska följa i syntaxträdet.


Redovisning

Labben lämnas in via git och redovisas muntligt av bägge gruppmedlemmarna.

Vid redovisningen ska du

  • Visa din godkända Kattis-körning.
  • 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

Denna labb kan endast ge betyg E. Du måste lämna in den och redovisa den i tid för att få göra labbarna för högre betyg i nästa period.

Alexander Baltatzis skapade sidan 18 januari 2016

kommenterade 29 februari 2016

Hej!

Kattis kuggar mitt program vid testfall 3. Skulle man kunna få lite feedback på vad det är som den inte gillar? Id:et är 1059494.

Lärare kommenterade 1 mars 2016

En formel som borde godkännas blir inte godkänd av ditt program. Testa ditt program med många molekyler. Använd google för att hitta molekyler att testa med. 

kommenterade 2 mars 2016

Okej Alexander, jag tror jag hittat problemet (om det inte finns flera). Formler som (NH4)H2AsO4, H2C(CH)CN, Li(AlSi2O6), CH3(CH2)16COOH osv säger mitt program är fel trots att de är verkliga molekyler. Deras "fel" är att de saknar siffror efter sina parenteser, något som jag trodde var ett måste givet att vi har "(<mol>) <num>" i BNF-Syntaxen, samt att den givna C(OH4)C ger felet "Saknad siffra vid radslutet C". Har jag missuppfattat detta med siffror efter parenteser?

Sen så antar jag att vi inte behöver ta hänsyn till andra korrekta formler som t.ex. joner (NO2-)...

kommenterade 2 mars 2016

Jag lyckades lösa det! Till alla andra så ska den inte klara (NH4)H2AsO4, H2C(CH)CN och Li(AlSi2O6), men CH3(CH2)16COOH ska den klara.

Lärare kommenterade 3 mars 2016

En syntaxregel kan innehålla ett epsilon ε som betyder att det matchar inget tecken.

ε | A | B

matchar A eller B eller tomma strängen. 

kommenterade 6 mars 2016

Hej!

När vi testar vår kod på kattis misslyckas den på test 3 för oss också, men när vi testar själva fungerar dem ovannämnda formlerna och våra tester som de ska. Vad kan vi ha gjort för fel?

Vi har ID: 1075263.

Lärare kommenterade 6 mars 2016

Det går inte att hjälpa dig om du inte registrerar dig i kattis (tryck på jag är student och läser denna kurs länken på tildav16). Hur många egna testfall har ni konstruerat?

kommenterade 7 mars 2016

Oj, hade missat den länken helt, men nu är jag registrerad på kursen på kattis.

10st egna testfall har vi utöver de man fick från uppgiften. Vi lyckades hitta problem i vår kod med våra egna testfall men när koden nu klarar alla testen så vet vi inte vad som är felet.

Lärare kommenterade 7 mars 2016

Har du ett inskickningsid?

En användare har tagit bort sin kommentar
kommenterade 7 mars 2016

Vi lyckades till slut lösa det efter en hel del svett och tårar, tack ändå!

kommenterade 8 mars 2016

Tips om ni har problem med Kattis trots att ni har löst uppgiften: Man behöver göra en .strip("\n") på alla rader i inputen för att formlerna ska tas in korrekt!

Lärare kommenterade 8 mars 2016

I allmänhet är .strip() är bättre än .strip(\n) eftersom det tar bort fler tecken, t.ex. både radmatning och retur.

kommenterade 9 mars 2016

Vi har samma problem med testfall 3. kl 14:37:06

ID: 1079699

mail: petraol@kth.se

kommenterade 10 mars 2016

Vi fastnade på att vi stavade "parantes" och inte "parentes"! Kolla det om ni har problem :)

Lärare kommenterade 10 mars 2016

@Linnea Programmet ser ut att bedöma molekylerna i testfallet rätt (godkända blir godkända och felaktiga underkända). Det ser att vara detaljer i utskrifterna som skiljer. Ni skriver t.ex. ut:

Saknad siffra vid radslutet )

Den sista parentesen ska inte skrivas ut. 

kommenterade 16 mars 2016

Hallå Alexander!

Vi är lite förvirrade över benämningen på molekylernas olika delar!

readformel() - Det här förstår vi, formel syftar på hela strängen som är indata, vare sig den är kort som Au eller lång som Si(C3(COOH)2)4(H2O)7

readmol() - Här är vi förvirrade, vad definierar en mol i det här fallet? Är det allt som står inom två parenteser, till exempel "H2O" i Fe(H2O)?

readgroup() - Men om mol är det som står i en parentes, vad är då en group? 

readatom() - Detta är lättare att tolka. Vi tänker på det som vad som helst som börjar med en stor bokstav, till exempel Sn, Pb, H eller N. Eller kan en atom ha siffror på slutet också, eller är det en group?

Lärare kommenterade 16 mars 2016
<group> ::= <atom> |<atom><num> | (<mol>) <num>

En grupp är antingen en atom, eller flera atomer, eller så är det en molekyl som står i parentes.

<mol>   ::= <group> | <group><mol>

En molekyl är antingen en grupp eller rekursivt en grupp och en molekyl

Jag vet inte om följande hjälper men om vi tar ert exempel Fe(H2O) och stannar på vad som är grupper i något steg så får vi Fe(H2O) -> mol -> grupp(mol) molekylen i parentes ->  grupp(grupp mol) -> grupp (grupp grupp)

kommenterade 18 mars 2016

Problem vid testfall 3. kl 11:04:14

ID: 1090304

mail: ambergs@kth.se

En användare har tagit bort sin kommentar
kommenterade 18 mars 2016

Tjena Alex!

Vi håller på att knyta ihop säcken med labb 9 här nu, ditt senaste svar hjälpte verkligen till att klara upp vissa saker vi var konfunderade av.

Vår första fråga gäller Kattis! Vilka filer ska vi ladda upp? Vi har en testfil som innehåller vårt unittest, en fil som innehåller vår klass för en länkad lista och till sist vår main.py som innehåller alla funktioner för denna labb. Ska alla tre laddas upp... eller???

Vår andra fråga gäller testfilen. Som det ser ut nu har vi skrivit varje test som

" self.assertEqual(readFormel("Nacl"), "Saknad stor bokstav vid radslutet cl")"

Men eftersom vi raisar ett fel när syntaxen inte stämmer, så får vi inte ut någon sträng av funktionsanropet readFormel("Nacl") som går att jämföra med önskat felmeddelande. Vi tror att det är problemet i alla fall, grejen är att vi inte riktigt vet. Så vilket kommando i Unittest skulle du rekommendera för denna labb?

kommenterade 18 mars 2016

Aha, genom en snilleblixt kom vi på att assertRaises() finns. Men felet blir det samma som tidigare, nämligen Grammatikfel raisas och hela testet avbryts istället för att Grammatikfel fångas som väntat och testet fortskrider....

kommenterade 18 mars 2016

Hej,

Får fel i testfall 3. Väldigt osäker på vad som inte fungerar. Vi har gjort egna tester som matchar och dessa ger full pott.

ID 1090379

mail: dui@kth.se

kommenterade 23 mars 2016

Hej!

Våra egna tester funkar felfritt och vi har brottats med Kattis jättelänge. Vi har flera gånger rättat till buggar av olika slag, men på sistone har vi inte hittat några och ändå funkar det inte. Eftersom hon inte ger någon detaljerad kritik blir det omöjligt att noggrannt buggtesta vårt program.

ID: 1098353

mail: aweinz@kth.se

Lärare kommenterade 23 mars 2016

Jag kan inte hjälpa dig om du inte registrerar dig på kursen även på kattis. 

kommenterade 23 mars 2016

Gjort!

Vi kom förbi problemet med "Wrong answer" i första testet, men nu har vi "RuntimeError" i tredje. Här är vår senaste körning: 1098666

kommenterade 27 mars 2016

Hej!

Har gort klart labb 9 alla mina egna tester ger godkänt men får "Run Time Error" på Kattis. 

ID: 1102759

rutaa@kth.se

Lärare kommenterade 27 mars 2016

@Ruth

Tala om för Kattis att du följer kursomgången tildav16 så kan vi lärare se din inskickning.

En användare har tagit bort sin kommentar
kommenterade 28 mars 2016

Hej igen! 

Jag hittade problemet så nu godkänner Kattis lösningen. Tack ändå :) 

En användare har tagit bort sin kommentar
En användare har tagit bort sin kommentar
kommenterade 31 mars 2016

Hej!

Även jag har problem med testfall 3.

ID:1107912

mail:svanteni@kth.se

Lärare kommenterade 31 mars 2016

@Clarissa

Det verkar vara testfall 1 (i labblydelsen) som Kattis klagar på. Skriv in testfallen från labblydelsen i en fil och provkör dom först innan du skickar in till Kattis!

kommenterade 31 mars 2016

Hejsan,

sitter också fast med testfall 3. Vi har ett 50-tal testfall som alla ger korrekt resultat och börjar därför tröttna något, en liten hint om vart vi ska kolla vore varmt uppskattat.

id: 1107863
e
mail: adamlew@kth.se
tid: 16:45:55

Lärare kommenterade 31 mars 2016

@Svante @Adam

Om det finns flera fel på raden så ska det första felet skrivas ut.

kommenterade 1 april 2016

Tack så mycket!

kommenterade 1 april 2016

Hej!

Jag får wrong answer på testfall 4, vet inte vad det är som blir fel?

ID: 1108732
11:08:35
camahl@kth.se

Lärare kommenterade 1 april 2016

@Camilla:

Har du med alla atomer?

kommenterade 1 april 2016

Nu fungerar det, tack snälla!

En användare har tagit bort sin kommentar
kommenterade 1 april 2016

Får wrong anwer, vad blir fel?

ID: 1108969

Lärare kommenterade 2 april 2016

@Carl:

Titta på problembeskrivningen. När du provkör ditt program ska testdata i Sample Input 1 ge utmatningen som du ser i Sample Input 2. 

kommenterade 2 april 2016

Har kört Kattis en massa gånger nu, en gång kom vi till steg 3 men annars fastnar vi alltid i steg 1. Alla exempel på uppgiftsbeskrivningen fungerar utan problem, och likaså ger alla de konstiga formler våra klasskamrater föreslagit det resultat vi väntar oss.

ID 1109733

Börjar bli trött på att stångas med en korkad robot som inte ger någon vettig felrapport! Hjälp tack!

kommenterade 2 april 2016

Testa att programmet hanterar symboler som: "+", "-" och så vidare, det var något som gav mig fel ett tag (tror jag åtminstone).

Lärare kommenterade 2 april 2016

@Marcus:

Provkör gärna programmet innan ni skickar in till Kattis, så är det lättare för er att se vad som är fel.

Enligt problembeskrivningen ska indata "Na" ge utskriften "Formeln är syntaktiskt korrekt", inte "Felaktig gruppstart vid radslutet".

En användare har tagit bort sin kommentar
kommenterade 3 april 2016

@Linda

Detta är svaren vårt program producerar när vi matar in testdatan som finns i uppgiftsbeskrivningen (ingen av dem har något mellanslag på slutet):

Formeln är syntaktiskt korrekt
Formeln är syntaktiskt korrekt
Formeln är syntaktiskt korrekt
Formeln är syntaktiskt korrekt
Okänd atom vid radslutet 4)5
Saknad siffra vid radslutet C
Saknad högerparentes vid radslutet
Felaktig gruppstart vid radslutet )Fe
För litet tal vid radslutet
För litet tal vid radslutet C
För litet tal vid radslutet 2C
Saknad stor bokstav vid radslutet cl
Saknad stor bokstav vid radslutet a
Felaktig gruppstart vid radslutet )3
Felaktig gruppstart vid radslutet )
Felaktig gruppstart vid radslutet 2

Förutom detta har vi buggkollat programmet i två veckors tid, för att det inte ska krascha oavsett vilken bisarr indata den får.

Men om Kattis sätter programmet i vrångstrupen och får helt andra utdata än vad vi får när vi kör programmet i IDLE, trots att indatan är den samma, då har jag verkligen ingen aning längre om vilka ändringar vi borde göra för att hon ska acceptera programmet. 

kommenterade 3 april 2016

@Linda

Här är den senaste versionen, denna fastnar på runtime error i tredje testdelen. 

ID: 1111219

Lärare kommenterade 3 april 2016

@Marcus

Jag laddade ner det program du länkade till och provkörde, då fick jag Felaktig gruppstart vid radslutet för Na osv. Men det kanske var en gammal version du råkade skicka?

Jag kollar på den nya!

Lärare kommenterade 3 april 2016

Kattis har helt rätt - ert program kraschar om kön tar slut...

kommenterade 3 april 2016

@Linda

Hej!
jag har också problem med att kattis inte vill acceptera min submission. jag får att det ser fel svar. tror du att man kan få lite hjälp med vad kattis ej uppskattar. min sumbission har kod 1111333

tack för hjälpen! 

Lärare kommenterade 3 april 2016

@Ludvig

Tyvärr - du har inte anslutit dig till kursomgången tildav16 i Kattis så jag kan inte följa länken.

kommenterade 3 april 2016

@Linda

Hej! jag har nu registrerat till kursen, och ifall du inte kan se de gamla testen så körde jag igen; här är koden 1111455.

tack på förhand 

Lärare kommenterade 3 april 2016

@Ludvig

Nu syns den!

Kolla vad syntaxregeln för <num> egentligen säger. Vilka tal ska godkännas?

kommenterade 3 april 2016

@Linda

För det första: tack så mycket för dina snabba svar. För det andra: jag förstår inte riktigt.

Din kommentar "Kattis har helt rätt - ert program kraschar om kön tar slut..." förbryllar mig. Det är nämligen så att vårt program slutade krascha för att kön tog slut i version två. Oavsett om du laddade ner den senaste versionen (1111219) eller någon äldre, begriper jag inte hur det kan krascha när Kattis kör det. 

Om programmet kraschar när kön tar slut, är det inte bara buggigt, det är oanvändbart, och om det betedde sig så när vi körde det eller när det matades med den testdata vi blivit givna, skulle vi inte ha laddat upp det. 

Nu är det ju så att Kattis testdata är hemlig, och det gör det mycket svårt för oss att åtgärda problemet, även om vi tack vare dig känner till problemets natur nu. Från vår synvinkel, och baserat på den data vi fått, fungerar ju programmet faktiskt precis som det ska. Om Kattis inte avslöjar sina krav på programmet, kan vi inte eller leverera något som lever upp till dem. Om Kattis var en chef skulle det vara dags att ta avsked.

Lärare kommenterade 3 april 2016

Ni har missuppfattat Kattis roll - Kattis är inte en motståndare utan ett stöd.

Chefen är den som har bett er att skriva programmet. Hen förväntar sig att ni själva hittar på egna testfall och att ni ser till att programmet fungerar enligt specifikationen innan det skickas till kunden.

Kattis är mer som den erfarna kollegan som kastar en blick på programmet och säger att ni bör testa lite till innan ni lämnar programmet till chefen. Ni är förstås mycket tacksamma för att kollegan tar sig tid.

kommenterade 4 april 2016

@Linda

Jag inser att vi har helt olika uppfattningar om Kattis. I din erfarenhet är hon en pålitlig kollega som du lärt känna under en lång lång tid. Jag har tyvärr upplevt en helt annan sida. Vi måste börja om på nytt om det här samtalet ska bli meningsfullt.

Vi är överens om att Kattis ändå har vissa brister – den främsta är att hon inte kan tänka. Vi är också överens om att hon har många kvalitéer: hon är snabbare, noggrannare och rättvisare än någon asse. 

Den respekt och och tillit assarna känner för hennes förmågor märks väldigt tydligt på hur snabbt de råder oss att kolla med henne ytterligare en gång, så fort vi ställer frågor om labben. Detta är ett bevis på fördelarna ett artöverskridande samarbete mellan människor och robotar kommer medföra i framtiden, men också ett tecken på vilken sida som kommer fylla den tjänande rollen i samhället.

Men nu är det ju faktiskt ändå så att Kattis inte kan tänka, och det begränsar allvarligt hennes kommunikation. Och nu är det så, att jag inte förstår vad hon menar, samtidigt som specen enligt alla tecken vi har att gå efter är uppfylld. Trots hennes välvilja är hennes kritik inte till hjälp.

Då är det ju tur att det inte är Kattis som är lärare i kursen, så jag har någon annan att vända mig till när jag inte förstår hur hon fungerar eller vad hon menar. Inte sant?

En användare har tagit bort sin kommentar
kommenterade 4 april 2016

Hej.

VI har lite problem med ett uncaught exception vi ej kan finna

Hjälp uppskattas!

ID: 1112047

Lärare kommenterade 4 april 2016

@Mattias

Du kan inte öppna filer i kattis. Hårdkoda atomerna i programmet.
open("atomer.txt", "r")

Lärare kommenterade 4 april 2016

@Marcus

Ditt program kraschar i peek. Du får nullpointer exception på self.first.value. Har du provat ditt program på sample data? Se till att ditt program får samma utskrift som i exemplet. Notera att # inte ska ge någon utskrift.