Java - Myśleć jak programista: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Linia 747:
(Przyp.tłum. - stany i diagramy stanów - chodzi o te obrazki które niby ukazują co się dzieje w programie. Moim zdaniem autor zamieścił je bo chciał sobie porysować i zwiększyć objętość książki)<br />
 
==Ćwiczenia*==
'''Rectangle''' to klasa Prostokąt<br/>
'''''ćwiczenie 1''''' <br />
1. W poniższym programie, narysować diagram pokazujący zmienne lokalne i parametry main i metody riddle, i pokazać wszystkie obiekty do których te zmienne się odnoszą. <br />
Linia 767 ⟶ 768:
:::<tt> return x + p.x + p.y;</tt><br/>
}</tt><br/> ''Celem tego ćwiczenia jest zrozumienie mechanizmu przekazywania obiektu jako parametru metody.''<br />
 
'''''ćwiczenie 2''''' <br />
W poniższym programie narysuj diagram ukazujący stan programu tuż przed zwróceniem <tt>distance</tt>. Powinieneś zawrzeć w diagramie wszystkie zmienne i parametry obiektów do których te zmienne się odnoszą.<br />
 
Jakie jest wyjście tego programu? <br />
 
public static double distance ( Punkt p1 , Point p2 ) { <tt><br />
 
    int dx = p1.x - p2.x ;<tt><br />
    int dy = p1.y - p2.y ;<tt><br />
    return Math.sqrt ( dx * dx + dy * dy ) ;</tt><br />
}<tt><br />
 
<tt>public static Point findCenter (Rectangle box) {</tt><br />
:::<tt>    int x = box.x + box.width / 2;</tt><br />
:::<tt>    int y = box.y + box.height / 2;</tt><br />
:::<tt>    return new Point ( x, y) ;</tt><br />
}<tt><br />
 
<tt>public static void main ( String [ ] args ) {</tt><br />
:::<tt>    Point blank = new Point ( 5, 8 );</tt><br />
 
:::<tt>    Rectangle rect = new Rectangle ( 0, 2, 4, 4);</tt><br />
:::<tt>    Point center = findCenter ( rect ) ;</tt><br />
 
:::<tt>    double dist = distance(center, blank);</tt><br />
 
:::<tt>    System.out.println ( dist ) ;</tt><br />
<tt>}</tt><br/>
 
'''''ćwiczenie 3''''' <br />
Metoda <tt>grow</tt> jest częścią klasy Rectangle. Przeczytaj dokumentację na [http://download.oracle.com/javase/6/docs/api/java/awt/Rectangle.html#grow(int,%20int) TEJ] stronie <br/>
Jakie jest wyjście tego programu? <br/>
Narysować diagram stanu , który pokazuje stan programu tuż przed końcem <tt>main</tt> .Powinieneś zawrzeć w diagramie wszystkie zmienne i parametry obiektów do których te zmienne się odnoszą.<br />
 
Na końcu <tt>main</tt>: czy p1 i p2 są aliasami? Dlaczego lub dlaczego nie? <br/>
<tt>public static void printPoint ( punkt P ) {</tt><br/>
:::<tt>    System.out.println ("( " + p.x + "," + p.y + " )"); </tt><br/>
<tt>}</tt><br/>
 
public static Point findCenter (Rectangle box ) {</tt><br/>
:::<tt>    int x = box.x + box.width / 2 ;</tt><br/>
:::<tt>    int y = box.y + box.height / 2 ;</tt><br/>
:::<tt>    return new Point ( x, y) ;</tt><br/>
<tt>}</tt><br/>
 
public static void main ( String [ ] args ) {</tt><br/>
 
:::<tt>    Rectangle box1 = new Rectangle ( 2 , 4 , 7 , 9 ) ;</tt><br/>
:::<tt>    Point p1 = findCenter ( box1 ) ;</tt><br/>
:::<tt>    printPoint ( P1) ;</tt><br/>
 
:::<tt>    box1.grow ( 1 , 1) ;</tt><br/>
:::<tt>    Point p2 = findCenter ( box1 ) ;</tt><br/>
:::<tt>    printPoint (P2 ) ;</tt><br/>
<tt>}</tt><br/><br/>
'''''ćwiczenie 4''''' <br />
 
Możesz już rzygać metodą rekurencyjną '''silnia''', ale mamy zamiar zrobić jeszcze jedną jej wersję.
Utwórz nowy program o nazwie Big.java i napisz iteracyjną wersję funkcji silnia.<br/>
 
Wypisz na ekran tabelę z liczbami całkowitymi od 0 do 30 wraz z ich silniami. W pewnym momencie około 15, prawdopodobnie zobaczysz , że odpowiedzi nie są poprawne. Dlaczego nie?<br/>
BigIntegers są obiektami Java , które mogą reprezentować dowolnie duże liczby całkowite. Nie istnieje górna granica. Wyjątkiem ograniczenia jest wielkość pamięci na twoim komputerze i prędkości przetwarzania. Przeczytaj dokumentację BigIntegers na [http://download.oracle.com/javase/6/docs/api/java/math/BigInteger.html tej stronie].<br/>
Aby korzystać z klasy BigIntegers , trzeba zaimportować java.math.BigInteger na początku programu.<br/>
Istnieje kilka sposobów tworzenia BigInteger , ale jeden ze sposobów, który osobiście polecam używa valueOf. Następujący kod konwertuje liczbę całkowitą do BigInteger : <br/>
:::<tt>int x = 17 ;</tt><br/>
:::<tt>BigInteger big = BigInteger.valueOf ( x ) ;</tt><br/>
 
Wpisz ten kod i wypróbuj go. Spróbuj wypisać BigInteger.<br/>
Ponieważ BigIntegers nie są typami bazowymi, zwykłe operatory matematyczne na nich nie działają. Zamiast tego musimy użyć metody, takie jak <tt>add</tt>. Aby dodać dwa obiekty BigIntegers, musisz wywołać <tt>add</tt> na jednym obiekcie z drugim obiektem jako jego argument: <br/>
:::<tt>BigInteger small = BigInteger.valueOf ( 17); </tt><br/>
:::<tt>BigInteger big = BigInteger.valueOf (1700000000) ; </tt><br/>
:::<tt>BigInteger total = small.add (big) ; </tt><br/>
Wypróbuj kilka innych metod, takich jak <tt>multiply</tt> czy <tt>pow</tt>. <br/>
 
Napisz metodę silnia która obsługuje obiekty typu BigInteger. <br/>
Spróbuj ponownie wypisać tabelę używając zmodyfikowanej metody silni. Czy udało się wypisać silnie do 30? Jak dużą silnię można uzyskać? Ja obliczyłem silnię wszystkich liczb od 0 do 999, ale mój komputer jest dość powolny, więc zajęło to trochę czasu. Ostatnia liczba, 999!, miała 2565 cyfr. <br/>
 
 
'''''ćwiczenie 5''''' <br />
Wiele technik szyfrowania zależy od zdolności do podniesienia dużych liczb całkowitych do potęgi całkowitej. Oto metoda, która implementuje
(całkiem rozsądnie) szybką technikę całkowitego potęgowania:<br/>
public static int pow ( int x , int n ) {</tt><br/>
:::<tt>    if ( n == 0 ) return 1 ;</tt><br/>
 
:::<tt>    //znajdź x do n / 2 rekurencyjnie</tt><br/>
:::<tt>   int t = pow ( x , n / 2 ) ;</tt><br/>
 
:::<tt>   //Jeśli n jest parzyste ,wynikiem jest '''t''' do kwadratu</tt><br/>
:::<tt>    //Jeśli n jest nieparzyste , to wynikiem jest '''t''' do kwadratu razy x</tt><br/>
 
:::<tt>    if ( n% 2 == 0 ) {</tt><br/>
:::<tt>      return t * t ;</tt><br/>
:::<tt>   } else {</tt><br/>
:::<tt>      return t * t * x;</tt><br/>
:::<tt>    }</tt><br/>
<tt>}</tt><br/><br/>
Problem z tej metody jest to, że to działa tylko dla liczb mniejszych niż 2 miliardy. Przerób kod tak, aby można było użyć obiektów BigInteger. Parametry powinny nadal być liczbami całkowitymi, choć możesz użyć metod BigInteger: <tt>add</tt> czy<tt>multiply</tt>, lecz nie używaj <tt>pow</tt>, metoda ta psuje całą zabawę. <br/><br/>
'''''ćwiczenie 6''''' <br />
::Jeśli jesteś zainteresowany grafiką, teraz jest dobry moment, aby przeczytać [http://www.greenteapress.com/thinkapjava/html/thinkjava019.html#graphics Dodatek A] i zrobić zamieszczone tam ćwiczenia.
 
=Stwórz swoje własne obiekty=