Menu
Coddy logo textTech

System wypożyczeń

Część sekcji Programowanie obiektowe ścieżki GO w Coddy. Lekcja 100 z 107.

challenge icon

Wyzwanie

Łatwy

Zbudujmy system wypożyczania na potrzeby naszego projektu zarządzania biblioteką! Utworzysz strukturę Library, która zarządza zbiorami książek i użytkowników, oraz metody obsługujące wypożyczanie i zwroty — z odpowiednią walidacją.

Rozmieścisz kod w czterech plikach:

  • book.go: Struktura Book z poprzedniej lekcji, zawierająca pola ID, Title, Author, ISBN i Available. Dodaj konstruktor NewBook, który inicjalizuje książki jako dostępne.
  • user.go: Struktura User z polami ID, Name, Email i BorrowedBooks (wycinek identyfikatorów książek). Dodaj konstruktor NewUser, który inicjalizuje użytkowników z pustą listą wypożyczonych książek.
  • library.go: Utwórz strukturę Library, która przechowuje książki i użytkowników w mapach (z identyfikatorami jako kluczami). Zbuduj następujące elementy:
    • Konstruktor NewLibrary, który inicjalizuje puste mapy książek i użytkowników
    • Metodę AddBook, która dodaje książkę do biblioteki
    • Metodę AddUser, która dodaje użytkownika do biblioteki
    • Metodę Borrow, która przyjmuje identyfikator użytkownika i książki, sprawdza poprawność operacji, oznacza książkę jako niedostępną, dodaje jej identyfikator do listy wypożyczonych książek użytkownika i zwraca błąd, jeśli coś pójdzie nie tak
    • Metodę Return, która cofa proces wypożyczenia: oznacza książkę jako dostępną i usuwa ją z listy wypożyczonych książek użytkownika

    Metoda Borrow powinna zwracać następujące błędy:

    • user not found, jeśli identyfikator użytkownika nie istnieje
    • book not found, jeśli identyfikator książki nie istnieje
    • book not available, jeśli książka jest już wypożyczona

    Metoda Return powinna zwracać następujące błędy:

    • user not found, jeśli identyfikator użytkownika nie istnieje
    • book not found, jeśli identyfikator książki nie istnieje
    • book not borrowed, jeśli książka jest już dostępna
  • main.go: Połącz wszystkie elementy: utwórz bibliotekę, dodaj książki i użytkowników, a następnie obsłuż operacje wypożyczenia i zwrotu.

    Wczytaj liczbę książek, a następnie dla każdej książki wczytaj jej identyfikator, tytuł, autora i numer ISBN. Następnie wczytaj liczbę użytkowników, a dla każdego użytkownika jego identyfikator, imię i nazwisko oraz adres e-mail. Na koniec wczytaj liczbę operacji, z których każda ma postać borrow [userID] [bookID] lub return [userID] [bookID].

    Dla każdej operacji wypisz OK, jeśli zakończy się powodzeniem, lub Error: [message], jeśli się nie powiedzie.

Dane wejściowe będą miały następującą postać:

  • Liczba książek, a następnie identyfikator, tytuł, autor i numer ISBN każdej z nich (każda wartość w osobnym wierszu)
  • Liczba użytkowników, a następnie identyfikator, imię i nazwisko oraz adres e-mail każdego z nich (każda wartość w osobnym wierszu)
  • Liczba operacji, a następnie każda operacja w osobnym wierszu

Na przykład dla danych:

2
B001
The Go Programming Language
Alan Donovan
978-0134190440
B002
Clean Code
Robert Martin
978-0132350884
1
U001
Alice Smith
alice@library.com
4
borrow U001 B001
borrow U001 B001
return U001 B001
borrow U002 B001

Oczekiwany wynik:

OK
Error: book not available
OK
Error: user not found

A dla danych:

1
B100
Design Patterns
Gang of Four
978-0201633610
2
U001
Bob Jones
bob@email.com
U002
Carol White
carol@email.com
3
borrow U001 B100
borrow U002 B100
return U001 B100

Oczekiwany wynik:

OK
Error: book not available
OK

A dla danych:

1
B001
Go in Action
William Kennedy
978-1617291784
1
U001
Dave Miller
dave@test.com
2
return U001 B001
borrow U001 B999

Oczekiwany wynik:

Error: book not borrowed
Error: book not found

Zwróć uwagę, że Library pełni rolę centralnego koordynatora. Sprawdza poprawność wszystkich operacji przed zmianą stanu, dzięki czemu dane o książkach i użytkownikach pozostają zsynchronizowane. Odbiorniki wskaźnikowe pozwalają metodom modyfikować rzeczywiste dane przechowywane w mapach!

Spróbuj swoich sił

package main

import (
	"bufio"
	"fmt"
	"os"
	"strings"
)

func main() {
	reader := bufio.NewReader(os.Stdin)

	// Wczytaj liczbę książek
	var numBooks int
	fmt.Fscanln(reader, &numBooks)

	// TODO: Utwórz nową bibliotekę

	// TODO: Wczytaj dane każdej książki (ID, tytuł, autor, ISBN — każde w osobnym wierszu)
	// i dodaj je do biblioteki
	for i := 0; i < numBooks; i++ {
		id, _ := reader.ReadString('\n')
		id = strings.TrimSpace(id)
		title, _ := reader.ReadString('\n')
		title = strings.TrimSpace(title)
		author, _ := reader.ReadString('\n')
		author = strings.TrimSpace(author)
		isbn, _ := reader.ReadString('\n')
		isbn = strings.TrimSpace(isbn)

		// TODO: Utwórz książkę i dodaj ją do biblioteki
	}

	// Wczytaj liczbę użytkowników
	var numUsers int
	fmt.Fscanln(reader, &numUsers)

	// TODO: Wczytaj dane każdego użytkownika (ID, imię i nazwisko, adres e-mail — każde w osobnym wierszu)
	// i dodaj je do biblioteki
	for i := 0; i < numUsers; i++ {
		id, _ := reader.ReadString('\n')
		id = strings.TrimSpace(id)
		name, _ := reader.ReadString('\n')
		name = strings.TrimSpace(name)
		email, _ := reader.ReadString('\n')
		email = strings.TrimSpace(email)

		// TODO: Utwórz użytkownika i dodaj go do biblioteki
	}

	// Wczytaj liczbę operacji
	var numOps int
	fmt.Fscanln(reader, &numOps)

	// TODO: Przetwórz każdą operację
	// Format: "borrow [userID] [bookID]" lub "return [userID] [bookID]"
	for i := 0; i < numOps; i++ {
		line, _ := reader.ReadString('\n')
		line = strings.TrimSpace(line)
		parts := strings.Split(line, " ")

		// TODO: Przeanalizuj operację i wywołaj odpowiednią metodę
		// Wypisz "OK" w przypadku powodzenia lub "Error: [message]" w przypadku niepowodzenia
	}
}

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Go online