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

Library Management projemiz için ödünç alma sistemini oluşturalım! Kitap ve kullanıcı collections yöneten bir Library struct'ı oluşturacak ve teslim alma ile iade işlemlerini uygun doğrulamayla ele alan metotlar yazacaksınız.

Kodunuzu dört dosya arasında düzenleyeceksiniz:

  • book.go: Önceki dersteki Book struct'ınız; ID, Title, Author, ISBN ve Available alanlarına sahip olacak. books'u available olarak başlatan NewBook constructor'ını ekleyin.
  • user.go: ID, Name, Email ve BorrowedBooks (book ID'lerinden oluşan slice) alanlarına sahip User struct'ınız. Kullanıcıları boş bir ödünç alınanlar listesiyle başlatan NewUser constructor'ını ekleyin.
  • library.go: books ve kullanıcıları map'lerde (ID'lerine göre anahtarlanmış) saklayan bir Library struct'ı oluşturun. Bu bileşenleri geliştirin:
    • books ve kullanıcılar için boş map'ler başlatan bir NewLibrary constructor'ı
    • library'ye bir book ekleyen bir AddBook metodu
    • library'ye bir kullanıcı ekleyen bir AddUser metodu
    • bir kullanıcı ID'si ve book ID'si alan, işlemi doğrulayan, book'u kullanılamaz olarak işaretleyen, book ID'sini kullanıcının ödünç alınanlar listesine ekleyen ve bir sorun oluşursa error döndüren bir Borrow metodu
    • ödünç alma sürecini tersine çeviren: book'u kullanılabilir olarak işaretleyen ve kullanıcının ödünç alınanlar listesinden kaldıran bir Return metodu

    Borrow metodunuz şu error'ları döndürmelidir:

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

    Return metodunuz şu error'ları döndürmelidir:

    • kullanıcı ID'si mevcut değilse user not found
    • book ID'si mevcut değilse book not found
    • book zaten available durumundaysa book not borrowed
  • main.go: Bir library oluşturarak, books ve kullanıcılar ekleyerek, ardından ödünç alma/iade işlemlerini işleyerek her şeyi bir araya getirin.

    books sayısını okuyun, ardından her book için ID'sini, başlığını, yazarını ve ISBN'sini okuyun. Sonra kullanıcıların sayısını okuyun ve her kullanıcı için ID'sini, adını ve email adresini okuyun. Ardından, her biri borrow [userID] [bookID] veya return [userID] [bookID] olan işlemlerin sayısını okuyun.

    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:

  • books sayısı, ardından her book'un ID'si, başlığı, yazarı ve ISBN'si (her biri ayrı satırda)
  • Kullanıcı sayısı, ardından her kullanıcının ID'si, adı ve email adresi (her biri ayrı satırda)
  • İş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

Ş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

Ş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

Library'nin merkezi koordinatör olarak nasıl davrandığına dikkat edin. Durumu değiştirmeden önce tüm işlemleri doğrulayarak books 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.Fscanln(reader, &numBooks)

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

	// TODO: Her kitabın detaylarını oku (ID, Title, Author, ISBN ayrı satırlarda)
	// 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.Fscanln(reader, &numUsers)

	// TODO: Her kullanıcının detaylarını oku (ID, Name, Email ayrı satırlarda)
	// 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.Fscanln(reader, &numOps)

	// TODO: Her işlemi işle
	// Biçim: "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ıda "OK", başarısızlıkta "Error: [message]" yazdır
	}
}

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

Kendi başına pratik yap: Online Go derleyicisi