8. P-uppgift: prototyp

Programmeringsteknik

Hoppa till: navigering, sök

Prototyp

# -*- 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!'


Inlämningsuppgift 5

TODO

Personliga verktyg