Pomoc w zadaniu (coś a'la symulator systemu bibliotecznego)

0

Witam mam problem z zadaniem. Cel jest jeden - zlokalizowanie książki w bibliotece. Należy stworzyć trójwymiarową tablicę (3,6,10), która przyjmuje odpowiednio numer regału, półki i miejsca gdzie leży dana książka. Należy również stworzyć klasę o nazwie Książka, która będzie przechowywać informacje odnośnie ksiażek. Bibliotekę należy wypełnić książkami, które mogą być takie same (np. tytuł "magia" autor "D. Collins").
Zadania:

  1. Należy zmienić tytuł i autora dokładnie jednej książki, która znajduje się w lokalizacji np. 1 regał, 2 półka, 5 miejsce ( [1,2,5] ).
  2. Pozwolić użytkownikowi wpisać ciąg znaków i jeżeli choć wycinek będzie zgodny np. końcówka nazwiska autora to należy wyświetlić lokalizację książki.

Aktualnie mój kod wygląda następująco:

static void Main(string[] args)
        {
            Console.WriteLine("Podaj tytyl: ");
            string tytul = Console.ReadLine();
            Console.WriteLine("Podaj autora: ");
            string autor = Console.ReadLine();
            Ksiazka ksiazka = new Ksiazka(tytul, autor);

class Ksiazka
    {
        string Tytul, Autor;
        int Polka, Regal, Miejsce;
        int liczbaKsiazek = 0;

        Ksiazka[,,] lokalizacja = new Ksiazka[3, 6, 10];
        public Ksiazka(string tytul, string autor)
        {
            do
            {
                Tytul = tytul;
                Autor = autor;
                for (int r = 1; r < 4; r++)
                {
                    for (int p = 1; p < 7; p++)
                    {
                        for (int m = 1; m < 11; m++)
                        {
                            Regal = r;
                            Polka = p;
                            Miejsce = m;
                            Console.WriteLine(Tytul + " " + Autor + lokalizacja[r, p, m] + " ");
                            liczbaKsiazek++;
                        }
                    }
                }
            } while (liczbaKsiazek <= 180);


        }
    }
        }

Bardzo proszę o jakieś rady jak ugryźć to zadanie.

1

Obiekty klasy Książka niech przechowują informację tylko na temat jednej książki.
Ta trójwymiarowa tablica niech będzie w innej klasie (Biblioteka?).
Dla ułatwienia klasa książka może posiadać metodę porównującą ciąg znaków z danymi danej książki (zwracać bool).

1

To, co się wydaje konstruktorem, wcale nie jest takie, jak Ci się wydaje. Sama się kopiesz po nogach.
Pętle po tablicach się liczy od 0 do wymiar-1, czyli < wymiar
Magiczne stałe, i każda w dwóch wersjach 6 i 7, w dodatku błędnie użyte

Bez rozbicia na dwie wyraziste klasy nie podejmuję się pomóc.

0

Dobra stworzyłam 2 klasy: książka i biblioteka. Wywaliłam konstruktora w main, w Książce dodałam funkcje nowaKsiazka i szukajKsiazke, a w klasieBiblioteka wrzuciłam tablice. Aktualnie tak to wygląda:
Main:

Ksiazka ksiazka = new Ksiazka();
            Console.WriteLine("Podaj tytyl: ");
            string tytul = Console.ReadLine();
            Console.WriteLine("Podaj autora: ");
            string autor = Console.ReadLine();
            ksiazka.nowaKsiazka(tytul, autor);

            Console.WriteLine("Podaj jakies slowo: ");
            string tekstUzytkownika = Console.ReadLine();
            ksiazka.szukajKsiazke(tekstUzytkownika);

Ksiażka:

string Tytul, Autor;
        int Polka, Regal, Miejsce;

        public void nowaKsiazka(string tytul, string autor)
        {
            Tytul = tytul;
            Autor = autor;
        }

        public bool szukajKsiazke(string tekst)
        {
            if (tekst == Tytul)
            {
                return true;
            }
            else if (tekst == Autor)
            {
                return true;
            } else return false;
        }

Biblioteka:

class Biblioteka
    {
        Ksiazka ksiazka = new Ksiazka();
        Ksiazka[,,] lokalizacja = new Ksiazka [3, 6, 10];

    }
0
  1. Masz tablicę 3 wymiarową, ale pustą.
  2. Nie namawiałem do porzucenia konstruktorów, tylko że tamten był d/d. Obecna funkcja nowaKsiązka jest .. po prostu nie rozumiesz, jak się tworzy obiekty. Kontruktor książki MA BYĆ.
    3 szukajKsiazke w klasie książka powinien zmienić nazwę na Compare / IsMatching / porownaj. A szukanie to robi Biblioteka, a nie książka.
  3. powołanie new Ksiązka w Bibliotece przez jakąkolwiek pętlą jest bez sensu.
  4. nie dajesz pełnego kodu, dającego się skompilować
0

@AnyKtokolwiek: czy mógłbyś jakoś jaśniej to opisać. Proszę. Wklejam cały kod.

0

Plik main

using System;

namespace Lab_4_zadanie
{
    class Program
    {
        static void Main(string[] args)
        {
            Ksiazka ksiazka = new Ksiazka();
            Console.WriteLine("Podaj tytul: ");
            string tytul = Console.ReadLine();
            Console.WriteLine("Podaj autora: ");
            string autor = Console.ReadLine();
            ksiazka.nowaKsiazka(tytul, autor);

            Console.WriteLine("Podaj jakies slowo: ");
            string tekstUzytkownika = Console.ReadLine();
            ksiazka.szukajKsiazke(tekstUzytkownika)
        }
    }
}

Książka

using System;
using System.Collections.Generic;
using System.Text;

namespace Lab_4_zadanie
{
    class Ksiazka
    {
        string Tytul, Autor;
        int Polka, Regal, Miejsce;

        public void nowaKsiazka(string tytul, string autor)
        {
            Tytul = tytul;
            Autor = autor;
        }

        public bool szukajKsiazke(string tekst)
        {
            if (tekst == Tytul)
            {
                return true;
            }
            else if (tekst == Autor)
            {
                return true;
            } else return false;
        }
    }
}

Biblioteka

using System;
using System.Collections.Generic;
using System.Text;

namespace Lab_4_zadanie
{
    class Biblioteka
    {
        Ksiazka ksiazka = new Ksiazka();
        Ksiazka[,,] lokalizacja = new Ksiazka[3, 6, 10];
    }
}
0

Trójwymiarowa tablica to jakiś żart. Skoro każdy jej wymiar odpowiada jakiemuś elementowi biblioteki, to - zgodnie z DDD (Domain Driven Design) - powinien być opakowany w klasę.
Zatem widzę coś takiego (BTW zwykle wszystkie nazwy powinny być po angielsku, żeby potem nie tworzyć potworków typu GetKsiążka):

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApp1
{
    class BookModel
    {
        public string Author { get; }
        public string Title { get; }
        public int? Index => Parent?.GetBookIndex(this);
        public ShelfModel Parent { get; set; }

        public BookModel(string author, string title, ShelfModel parent)
        {
            Author = author ?? throw new ArgumentNullException(nameof(author));
            Title = title ?? throw new ArgumentNullException(nameof(title));
            Parent = parent ?? throw new ArgumentNullException(nameof(parent));
            parent.AddBook(this);
        }

        public override string ToString() => $"{Author} {Title}";
    }


    class ShelfModel
    {
        public int Index => Parent.GetShelfIndex(this);
        public BookcaseModel Parent { get; }
        public string Description { get; }
        private List<BookModel> books = new List<BookModel>();

        public ShelfModel(string description, BookcaseModel parent)
        {
            Description = description;
            Parent = parent;
            parent.AddShelf(this);
        }


        public void AddBook(BookModel book) => books.Add(book);

        public IEnumerable<BookModel> Find(string author = null, string title = null)
            => books.Where(b => (title == null || b.Title == title) && (author == null || b.Author == author));

        public int GetBookIndex(BookModel bookModel) => books.IndexOf(bookModel);

        public override string ToString() => Description;
    }


    class BookcaseModel
    {
        public int Index => Parent.GetBookcaseIndex(this);
        public string Description { get; }
        public LibraryModel Parent { get; }

        private List<ShelfModel> shelves = new List<ShelfModel>();

        public BookcaseModel(string description, LibraryModel parent)
        {
            Description = description;
            Parent = parent;
            Parent.AddBookcase(this);
        }


        public void AddShelf(ShelfModel shelf) => shelves.Add(shelf);

        public IEnumerable<BookModel> Find(string author = null, string title = null) => shelves.SelectMany(s => s.Find(author, title));

        public int GetShelfIndex(ShelfModel shelf) => shelves.IndexOf(shelf);

        public override string ToString() => Description;
    }


    class LibraryModel
    {
        private List<BookcaseModel> bookcases = new List<BookcaseModel>();
        public string Description { get; }

        public LibraryModel(string description)
        {
            Description = description;
        }

        public int GetBookcaseIndex(BookcaseModel bookcase) => bookcases.IndexOf(bookcase);

        public void AddBookcase(BookcaseModel bookcase) => bookcases.Add(bookcase);

        public IEnumerable<BookModel> Find(string author = null, string title = null)
            => bookcases.SelectMany(bc => bc.Find(author, title));

        public bool HasBook(string author = null, string title) => Find(author, title).Any();

        public override string ToString() => Description;
    }


    class Program
    {
        static void Main(string[] args)
        {
            var library = new LibraryModel("Biblioteka przy piekarni");
            var bookcaseA = new BookcaseModel("Ta po lewej", library);
            var bookcaseB = new BookcaseModel("Ta po prawej", library);
            var shelfA = new ShelfModel("półka w regale A", bookcaseA);
            var shelfB1 = new ShelfModel("górna półka w regale B", bookcaseB);
            var shelfB2 = new ShelfModel("dolna półka w regale B", bookcaseB);

            var book1 = new BookModel("author", "title", shelfB1);
            var book2 = new BookModel("author", "other title", shelfB1);
            var book3 = new BookModel("other author", "other title", shelfA);

            var booksOfAuthor = library.Find("author").ToList();

            booksOfAuthor.ForEach(
                b => Console.WriteLine($"{b.Author} \"{b.Title}\" regał: {b.Parent.Parent.Index}, półka: {b.Parent.Index}, miejsce: {b.Index}")
            );
        }
    }
}

Oczywiście można to zrobić ładniej, tu raczej chodzi o ideę.
Teraz zobacz, każdy regał i półka może mieć opis i inne dane, dzięki czemu ktoś, kto pierwszy raz odwiedza bibliotekę może szybko je znaleźć.
Każdy regał może mieć różną ilość półek, a półka - różną ilość książek, co trochę bardziej odpowiada rzeczywistości, niż trójwymiarowa tablica.
Książka wie, w którym miejscu półki stoi, półka - w którym regale, a regał - w której bibliotece, zatem po znalezieniu samej książki trywialne jest znalezienie jej lokalizacji.

0
ŁF napisał(a):

Trójwymiarowa tablica to jakiś żart. Skoro każdy jej wymiar odpowiada jakiemuś elementowi biblioteki, to - zgodnie z DDD (Domain Driven Design) - powinien być opakowany w klasę.
...

To się nasuwa(ło) od początku, i tak jest profesjonalnie, ale chyba byśmy zabili koleżankę i jej prowadzącego też.

1 użytkowników online, w tym zalogowanych: 0, gości: 1