Menu
Coddy logo textTech

Система выдачи книг

Часть раздела Объектно-ориентированное программирование путешествия по GO на Coddy. Урок 100 из 107.

challenge icon

Задание

Легко

Давайте создадим систему выдачи книг для нашего проекта Library Management! Вы создадите структуру Library, которая управляет коллекциями книг и пользователей, с методами для обработки операций выдачи и возврата, включая надлежащую проверку данных.

Вы организуете код в четырех файлах:

  • book.go: ваша структура Book из предыдущего урока с полями ID, Title, Author, ISBN и Available. Включите конструктор NewBook, который инициализирует книги как доступные.
  • user.go: ваша структура User с полями ID, Name, Email и BorrowedBooks (срезом ID книг). Включите конструктор NewUser, который инициализирует пользователей с пустым списком выданных книг.
  • library.go: создайте структуру Library, которая хранит книги и пользователей в отображениях (с ключами, соответствующими их ID). Реализуйте следующие компоненты:
    • конструктор NewLibrary, который инициализирует пустые отображения для книг и пользователей
    • метод AddBook, который добавляет книгу в библиотеку
    • метод AddUser, который добавляет пользователя в библиотеку
    • метод Borrow, который принимает ID пользователя и ID книги, проверяет операцию, помечает книгу как недоступную, добавляет ID книги в список выданных книг пользователя и возвращает ошибку, если что-то пошло не так
    • метод Return, который отменяет процесс выдачи: помечает книгу как доступную и удаляет ее из списка выданных книг пользователя

    Метод Borrow должен возвращать следующие ошибки:

    • user not found, если ID пользователя не существует
    • book not found, если ID книги не существует
    • book not available, если книга уже выдана

    Метод Return должен возвращать следующие ошибки:

    • user not found, если ID пользователя не существует
    • book not found, если ID книги не существует
    • book not borrowed, если книга уже доступна
  • main.go: объедините все компоненты, создав библиотеку, добавив книги и пользователей, а затем обработав операции выдачи и возврата.

    Прочитайте количество книг, затем для каждой книги прочитайте ее ID, название, автора и ISBN. Затем прочитайте количество пользователей и для каждого пользователя — его ID, имя и email. После этого прочитайте количество операций, где каждая операция имеет вид borrow [userID] [bookID] или return [userID] [bookID].

    Для каждой операции выведите OK в случае успеха или Error: [message] в случае ошибки.

Будут предоставлены следующие входные данные:

  • Количество книг, затем ID, название, автора и ISBN каждой книги (каждое значение в отдельной строке)
  • Количество пользователей, затем ID, имя и email каждого пользователя (каждое значение в отдельной строке)
  • Количество операций, затем каждая операция в отдельной строке

Например, для следующих данных:

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

Вывод должен быть таким:

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

А для следующих данных:

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

Вывод должен быть таким:

OK
Error: book not available
OK

А для следующих данных:

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

Вывод должен быть таким:

Error: book not borrowed
Error: book not found

Обратите внимание, как Library выступает в роли центрального координатора. Она проверяет все операции перед изменением состояния, обеспечивая синхронизацию книг и пользователей. Использование указателей-получателей позволяет вашим методам изменять фактические данные, хранящиеся в отображениях!

Попробуйте сами

package main

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

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

	// Прочитать количество книг
	var numBooks int
	fmt.Fscanln(reader, &numBooks)

	// TODO: Создать новую библиотеку

	// TODO: Прочитать данные каждой книги (ID, Title, Author, ISBN на отдельных строках)
	// и добавить их в библиотеку
	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: Создать книгу и добавить в библиотеку
	}

	// Прочитать количество пользователей
	var numUsers int
	fmt.Fscanln(reader, &numUsers)

	// TODO: Прочитать данные каждого пользователя (ID, Name, Email на отдельных строках)
	// и добавить их в библиотеку
	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: Создать пользователя и добавить в библиотеку
	}

	// Прочитать количество операций
	var numOps int
	fmt.Fscanln(reader, &numOps)

	// TODO: Обработать каждую операцию
	// Формат: "borrow [userID] [bookID]" или "return [userID] [bookID]"
	for i := 0; i < numOps; i++ {
		line, _ := reader.ReadString('\n')
		line = strings.TrimSpace(line)
		parts := strings.Split(line, " ")

		// TODO: Разобрать операцию и вызвать соответствующий метод
		// Выведите "OK" при успехе или "Error: [message]" при ошибке
	}
}

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор Go