Hoppa till huvudinnehållet
Institutionen för informationsteknologi

PK1&PM1 HT-04: Inlämningsuppgift 2

Inledning

Uppgiften består i att skriva ett webbgränssnitt till kryptokorsordslösaren från inlämningsuppgift 1. Du skall dels konstruera en webbsida i vilken man kan fylla i ett kryptokorsord och dels ett ML-program för att kommunicera med webbsidan. Genom att klicka på en "lösningsknapp" skall webbsidan anropa ML-programet vilket löser kryptokorsordet och sedan visar en webbsida med lösningen.

Ditt ML-program skall alltså ta informationen från startwebbsidan, konstruera en lista med kryptoord, anropa funktionen solve som du skrev i inlämningsuppgift 1 och sedan skapa en ny webbsida där de möjliga lösningarna ritas upp.

Ordlistan skall inte vara inbyggd i ditt program utan det skall läsa in ordlistan från en fil.

Du skall installera webbsidan och kompilerat program i din egen webkatalog på institutionens datorsystem så att man direkt kan provköra den. Hur detta går till skall framgå av dokumentationen (se nedan).

Inmatning av kryptokorsordet

Webbgränssnittet skall starta med en webbsida där du matar in ditt kryptokorsord. Sidan skall visa ett rutnät där man kan skriva in tal i varje ruta, precis som i exemplen på kryptokorsord i inlämningsuppgift 1. Rutor som lämnas blanka skall inte ingå i några ord -- dvs de motsvarar de överkryssade rutorna från exemplen i inlämningsuppgift 1. Rutnätet skall vara åtminstonde så stort att alla exempel från inlämningsuppgift 1 ryms -- dvs minst 5 rader och 7 kolumner.

Ett enkelt sätt att skapa ett sådant rutnät är med en HTML-tabell där varje cell innehåller ett kort INPUT-fält.

Förutom en knapp som anropar korsordslösaren är det bra med en knapp som kan rensa korsordet.

Lösning av kryptokorsordet

Kryptokorsordet och ordlistan är inte direkt tillgängliga i en form som går att skicka till funktionen solve. Detta är en mycket vanlig situation i databehandling. Ditt program måste alltså hämta information dels från webbsidan och dels från ordlistan och göra om den till den form som argumenten till funktionen solve har.

För korsordet så innebär det att du måste läsa in alla korsordsrutorna -- t.ex. som en lista av korsordsrader där varje rad i sin tur är en lista av innehållet i rutorna i just den raden -- och sedan plocka ut själva kryptoorden ur korsordet eftersom solve vill ha en lista av kryptoord. Du måste också göra felkontroll på indata. Har t.ex. användaren stoppat in något annat än ett tal i en korsordsruta (eller lämnat rutan blank) så skall ditt program svara med en webbsida med felmeddelande.

För ordlistan innebär det att du måste sortera upp orden efter storlek eftersom solve vill ha en ordlista där ord av olika längd ligger i separata listor. Den stora respektive lilla ordlistan från inlämningsuppgift 1 finns i filerna /it/kurs/pkpm/public_html/ht04/labs/inlupp2/long.txt respektive /it/kurs/pkpm/public_html/ht04/labs/inlupp2/short.txt. Normalt skall du använda den långa ordlistan men t.ex. för testning kan det vara bra att på något sätt kunna välja den korta ordlistan eller någon helt annan ordlista.

Presentation av svaret

ML-programmet skall konstruera en webbsida som visar de matchningar som solve beräknar. Om programmet inte kunde lösa korsordet skall webbsidan tala om det. Eftersom det kan finnas väldigt många olika lösningar på enkla korsord så skall du sätta en gräns för hur många olika matchningar som visas -- t.ex. maximalt 10 stycken.

Ett enkelt sätt att visa en lösning är med en HTML-tabell där varje ruta innehåller den bokstav som motsvarar siffran i korsordet (eller blankt om motsvarande korsordsruta inte innehåller några siffror).

Dokumentation

Du skall skriva dokumentation till ditt program. Förutom de vanliga specifikationerna till varje funktion som skall finnas i programkoden, så innebär det att du skall skriva ett separat dokument som beskriver hur ditt program fungerar och hur man skall använda det. Dokumentet skall lämnas in som en pdf-fil (helst) eller en textfil. Inte som en Microsoft Word .doc-fil, TeX-källkod eller liknande.

Dokumentationen skall innehålla:

  1. Titel, författarnamn, uppgift om att detta är inlämningsuppgift 2 på denna kurs detta år, innehållsförteckning, inledning med sammanfattning av vad programmet gör.
  2. En "användarbeskrivning": en anvisning för hur man praktiskt använder ditt program för att mata in och lösa kryptokorsord, inklusive körexempel.
  3. En "programdokumentation": en beskrivning av hur ditt program egentligen fungerar:
    • Beskrivning av datatyper som du använder
    • Beskrivning av de behandlar indata och skapar utdata, vad de olika delfunktionerna gör och hur programflödet ser ut (alltså hur funktionerna anropar varandra). Det skadar inte att ge en beskrivning av algoritmen här.
  4. Du behöver inte ge en beskrivning av funktionen solve igen -- däremot bör du ha en hänvisning till dokumentationen för inlämningsuppgift 1.
  5. Beskrivning av kända brister hos programmet. Det kan vara sådant som du själv tycker är mindre lyckat gjort, funktioner enligt uppgiften som du trots tappra försök inte lyckats få till ordentligt eller saker som du tycker programmet borde göra fastän det inte krävs i uppgiften.

Det skall räcka att läsa dokumentationen för att förstå ditt program. Du kan inte utgå ifrån att läsaren också läst denna uppgiftsbeskrivning. Du kan alltså inte utlämna information från dokumentationen bara för att den finns i uppgiftsbeskrivningen. Å andra sidan behöver du inte ta med allt som finns i uppgiftsbeskrivningen. Instruktionerna för hur uppgiften skall genomföras behöver förstås inte finnas i programdokumentationen.

Dokumentationen är lika viktig som själva programmet. Är dokumentationen dålig så kommer du att få komplettering på uppgiften även om ditt program fungerar. Det är svårt att skriva en godkänd dokumentation som är kortare än två sidor.

Några tips:

Några praktiska tips som kommer att underlätta utförandet av uppgiften.

  • När du skall läsa in kryptokorsordet från webbsidan så undvik att ha 35 (eller vad det nu blir med tanke på storleken av korsordet) separata anrop till cgi_field_integer (eller vilken funktion du nu använder) för de olika rutorna. Skriv istället en rekursiv funktion där du systematiskt plockar in fälten ett i taget. Om fälten namnges på ett konsekvent sätt -- t.ex. ruta2-3 för tredje rutan i andra raden så är det enkelt att skriva en sådan funktion. Då är det också lätt att ändra programmet om du vill ha en annan storlek på korsordet.
  • Skriv så långt möjligt dokumentationen -- både funktionsspecifikationerna och den externa dokumentationen -- innan du börjar skriva programmet. Det vill säga: Tänk igenom hur du skall lösa uppgiften, skriv sedan dokumentationen och sist programmet.
  • Tänk ut datastrukturer först innan du skriver resten av koden.
  • Be om hjälp när du kör fast. Antingen via mail eller genom att söka upp din assistent eller föreläsare. Det är inte meningen att ni ska sitta i timtal och jaga en och samma bug. Om du å andra sidan inte skrivit ner hur du tänkt göra, typ, etc, så är det det första du kommer att bli ombedd att göra, så det är ingen mening att fråga om kodhjälp om du inte gjort det (annat än väldigt specifika frågor förstås).

Inlämning

  • Inlämningsuppgiften skall lösas individuellt! Du får givetvis diskutera uppgiften och olika lösningsmetoder med kurskamrater, men du får inte konstruera din lösning tillsammans med någon annan.
  • Lösningen skall lämnas in i tre delar -- en HTML-fil, en ML-fil och en dokumentationsfil. Överst i HTML- och ML-filerna skall du lägga en kommentar med kursens namn, texten "Inlämningsuppgift 2, datum och ditt namn.
  • ML-filen måste även innehålla koden till funktionen solve med hjälpfunktioner som du skrev i inlämningsuppgift 1. Lägg dessa först i filen och avgränsa dem tydligt, t.ex. med kommentarrader.
  • Du skall följa kodstandarden, bl.a. skall du skriva funktionsdeklarationer för alla funktioner du definierar och varianter för alla rekursiva funktioner. Detta är ännu viktigare än för labbarna. Eftersom du har nästan full frihet att utforma din lösning som du vill -- t.ex. beträffande vilka hjälpfunktioner du inför -- så är det mycket viktigt att assistenterna snabbt kan sätta sig in i vad din kod gör. Där spelar bra funktionsspecifikationer en viktig roll.
  • Lämna in din lösning enligt anvisningarna senast den 18/1 klockan 08:00!

Uppdaterad  2004-12-13 12:21:44 av Lars-Henrik Eriksson.