7. P-uppgift: kodskelett

Programmeringsteknik

Hoppa till: navigering, sök

Innehåll

[redigera] P-uppgift

Kursens sista moment är en större, personlig programmeringsuppgift i Python; en P-uppgift. Uppgifterna är tänkta att vara något så när svåra och tidskrävande, räkna med 40-80 timmar. Betyget i kursen ges av detta moment.

P-uppgiften redovisas i fyra steg, kodskelett, prototyp, granskning och slutredovisning (se nedan). Slutredovisningen görs på KTH och du kan boka en tid när du är klar med de tre första momenten.

Uppgiftslydelsen till din P-uppgift hämtar du från studentportalen. (Du måste dock vara klar med testet i avsnitt 1 innan du kan hämta din P-uppgift.)

P-uppgifterna är uppdelade i en grunduppgift och tre extrauppgifter som du kan göra för att få högre betyg. Extrauppgifterna för betyg B och C går att lösa med hjälp av de delar av Python som vi gått igenom hittills i kursen.

I extrauppgiften för betyg A ska du göra ett grafiskt användargränssnitt till ditt program och det ingår i uppgiften att lära sig detta på egen hand, till exempel genom att läsa på nätet om Pythons inbyggda GUI-verktyg som heter Tkinter. En samling bra länkar finns under rubriken GUI-länkar på kursens huvudsida.


[redigera] P-uppgiftens delmoment

[redigera] Kodskelett

Innan programmet skrivs ska en specifikation i form av ett kodskelett lämnas in. Syftet är att du ska tänka igenom problemet innan du försöker lösa det. Kodskelettet ska innehålla följande delar:

  • En inledande kommentar som kortfattat beskriver vad programmet gör och hur det är implementerat.
  • Funktioner (utan kod) med kommentarer.
  • Klasser med attribut och metoder (om du använder klasser), men utan kod.

[redigera] Prototyp

En prototyp är en första körbar version av programmet som innehåller den mest grundläggande funktionaliteten. I det här skedet behöver programmet ännu inte har fullt utbyggd felhantering, eventuella extrauppgifter behöver inte vara implementerade och vissa delar av programmet kan innehålla funktioner som ännu inte utför sin uppgift. Syftet med att lämna in en protyp är att vi ska kunna ge tips och råd om förbättringar och ändringar redan innan programmet är helt klart.

[redigera] Granskning

Innan det färdiga programmet kan redovisas för en handledare på KTH ska det testas (granskas) av en kurskamrat. Vid testen ska din granskare kritiskt granska ditt program, testköra det och fylla i ett granskningsprotokoll. Denna granskning är ett obligatoriskt moment. (Varje kursdeltagare måste granska en uppgift, och alla uppgifter som ska redovisas för handledare måste granskas först.) Syftet med granskningen är att du genom att kritiskt granska en annans program ska få en ökad förståelse för hur man ska (och inte ska) programmera.

[redigera] Slutredovisning

När du är klar med de tre första momenten så är det dags att välja en tid för slutredovisning på KTH. Uppgiftslydelsen, en utskrift av programmet samt granskningsprotokollet ska medföras till slutredovisningen. Observera att vi (för att förhindra fusk) jämför din lösning mot en databas som innehåller alla tidigare inlämningar som gjorts på kursen.

Betyget på kursen bestäms i samband med slutredovisningen. Det finns sex betygssteg, A-F, där A är det högsta betyget. A-E är alla godkända betyg och F är underkänt. Man får betyg

  • F om man har fler än 3 påpekanden eller inte uppfyller samtliga nödvändiga punkter i granskningsprotokollet.
  • E om man har 1-3 påpekanden och uppfyller samtliga nödvändiga punkter i granskningsprotokollet.
  • D om man har ett perfekt program (ett program utan påpekanden).
  • C om man har uppfyllt villkoren för betyg D och dessutom har gjort extrauppgift C.
  • B om man har uppfyllt villkoren för betyg C och dessutom har gjort extrauppgift B.
  • A om man har uppfyllt villkoren för betyg B och dessutom har gjort extrauppgift A.


[redigera] Krav på P-uppgiftslösningen

Utöver kraven på funktionalitet som finns i uppgiftslydelsen gäller detta alltid:

  • Programmet ska vara kommenterat upptill med författare, datum och ev revisionsdatum. Överkommentera inte programmet i övrigt. Tänk på att det är kvalitet och inte kvantitet på kommentarer som räknas.
  • Programmet ska vara användarvänligt och presentera sig vid programstart. Tydliga instruktioner ska ges på skärmen. Det ska vara lätt att förstå vad programmet skriver ut. Det är tillåtet att anta att indatafiler är felfria om inte annat anges i uppgiftslydelsen.
  • Programmet ska vara vettigt uppdelat i funktioner, och eventuellt klasser. Funktioner ska inte vara alltför långa (max en skärmsida). Det ska vara lätt att i efterhand gå in och förstå och ändra i programmet. Robust, flexibelt och lättläst är nyckelord.
  • Varje variabel och funktion ska vara försedd med kommentarer. Ange vad variabeln representerar och vad funktionen gör. För funktioner bör man också ange vad indata (parametrar) och utdata (retur-värde) betyder. Det ska räcka att läsa kommentar och funktionshuvud för att förstå hur en funktion ska användas.
  • Namn på variabler och funktioner ska vara vettiga. Alla deklarerade namn ska vara på samma språk, liksom alla kommentarer (engelska namn och svenska kommentarer är OK). Koden skall vara snyggt formaterad.
  • Nästan identiska kodstycken ska inte upprepas. Gör i stället generella funktioner. Inför inte i onödan begränsningar. Inför konstanter för sådant som man kan tänkas vilja ändra framöver (om man skulle vilja arbeta vidare med din lösning) och för tal som inte ska ändras och går att beskriva med namn.


[redigera] Fiktiv P-uppgift

I de sista avsnitten av kursen kommer vi att gå igenom ett exempel som visar hur en P-uppgiften kan se ut och hur de olika inlämningsmomenten är tänkta att fungera. Den fiktiva uppgiften går ut på att göra ett program för hantering av enklare biblioteksrutiner. Uppgiftslydelsen ser ut så här:

[redigera] Bibliotek

LÄS ANVISNINGARNA PÅ KURSENS WEBBPLATS INNAN DU BÖRJAR MED UPPGIFTEN!

Varudeklaration: Datastrukturer, sökning, sortering, filhantering, grafik.

Skriv ett program för hantering av enklare biblioteksrutiner. Programmet ska kunna söka efter böcker både med avseende på författare och titel. Man ska även kunna låna och lämna tillbaka böcker, lägga in nya böcker i registret och ta bort gamla böcker, samt skriva ut en lista på skärmen över alla böcker. Böckerna ska sorteras med avseende på författare.

Böckerna ska lagras på en textfil som du får skriva in själv. Din fil behöver inte innehålla fler än tio böcker men ditt program ska gå att använda även för ett stort antal böcker.

Exempel:

Välkommen till biblioteksprogrammet!
   T söka på Titel.
   F söka på Författare.
   L Låna bok.
   Å Återlämna bok.
   N lägga in Ny bok.
   B ta Bort bok.
   A lista Alla böcker.
   S Sluta.

Vad vill du göra? F
   Vilken författare vill du söka efter? Bälter
   Hittade 2 böcker
   Bälter: Programmeringsteknik med Python (utlånad)
   Bälter: Pythonvetaren

Vad vill du göra? L
   Ange titeln på den bok du vill låna: Pythonvetaren

Vad vill du göra? s
   Välkommen åter!

Tips: Skriv programmet i etapper. Börja med att läsa in böckerna från fil och skriva ut dem igen. Utöka sedan programmet stegvis.

Extrauppgift, betyg C: Inför felkontroll för användarens inmatning och filers existens.

Extrauppgift, betyg B: Låt programmet hålla reda på vem som lånat boken och vilket datum den ska återlämnas. Användaren ska kunna be om en lista på alla personer som lånat böcker, och vilka de lånat. Böcker som borde varit tillbakalämnade ska markeras.'Man ska också kunna få en lista på enbart personer som har böcker hemma vars datum gått ut tillsammans med dessa böcker och hur mycket personen är skyldig i böter. Kolla upp bötesregler på biblioteket!

Extrauppgift, betyg A: Gör ett grafiskt användargränssnitt till programmet.


[redigera] Kodskelett till bibliotek

I kodskelettet hoppar vi över extrauppgifterna. Eftersom uppgiften handlar om att lagra böcker i en databas så kan det vara lämpligt att ha en klass som heter Book som innehåller all information om en bok. Databasen kan vi representera som en lista av Book-objekt. De olika valaternativen i menyn implementerar vi med hjälp av funktioner. Eftersom kodskelettet kommer att utgöra basen för vårt program så ser vi till att programmet går att kompilera redan nu trots att det ännu inte innehåller fungerande kod. Det är därför samtliga metoder innehåller kommandot return i stället för riktig kod.

Observera att det ska finnas kommentarer till samtliga klasser, metoder och funktioner. Kommentaren i början av en klass ska beskriva vad klassen represerar samt en förklaring av klassens samtliga attribut (klassvariabler).

Exempel på ett kodskelett för den fiktiva P-uppgiften:

# -*- coding: iso8859-1 -*-

# Titel: Bibliotek
# Författare: Stefan Nilsson
# Datum: 2007-06-28
#
# Det här är ett program för hantering av enklare biblioteksrutiner.
# Programmet lagrar böckerna i en fil med namnet "bibliotek.txt"
# mellan körningarna.

# En klass som beskriver en bok:
#    author - namnet på författaren
#    title - bokens titel
#    isBorrowed - en variabel som är True om boken är utlånad.
class Book:
    # Skapar en ny bok.
    def __init__(self, author, title):
        self.author = author
        self.title = title
        self.isBorrowed = False

    # Returnerar en sträng som beskriver boken
    def string(self):
        return

# En klass som beskriver en bibliotekskatalog:
#    books - en lista som innehåller samtliga böcker.
class Bibliotek:
    # Skapar en bibliotekskatalog med de böcker som finns i filen.
    def __init__(self, filename):
        self.books = list()

    # Sparar hela bibliotekskatalogen i en fil.
    def save(self, filename):
        return

    # Skriver ut valmenyn.
    def meny(self):
        return

    # Läser in och returnerar användarens val.
    def choose(self):
        return

    # Söker på en titel.
    def findTitle(self, title):
        return

    # Söker på en författare.
    def findAuthor(self, author):
        return

    # Lånar en bok.
    def borrowBook(self, book):
        return

    # Återlämnar en bok.
    def returnBook(self, book):
        return

    # Lägger till en ny bok:
    def addBook(self, book):
        return

    # Tar bort en bok:
    def deleteBook(self, book):
        return

    # Returnerar en lista över alla böcker:
    def listBooks(self):
        return

# Huvudprogram

FILENAME = 'bibliotek.txt'
bibliotek = Bibliotek(FILENAME)

# choice = '';
# while choice != 'S':
#     bibliotek.meny()
#     choice = bibliotek.choose()
#     # Utför detta val.

bibliotek.save(FILENAME)

Det här kodskelettet är inte avsett att vara varken perfekt eller komplett. Det är inte bara koden som saknas; vi kommer också att behöva modifiera både funktioner och kommentarer efterhand som projektet fortskrider.


==Inlämningsuppgift: kodskelett

Skriv ett kodskelett till din P-uppgift och lämna in den på vanligt sätt under rubriken "P-uppgift Kodskelett".

Personliga verktyg