Menu
Coddy logo textTech

Bücher und Mitglieder

Teil des Abschnitts Objektorientierte Programmierung der R-Journey von Coddy. Lektion 50 von 57.

In diesem Projekt erstellst du den Kern eines Bibliothekssystems mit Referenzklassen, da sich Bücher und Mitglieder ändern, während das Programm läuft: Ein Buch wird verliehen und zurückgegeben, die Liste der Ausleihen eines Mitglieds wird länger und kürzer. Ein Library-Objekt empfängt Befehle, einen pro Zeile, und antwortet auf jeden einzelnen. In fünf Schritten lernst du, Bücher und Mitglieder hinzuzufügen, Bücher zu verleihen und zurückzunehmen, im Katalog zu suchen und einen Bericht auszugeben.

ADD_BOOK 1 Dune
JOIN ada
BORROW ada 1
RETURN ada 1
SEARCH dune
REPORT

Das Programm hat eine Klasse pro Datei. Book.R und Member.R enthalten die beiden kleinen Klassen, und Library.R enthält die Klasse, die sie in zwei benannten Listen speichert und die Befehle beantwortet. Da RC-Objekte Referenzen sind, ändert das Ändern eines Buchs, das in der Liste gefunden wurde, das Buch in der Bibliothek:

Book <- setRefClass("Book", fields = list(id = "numeric", title = "character", borrower = "character"))
books <- list()
books[["7"]] <- Book$new(id = 7, title = "Dune")
b <- books[["7"]]
b$borrower <- "ada"
cat(books[["7"]]$borrower, is.null(books[["9"]]))

Ausgabe:

ada TRUE

handle(line) teilt den Befehl auf und verwendet switch() für sein erstes Wort, um die Methode für diesen Befehl aufzurufen. Jede Methode gibt ihre Antworten als Zeichenvektor zurück, sodass ein Befehl wie REPORT mit mehreren Zeilen antworten kann. Ein Titel kann Leerzeichen enthalten, daher umfasst er alles nach der ID:

p <- strsplit("ADD_BOOK 7 The Hobbit", " ")[[1]]
id <- as.numeric(p[2])
title <- paste(p[-(1:2)], collapse = " ")
cat(id, title, sep = ": ")

Ausgabe:

7: The Hobbit
challenge icon

Aufgabe

Einfach

Die Klassen Book (Felder id, title, borrower) und Member (Felder name, borrowed) sind vorgegeben. Vervollständige zwei Methoden von Library in Library.R:

  • add_book(id, title) für ADD_BOOK <id> <title>: Speichere ein neues Buch unter as.character(id) und antworte mit added book 1: Dune; wenn die ID bereits vergeben ist, antworte mit book 1 exists.
  • join(name) für JOIN <name>: Speichere ein neues Mitglied unter dem Namen und antworte mit welcome ada; wenn der Name bereits existiert, antworte mit ada is already a member.

Der bereitgestellte Code übergibt jede Eingabezeile an lib$handle(line) und gibt jede zurückgegebene Antwort in einer eigenen Zeile aus. Mitgliedsnamen sind einzelne Kleinbuchstabenwörter, Buch-IDs sind ganze Zahlen, und die Eingabe enthält nur die bisher beschriebenen Befehle. Bei jedem anderen Befehl wird mit unknown command geantwortet.

Dein Code gehört in Book.R, Member.R und Library.R. main.R enthält den bereitgestellten Ein-/Ausgabecode und kann nicht bearbeitet werden.

Probier es selbst

source("Book.R")
source("Member.R")
source("Library.R")

# Gelieferter Ein-/Ausgabecode: belasse ihn wie er ist
input <- suppressWarnings(readLines(file("stdin")))
lib <- Library$new()
for (line in input) {
  for (reply in lib$handle(line)) cat(reply, "\n", sep = "")
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-R-Compiler