• Nie Znaleziono Wyników

Walery Susłow, Piotr Rojewski Aplikacja Java, umożliwiająca zaawansowane ćwiczenia praktyczne z zakresu liczb pseudolosowychSesja: Kształcenie w dziedzinie elektroniki i telekomunikacji.Politechnika Koszalińska

N/A
N/A
Protected

Academic year: 2021

Share "Walery Susłow, Piotr Rojewski Aplikacja Java, umożliwiająca zaawansowane ćwiczenia praktyczne z zakresu liczb pseudolosowychSesja: Kształcenie w dziedzinie elektroniki i telekomunikacji.Politechnika Koszalińska"

Copied!
5
0
0

Pełen tekst

(1)www.pwt.et.put.poznan.pl. Piotr Rojewski Walery Susłow Politechnika Koszalińska Wydział Elektroniki i Informatyki ul. Śniadeckich 2, 75-543 Koszalin swalover@ie.tu.koszalin.pl. 2005. Poznańskie Warsztaty Telekomunikacyjne Poznań 8 - 9 grudnia 2005. APLIKACJA JAVA, UMOŻLIWIAJĄCA ZAAWANSOWANE ĆWICZENIA PRAKTYCZNE Z ZAKRESU LICZB PSEUDOLOSOWYCH Streszczenie: Przedstawiono projekt autorskiej aplikacji dydaktyczno-naukowej Java, przeznaczonej do konstruowania i testowania generatorów liczb pseudolosowych. Aplikacja stwarza warunki do szczegółowego sterowania modelem generatora oraz parametrami produkowanych ciągów pseudolosowych. Weryfikacji wybranych algorytmów symulacyjnych dokonano poprzez zbadanie pracy generatorów znanych modeli, jak generator Fishmana.. 1. WSTĘP Metoda wytwarzania ciągów liczb pseudolosowych poprzez wykorzystanie programu implementującego konkretny model matematyczny generatora zyskała wielu zwolenników wraz z upowszechnieniem się komputerów jako przeciwstawna do wykorzystania generatorów fizycznych oraz tablicowych. Wszelkie programowe metody wytwarzania takich ciągów oparte są na ścisłej procedurze matematycznej. Tak, więc wytworzone w ten sposób zbiory liczb nie stanowią rzeczywistych ciągów losowych. Jednak niektóre z nich spełniają postawione przed nimi wymagania praktyczne na tyle dobrze, że z pewnym przybliżeniem mogą być traktowane jako generatory liczb losowych. Programowe generatory liczb pseudolosowych znajdują swoje zastosowania np. w kryptografii, algorytmach symulacyjnych lub grach komputerowych, do których wnoszą one zmienność i przypadkowość w wynikach obliczeń. Generatory te tworzą liczbowe ciągi, które w ramach danego zastosowania są nieodróżnialne od ciągów losowych. Oznacza to, że dla użytkownika aplikacji każda z liczb ciągu wydaje się być wybrana w sposób zupełnie przypadkowy, bez jakiegokolwiek związku z pozostałymi elementami tegoż ciągu. Jednocześnie, każda z tych liczb mieści się w dowolnym, ustalonym zakresie wartości z określonym prawdopodobieństwem, co tworzy ciąg liczb losowych o danym rozkładzie [1] i umożliwia wykorzystanie tego ciągu w konstrukcjach algorytmicznych. Obecnie każdy z dostępnych systemów operacyjnych i języków programowania udostępnia nam kilka standardowych sposobów generacji ciągów pseudolosowych. Dla środowiska programowania Java jest to klasa java.util.Random, która pozwala na generowanie ciągów pseudolosowych, lecz nie daje. PWT 2005 - POZNAŃ 8-9 GRUDNIA 2005. możliwości ustawiania punktu pracy generatora czy zachowywania stanu jego pracy do ponownego uruchomienia. Te standardowe sposoby generacji nie mogą zaspokoić potrzeb praktycznych we wszystkich sytuacjach, dlatego warto mieć możliwość rozszerzania palety generatorów, projektowania generatora „na zamówienie”, przy tym pozostając w ramach niezależnej od platformy technologii programowania, jaką jest Java. Udzielenie odpowiedzi na pytania: czy dany generator w danej sytuacji może być uznany za losowy, czy rzeczywiście generuje on ciągi liczbowe o żądanym rozkładzie nie stanowi łatwego zadania. W tym celu zazwyczaj posługują się najróżniejszego rodzaju testami i sposobami oceniania. Można wymienić tutaj testy zgodności z rozkładem (test chi-kwadrat), testy zgodności wybranych statystyk zmiennej losowej (test sum, test średniej), czy testy kombinatoryczne (test pokerowy lub kolekcjonera) [1-3]. Obecnie tematyka ćwiczeń praktycznych z zakresu liczb pseudolosowych występuje w różnych kursach, czytanych na uczelniach wyższych technicznych. Przykładem mogą służyć kursy „Algorytmy i struktury danych” czy „Reprogramowalne układy cyfrowe”. Dlatego propozycja aplikacji naukowo-dydaktycznej, przeznaczonej do konstruowania i do testowania generatorów liczb pseudolosowych ma znaczenie stricte praktyczne. 2. ZAŁOŻENIA KONCEPTUALNE I OPIS STWORZONEJ APLIKACJI W fundamencie budowy aplikacji autorskiej umieszczone są trzy nadrzędne założenia: generator obiektem niezależnym, generator jednostką sparametryzowaną i inicjowalną oraz interfejsy generatora o budowie otwartej. Zgodnie z modelem programowania obiektowego, który dominuje w języku Java, generator liczb pseudolosowych ma być postrzegany w stworzonym systemie jako niezależny obiekt z zaimplementowanym algorytmem produkowania liczb pseudolosowych. Algorytm ten ma być sterowalny z poziomu GUI aplikacji przy pomocy odpowiednich parametrów. Parametry sterowania generatora można rozdzielić na statyczne oraz dynamiczne. Parametry statyczne mają. 1/5.

(2) www.pwt.et.put.poznan.pl. pozostawać niezmienne cały cykl życia generatora. Natomiast dynamiczne będą podlegały zmianom w miarę kolejnych generacji. Do parametrów statycznych można zaliczyć również te, które są inicjowane jednorazowo podczas uruchamiania generatora, aby ustalić jego punkt pracy. Przyjęliśmy, że lista parametrów sterowania ma być otwarta, by umożliwić eksperymentowanie z budową generatora podczas prac konstruktorskich.. Generator Liczb Pseudolosowych obiektem niezależnym jednostką inicjowalną i sparametryzowaną. otwarta budowa interfejsów łatwość obsługi i dokumentowania. Rys. 1. Koncepcja budowy aplikacji wspomagającej prace projektowe przy generatorach liczb pseudolosowych Każdy z parametrów sterowania określamy poprzez nazwę (identyfikator), typ przechowywanej wartości oraz samą wartość. Aplikacja ma automatycznie rozpoznawać posiadane parametry badanego generatora i umożliwiać ich zmianę. Dzięki temu powstaje szansa na sprawdzenie sposobu funkcjonowania algorytmu tworzenia ciągów liczb pseudolosowych w zależności od zadanych wartości tych parametrów. Do przechowywania wartości parametrów wykorzystujemy trzy typy danych: całkowity, rzeczywisty oraz generator. Ostatni z typów jest zdefiniowany w aplikacji, pozwala on na uzależnienie określonego parametru od wartości zaczerpniętej z innego generatora. Umożliwia to łatwe budowanie kaskadowych generatorów liczb pseudolosowych. Dzięki sparametryzowaniu generatorów istnieje możliwość zapisywania do pliku parametrów aktualnego stanu pracy generatora. To zapewnia sposobność przerywania pracy generatora i kontynuowania jej w dalszej generacji poprzez wczytanie zapisanych danych. Dzięki tej decyzji zostaje spełniony warunek, który pozwala stosować takowy generator w symulacjach dydaktycznych, bowiem istnieje możliwość zrekonstruowania danego stanu generatora i powtórzenia ćwiczenia. Założyliśmy, że aplikacja ma przewidywać trzy sposoby uruchamiania generatora. Pierwszy polega na starcie generatora bez zmian jego parametrów. Drugi, nazwany „z inicjowaniem”, umożliwia wykonanie ponownego przydzielenia dla generatora zmiennych statycznych jak i dynamicznych, np. przy resetowaniu jego pracy do stanu początkowego. Natomiast trzeci sposób, „z reinicjowaniem”, polega na ponownym wyznaczeniu parametrów dynamicznych do wartości wyjściowych w zależności od parametrów statycznych, co daje możliwość powtórzenia generowanej sekwencji.. PWT 2005 - POZNAŃ 8-9 GRUDNIA 2005. Jednym z podstawowych założeń projektu było również wykorzystanie możliwości kreowania interfejsów. Dzięki zastosowanym zabiegom konstrukcyjnym należało osiągnąć efekt łatwego dodawania do programu nowych algorytmów generacji liczb losowych, przeprowadzania obliczeń i testów na wygenerowanych danych, a także wizualizowania otrzymanych wyników. Aplikacja ma stanowić jakoby platformę, do której można dodawać nowe elementy i dzięki temu poszerzać jej funkcjonalność. Aplikacja autorska o nazwie „GenerProj” została napisana w języku programowania Java w oparciu o zestaw narzędzi programowych sdk 1.3. Jej zadaniem jest wspieranie procesu tworzenia oraz testowania generatorów. W swoim działaniu umożliwia ona: • stworzenie żądanego generatora na bazie zaimplementowanego kodu algorytmu, • przetestowanie generatora pod kątem różnych ustawień, • sprawdzenie „jakości” generowanych ciągów liczb pseudolosowych. Cechę modułowości aplikacji osiągnięto dzięki opracowaniu w pierwszym kroku jej projektowania przejrzystego interfejsu programistycznego, który pozwoliłby na tworzenie poszczególnych elementów systemu wytwarzania, stosowania i testowania generatorów. Jednocześnie zadbano o to, aby interfejs programistyczny był całkowicie niezależny od graficznego interfejsu użytkownika. Interfejsy unikatowe:. Podstawowy parametryzujący (ParameterInterface) GeneratorDataInterface. Moduy bazowe: Algorytm Generatora. Klasy pomocnicze:. ViewDataInterface. LaborDataInterface. Prezentacji Danych. Przekształceń Danych. GenerStoreFile.class. NumberStoreOne.class. Pliki stanu generatora:. GenParam.xml. GenProj.xml. Aplikacja Implementująca GLP. Środowisko Projektowania GLP. Rys. 2. Schematyczne współdziałania modułów projektu. przedstawienie. Schemat, przedstawiony na rysunku 2, obrazuje interfejsy wewnętrzne stworzonej aplikacji. Jak można zauważyć, interfejsem nadrzędnym jest interfejs parametryzowania. Takie założenie narzuca na podrzędne elementy konieczność tworzenia cech algorytmu, określających jego funkcjonowanie. Jednocześnie implementując nowy algorytm uzależnia się go od konkretnych zmiennych, na które może mieć wpływ użytkownik. Dzięki temu umożliwiono ustalanie punktu pracy algorytmu albo nacechowanie go określonymi właściwościami. Kolejne, podrzędne interfejsy, dotyczą konkretnych zastosowań. Jest to interfejs generatora, który pozwala na implementowanie algorytmów wytwarzania ciągów liczbowych. Następnie interfejs wizualizowania danych oraz interfejs przetwarzania danych, czyli algorytmy testowania i obróbki matematycznej.. 2/5.

(3) www.pwt.et.put.poznan.pl. Jako opcję dodatkową w aplikacji zapewniono prosty sposób tworzenia opisów do generatorów, dzięki czemu można nimi posługiwać się nawet przy ich małej znajomości. Przyjęte rozwiązanie zakłada tworzenie dokumentów w formacie podstawowym HTML. Ponieważ jest to ogólnie znany standard, więc stworzenie dokumentacji do generatora nie powinno nastręczać większego problemu. Jednocześnie daje to sposobność płynnej zmiany domyślnych wersji opisu na dowolny język. 3. PRZYKŁADOWA IMPLEMENTACJA GENERATORA FISHMANA Aby zaprezentować sposób wykorzystania udostępnionych interfejsów, posłużyliśmy się przykładem dwóch implementacji generatorów Fishman’a. Pierwszy z nich [3] został zaproponowany w roku 1990 i bazuje na algorytmie liniowego generatora kongruentnego. Ów algorytm charakteryzuje się wzorem: X[n+1]=(a*X[n]+c) mod M. Fishman zaproponował dla jego pracy następujące wartości parametrów: M=232 (jest to 2147483648), c=0 oraz a=1099087573. Drugi, z roku 1986, różni się zaledwie swoimi parametrami. Wynoszą one odpowiednio: M=231-1 (jest to 1073741823), c=0, a=742938285. Aby zaimplementować jeden z owych generatorów należało stworzyć klasę Javy, która byłaby poszerzona o metody abstrakcyjne interfejsu GeneratorInterface. Metody te wypełnialiśmy, kodując w ich wnętrzu algorytm funkcjonowania liniowego generatora kongruentnego. Dzięki temu, że interfejs GeneratorInterface stanowi poszerzenie abstrakcyjnej klasy parametryzującej mogliśmy w jej parametrach umiejscowić parametry generatora: generowaną zmienną losową X oraz argumenty algorytmu: a, c i m. Do poprawnego funkcjonowania algorytmu potrzebna była również wartość inicjująca początkowy stan generatora, określana jako ziarno (seed). Ten parametr również dodaliśmy do listy. Tym sposobem otrzymaliśmy oczekiwany generator, gotowy już do swojej pracy. Sparametryzowanie generatora dało również drugą, dość istotną zaletę. Stworzony generator, z określonymi parametrami funkcjonowania algorytmu, można było zapisać w postaci pliku projektu generatora. Plik ów tworzony jest przez aplikację w postaci kodu XML i może być załadowany później w dowolnym programie Java przy pomocy udostępnionej klasy GenerStoreFile.class. Jest to sposób na zastosowanie praktyczne wyników przeprowadzonych symulacji. Plik stanu generatora uzyskany dla generatora Fishmana z 1990 został wylistowany poniżej. Tab. 1. Listing pliku XML, opisującego stan przykładowego generatora LCG (Fishman, 1990) <?xml version='1.0' encoding='Latin1' ?> <generator class='generator.GeneratorLCG'> <parameter name='zm. losowa'> <Long>0</Long> </parameter> <parameter name='a'><Long>1099087573</Long> </parameter> <parameter name='c'><Long>0</Long>. PWT 2005 - POZNAŃ 8-9 GRUDNIA 2005. </parameter> <parameter name='m'><Long>2147483648</Long> </parameter> <parameter name='ziarno'> <generator class='generator.GeneratorSystemTime'> <parameter name='zm. Losowa'> <Integer>0</Integer> </parameter> </generator> </parameter> </generator> Plik stanu generatora w formacie XML przechowuje wszystkie parametry przykładowego generatora. Ponieważ generator nie był wykorzystywany jeszcze do pracy, zmienna losowa posiada wartość zerową. Plik przechowuje także informację o klasie zawierającej algorytm generatora, dla jakiego został stworzony (generator.GeneratorLCG). Można również zauważyć, że ziarno generatora jest inicjowane poprzez klasę generator.GeneratorSystemTime innego generatora, która pobiera czas z zegara systemowego. Taki plik stanu, po załadowaniu z wykorzystaniem metody loadGeneratorFromFile klasy GenerStoreFile, udostępni generator Fishman’a w programie użytkownika, który będzie mógł się doń odwołać wykorzystując proponowany interfejs GeneratorInterface. 4. TESTOWANIE GENERATORÓW Nieodłącznym elementem projektowania jest testowanie otrzymanych wyników. Stworzone środowisko projektowe „GenerProj” realizuje również i ten etap. Wykorzystuje ono przy tym dwa unikatowe interfejsy - LaborDataInterface oraz ViewDataInterface. Przeznaczeniem pierwszego z nich jest implementowanie algorytmów matematycznego przekształcania zbioru danych liczbowych. Przekształcenie takie może być równoznaczne z przeprowadzeniem określonego testu statystycznego na wygenerowanym zbiorze. Omawiany interfejs oferuje bowiem dwie podstawowe metody: setInputData oraz getOutputData. Metoda setInputData, jak wskazuje nazwa, pozwala na podawanie danych, natomiast getOutputData na pobieranie rezultatów przekształcenia. Istotnym założeniem środowiska jest to, iż dane nie muszą być przekazywane jednorazowo, lecz mogą być podawane pakietami. Jednak od momentu rozpoczęcia pobierania wyników strumień wejściowy przestaje być uwzględniany i nie wpływa na stan wyjścia. Odbieranie danych od przekształcenia również może zachodzić w sposób pakietowy. Sytuacja taka ma miejsce, kiedy przekształcenie generuje znaczną liczbę danych w stosunku do ograniczonej pojemności środowiska. Wyniki są wtedy dzielone na mniejsze fragmenty, które kolejno są oddawane na zewnątrz. Po uzyskaniu wszystkich danych strumień wyjściowy jest blokowany. W praktyce przekształcenia są realizowane na dwa podstawowe sposoby. Wśród algorytmów można wyodrębnić takie, które do wykonania przekształcenia potrzebują całościowego zbioru danych liczbowych oraz takie, które mogą na bieżąco wykonywać obliczenia.. 3/5.

(4) www.pwt.et.put.poznan.pl. Przykładowo, wyznaczanie minimum zbioru może być wykonywane w trakcie otrzymywania danych wejściowych. Natomiast określenie częstości występowania konkretnych wartości w grupach, bez znajomości zakresu danych, wymaga „odczekania” algorytmu na całościową informację. Tak więc właściwy algorytm przekształcenia danych zostaje „uruchomiony” albo w momencie podawania danych metodą setInputData, albo w momencie pobierania wyników poprzez metodę getOutputData. Drugi interfejs ViewDataInterface powstał z myślą o zagospodarowaniu przestrzeni prezentacji otrzymywanych wyników przekształceń. Klasy realizujące to zadanie w prezentowanym środowisku projektowania są „zobowiązane” do stosowania pary podstawowych metod: metody sekwencyjnego przyjmowania danych do zinterpretowania, setData, oraz metody obrazowania ich w ustalonej przez siebie formie showView. Dodatkowymi metodami, które uwzględnia interfejs ViewDataInterface są refreshView, odświeżania obrazowanej informacji, oraz getView, zwracającej obiekt widoku, jeżeli zaistnieje potrzeba zamieszczenia go w podrzędnej strukturze. Aby praktycznie przyjrzeć się funkcjonowaniu zaprezentowanych interfejsów można przeanalizować przebieg testu chi-kwadrat na wcześniej zaprojektowanym generatorze LCG proponowanym przez Fishman’a z 1990. Test ten pozwala na sprawdzenie zbieżności otrzymywanych danych do zadanego rozkładu i stwierdza wobec niego, czy uzyskane dane pseudolosowe są rozłożone w sposób zbyt mocno od niego odbiegający lub zbyt zgodny. Test ten przeprowadziliśmy wykonując go 15 razy na wymienionym generatorze z liczebnością próbki wynoszącą 10.000 oraz określając liczbę stopni swobody na 19 (czyli 20 klas wedle których zostaną poszeregowane wygenerowane dane). Przed każdym testem generator był inicjowany przez ziarno, zaczerpnięte z systemowego zegara, co zapewniało ustalenie nowego początkowego punktu pracy. Efektem końcowym testu jest ciąg piętnastu wartości chi-kwadrat, które przedstawione są w zaokrągleniu do czwartego miejsca po przecinku w tabeli 2. Tab. 2. Wyniki testu Chi Kwadrat (15 próbek po 10.000 liczb) dla LCG Fishmana z 1990 24.9684 8.1337 27.6927. 20.4839 14.38 36.556. 11.0378 19.196 21.04. 33.5752 15.6947 27.72. 11.7966 20.3906 21.712. Dane te można ocenić na podstawie tabeli wartości krytycznych rozkładu chi-kwadrat, której fragment, odpowiadający liczbie stopni swobody ν=19 zamieszczamy w tabeli 3 [7]. Ciekawostką jest to, że generator Fishmana z roku 1986 nie wykazuje dobrej jakości generowanych ciągów, hipoteza liniowości rozkładu danych pseudolosowych zostaje odrzucona. Jest to zgodne z doświadczeniem autorów publikacji [6].. PWT 2005 - POZNAŃ 8-9 GRUDNIA 2005. Tab. 3. Wartości krytyczne rozkładu chi-kwadrat dla stopni swobody ν=19, w zależności od parametru α 0,01 7,633. 0,05 10,117. 0,1 11,651. 0,2 13,716. 0,3 15,352. 0,4 16,850. 0,5 18,338. 0,6 19,910. 0,7 21,689. 0,8 23,900. 0,9 27,204. 0,95 30,144. 0,99 36,191. Do przeglądania wyników testowania można wykorzystać tryb prezentacji dostępny w aplikacji autorskiej. Mechanizm prezentacji działa poprzez klasę ViewTestChiSquare (Rysunek 3), realizującą interfejs ViewDataInterface. Postać prezentowanych wyników klasa opiera o wizualizację zaprezentowaną w [3]. Uzyskane wyniki podzielone są na 4 kategorie: Odrzucone, Podejrzane, Akceptowalne oraz Zaakceptowane. Każda kategoria jest oznaczona swoim prywatnym kodem (wyniki zaakceptowane są oznaczone pustą kratką) oraz jest wyznaczona przez swój próg prawdopodobieństwa. Próg jednoprocentowy oznacza, że wynik zawiera się w zakresie wartości krytycznych określonych dla prawdopodobieństw 0-1% lub 99-100%, pięcioprocentowy dla prawdopodobieństw 1-5% lub 9599% itd. Tak więc ustalony próg powoduje automatyczne odcięcie wartości od dołu (dla rozkładu zbyt prawdopodobnego) oraz od góry (dla rozkładu zbytnio odbiegającego od założonego rozkładu statystycznego).. Rys. 3. Prezentacja graficzna testów Chi Kwadrat Innym z ciekawszych testów, stosowanych względem generatorów multiplikatywnych jest test struktury przestrzennej. Sposób jego przeprowadzenia oparto na publikacji [3]. Polega on na zobrazowaniu wyników otrzymywanych z generatora pseudolosowego w postaci graficznego wykresu, na którym zamieszcza się zbiór punktów utworzonych z par kolejno generowanych liczb. Ćwiczenie to, podobnie jak w przykładzie autora, wykonano w oparciu o generator multiplikatywny o następujących parametrach: a=12, m=101. Wynik, zobrazowany na rysunku 4 przedstawia zbiór punktów, który układa się w specyficzne linie. Niezależne ciągi losowe charakteryzują się równomiernym rozkładem naniesionych punktów, czego efektem byłoby wypełnienie całej przestrzeni. 4/5.

(5) www.pwt.et.put.poznan.pl. podzielonej na jednostkowe kostki. Natomiast w tym przykładzie są wypełniane zaledwie niektóre z nich i dodatkowo układają się w dobrze widoczne linie. Takie ułożenie sugeruje, iż jest to ciąg zależnych zmiennych losowych.. SPIS LITERATURY [1] D. E. Knuth, Sztuka programowania. Tom 2. Algorytmy seminumeryczne, WNT, Warszawa 2002 [2] R. Zieliński, Generatory liczb losowych, WNT, Warszawa 1979 [3] R. Wieczorowski, R. Zieliński, Komputerowe generatory liczb losowych, WNT, Warszawa 1997 [4] B. P. Zeigler, Teoria modelowania i symulacji, PWN, Warszawa 1984 [5] S. Brandt, Analiza danych, rozdz. 4. „Metoda Monte Carlo i generowanie liczb losowych”, PWN, Warszawa 1998, [6] P. L'Ecuyer, R. J. Simard, “Beware of linear congruential generators with multipliers of the form a = ±2q ±2r”, ACM Trans. Math. Softw., 25(3), str. 367-374, 1999 [7] Tablice matematyczne, Wydawnictwo Adamantan, str. 374, Warszawa 2002. Rys. 4. Prezentacja struktury przestrzennej par punktów wygenerowanych z generatora multiplikatywnego o m=101 i a=12 5. PODSUMOWANIE Ćwiczenia praktyczne z zakresu liczb pseudolosowych mogą być wspierane autorską aplikacją Java, którą zaprojektowano celowo jako środowisko projektowe o budowie otwartej. Istotną zaletą aplikacji jest to, że w wyniku prac projektowych powstają wygodne warunki do implementacji przetestowanych generatorów w innych programach Java poprzez zastosowanie opracowanych interfejsów. Możliwość ta ma znaczenie szczegółowe przy opracowaniu ćwiczeń dla osób studiujących kierunek Informatyka.. PWT 2005 - POZNAŃ 8-9 GRUDNIA 2005. 5/5.

(6)

Cytaty

Powiązane dokumenty

• Okno tekstowe do wyświetlenia prawidłowo przeliczonej wartości podanej w PLN na walutę obcą (jTextField)... Kiedy już mamy komponenty na formatce ustawiamy ich

Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007. Java jest niezależna

class mojAdapter extends MouseAdapter { public void mouseClicked(MouseEvent e) { //implementacja obsługi zdarzenia. }

w Windows jest to System Tray odnosi się do paska, a w GNOME rozumiany jest jak obszar powiadomień.

Napisz program, który dla podanych jako argumenty programu nazwisk wpisze je do tablicy nazwisk, a następnie wypisze na je w kolejności od najdłuższego na ekran podając dla

Write a program that read command line arguments and write in order form longest to shortest and give its length:. Documentation

Gdy od zmiennej typu znakowego w której skład wchodzą nie tylko znaki cyfr ale i litery odejmiemy zmienną typu liczbowego wówczas otrzymanym wynikiem będzie..

resize odpalane, rozmiar okna przeglądarki jest zmieniany select odpalane, gdy zawartość obiektu została zaznaczona submit odpalane, gdy formularz został wysłany.. unload