Pomoc w znalezieniu błędu

0

Witam. Bardzo proszę o pomoc z zadaniem. Amianowicie program po wpisaniu ma znaleźć daną książkę i wyświetlić gdzie ona się znajduje. Dla książki AKADEMIA działa bez problemu. Jednak kiedy dla wybranej lokalizacji zmieniam książkę( tutaj Mickiewicz) już jej nie znajduje. Nie potrafię zlokalizować błędu więc proszę o pomoc.

class Ksiazka
    {
        public string Tytul { get; set; }
        public string Autor { get; set;}
        public int Regal { get; set; }
        public int Polka { get; set; }
        public int Miejsce { get; set; }
        public Ksiazka () { }
        public Ksiazka(int r, int p, int m)
        {
            r = Regal;
            p = Polka;
            m = Miejsce;
        }

    }
class Program
    {
        static void Main(string[] args)
        {
            Ksiazka[,,] lokalizacja = new Ksiazka[3, 6, 10];
            Ksiazka ksiazka = new Ksiazka();

            for (int r = 0; r < lokalizacja.GetLength(0); r++)
            {
                for (int p = 0; p < lokalizacja.GetLength(1); p++)
                {
                    for (int m = 0; m < lokalizacja.GetLength(2); m++)
                    {
                        Ksiazka ksiazka2 = new Ksiazka(r, p, m);
                        ksiazka = ksiazka2;
                        ksiazka.Tytul = "Akademia Pana Kleksa";
                        ksiazka.Autor = "Jan Brzechwa";
                        {
                            if (r == 2 && p == 2 && m == 2)
                            {
                                ksiazka.Tytul = "Pan Tadeusz";
                                ksiazka.Autor = "Adam Mickiewicz";
                            }
                        }
                    }
                }
            }

            void znajdzKsiazke()
            {
                Console.WriteLine("Podaj fraze, ktorej szukasz: ");
                string tekst = Console.ReadLine();

                if (ksiazka.Autor.Contains(tekst, StringComparison.OrdinalIgnoreCase) || ksiazka.Tytul.Contains(tekst, StringComparison.OrdinalIgnoreCase))
                {
                    Console.WriteLine("Twoja ksiazka znajduje sie na regale " + ++ksiazka.Regal + " na polce " + ++ksiazka.Polka + " miejsce " + ++ksiazka.Miejsce + " . Zyczymy milego czytania");
                }
                else
                {
                    Console.WriteLine("Nie znaleziono takiej ksiazki.");
                }
            }
            znajdzKsiazke();
        }
    }
0

@Klaudia Capik: Bo ten if (r == 2 && p == 2 && m == 2) wykona się tylko raz, później w kolejnej iteracji pętli nadpisujesz książka.tytuł i książka.autor znów na "Akademia..." i "Jan Brzechwa". Dlatego nie znajduje Mickiewicza.

0

@Klaudia Capik:

ustaw breakpointy

Ksiazka ksiazka2 = new Ksiazka(r, p, m);
ksiazka.Tytul = "Pan Tadeusz";

puść w trybie debug i zobaczysz co się dzieje i czemu nie znajduje

0

@Klaudia Capik: @Klaudia Capik: Bo w ostatniej iteracji pętli nadpisujesz nr Regału, Półki i Miejsca i ten if nie wykona się ani razu.

0

@Klaudia Capik: Zresztą skoro chcesz dwie książki to dlaczego masz tylko jeden obiekt Książka? Jeśli chcesz aby byla również książka mickiewicza to musisz stworzyć drugą instancje klasy Książka i do niej przypisać w tym if (r == 2 && p == 2 && m == 2) lub użyć tablicy Książek i np:
Ksiazka[] ksiazka = new Ksiazka[2]
i w if (r == 2 && p == 2 && m == 2)
{
ksiazka[1].Tytul = "Pan Tadeusz";
ksiazka[1].Autor = "Adam Mickiewicz";
}

0

W pętli przypisz książki do odpowiedniego miejsca w bibliotece (lokalizacji) i nie pamiętaj tego w samej książce. Szukaj książki w bibliotece a nie w książce.
Co ma znaczyć taki zapis ++ksiazka.Regal, ++ksiazka.Polka, ++ksiazka.Miejsce w jednej linii? I czemu wykonuje się po spełnieniu warunku?

1

@Klaudia Capik: Drugi wątek z tym samy fatalnym kodem, zerowe uwzględnienie porad z poprzedniego.
Lepiej się z tym czujesz?

@ Koledzy: marnujecie czas nad kodem, który się nawet nie skompiluje.
W tym programie trudno znaleźć błąd, jak tytuł wątku głosi.
Raczej przeciwnie, zmieniłbym zagadnienie na: znajdź dwie sensowne linijki będące koło siebie. Ale to trudne zadanie.

Amianowicie program po wpisaniu ma znaleźć daną książkę i wyświetlić gdzie ona się znajduje. Dla książki AKADEMIA działa bez problemu.

Nieprawda. Ale jak na razie to sama nie wiesz, co Twój program naprawdę robi. W każdy razie NICZEGO nie wyszukuje.
Trudno szukać cokolwiek po niewypełnionej tablicy.

1

Spójrzcie w konstruktor klasy książka. Tam coś nie gra czy mi się zdaje?

0

Przeanalizuj ten link

0

Klasa Ksiazka jest dość dziwna:

  • zawiera dwa konstruktory, ale używany jest jeden;
  • część pól jest inicjalizowana konstruktorem, część setterami.
    Do tego nazywa się po polsku.

Moim zdaniem powinna wyglądać tak:

    public class BookModel
    {
        public string Title { get; }
        public string Author { get; }
        public int ShelfId { get; private set; }
        public int BookcaseId { get; private set; }
        public int PlaceId { get; private set; }

        public BookModel(string title, string author, int bookcaseId, int shelfId, int placeId)
        {
            Title = title;
            Author = author;
            BookcaseId = bookcaseId;
            ShelfId = shelfId;
            PlaceId = placeId;
        }
    }

Pomysł na trzymanie książek w tablicy 3D to porażka. Przecież każdy regał może być inny, mieć inną szerokość i zawierać inną ilość półek. Metody znajdzKsiazke pominę milczeniem.
Jeśli już musisz to zrobić na tablicy 3D zamiast na odpowiedniej kolekcji modeli (vide link z mojego poprzedniego posta), to czeka Cię długa droga:

    public class BookModel
    {
        public string Title { get; }
        public string Author { get; }
        public int ShelfId { get; private set; }
        public int BookcaseId { get; private set; }
        public int PlaceId { get; private set; }

        public BookModel(string title, string author, int bookcaseId, int shelfId, int placeId)
        {
            Title = title;
            Author = author;
            BookcaseId = bookcaseId;
            ShelfId = shelfId;
            PlaceId = placeId;
        }

        private bool MatchesOrEmpty(string a, string b) => string.IsNullOrEmpty(a) || a.Equals(b, StringComparison.CurrentCultureIgnoreCase);

        public bool Matches(string title, string author) => MatchesOrEmpty(title, Title) && MatchesOrEmpty(author, Author);
    }

    public class Library
    {
        private readonly BookModel[,,] books = new BookModel[3, 6, 10];


        private Library()
        {
            for (int bookcaseId = 0; bookcaseId < books.GetLength(0); bookcaseId++)
            {
                for (int shelfId = 0; shelfId < books.GetLength(1); shelfId++)
                {
                    for (int placeId = 0; placeId < books.GetLength(2); placeId++)
                    {
                        var book = bookcaseId == 2 && shelfId == 2 && placeId == 2
                            ? new BookModel("Akademia Pana Kleksa", "Jan Brzechwa", bookcaseId, shelfId, placeId)
                            : new BookModel("Pan Tadeusz", "Adam Mickiewicz", bookcaseId, shelfId, placeId);
                        books[bookcaseId, shelfId, placeId] = book;
                    }
                }
            }
        }

        public BookModel FindBook(string title, string author)
        {
            foreach (var book in books)
            {
                if (book.Matches(title, author))
                    return book;
            }
            return null;
        }


        static void Main(string[] args)
        {
            var library = new Library();

            var bookFound = library.FindBook("", "jan brzechwa");

            if (bookFound != null)
                Console.WriteLine($"Twoja książka znajduje się na regale {bookFound.BookcaseId} na półce {bookFound.ShelfId} miejsce {bookFound.PlaceId}. Życzymy miłego czytania.");
            else
                Console.WriteLine("Nie znaleziono takiej książki.");
        }
0

Ja bym to bardziej rozdzielił na klasy. Wybaczcie za błędy ale... jest piątek :B

public interface IName
        {
            string Name { get; }
        }
        public class Ksiazka : IName
        {
            public string Tytul { get; private set; }
            public string Autor { get; private set; }

            public string Name { get { return Autor + ": " + Tytul; } }

            public Ksiazka(string Tytul, string Autor)
            {
                this.Tytul = Tytul;
                this.Autor = Autor;
            }
        }
        public class MiejsceKsiazki : IName
        {
            public MiejsceKsiazki(Ksiazka ksiazka, int miejsce)
            {
                Ksiazka = ksiazka;
                Miejsce = miejsce;
            }
            public Ksiazka Ksiazka { get; private set; }
            public int Miejsce { get; private set; }

            public string Name { get { return "Miejsce: " + Miejsce; } }
        }
        public class Polka : IName
        {
            public Polka(MiejsceKsiazki[] ksiazkiNaPolce, int numer)
            {
                KsiazkiNaPolce = ksiazkiNaPolce;
                Numer = numer;
            }

            public MiejsceKsiazki[] KsiazkiNaPolce { get; private set; }
            public int Numer { get; private set; }

            public string Name { get { return "Numer półki: " + Numer; } }
        }
        public class Regal : IName
        {
            public Regal(Polka[] polki, int numer)
            {
                Polki = polki;
                Numer = numer;
            }
            public Polka[] Polki { get; private set; }
            public int Numer { get; private set; }

            public string Name { get { return "Numer regału: " + Numer; } }
        }
        public class FindResult
        {
            public FindResult(Regal regal, Polka polka, MiejsceKsiazki miejsce)
            {
                this.regal = regal;
                this.polka = polka;
                this.miejsce = miejsce;
            }
            public Regal regal { get; private set; }
            public Polka polka { get; private set; }
            public MiejsceKsiazki miejsce { get; private set; }
        }
        public class Biblioteka
        {
            public Biblioteka(Regal[] regaly)
            {
                Regaly = regaly;
            }
            public Regal[] Regaly { get; private set; }
            public FindResult FindBookLocation(string Tytul)
            {
                Regal regal = Regaly.FirstOrDefault(x => x.Polki.FirstOrDefault(y => y.KsiazkiNaPolce.FirstOrDefault(z => z.Ksiazka.Tytul == Tytul) != null) != null);
                if (regal == null)
                    return null;
                Polka polka = regal.Polki.FirstOrDefault(y => y.KsiazkiNaPolce.FirstOrDefault(z => z.Ksiazka.Tytul == Tytul) != null);
                MiejsceKsiazki miejsce = polka.KsiazkiNaPolce.FirstOrDefault(z => z.Ksiazka.Tytul == Tytul);

                Console.WriteLine("regał: " + regal.Name);
                Console.WriteLine("polka: " + polka.Name);
                Console.WriteLine("miejsce: " + miejsce.Name);
                Console.WriteLine("ksiazka: " + miejsce.Ksiazka.Name);

                FindResult result = new FindResult(regal, polka, miejsce);
                return result;
            }
        }

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