Menu
CoddyTech

Sistem Peminjaman

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 100 dari 107.

challenge icon

Tantangan

Mudah

Mari bangun sistem peminjaman untuk proyek Manajemen Perpustakaan kita! Kamu akan membuat struct Library yang mengelola koleksi buku dan pengguna, dengan method untuk menangani operasi peminjaman dan pengembalian, lengkap dengan validasi yang tepat.

Kamu akan mengatur kodemu dalam empat file:

  • book.go: Struct Book dari pelajaran sebelumnya, dengan field ID, Title, Author, ISBN, dan Available. Sertakan konstruktor NewBook yang menginisialisasi buku agar tersedia.
  • user.go: Struct User dengan ID, Name, Email, dan BorrowedBooks (slice berisi ID buku). Sertakan konstruktor NewUser yang menginisialisasi pengguna dengan daftar pinjaman kosong.
  • library.go: Buat struct Library yang menyimpan buku dan pengguna dalam map (dengan ID sebagai kunci). Buat komponen berikut:
    • Konstruktor NewLibrary yang menginisialisasi map kosong untuk buku dan pengguna
    • Method AddBook yang menambahkan buku ke library
    • Method AddUser yang menambahkan pengguna ke library
    • Method Borrow yang menerima ID pengguna dan ID buku, memvalidasi operasi, menandai buku sebagai tidak tersedia, menambahkan ID buku ke daftar pinjaman pengguna, dan mengembalikan error jika terjadi masalah
    • Method Return yang membalikkan proses peminjaman: menandai buku sebagai tersedia dan menghapusnya dari daftar pinjaman pengguna

    Method Borrow-mu harus mengembalikan error berikut:

    • user not found jika ID pengguna tidak ditemukan
    • book not found jika ID buku tidak ditemukan
    • book not available jika buku sudah dipinjam

    Method Return-mu harus mengembalikan error berikut:

    • user not found jika ID pengguna tidak ditemukan
    • book not found jika ID buku tidak ditemukan
    • book not borrowed jika buku sudah tersedia
  • main.go: Satukan semuanya dengan membuat library, menambahkan buku dan pengguna, lalu memproses operasi peminjaman dan pengembalian.

    Baca jumlah buku, lalu baca ID, judul, penulis, dan ISBN setiap buku. Berikutnya, baca jumlah pengguna, lalu baca ID, nama, dan email setiap pengguna. Kemudian baca jumlah operasi, dengan setiap operasi berupa borrow [userID] [bookID] atau return [userID] [bookID].

    Untuk setiap operasi, cetak OK jika berhasil, atau Error: [message] jika gagal.

Input yang diberikan adalah:

  • Jumlah buku, lalu ID, judul, penulis, dan ISBN setiap buku, masing-masing pada baris terpisah
  • Jumlah pengguna, lalu ID, nama, dan email setiap pengguna, masing-masing pada baris terpisah
  • Jumlah operasi, lalu setiap operasi pada baris terpisah

Contohnya, jika diberikan:

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

Outputmu seharusnya:

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

Dan jika diberikan:

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

Outputmu seharusnya:

OK
Error: book not available
OK

Dan jika diberikan:

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

Outputmu seharusnya:

Error: book not borrowed
Error: book not found

Perhatikan bahwa Library bertindak sebagai koordinator utama. Library memvalidasi semua operasi sebelum mengubah status, sehingga buku dan pengguna tetap tersinkron. Penggunaan pointer receiver memungkinkan method-mu mengubah data sebenarnya yang disimpan di dalam map!

Coba sendiri

package main

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

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

	// Baca jumlah buku
	var numBooks int
	fmt.Fscanln(reader, &numBooks)

	// TODO: Buat library baru

	// TODO: Baca detail setiap buku (ID, Title, Author, ISBN pada baris terpisah)
	// dan tambahkan ke library
	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: Buat buku dan tambahkan ke library
	}

	// Baca jumlah pengguna
	var numUsers int
	fmt.Fscanln(reader, &numUsers)

	// TODO: Baca detail setiap pengguna (ID, Name, Email pada baris terpisah)
	// dan tambahkan ke library
	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: Buat pengguna dan tambahkan ke library
	}

	// Baca jumlah operasi
	var numOps int
	fmt.Fscanln(reader, &numOps)

	// TODO: Proses setiap operasi
	// Format: "borrow [userID] [bookID]" atau "return [userID] [bookID]"
	for i := 0; i < numOps; i++ {
		line, _ := reader.ReadString('\n')
		line = strings.TrimSpace(line)
		parts := strings.Split(line, " ")

		// TODO: Uraikan operasi dan panggil method yang sesuai
		// Cetak "OK" jika berhasil atau "Error: [message]" jika gagal
	}
}

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Go online