7. P-uppgift: kodskelett

Programmeringsteknik

(Skillnad mellan versioner)
Hoppa till: navigering, sök
Versionen från 28 juni 2007 kl. 13.09 (redigera)
KTH.SE:u1ndpe5c (Diskussion | bidrag)
(Kodskelett till bibliotek)
← Gå till föregående ändring
Versionen från 28 juni 2007 kl. 13.13 (redigera) (ogör)
KTH.SE:u1ndpe5c (Diskussion | bidrag)
(Kodskelett till bibliotek)
Gå till nästa ändring →
Rad 97: Rad 97:
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 trots att det ännu inte innehåller någon kod. 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 trots att det ännu inte innehåller någon 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 innehålla en lista som förklarar samtliga klassvariabler.+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 innehålla en lista som förklarar samtliga attribut (klassvariabler).
Exempel på ett kodskelett för den fiktiva P-uppgiften: Exempel på ett kodskelett för den fiktiva P-uppgiften:
Rad 112: Rad 112:
# En klass som beskriver en bok. # En klass som beskriver en bok.
-# Klassen innehåller följande variabler.+# Klassen innehåller följande attribut.
# author: namnet på författaren # author: namnet på författaren
# title: bokens titel # title: bokens titel
Rad 132: Rad 132:
# En klass som beskriver en bibliotekskatalog. # En klass som beskriver en bibliotekskatalog.
-# Klassen innehåller följande variabler.+# Klassen innehåller följande attribut.
# books: en lista som innehåller samtliga böcker. # books: en lista som innehåller samtliga böcker.
class Bibliotek: class Bibliotek:

Versionen från 28 juni 2007 kl. 13.13

Innehåll

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 cirka 60 timmar. Betyget i kursen ges av detta moment.

P-uppgiften redovisas i fyra steg, kodskelett, prototyp, granskning och slutredovisning (se nedan). Du måste boka en tid för slutredovisningen.

Uppgiftslydelsen till din P-uppgift får du med e-post så snart du är klar med de tre första inlämningsuppgifterna.


P-uppgiftens delmoment

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.

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.

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.

Slutredovisning

Du väljer (normalt via webben) 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.


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.


Fiktiv P-uppgift

I de fyra 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:

999 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.


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 trots att det ännu inte innehåller någon 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 innehålla en lista som förklarar samtliga attribut (klassvariabler).

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

# -*- coding: iso8859-1 -*-
#
# Titel: 999 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.
# Klassen innehåller följande attribut.
#    author: namnet på författaren
#    title: bokens titel
#    borrowed: 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.borrowed = False

    # Lånar ut den här boken
    def borrowBook():
        return

    # Lämnar tillbaks den här boken
    def returnBook():
        return

# En klass som beskriver en bibliotekskatalog.
# Klassen innehåller följande attribut.
#    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 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

# Läser in en ny katalog från fil.
FILENAME = 'bibliotek.txt'
bibliotek = Bibliotek(FILENAME)

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

# Sparar katalogen på fil.
bibliotek.save(FILENAME)

Inlämningsuppgift 4

TODO

Personliga verktyg