Menu
Coddy logo textTech

Ödünç Alma Sistemi

Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 100 / 107.

challenge icon

Görev

Kolay

Kütüphane Yönetimi projemiz için ödünç alma sistemini kuralım! Kitap ve kullanıcı koleksiyonlarını yöneten, ödünç alma ve iade işlemlerini uygun doğrulamalarla birlikte gerçekleştiren metotlara sahip bir Library yapısı oluşturacaksınız.

Kodunuzu dört dosya halinde düzenleyeceksiniz:

  • book.go: Önceki dersten kalma ID, Title, Author, ISBN ve Available alanlarına sahip Book yapınız. Kitapları kullanılabilir (available) olarak başlatan NewBook yapıcı fonksiyonunu (constructor) dahil edin.
  • user.go: ID, Name, Email ve BorrowedBooks (kitap ID'lerinden oluşan bir slice) alanlarına sahip User yapınız. Kullanıcıları boş bir ödünç listesiyle başlatan NewUser yapıcı fonksiyonunu dahil edin.
  • library.go: Kitapları ve kullanıcıları map'lerde (ID'lerine göre anahtarlanmış) saklayan bir Library yapısı oluşturun. Şu bileşenleri inşa edin:
    • Kitaplar ve kullanıcılar için boş map'leri başlatan bir NewLibrary yapıcı fonksiyonu
    • Kütüphaneye bir kitap ekleyen AddBook metodu
    • Kütüphaneye bir kullanıcı ekleyen AddUser metodu
    • Bir kullanıcı ID'si ve kitap ID'si alan, işlemi doğrulayan, kitabı ödünç alınmış olarak işaretleyen, kitap ID'sini kullanıcının ödünç listesine ekleyen ve bir şeyler ters giderse hata döndüren bir Borrow metodu
    • Ödünç alma işlemini tersine çeviren; kitabı kullanılabilir olarak işaretleyen ve kullanıcının ödünç listesinden çıkaran bir Return metodu

    Borrow metodunuz şu hataları döndürmelidir:

    • Kullanıcı ID'si mevcut değilse user not found
    • Kitap ID'si mevcut değilse book not found
    • Kitap zaten ödünç alınmışsa book not available

    Return metodunuz şu hataları döndürmelidir:

    • Kullanıcı ID'si mevcut değilse user not found
    • Kitap ID'si mevcut değilse book not found
    • Kitap zaten kullanılabilir durumdaysa (ödünç alınmamışsa) book not borrowed
  • main.go: Bir kütüphane oluşturarak, kitap ve kullanıcı ekleyerek, ardından ödünç alma/iade işlemlerini işleyerek her şeyi bir araya getirin.

    Kitap sayısını okuyun, ardından her kitap için ID, başlık, yazar ve ISBN bilgilerini okuyun. Sonra kullanıcı sayısını okuyun ve her kullanıcı için ID, isim ve e-posta bilgilerini okuyun. Daha sonra işlem sayısını okuyun; her işlem ya borrow [userID] [bookID] ya da return [userID] [bookID] şeklindedir.

    Her işlem için, başarılıysa OK, başarısızsa Error: [message] yazdırın.

Aşağıdaki girdiler sağlanacaktır:

  • Kitap sayısı, ardından her kitabın ID'si, başlığı, yazarı, ISBN'i (her biri ayrı satırlarda)
  • Kullanıcı sayısı, ardından her kullanıcının ID'si, ismi, e-postası (her biri ayrı satırlarda)
  • İşlem sayısı, ardından her işlem ayrı bir satırda

Örneğin, şu girdi verildiğinde:

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

Çıktınız şu olmalıdır:

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

Ve şu girdi verildiğinde:

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

Çıktınız şu olmalıdır:

OK
Error: book not available
OK

Ve şu girdi verildiğinde:

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

Çıktınız şu olmalıdır:

Error: book not borrowed
Error: book not found

Kütüphanenin (Library) nasıl merkezi bir koordinatör görevi gördüğüne dikkat edin; durumu değiştirmeden önce tüm işlemleri doğrular, kitapların ve kullanıcıların senkronize kalmasını sağlar. Pointer receiver'lar kullanmak, metotlarınızın map'lerde saklanan gerçek verileri değiştirmesine olanak tanır!

Kendin dene

package main

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

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

	// Kitap sayısını oku
	var numBooks int
	fmt.Scanln(&numBooks)

	// TODO: Yeni bir kütüphane oluştur

	// TODO: Her kitabın ayrıntılarını oku (ayrı satırlarda ID, Title, Author, ISBN)
	// ve bunları kütüphaneye ekle
	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: Kitap oluştur ve kütüphaneye ekle
	}

	// Kullanıcı sayısını oku
	var numUsers int
	fmt.Scanln(&numUsers)

	// TODO: Her kullanıcının ayrıntılarını oku (ayrı satırlarda ID, Name, Email)
	// ve bunları kütüphaneye ekle
	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: Kullanıcı oluştur ve kütüphaneye ekle
	}

	// İşlem sayısını oku
	var numOps int
	fmt.Scanln(&numOps)

	// TODO: Her işlemi işle
	// Format: "borrow [userID] [bookID]" veya "return [userID] [bookID]"
	for i := 0; i < numOps; i++ {
		line, _ := reader.ReadString('\n')
		line = strings.TrimSpace(line)
		parts := strings.Split(line, " ")

		// TODO: İşlemi ayrıştır ve uygun metodu çağır
		// Başarı durumunda "OK" veya hata durumunda "Error: [message]" yazdır
	}
}

Nesne Yönelimli Programlama bölümündeki tüm dersler