|
|
(19 mellanliggande versioner visas inte.) |
Rad 1: |
Rad 1: |
- | ==Prototyp==
| + | Se [[P-uppgift: Prototyp|Prototyp]] |
- | | + | |
- | När ditt kodskelett har blivit godkänt så är det dags att börja arbeta med en prototyp av programmet. Prototypen behöver inte implementera all funktionalitet. I biblioteksexemplet har vi valt att starta med inläsning och utskrift till fil. Vi har också lagt till de två första funktionerna i menyn: att söka på titel och att söka på författare.
| + | |
- | | + | |
- | När man jobbar med att skriva kod så upptäcker man ofta att den ursprungliga kodskelettet måste modifieras. Studera koden i exemplet nedan noggrannt och lägg märke till ändringarna.
| + | |
- | | + | |
- | # Klassen Bibliotek har bytt namn till Catalog, ett namn som bättre beskriver vad klassen representerar.
| + | |
- | | + | |
- | # Många av metoderna i Catalogklassen har ändrats. När vi började skriva koden så märkte vi att många av de ursprungliga metoderna i klassen Bibliotek gjorde två helt skilda saker: de gjorde både operationer på biblioteksdatabasen samtidigt som de skötte det textbaserade användargränssnittet. En bättre lösning är att metoderna i klassen Catalog endast hanterar databasoperationerna. Användargränsnittet har vi implementerat separat med hjälp av ett antal funktioner.
| + | |
- | | + | |
- | <pre># -*- coding: iso8859-1 -*-
| + | |
- | | + | |
- | ######################################################################
| + | |
- | #
| + | |
- | # Titel: Bibliotek (prototyp)
| + | |
- | # Författare: Stefan Nilsson
| + | |
- | # Datum: 2007-06-29
| + | |
- | #
| + | |
- | # 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. Varje rad innehåller en bok beskriven på
| + | |
- | # följande format:
| + | |
- | #
| + | |
- | # <AUTHOR>/<TITLE>
| + | |
- | #
| + | |
- | # eller
| + | |
- | #
| + | |
- | # <AUTHOR>/<TITLE>/Utlånad
| + | |
- | #
| + | |
- | # om boken är utlånad. Exempel på datafil:
| + | |
- | #
| + | |
- | # Bälter/Programmeringsteknik med Python/Utlånad
| + | |
- | # Bälter/Pythonvetaren
| + | |
- | #
| + | |
- | ######################################################################
| + | |
- | | + | |
- | | + | |
- | ######################################################################
| + | |
- | # 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.
| + | |
- | # Format: <author>: <title> (utlånad)
| + | |
- | def string(self):
| + | |
- | author_and_title = self.author + ': ' + self.title
| + | |
- | if self.isBorrowed:
| + | |
- | return author_and_title + ' (utlånad)'
| + | |
- | else:
| + | |
- | return author_and_title
| + | |
- | | + | |
- | | + | |
- | ######################################################################
| + | |
- | # En klass som beskriver en bibliotekskatalog.
| + | |
- | # books - en lista som innehåller samtliga böcker.
| + | |
- | ######################################################################
| + | |
- | class Catalog:
| + | |
- | # Skapar en bibliotekskatalog med de böcker som finns i filen.
| + | |
- | def __init__(self, filename):
| + | |
- | self.books = list()
| + | |
- | file = open(filename, 'r')
| + | |
- | line = file.readline()
| + | |
- | while (line != ''):
| + | |
- | parts = line.split('/')
| + | |
- | if (len(parts) >= 2):
| + | |
- | book = Book(parts[0], parts[1])
| + | |
- | if len(parts) == 3:
| + | |
- | book.isBorrowed = True
| + | |
- | self.books.append(book)
| + | |
- | line = file.readline()
| + | |
- | | + | |
- | # Sparar hela bibliotekskatalogen i en fil.
| + | |
- | def save(self, filename):
| + | |
- | file = open(filename, 'w')
| + | |
- | for book in self.books:
| + | |
- | file.write(book.author + '/' + book.title)
| + | |
- | if book.isBorrowed:
| + | |
- | file.write('/Utlånad')
| + | |
- | file.write('\n')
| + | |
- | | + | |
- | # Returnerar boken om den finns, annars None.
| + | |
- | # Skiljer inte på små och stora bokstäver.
| + | |
- | def find_title(self, title):
| + | |
- | for book in self.books:
| + | |
- | if are_equal(title, book.title):
| + | |
- | return book
| + | |
- | return None
| + | |
- | | + | |
- | # Returnerar en lista på böcker av en viss författare.
| + | |
- | # Return en tom lista om det inte finns några böcker.
| + | |
- | # Skiljer inte på stora och små bokstäver.
| + | |
- | def find_author(self, author):
| + | |
- | book_list = list()
| + | |
- | for book in self.books:
| + | |
- | if are_equal(author, book.author):
| + | |
- | book_list.append(book)
| + | |
- | return book_list
| + | |
- | | + | |
- | | + | |
- | ######################################################################
| + | |
- | # Hjälpfunktioner
| + | |
- | ######################################################################
| + | |
- |
| + | |
- | # Returnerar True om s1 och s2 är lika.
| + | |
- | # Skiljer inte på små och stora bokstäver och tar bort
| + | |
- | # eventuella blanktecken i början och slutet av strängen.
| + | |
- | def are_equal(s1, s2):
| + | |
- | return s1.strip().upper() == s2.strip().upper()
| + | |
- | | + | |
- | | + | |
- | ######################################################################
| + | |
- | # Funktioner för textgränssnitt
| + | |
- | ######################################################################
| + | |
- | | + | |
- | INDENT = ' ' # Tomma tecken i början av indragna rader
| + | |
- | | + | |
- | # Skriver ut valmenyn.
| + | |
- | def print_menu():
| + | |
- | print INDENT, 'T söka på Titel.'
| + | |
- | print INDENT, 'F söka på Författare.'
| + | |
- | print INDENT, 'L Låna bok.'
| + | |
- | print INDENT, 'Å Återlämna bok.'
| + | |
- | print INDENT, 'N lägga in Ny bok.'
| + | |
- | print INDENT, 'B ta Bort bok.'
| + | |
- | print INDENT, 'A lista Alla böcker.'
| + | |
- | print INDENT, 'S Sluta.'
| + | |
- | | + | |
- | # Läser in och returnerar första bokstaven i användarens val.
| + | |
- | # Omvandlar liten bokstav till stor.
| + | |
- | def choose():
| + | |
- | choice = raw_input('Vad vill du göra? ')
| + | |
- | return choice[0].upper()
| + | |
- | | + | |
- | # Söker på titel.
| + | |
- | def search_title(catalog):
| + | |
- | title = raw_input('Vilken titel vill du söka efter? ')
| + | |
- | book = catalog.find_title(title)
| + | |
- | if (book == None):
| + | |
- | print INDENT, 'Hittade ingen bok med den titeln.'
| + | |
- | else:
| + | |
- | print INDENT, book.string()
| + | |
- | | + | |
- | # Söker på författare.
| + | |
- | def search_author(catalog):
| + | |
- | author = raw_input('Vilken författare vill du söka efter? ')
| + | |
- | book_list = catalog.find_author(author)
| + | |
- | if len(book_list) == 0:
| + | |
- | print INDENT, 'Hittade inga böcker av den författaren.'
| + | |
- | else:
| + | |
- | print INDENT, 'Hittade',
| + | |
- | print len(book_list),
| + | |
- | print 'böcker'
| + | |
- | for book in book_list:
| + | |
- | print INDENT, book.string()
| + | |
- | | + | |
- | # Lånar en bok.
| + | |
- | def borrow_book(catalog):
| + | |
- | return
| + | |
- | | + | |
- | # Återlämnar en bok.
| + | |
- | def return_book(catalog):
| + | |
- | return
| + | |
- | | + | |
- | # Lägger till en ny bok.
| + | |
- | def add_book(catalog):
| + | |
- | return
| + | |
- | | + | |
- | # Tar bort en bok.
| + | |
- | def delete_book(catalog):
| + | |
- | return
| + | |
- | | + | |
- | | + | |
- | ######################################################################
| + | |
- | # Huvudprogram
| + | |
- | ######################################################################
| + | |
- | | + | |
- | print 'Välkommen till biblioteksprogrammet!'
| + | |
- | | + | |
- | FILENAME = 'bibliotek.txt'
| + | |
- | catalog = Catalog(FILENAME)
| + | |
- | | + | |
- | # Testutskrift
| + | |
- | print 'Antal böcker:', len(catalog.books)
| + | |
- | for book in catalog.books:
| + | |
- | print book.string()
| + | |
- | | + | |
- | print_menu()
| + | |
- | | + | |
- | choice = choose();
| + | |
- | while choice != 'S':
| + | |
- | if choice == 'T':
| + | |
- | search_title(catalog)
| + | |
- | if choice == 'F':
| + | |
- | search_author(catalog)
| + | |
- | choice = choose()
| + | |
- | | + | |
- | catalog.save(FILENAME)
| + | |
- | | + | |
- | print INDENT, 'Välkommen åter!'</pre>
| + | |
- | | + | |
- | | + | |
- | ==Inlämningsuppgift 5==
| + | |
- | | + | |
- | TODO
| + | |