Brak pomysłu na "idioto-uodpornienie" programu.

0

Witam, mam następujący problem. Otóż nie mam pomysłu jakie warunki trzeba napisać, aby program zadziałał dla dwóch tych samych książek w mojej bibliotece. Dam może trochę kodu to się wyjaśni.

void wypozyczKsiazke(String ksiazka)
{
	boolean koniec=false;
	if(listaK.size()>0)
	{
		int pom=0;
		while(koniec==false || pom<listaK.size())
		{
			if((listaK.get(pom).dajTytul()).equals(ksiazka))
			{
				if(listaK.get(pom).czyWypozyczona())
				{
					System.out.println("Przykro nam, książka jest już wypożyczona.");
				}
				else
				{
					listaK.get(pom).wypozycz();
					System.out.println("Udało się wypożyczyć książkę: " + listaK.get(pom).dajTytul());
				}
			koniec=true;
			}
                        else 
{
		System.out.println("Przykro nam, nie mamy takiej książki");
	}
			
		pom++;
		}
	}
}

Tu oczywiście metoda wypożyczająca książki.

teraz to co jest w mainie:

Biblioteka pierwsza = new Biblioteka( "Armi Krajowej 24" );
        Biblioteka druga = new Biblioteka( "Plac Grunwaldzki 6" );

        pierwsza.dodajKsiazke( new Epopeja( "Pan Tadeusz","Litwa" ) );
        pierwsza.dodajKsiazke( new Epopeja( "Pan Tadeusz","Litwa" ) );
        pierwsza.dodajKsiazke( new KsiazkaFantastyczna( "Gra o Tron","Eddard Stark" ) );
        pierwsza.dodajKsiazke( new Kryminal( "Tozsamosc Bourne'a","Jason Bourne" ) );
        pierwsza.dodajKsiazke( new KsiazkaNaukowa( "Analiza Matematyczna","Matematyka" ) );

System.out.println( "Wypozyczanie Pana Tadeusza" );
        pierwsza.wypozyczKsiazke( "Pan Tadeusz" );
        pierwsza.wypozyczKsiazke( "Pan Tadeusz" ); 
        druga.wypozyczKsiazke( "Pan Tadeusz" );

Teraz tak - program ma wypisać następująco:
Udało się wypożyczyć książkę: Pan Tadeusz
Udało się wypożyczyć książkę: Pan Tadeusz
Przykro nam, nie mamy takiej książki //bo to jest druga biblioteka, która jest pusta

Działa, to niezgodnie z oczekiwaniem - zmienna boolean koniec przewidziana była do zakonczenia petli, jednak to nie działa jak powinno, program poza tym leci po wszystkich książkach(ale to chyba kwestia, że ten else powinien być wyżej - oczywiscie nie jako else).

Wszystko jest ok dla niepowtarzających się książek(panów tadeuszów), ale jak są dwie takie same, to już świruje program ...

Prośba do Was o pomoc, jak zmienić metodę, aby poprawnie działał dla większej ilości książek o tym samym tytule ? (być może lepsza pętla foreach ?)

0
void wypozyczKsiazke(String ksiazka)
{
        boolean koniec=false;
                int pom=0;
                while(koniec==false || pom<listaK.size())
                {
                        if((listaK.get(pom).dajTytul()).equals(ksiazka))
                        {
                                if(listaK.get(pom).czyWypozyczona())
                                {
                                        System.out.println("Przykro nam, książka jest już wypożyczona.");
                                }
                                else
                                {
                                        listaK.get(pom).wypozycz();
                                        System.out.println("Udało się wypożyczyć książkę: " + listaK.get(pom).dajTytul());
                                }
                        koniec=true;
                        }
                  pom++;
                }
            if(!koniec)
               {
                System.out.println("Przykro nam, nie mamy takiej książki");
               }
   }

Zamiast wypisywać na ekran funkcja powinna zwrócić kod zakończenia, teksty powinna drukować funkcja wywołująca.
Co do dublowania, powinieneś przewidzieć ilość dal każdej książki. Funkcja .wypozycz() zmniejsza ilość o jeden jeżeli nie jest zerowa i zwraca true jeżeli się udało. W tym przypadku wyeliminujesz metodę .czyWypozyczona() i uprościsz kod.

0

dalej jest źle ;( ...

nawet przy jednej książce wyskakuje przy próbie wypożyczenia z drugiej biblioteki

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(Unknown Source)
	at java.util.ArrayList.get(Unknown Source)
</java>

poza tym dla dwóch książek on dwa razy wypisuje, że wypożycza ( i tu powinien przejśc do wywołania "druga.wypozyczKsiazke"), a wypisuje potem dwa razy "przykro nam, ksiazka jest juz wypozyczona"
0

Bo jeszcze tego nie zauważyłem: while(koniec==false && pom<listaK.size())

0

gubi się dla dwóch Panów Tadeuszów ;) tzn. wypożycza, później mówi, ze książka jest już wypożyczona, a przecież istnieje druga taka sama, która powinien wypożyczyć ...

0

Oczywiście, bo musisz to inaczej oprogramować z ilością danej książki. Albo przez dodatkowego wartownika.

0

co masz na myśli mówiąc o dodatkowym wartowniku ?

0

licznik istniejących ale wypożyczonych książek lub przynajmniej zmienna typu logicznego przechowująca informacje że napotkano. Alternatywą jest nie rozróżnianie przez funkcje sytuacji kiedy książki NIE MA od sytuacji kiedy jest ale wszystkie egzemplarzy są już wypożyczone.

0

A wiesz jak to się robi w prawdziwych bibliotekach? Każdy egzemplarz książki ma własny numer. Najczęściej jest to numer wewnętrzny danej biblioteki. Powinieneś mieć tak na prawdę opis książki wspólny dla wszystkich egzemplarzy tej książki. Bo gdy czytelnik nie zwróci książki, to nie będziesz wiedział który :P

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