Menu
Coddy logo textTech

Структуры Book и User

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

challenge icon

Задание

Легко

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

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

  • book.go: Определите структуру Book с полями ID, Title, Author, ISBN и Available (логическое значение). Создайте функцию-конструктор NewBook, которая принимает ID, название, автора и ISBN в качестве параметров и возвращает указатель на новую Book. Новые книги всегда должны начинать как доступные. Добавьте метод Info(), который возвращает details книги в формате: [ID] "Title" by Author (ISBN: [isbn]) - Available: [true/false]
  • user.go: Определите структуру User с полями ID, Name, Email и BorrowedBooks (срез строк для хранения ID книг). Создайте конструктор NewUser, который принимает ID, имя и email и возвращает указатель на нового User с пустым списком взятых книг. Добавьте метод Info(), который возвращает: Member: [Name] ([Email]) - Books borrowed: [count]
  • main.go: Объедините модели, создав книги и пользователей из входных данных, а затем выведите их информацию.

    Прочитайте number книг, затем для каждой книги прочитайте её ID, название, автора и ISBN в отдельных строках. Далее прочитайте number пользователей, а для каждого пользователя прочитайте его ID, имя и email в отдельных строках.

    Выведите info каждой книги в отдельной строке, затем info каждого пользователя также в отдельной строке.

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

  • Number of books
  • Для каждой книги: ID, title, author, ISBN (каждое значение в отдельной строке)
  • Number of users
  • Для каждого пользователя: ID, name, 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

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

[B001] "The Go Programming Language" by Alan Donovan (ISBN: 978-0134190440) - Available: true
[B002] "Clean Code" by Robert Martin (ISBN: 978-0132350884) - Available: true
Member: Alice Smith (alice@library.com) - Books borrowed: 0

А для:

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

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

[B100] "Design Patterns" by Gang of Four (ISBN: 978-0201633610) - Available: true
Member: Bob Jones (bob@email.com) - Books borrowed: 0
Member: Carol White (carol@email.com) - Books borrowed: 0

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

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

package main

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

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

	// Прочитать количество книг
	numBooksStr, _ := reader.ReadString('\n')
	numBooks, _ := strconv.Atoi(strings.TrimSpace(numBooksStr))

	// TODO: Создать слайс для хранения книг

	// Прочитать детали каждой книги
	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: Создать новую книгу используя конструктор NewBook и добавить в слайс
	}

	// Прочитать количество пользователей
	numUsersStr, _ := reader.ReadString('\n')
	numUsers, _ := strconv.Atoi(strings.TrimSpace(numUsersStr))

	// TODO: Создать слайс для хранения пользователей

	// Прочитать детали каждого пользователя
	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: Создать нового пользователя используя конструктор NewUser и добавить в слайс
	}

	// TODO: Вывести информацию о каждой книге используя метод Info()

	// TODO: Вывести информацию о каждом пользователе используя метод Info()

	fmt.Println() // Заглушка - удалить при реализации
}

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

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