Professional Documents
Culture Documents
Programowanie W Języku Java. Zbiór Zadań Z (P) Odpowiedziami - Wiesław Rychlicki
Programowanie W Języku Java. Zbiór Zadań Z (P) Odpowiedziami - Wiesław Rychlicki
Programowanie W Języku Java. Zbiór Zadań Z (P) Odpowiedziami - Wiesław Rychlicki
pl
Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej
publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną,
fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje
naruszenie praw autorskich niniejszej publikacji.
Autor oraz Wydawnictwo HELION dołożyli wszelkich starań, by zawarte w tej książce informacje
były kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie,
ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich.
Autor oraz Wydawnictwo HELION nie ponoszą również żadnej odpowiedzialności
za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce.
Wydawnictwo HELION
ul. Kościuszki 1c, 44-100 GLIWICE
tel. 32 231 22 19, 32 230 98 63
e-mail: helion@helion.pl
WWW: http://helion.pl (księgarnia internetowa, katalog książek)
Drogi Czytelniku!
Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres
http://helion.pl/user/opinie?projaz_ebook
Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję.
ISBN: 978-83-246-6366-8
Printed in Poland.
• Oceń książkę
Przeomem w rozwoju tego jzyka stao si napisanie w nim przegldarki internetowej
HotJava. Umoliwiaa ona uruchamianie kodu wbudowanego w strony internetowe,
czyli tzw. apletów. Efekty pracy opublikowano w maju 1995 roku w magazynie „Sun
Word” i odtd Java zacza zyskiwa popularno.
Na pocztku 1996 roku ukazaa si pierwsza oficjalna wersja jzyka — Java 1.0. Ha-
sem promujcym Jav byo zdanie Write Once, Run Anywhere („Napisz raz, urucha-
miaj wszdzie”). W kolejnych wersjach uzupeniano zauwaone braki i dodawano nowe
funkcjonalnoci. Systematycznie rosa liczba klas i interfejsów:
JDK1 1.0 (23 stycznia 1996 r. — 211 klas i interfejsów) — pierwsza oficjalna
wersja Javy.
JDK 1.1 (19 lutego 1997 r. — 477 klas i interfejsów).
J2SE2 1.2 (8 grudnia 1998 r. — 1524 klasy i interfejsy) — nazwa kodowa
Playground.
J2SE 1.3 (8 maja 2000 r. — 1840 klas i interfejsów) — nazwa kodowa
Kestrel.
J2SE 1.4 (6 lutego 2002 r. — 2723 klasy i interfejsy) — nazwa kodowa
Merlin.
J2SE 5.03 (30 wrzenia 2004 r. — 3270 klas i interfejsów) — nazwa kodowa
Tiger.
Java SE 64 (11 grudnia 2006 r. — 3777 klas i interfejsów) — nazwa kodowa
Mustang.
Java SE 7 (28 lipca 2011 r.) — nazwa kodowa Dolphin.
W 2007 roku firma Sun ogosia, e kolejne wersje jzyka bd dostpne na licencji
GPL i taka jest wanie licencja dla wersji Java SE 7. Autor podczas pracy nad zbio-
rem zada uywa wersji Java SE 6. Wszystkie przedstawione rozwizania nie bd
sprawia problemów w Java SE 7. Od 27 stycznia 2010 roku nowym wacicielem
Javy jest firma Oracle, która kupia firm Sun Microsystems.
Zadanie 1.1.
Przygotuj komputer do programowania w jzyku Java.
Zadanie 1.2.
Sprawd , czy rodowisko JDK do programowania w jzyku Java jest poprawnie zain-
stalowane na Twoim komputerze. Jak wersj rodowiska masz zainstalowan?
1
Java Development Kit — pakiet udostpniajcy kod bajtowy wszystkich klas standardowych, maszyn
wirtualn do ich uruchamiania oraz róda klas i narzdzia niezbdne do programowania w jzyku Java
(m.in. kompilator, paker, debuger).
2
Java 2 Platform, Standard Edition — podstawowa wersja platformy Java, pozwalajca tworzy i uru-
chamia aplikacje napisane w jzyku Java na komputerach stacjonarnych i serwerach. Od tego wyda-
nia Java rozwija si w trzech wersjach: J2SE, J2EE (Java 2 Platform, Enterprise Edition — serwerowa
platforma programistyczna jzyka Java) i J2ME (Java 2 Platform Micro Edition — uproszczona wer-
sja platformy Java, zaprojektowana z myl o tworzeniu aplikacji mobilnych dla urzdze o bardzo
ograniczonych zasobach).
3
Dotychczasow numeracj 1.5 zmieniono na 5.0.
4
J2SE zastpiono Java SE, a z numeracji usunito 0. Nadal jednak uywa si równie oznaczenia 1.6.
Sprawd w oknie konsoli (praca w trybie MS-DOS) dziaanie polece java i javac.
Zadanie 1.3.
Przygotuj „cigawk” z instrukcj uruchamiania wirtualnej maszyny Javy (JVM).
Zadanie 1.4.
Przygotuj „cigawk” z instrukcj uruchamiania kompilatora Javy (javac.exe).
Metoda zastosowana w rozwizaniu zadania 1.3 nie sprawdzi si w tym przypadku.
Informacje s zawsze wywietlane na ekranie. Naley poszuka innego rozwizania.
Zadanie 1.5.
Przygotuj folder, w którym bdziesz zapisywa swoje kody ródowe, i kilka plików
wsadowych uatwiajcych dalsz prac.
Na pocztek tak przygotowane narzdzia w zupenoci nam wystarcz. Autor nie jest
zwolennikiem strzelania z armaty do wróbli (generalnie uwaa, e strzelanie do wró-
bli nie jest wskazane), wobec tego nie proponuje Czytelnikowi uycia skomplikowa-
nych zintegrowanych rodowisk programistycznych (IDE) i wieloplikowych projektów
do kompilowania i uruchamiania kilku linijek kodu. Po wykonaniu tych zada moesz
kontynuowa nauk programowania w jzyku Java.
Listing 1. Hello.java
public class Hello {
public static void main(String args[]) {
System.out.println("Hello World");
}
}
Zadanie 2.1.
Przepisz dokadnie kod ródowy podany na listingu 1. Skompiluj go i uruchom.
Zadanie 2.2.
Napisz polskojzyczn wersj klasycznego przykadu z zadania 2.1. Klas nazwij Witam;
uruchomiona aplikacja powinna wywietli w konsoli napis (w dwóch wierszach):
Witaj, wiecie.
Ucz si programowa w jzyku Java.
Zadanie 2.3.
Napisz program, który wywietli na ekranie Twój adres w kilku wierszach, tak jak na-
pisaby go na kopercie (plik ródowy: Adres.java).
Zadanie 2.4.
Napisz program, który wywietli na ekranie etykietk zawierajc Twoje imi i na-
zwisko (plik ródowy: Etykieta.java). Jako wzór (niekoniecznie do wiernego odtwo-
rzenia) przyjmij podany przykad:
******* Programowanie *******
* obiektowe w jzyku Java *
* Jan Nowak *
*****************************
Klasa Character opakowuje prosty typ char w obiekt; posiada jedno pole typu char
i szereg metod dziaajcych na znakach.
Najczciej posugujemy si staymi znakowymi, np. 'A' jest znakiem o kodzie 65.
W ten sposób moemy zapisywa wszystkie znaki widoczne na klawiaturze. Znaki
specjalne posiadaj symbole zastpcze: \b — backspace, \t — tabulator, \n — przej-
cie do nowego wiersza, \r — powrót karetki (przejcie na pocztek wiersza), \" —
znak cudzysowu, \' — znak apostrofu, \\ — znak lewego ukonika (ang. slash). Znaki
Unicode moemy zapisywa w notacji szesnastkowej — wartoci od \u0000 do \uFFFF
(65 536 znaków)5. W konsoli bd wywietlone poprawnie znaki zdefiniowane w wy-
branej czcionce, pozostae znaki zostan zastpione znakiem zapytania (?). Oto kilka
operacji na zmiennych typu char:
char a; // deklaracja zmiennej
a = 'A'; // przypisanie do zmiennej a znaku 'A' (staej znakowej 'A')
char b = 'B'; // zadeklarowanie zmiennej b i zainicjowanie jej wartoci 'B'
b = a; // przypisanie zmiennej b wartoci zmiennej a
char alfa = '\u03B1'; // grecka litera alfa ()
Zwykle pojedyncze znaki nam nie wystarczaj, wic tworzymy tablice znaków. Zmien-
n tablicow (w tym przypadku tablic znaków) moemy zadeklarowa na dwa sposoby:
char[] znaki lub char znaki[]. Sowo znaki jest identyfikatorem (nazw) zmiennej,
natomiast char nazw typu danych przechowywanych w tablicy. Tablicami zawiera-
jcymi dane rónych typów bdziemy posugiwali si wielokrotnie. Na razie zadekla-
rowalimy zmienn znaki. Teraz moemy utworzy tablic za pomoc operatora new:
znaki = new char[15];
Pozostaje wypeni tablic wartociami, np.: znaki[0] = 'W', znaki[1] = 'i' itd. (pa-
mitajmy o zakresie indeksów; przekroczenie zakresu zakoczy si zgoszeniem wy-
jtku ArrayIndexOutOfBounds).
5
Na tym etapie ta informacja w zupenoci wystarczy. Obecnie standard Unicode umoliwia zakodowa-
nie wikszej liczby znaków. Zastosowano siedemnacie tzw. przestrzeni numeracyjnych. My ograniczy-
my si do podstawowej przestrzeni numeracyjnej.
Rozmiar tej tablicy jest równy 5, a indeksy elementów zawieraj si w przedziale
od 0 do 4.
Tablica jest struktur danych stanowicych zestaw elementów tego samego typu.
Tablic moemy utworzy za pomoc operatora new. Tworzc tablic, naley okreli
liczb elementów:
// zmienna nazwaTablicy bya wczeniej zadeklarowana
nazwaTablicy = new typ_danych[liczba_elementów];
// deklaracja i tworzenie tablicy elementów
typ_danych[] nazwaTablicy = new typ_danych[liczba_elementów];
Zadanie 3.1.
Utwórz tablic znaków zawierajc napis Dzie dobry. Napisz aplikacj (plik ródo-
wy: Witaj.java), która wywietli napis w konsoli.
Parametrem wywoania metody print() lub println() (obiektu out z klasy System)
moe by warto typu char lub char[].
Zadanie 3.2.
Utwórz tablic zawierajc znaki sowa Informatyka. Napisz program wywietlajcy
znaki zawarte w tablicy w nastpujcy sposób (plik ródowy: Informatyka.java):
a) pionowo — kady znak w odrbnym wierszu,
b) poziomo — znaki rozdzielone dodatkowymi odstpami (tzw. spacjowanie
lub rozstrzelenie tekstu).
6
Tablica jest obiektem, który posiada pole (wasno) length. Pojcie to wkrótce bdzie wyjanione
dokadniej.
Zadanie 3.3.
Utwórz tablic zawierajc znaki sowa programowanie. Napisz program zmieniaj-
cy zawarto tablicy i wywietlajcy efekty tych zmian (plik ródowy: Programowa-
nie.java):
a) zamie pierwsz liter na wielk,
b) zamie wszystkie litery na wielkie.
Tym razem ptla typu for each nie wystarczy. Przegldajc tablic, musimy mie
moliwo modyfikowania znaków. Aby zmodyfikowa znak, naley zna jego indeks.
Dostp do wszystkich znaków w tablicy dane uzyskamy, stosujc ptl typu for:
for(int i=0; i < dane.length; ++i) {
// tu wykonaj przeksztacenie zwizane z elementem dane[i]
}
Zadanie 3.4.
Utwórz tablic zawierajc znaki sowa programowanie. Napisz program wywietla-
jcy znaki zawarte w tablicy w kolejnoci odwrotnej — od koca do pocztku (plik
ródowy: Wspak1.java).
Mona zastosowa ptl for, w której nastpuje odliczanie w dó (od wartoci wik-
szych do mniejszych for(int i=dane.length–1; i >= 0; ––i) ....
Do przegldania (odczytu) zawartoci tablicy moemy wykorzysta ptl typ for each:
for(typ_danych z : tablica) instrukcja;
Zmienna z przyjmuje kolejno wartoci wszystkich elementów tablicy (od pocztku
do koca).
Do przegldania (odczytu) lub modyfikowania (zapisu) zawartoci tablicy moemy
wykorzysta ptl typu for:
for(int i = 0; i < tablica.length; ++i) instrukcja; /* Odliczanie w gór */
lub:
for(int i = tablica.length-1; i >= 0; --i) instrukcja; /* Odliczanie w dó */
Zadanie 3.5.
Utwórz tablic zawierajc znaki sowa programowanie. Napisz program odwracaj-
cy kolejno znaków w tablicy (plik ródowy: Wspak2.java).
Zadanie 3.6.
Przeanalizuj kod podany na listingu 2. Przepisz kod i uruchom t aplikacj. Sprawd ,
czy wyniki na ekranie s zgodne z Twoimi oczekiwaniami. Na podstawie tego kodu
i dokumentacji klasy Character napisz wasn aplikacj pokazujc dziaanie wybra-
nej metody lub wartoci zdefiniowanych staych.
Listing 2. DemoCharacter.java
import static java.lang.System.*;
public class DemoCharacter {
public static void main(String args[]) {
/* Informacje o metodzie */
out.println("Klasa: java.lang.Character");
out.println("Metoda statyczna: digit\n");
out.println("static int digit(int ch, int radix)");
out.println("Returns the numeric value of the character ch
in the specified radix.");
out.println();
/* Przykadowa tablica znaków */
char znak[] = {'E', 'u', 'r', 'o', ' ', '2', '0', '1', '2'};
/* Demonstracja dziaania metody */
out.println("Warto znaku jako cyfry w ukadzie dziesitkowym
(radix = 10)");
for(char z : znak)
out.println("Znak: "+z+" Cyfra: "+Character.digit(z, 10));
out.println("Uwaga: -1 oznacza, e znak nie jest cyfr w tym
ukadzie liczbowym.");
out.println();
out.println("Warto znaku jako cyfry w ukadzie szesnastkowym
(radix = 16)");
for(char z : znak)
out.println("Znak: "+z+" Cyfra: "+Character.digit(z, 16));
out.println("Uwaga: -1 oznacza, e znak nie jest cyfr w tym
ukadzie liczbowym.");
}
}
Zadanie 3.7.
Napisz program, który utworzy dziesicioelementow tablic znaków i wypeni j cy-
frami od 0 do 9 (plik ródowy: Cyfry.java).
Zadanie 3.8.
Napisz program, który utworzy szesnastoelementow tablic znaków i wypeni j cy-
frami ukadu szesnastkowego (plik ródowy: Cyfry16.java).
Moesz postpi podobnie jak w zadaniu 3.7 lub wykorzysta statyczn metod
forDigit() z klasy Character.
Zadanie 4.1.
Uruchom aplikacj, której kod ródowy przedstawiono na listingu 3. Na podstawie
obserwacji wyników dziaania programu opisz dziaanie uytych metod klasy String.
W przypadku wtpliwoci zajrzyj do dokumentacji jzyka Java (np. http://download.
oracle.com/javase/6/docs/api/java/lang/String.html).
Listing 3. TestString.java
public class TestString {
public static void main(String args[]) {
System.out.println("Zadania z programowania.");
System.out.println("Zadania z programowania.".charAt(0));
System.out.println("Zadania z programowania.".length());
System.out.println("Zadania z programowania.".charAt(23));
System.out.println("Zadania z programowania.".toUpperCase());
System.out.println("Zadania z programowania.".toLowerCase());
System.out.println("Zadania z programowania.".indexOf('z'));
System.out.println("Zadania z programowania.".indexOf("prog"));
System.out.println("Zadania z programowania.".replace('.', '?'));
System.out.println("Zadania z programowania.".
replace("adania", "dania"));
System.out.println("Zadania z programowania.".
replaceAll("ania", "anka"));
System.out.println("Zadania z programowania.".
replaceFirst("ania", "anka"));
System.out.println("Zadania z programowania.".substring(10));
System.out.println("Zadania z programowania.".substring(10, 17));
System.out.println("Zadania z programowania.".
concat("\b z podpowiedziami."));
System.out.println("Zadania z programowania."+"\b"+
" z odpowiedziami.");
}
}
Oczywicie moemy tworzy zmienne typu obiektowego String. Poniewa raz utwo-
rzony acuch znaków (ang. string) nie moe by zmieniany, to kada operacja powo-
duje tworzenie nowego acucha. Zmienna jest referencj do acucha znaków, wic
moemy przypisa jej inny acuch (w szczególnoci zmieniony obraz acucha, który
wskazywaa wczeniej). Nie powoduje to problemów z pamici, gdy zbdne obiekty
w Javie s automatycznie usuwane. Utworzon zmienn naley zainicjowa:
String napis = "Zadania z programowania.";
lub:
String napis = new String("Zadania z programowania.");
acuch moemy równie utworzy z tablicy znaków, np.:
char[] znaki = {'z', 'a', 'd', 'a', 'n', 'i', 'e'};
String napis = new String(znaki);
Zadanie 4.2.
Napisz program z listingu 3., wykorzystujc zamiast literaów zmienne reprezentujce
obiekty typu String lub zmienne typu char. Klas nazwij DemoString.
Aby kod by czytelny, wprowad odpowiednie nazwy zmiennych, np. char kropka
= '.'; itp.
Zadanie 4.3.
Utwórz acuch zawierajcy napis Dzie dobry. Napisz aplikacj (plik ródowy: WitajStr.
java), która wywietli napis w konsoli:
a) pionowo — kady znak w odrbnym wierszu,
Zadanie 4.4.
Utwórz acuch znaków zawierajcy sowo programowanie. Napisz program zmie-
niajcy zawarto acucha i wywietlajcy efekty tych zmian (plik ródowy: Pro-
gramowanieStr.java):
a) zamie pierwsz liter na wielk,
b) zamie wszystkie litery na wielkie.
Moemy utworzy nowy acuch, speniajcy warunki zadania, i przypisa jego war-
to tej samej zmiennej. Dotychczasowa warto zostanie usunita z pamici w chwili,
gdy nie bdzie ju dalej potrzebna.
Zadanie 4.5.
Utwórz acuch znaków zawierajcy sowo programowanie. Napisz program, który
znaki zawarte w acuchu bdzie wywietla w kolejnoci odwrotnej, od koca do po-
cztku (plik ródowy: WspakStr1.java).
Zadanie 4.6.
Utwórz acuch znaków zawierajcy sowo programowanie. Napisz program odwra-
cajcy kolejno znaków w acuchu (plik ródowy: WspakStr2.java).
Zadanie 4.7.
Napisz program, który utworzy acuch znaków wypeniony cyframi od 0 do 9 (plik
ródowy: CyfryStr.java).
Rozwizanie tego zadania jest zupenie banalne — poprawna odpowied to: String
cyfry = "0123456789";. Spróbuj jednak zbudowa ten acuch z poszczególnych
znaków (zob. zadanie 3.7). Takie podejcie do zagadnienia moe w przyszoci si
przyda .
Zadanie 4.8.
Napisz program, który utworzy acuch znaków wypeniony cyframi ukadu szesnast-
kowego (plik ródowy: CyfryStr16.java).
Jeli aplikacj wywoamy bez dodatkowych parametrów (java NazwaKlasy), czyli liczba
argumentów bdzie równa 0, to wtedy tablica args bdzie pusta (nie bdzie zawiera
adnego elementu).
Zadanie 5.1.
Napisz program, który wywietli na ekranie liczb argumentów wywoania aplikacji
oraz podane argumenty. Kady argument powinien by wywietlony w odrbnym wier-
szu (plik ródowy: Argumenty.java).
Do przegldania zawartoci tablicy wykorzystaj ptle typu for lub for each (zob.
zadanie 3.2).
Zadanie 5.2.
Napisz program (plik ródowy: Osoba.java), który uruchamiany z dwoma parame-
trami, imi i nazwisko, wywietli na ekranie w kolejnych wierszach te dane wedug
schematu:
Nazwisko: Kowalska
Imi: Maria
Nazwisko i imi: KOWALSKA Maria
Inicjay: MK
Login: KOmar
Zadanie 5.3.
Napisz program (plik ródowy: ArgsWspak.java), który uruchomiony z kilkoma argu-
mentami wypisze list argumentów, oddzielonych odstpami, w odwrotnej kolejnoci.
Zadanie 5.4.
Napisz program (plik ródowy: ArgWspak.java), który uruchomiony z kilkoma argu-
mentami wypisze kady argument w odrbnym wierszu, odwracajc przy tym kolejno
znaków w argumencie.
Naley uy dwóch ptli, stosujc tzw. zagniedanie ptli. Zewntrzna ptla powin-
na odczyta kolejno wszystkie argumenty, a wpisana w jej ciele wewntrzna ptla
ma za zadanie odwróci kolejno znaków w biecym argumencie.
Zadanie 5.5.
Napisz program, który wywietli na ekranie etykietk zawierajc imi i nazwisko po-
dane jako parametry wywoania aplikacji (plik ródowy: EtykietaArg.java). Zmody-
fikuj odpowiednio rozwizanie zadania 2.4.
Oblicz dugo tekstu (imienia i nazwiska razem z odstpem midzy nimi), liczb
odstpów pomidzy midzy znakiem * a tekstem oraz po tekcie przed znakiem *.
Stosown liczb odstpów moesz wywietli w ptli lub wyci jako podacuch
z acucha zoonego z okrelonej liczby odstpów. Ze wzgldu na konieczno ob-
licze zadanie wyprzedza nieco omawian teori.
Zadanie 6.1.
Napisz program, który w formie tabeli przedstawi dziaanie operatorów logicznych
(plik ródowy: OperatoryLogiczne.java).
Moesz zbudowa dwuelementow tablic wartoci logicznych i uy ptli typu for
each do pobierania wartoci z tej tablicy. Dziki zagniedeniu ptli moesz w atwy
sposób przetestowa wszystkie wartoci dla dwóch i wikszej liczby zda logicznych.
Do dyspozycji masz trzy operatory:
! — negacj (NOT),
Zadanie 6.2.
Napisz program (plik ródowy: PrawaLogiczne.java), który w formie tabeli przedsta-
wi dowód nastpujcych praw logicznych:
a) prawo wyczonego rodka p p ,
b) prawo niesprzecznoci p p ,
Zadanie 6.3.
Napisz program (plik ródowy: PrawaDeMorgana.java), który w formie tabeli przed-
stawi dowód praw De Morgana:
a) I prawo De Morgana — prawo zaprzeczenia koniunkcji
p q p q ,
b) II prawo De Morgana — prawo zaprzeczenia alternatywy
p q p q .
Zadanie 6.4.
Napisz program, który przedstawi tabel wartoci logicznych implikacji (plik ródo-
wy: Implikacja.java).
Zadanie 6.5.
Napisz program, który przedstawi tabel wartoci logicznych alternatywy wyklucza-
jcej (plik ródowy: Xor.java).
Alternatywa wykluczajca (p albo q) jest prawdziwa, gdy jedno ze zda jest prawdzi-
we, a drugie jest faszywe, czyli ich wartoci logiczne nie s równe.
Zadanie 6.6.
Napisz programy (pliki ródowe: PrawoLogiczneX.java, gdzie X oznacza jedn z li-
ter A, B, C, D lub E, zgodn z podpunktem rozwizywanego zadania) przedstawiajce
w formie tabeli dowody nastpujcych praw logicznych:
a) prawo przechodnioci implikacji > p q q r @ p r ,
b) prawo rozdzielnoci alternatywy wzgldem koniunkcji
> p q r @ > p q p r @ ,
c) prawo rozdzielnoci koniunkcji wzgldem alternatywy
> p q r @ > p q p r @ ,
d) prawo odrywania > p q q @ q ,
Zadanie 6.7.
W klasie String (od wersji Javy 1.6) dostpna jest metoda isEmpty(), zwracajca war-
to true, gdy dugo acucha znaków jest równa 0, oraz warto false w pozosta-
ych przypadkach. Napisz prost aplikacj (plik ródowy: StringIsEmpty.java) poka-
zujc dziaanie tej metody.
Ustal warto acucha, a nastpnie wywietl na ekranie ten acuch, jego dugo
i warto zwrócon przez metod isEmpty().
Zadanie 6.8.
Napisz program (plik ródowy: TestChar.java) demonstrujcy dziaanie metod isDi-
git(), isLetter(), isLetterOrDigit(), isLowerCase(), isSpaceChar(), isUpperCase()
i isWhiteSpace(). Wyniki przedstaw w postaci tabeli. Zadanie wykonaj dla zestawu
znaków zapisanego w acuchu:
a) "A\240b3&4\040",
b) "o_0+\t",
c) "#\"\304\\\344\b\n".
Klasa Integer opakowuje prosty typ int i oferuje dwa konstruktory budujce obiekt
na podstawie liczby cakowitej lub acucha znaków. Zawiera m.in. szereg metod
przeznaczonych do konwersji obiektów klasy Integer na inne typy liczbowe lub a-
cuchy znaków.
Zadanie 7.1.
Uruchom aplikacj, której kod ródowy przedstawiono na listingu 4. Na podstawie
obserwacji wyników dziaania programu opisz przeznaczenie uytych staych i metod
statycznych klasy Integer. W kodzie ródowym programu, w miejscu trzech kropek,
wpisz odpowiednie teksty objaniajce wywietlane wyniki. W przypadku wtpliwo-
ci zajrzyj do dokumentacji jzyka Java (np. http://download.oracle.com/javase/1.5.0/
docs/api/java/lang/Integer.html).
Listing 4. StaticInteger.java
public class StaticInteger {
public static void main(String args[]) {
System.out.println("Wybrane stae i metody statyczne klasy Integer\n");
System.out.println("...: "+Integer.MIN_VALUE);
System.out.println("...: "+Integer.MAX_VALUE);
System.out.println("...: "+Integer.SIZE);
int a = 179;
System.out.println("a = "+a);
System.out.println("...: "+Integer.toBinaryString(a));
System.out.println("...: "+Integer.toOctalString(a));
System.out.println("...: "+Integer.toHexString(a));
System.out.println("...: "+Integer.toString(a));
System.out.println("...: "+Integer.toString(a, 4));
int b = Integer.parseInt("-177");
System.out.println("b = "+b);
int c = Integer.parseInt("1000", 8);
System.out.println("c = "+c);
System.out.println("...: "+Integer.signum(a));
System.out.println("...: "+Integer.signum(b));
System.out.println("...: "+Integer.signum(0));
}
}
Zadanie 7.2.
Uruchom aplikacj przedstawion na listingu 5. Na podstawie uzyskanych wyników
i dokumentacji objanij (w postaci komentarza) uyte metody klasy Integer.
Listing 5. ObjectInteger.java
public class ObjectInteger {
public static void main(String args[]) {
System.out.println("Wybrane metody obiektów klasy Integer\n");
/* tworzenie obiektów */
Integer a = new Integer(1024);
Integer b = new Integer("02000");
Integer c = Integer.decode("02000");
Integer d = Integer.decode("0x2000");
System.out.println("a = "+a);
System.out.println("b = "+b);
System.out.println("c = "+c);
System.out.println("d = "+d);
/* porównania obiektów */
System.out.println("...? "+a.equals(b));
System.out.println("...? "+a.equals(c));
System.out.println("...? "+a.compareTo(c));
System.out.println("...? "+c.compareTo(d));
System.out.println("...? "+d.compareTo(c));
/* zmiana wartoci obiektu */
a = Integer.valueOf(1000);
b = Integer.valueOf("1000");
c = Integer.valueOf("1000", 2);
d = Integer.valueOf("1000", 16);
System.out.println("a = "+a);
System.out.println("b = "+b);
System.out.println("c = "+c);
System.out.println("d = "+d);
}
}
Zmienne i stae (literay) typu int mog by wykorzystane do wykonywania oblicze
w zbiorze liczb cakowitych, w zakresie ograniczonym 32-bitowym rozmiarem typu
(od –231 do 231–1). Do dyspozycji mamy cztery podstawowe operatory: dodawanie +,
odejmowanie –, mnoenie * i dzielenie (cakowite) / oraz operator %, sucy do obli-
czania reszty z dzielenia dwóch liczb cakowitych.
Zadanie 7.3.
Dla dwóch dowolnie wybranych liczb cakowitych typu int napisz aplikacj pokazujc
dziaanie operatora + (plik ródowy: Dodawanie.java). Wynik wywietlaj w postaci:
a = 3, b = 15
a + b = 18
Zadeklaruj i zainicjuj dwie zmienne typu int, np. int a = 2451, b = 375;. Wyrae-
nia wykonujce obliczenia moesz umieci jako parametry w metodzie println().
Zadanie 7.4.
Dla dwóch dowolnie wybranych liczb cakowitych typu int napisz aplikacje pokazu-
jce dziaanie pozostaych operatorów arytmetycznych:
a) odejmowanie – (plik ródowy: Odejmowanie.java),
b) mnoenie * (plik ródowy: Mnoenie.java),
c) dzielenie / (plik ródowy: Dzielenie.java),
d) reszta z dzielenia % (plik ródowy: Reszta.java).
Zadanie 7.5.
Napisz aplikacj (plik ródowy: Dzielenie2.java) demonstrujc dzielenie z reszt
dla liczb cakowitych o rónych znakach. Wyniki wywietlaj w postaci znanej z lekcji
matematyki, np. 13 : 2 = 6 r. 1.
Zadanie 7.6.
Napisz aplikacj (plik ródowy: Suma.java), która obliczy sum dwóch liczb natural-
nych podanych jako parametry wywoania. Wynik wywietl na ekranie.
Zadanie 7.7.
Napisz aplikacj (plik ródowy: Sumuj.java), która obliczy sum serii liczb natural-
nych podanych jako parametry wywoania aplikacji. Wynik wywietl na ekranie.
Wprowad zmienn suma typu int i zainicjuj j wartoci 0. Korzystajc z ptli typu
for each, przegldaj tablic argumentów, zamieniaj argument (acuch znaków) na
liczb cakowit i dodawaj j do sumy. Po przejrzeniu caej tablicy wywietl wynik.
Zadanie 7.8.
Napisz aplikacj (plik ródowy: Zamiana.java), która na podstawie dwóch parame-
trów cakowitych — podstawy systemu liczbowego od 2 do 36 i liczby dziesitnej —
wywietli na ekranie liczb zapisan we wskazanym systemie wedug podanego wzo-
ru: 102[10] = 123[9].
Zadanie 7.9.
Napisz aplikacj (plik ródowy: Zamiana2.java), która na podstawie dwóch para-
metrów — podstawy systemu liczbowego od 2 do 36 i liczby zapisanej w systemie
o podstawie podanej jako pierwszy parametr — wywietli na ekranie t liczb zapisa-
n w systemie dziesitnym wedug podanego wzoru: 123[9] = 102[10].
Zadanie 8.1.
Przepisz i uruchom kod ródowy przedstawiony na listingu 6. Opisz krótko zastoso-
wane metody. Uzasadnij otrzymane rezultaty. Powtórz wiczenie, zmieniajc warto
liczby n na minimaln dostpn warto typu long.
Listing 6. LongNumber.java
public class LongNumber {
public static void main(String args[]) {
long n = Long.MAX_VALUE;
System.out.println("n = "+n);
System.out.println("BIN: "+Long.toBinaryString(n));
System.out.println("HEX: "+Long.toHexString(n));
long m = n+1;
System.out.println("m = "+m);
System.out.println("BIN: "+Long.toBinaryString(m));
System.out.println("HEX: "+Long.toHexString(m));
Zadanie 8.2.
Napisz program (plik ródowy: MinMax.java) wywietlajcy minimalne i maksymalne
wartoci liczb cakowitych typu byte, short, int i long. Wyniki wywietl w postaci:
nazwa typu <warto minimalna, warto maksymalna>.
Zadanie 8.3.
Napisz program (plik ródowy: MaxPositive.java) wywietlajcy maksymalne warto-
ci liczb cakowitych typu byte, short, int i long. Wyniki wywietl w postaci binar-
nej i szesnastkowej.
Zadanie 8.4.
Napisz program (plik ródowy: Kodowanie.java) zamieniajcy acuch znaków (np.
sowo kodowanie) na cig bajtów odpowiadajcych tym znakom.
Zadanie 8.5.
Napisz program (plik ródowy: Dekodowanie.java) zamieniajcy cig bajtów (np.
{115, 122, 121, 102, 114}) na acuch znaków odpowiadajcych tym liczbom.
Zadanie 8.6.
Napisz program (plik ródowy: DodajCyfry.java) obliczajcy sum cyfr liczby cako-
witej dodatniej podanej:
a) w postaci tekstu — acucha znaków (cyfr) reprezentujcych t liczb,
b) jako warto typu long.
Zadanie 8.7.
Napisz program (plik ródowy: Txt2Hex.java) zamieniajcy acuch znaków ASCII
na acuch cyfr szesnastkowych odpowiadajcych tym znakom.
Zadanie 8.8.
Napisz program (plik ródowy: Hex2Txt.java) zamieniajcy acuch cyfr szesnast-
kowych na odpowiadajcy mu acuch znaków ASCII (dwie cyfry przypadaj na je-
den znak).
Zadanie 9.1.
Przepisz i uruchom kod ródowy przedstawiony na listingu 7. Zobacz efekty dziaa-
nia programu. Czy na podstawie zapisu kodu ródowego (bez czytania dokumentacji)
moesz okreli dziaanie uytych metod? Sporzd krótki opis kodu i efektów jego
dziaania.
Listing 7. DemoDouble.java
public class DemoDouble {
public static void main(String[] args) {
double a = Double.MIN_VALUE;
System.out.println("Minimalna warto dodatnia: "+a);
System.out.println("BIN: "+Long.toBinaryString(Double.
doubleToLongBits(a)));
System.out.println("HEX: "+Double.toHexString(a));
a = -a;
System.out.println("Liczba przeciwna: "+a);
System.out.println("BIN: "+Long.toBinaryString(Double.
doubleToLongBits(a)));
System.out.println("HEX: "+Double.toHexString(a));
}
}
Zadanie 9.2.
Przedstaw w postaci sowa 64-bitowego reprezentacj binarn kilku wybranych liczb
typu double (plik ródowy: DoubleBin.java). Z cigu 64 bitów wyodrbnij bit znaku,
cech i mantys.
a) 0,25; 0,5; 1,0; 2,0; 512,0;
b) 0,01; 0,1; 1,0; 10,0; 100,0;
c) 1,367; 1367; 13,67; –13,67; 1,367e–12; 1,367e12;
d) symbole specjalne: Double.NaN (ang. Not-a-Number), np. wynik
pierwiastkowania liczby ujemnej, Double.NEGATIVE_INFINITY ( f — ujemna
nieskoczono, np. wynik dzielenia –1/0,0), Double.POSITIVE_INFINITY ( f
— dodatnia nieskoczono, np. wynik dzielenia 1/0,0).
e) dwie reprezentacje zmiennoprzecinkowe zera 0.0 i –0.0 oraz wartoci
ekstremalne Double.MIN_VALUE, Double.MAX_VALUE i 2.2250738585072014e-308.
Zadanie 9.3.
Cig bitów 111110000011110000111000110010 reprezentuje pewn liczb zmienno-
przecinkow pojedynczej precyzji (zera nieznaczce pominito). Jak warto dzie-
sitn ma ta liczba? Napisz program (plik ródowy: Bin2Float.java) wyznaczajcy t
warto.
Liczby typu int i float zajmuj w pamici 32 bity. Znajd liczb cakowit posia-
dajc podan reprezentacj binarn i skorzystaj z metody intBitsToFloat() z kla-
sy Float.
Zadanie 9.4.
Cig bitów 111110000011110000111000110010 reprezentuje pewn liczb zmienno-
przecinkow podwójnej precyzji (zera nieznaczce pominito). Jak warto dziesit-
n ma ta liczba? Napisz program (plik ródowy: Bin2Double.java) wyznaczajcy t
warto.
Zadanie 9.5.
Napisz binarne reprezentacje symboli specjalnych ( rf , NaN) dla liczb zmiennoprze-
cinkowych pojedynczej precyzji. Utwórz aplikacj (plik ródowy: TestBinFloat.java),
która odkoduje liczb binarn podan jako parametr wywoania i wywietli odpowia-
dajc jej warto typu float. Wykorzystaj t aplikacj do sprawdzenia poprawnoci
swoich odpowiedzi.
Drugi parametr (lista_argumentów) jest list zmiennych lub staych oddzielonych prze-
cinkami — wartoci tych argumentów bd podstawiane w miejsce znaczników for-
matujcych w acuchu formatujcym zgodnie z kolejnoci wystpowania lub w miej-
scu okrelonym przez opcjonalny indeks_argumentu$. Pozostae opcjonalne parametry
okrelaj:
flaga — znak okrelajcy dodatkowe cechy sformatowanego wyniku,
np. + oznacza, e przed liczb zawsze wywietlany jest znak + lub –.
Klasa Math zawiera zestaw funkcji matematycznych i dwie stae (pola klasy) — przy-
blienie liczby S i podstawy logarytmu naturalnego e. Wszystkie funkcje zostay zde-
finiowane jako metody statyczne, wic nie tworzymy obiektów klasy Math, a jedynie
wywoujemy zdefiniowane metody, np. Math.sqrt(2) zwróci warto (przyblion)
pierwiastka kwadratowego z liczby 2. Wykaz funkcji znajdziemy w dokumentacji:
http://docs.oracle.com/javase/6/docs/api/java/lang/Math.html.
Zadanie 10.1.
4
Przedstaw uamek 7
z dokadnoci do 5 miejsc po przecinku.
Dzielc 4 przez 7, otrzymasz uamek dziesitny, o ile co najmniej jedn z tych liczb
zamienisz na liczb zmiennoprzecinkow, np. stosujc tzw. rzutowanie double x =
(double) 4. Do sformatowania wyniku moesz uy metody System.out.printf().
Zadanie 10.2.
Wywietl w konsoli z dokadnoci do 10 miejsc po przecinku nastpujce liczby nie-
wymierne: e, S i M (liczba Fibonacciego). Liczby poprzed komentarzem sownym
i ustaw w kolumnie wyrównanej do prawej strony.
1 5
Liczby e i S s zdefiniowane w klasie Math jako stae, natomiast M .
2
Zadanie 10.3.
Napisz aplikacj, która wywietli w konsoli w trzech kolumnach liczby naturalne 2, 3,
5, 7, 11, 13 i 17, pierwiastki kwadratowe i pierwiastki szecienne z tych liczb. Warto-
ci pierwiastków wywietlaj z dokadnoci do 8 miejsc po przecinku, w kolumnach
o szerokoci 15 znaków.
Zadanie 10.4.
Napisz aplikacj, która wywietli w konsoli pierwiastki arytmetyczne od stopnia 2. do
10. z liczby 5 z dokadnoci do 6 miejsc po przecinku.
Zadanie 10.5.
Wywietl w konsoli kody ósemkowe, dziesitkowe i szesnastkowe wielkich liter alfa-
betu aciskiego. W pierwszym wierszu umie opisy poszczególnych kolumn: Znak,
OCT, DEC i HEX.
Zadanie 10.6.
Wywietl w konsoli miar kta o rozwartoci 1 radiana w stopniach (z maksymaln
moliw precyzj), w stopniach i minutach ktowych oraz w stopniach, minutach i se-
kundach ktowych.
Zadanie 10.7.
Wywietl w konsoli miary któw 1°, 1' i 1" w radianach z dokadnoci do 15 miejsc
po przecinku.
Zadanie 10.8.
Oblicz kty ostre w trójkcie egipskim (trójkcie prostoktnym o proporcji boków
3:4:5). Wyniki podaj:
a) w radianach, z dokadnoci do 4 miejsc po przecinku,
b) w stopniach, z dokadnoci do 1 miejsca po przecinku,
c) w stopniach i minutach ktowych, z dokadnoci do 1',
d) w stopniach, minutach i sekundach ktowych z dokadnoci do 1".
Klasa Scanner oferuje m.in. metody testujce, czy w strumieniu znajduje si kolejny
token okrelonego typu, oraz metody odczytujce jego warto ze strumienia:
hasNextLine() — zwraca warto true, gdy w strumieniu znajduje si wiersz
danych, w przeciwnym wypadku zwraca warto false;
nextLine() — odczytuje jeden wiersz danych;
hasNext() — zwraca warto true, gdy w strumieniu znajduje si nastpny
token (np. sowo ograniczone spacjami);
next() — odczytuje ze strumienia jeden token (jedno sowo);
hasNextInt() — zwraca warto true, gdy kolejny token w strumieniu
reprezentuje liczb cakowit;
nextInt() — odczytuje ze strumienia kolejny token, interpretujc go jako
liczb cakowit.
Zadanie 11.1.
Napisz program zamieniajcy temperatur podan w stopniach Celsjusza na tempe-
ratur wyraon w stopniach Fahrenheita. Dane wejciowe wprowadzamy z klawiatu-
ry w postaci liczby dziesitnej; wynik naley obliczy i wywietli z dokadnoci do
0,1 stopnia.
Zadanie 11.2.
Napisz program zamieniajcy temperatur podan w stopniach Fahrenheita na tempe-
ratur wyraon w stopniach Celsjusza. Dane wejciowe wprowadzamy z klawiatury
w postaci liczby cakowitej, wynik naley obliczy i wywietli z dokadnoci do 0,1
stopnia.
Zadanie 11.3.
Napisz program obliczajcy dugo przeciwprostoktnej w trójkcie prostoktnym,
majc dane:
a) dugoci przyprostoktnych,
b) dugo przyprostoktnej i miar kta ostrego (podan w stopniach) lecego
naprzeciw tej przyprostoktnej.
Zadanie 11.4.
Napisz program, który odczyta z konsoli dwie liczby zapisane w naturalnym kodzie bi-
narnym, obliczy ich sum i wywietli wynik w postaci binarnej. Zaproponuj ogranicze-
nie liczby cyfr binarnych stosownie do przyjtej metody oblicze i uytych zmiennych.
Odczytaj cigi cyfr binarnych i zamie je na liczby cakowite, dodaj uzyskane rezul-
taty i przedstaw wynik w postaci binarnej. Póniej wykonamy te obliczenia na ci-
gach cyfr, bez konwersji na liczby.
Zadanie 11.5.
Napisz program, który zamieni uamek zwyky na procent. Uamek zwyky wprowa-
dzamy z klawiatury w postaci acucha znaków zoonego z dwóch liczb cakowitych
(licznika i mianownika) oddzielonych znakiem / (bez odstpów). Wynik naley wy-
wietli z dokadnoci do 0,1%.
Zadanie 11.6.
acuch znaków zawiera oddzielone odstpami imi i nazwisko pracownika, liczb
przepracowanych godzin i stawk godzinow. Napisz program obliczajcy na tej pod-
stawie wynagrodzenie nalene pracownikowi.
Zadanie 11.7.
Plik tekstowy dane.txt zawiera wiersz tekstu, a w nim oddzielone odstpami imi i na-
zwisko pracownika, liczb przepracowanych godzin i stawk godzinow. Napisz pro-
gram obliczajcy na tej podstawie wynagrodzenie nalene pracownikowi.
Obie klasy maj ten sam interfejs. Podstawowe metody to: append() (dodawanie zna-
ków na kocu acucha — dane rónych typów s konwertowane na typ String i do-
czane do budowanego obiektu), delete() (usuwanie znaków z acucha), insert()
(wstawianie znaków do acucha), replace() (zastpowanie znaków w acuchu).
W budowanym obiekcie mamy dostp do odczytu pojedynczych znaków (metoda
charAt()) i podacuchów (metoda substring()) oraz moliwo zmiany pojedynczego
znaku (setCharAt()).
Zadanie 12.1.
Wykresem funkcji kwadratowej f ( x) ax 2 bx c, a z 0 jest parabola o wierzchoku
§ b ' · . Napisz program, który obliczy i wywietli w konsoli wspórzdne wierz-
¨ , ¸
© 2 a 4a ¹
choka paraboli. Zakadamy, e uytkownik bdzie podawa poprawne wspóczynniki
trójmianu.
Zadanie 12.2.
Rozwi zadanie 12.1, stosujc obiekt i metod insert() klasy StringBuffer lub
StringBuilder.
Zadanie 12.3.
Rozwi zadanie 12.1, stosujc obiekt i metod replace() klasy StringBuffer lub
StringBuilder.
Zadanie 12.4.
Napisz program, który obliczy rónic liczby cakowitej dodatniej wprowadzonej
z konsoli i liczby zapisanej tymi samymi cyframi w odwrotnej kolejnoci. Wynik wy-
wietl w postaci caego wyraenia, np.: 452-254 = 198.
Zadanie 12.5.
Symbol [a, b] w geometrii analitycznej oznacza wektor o wspórzdnych a i b (w prze-
strzeni dwuwymiarowej, czyli na paszczy nie). Napisz program obliczajcy dugo
wektora [a, b] wprowadzonego przez uytkownika z klawiatury w postaci acucha
znaków, np. [2.5, -4]. Zakadamy, e uytkownik bdzie podawa poprawn posta
danych (nawiasy prostoktne, przecinek i liczby dziesitne w notacji z kropk).
Zadanie 12.6.
Napisz program obliczajcy dugo wektora [a, b, c] (w przestrzeni trójwymiarowej)
wprowadzonego przez uytkownika z klawiatury w postaci acucha znaków. Zaka-
damy, e uytkownik bdzie podawa poprawn posta danych (nawiasy prostoktne,
dwa przecinki oddzielajce wspórzdne i trzy liczby dziesitne w notacji z kropk).
lub
if (wyraenie) instrukcja1; else instrukcja2;
Instrukcje mog by instrukcjami prostymi, zoonymi (cig instrukcji ujtych w na-
wiasy klamrowe {}, tzw. blok) lub instrukcjami warunkowymi (tzw. zagniedanie
instrukcji warunkowych).
Zadanie 13.1.
Napisz program, który zapyta uytkownika o imi, a nastpnie wykorzystujc podane
imi, wywietli w konsoli napis w postaci: "Jan jest mczyzn." lub "Anna jest
kobiet.".
Zadanie 13.2.
Napisz program obliczajcy pole powierzchni i obwód kwadratu. Dugo boku kwa-
dratu uytkownik wprowadzi z klawiatury. Program powinien sprawdzi, czy wpro-
wadzona dugo boku jest poprawna (dodatnia).
Zadanie 13.3.
Uytkownik wprowadza z klawiatury dwie liczby rzeczywiste a i b. Napisz program,
który wywietli (zapisany w sposób symboliczny) zbiór zoony z tych liczb oraz
wszystkich liczb zawartych midzy nimi.
Zadanie 13.4.
Uytkownik wprowadza z klawiatury wspóczynniki funkcji kwadratowej
f ( x) ax 2 bx c
Napisz program, który wyznaczy zbiór wartoci tej funkcji lub wywietli komunikat,
e podane wspóczynniki nie s poprawne (przypadek a 0 ).
Zadanie 13.5.
Uytkownik wprowadza z klawiatury wspóczynniki funkcji kwadratowej
f ( x) ax 2 bx c
Zadanie 13.6.
Napisz program rozwizujcy równanie liniowe ax b 0 . Wspóczynniki równania
uytkownik wprowadzi z klawiatury. Rozwa wszystkie moliwe przypadki dla wspó-
czynników równania.
Zadanie 13.7.
Uytkownik wprowadza z klawiatury trzy liczby a, b i c. Napisz program, który wywie-
tli najmniejsz (lub najwiksz) z tych liczb. Nie wprowadzaj dodatkowych zmiennych.
Zadanie 13.8.
Uytkownik wprowadza z klawiatury trzy liczby a, b i c. Napisz program, który wy-
wietli te liczby w sposób uporzdkowany, w kolejnoci od najmniejszej do najwik-
szej (lub od najwikszej do najmniejszej). Nie wprowadzaj dodatkowych zmiennych.
Zadanie 13.9.
Stosujc instrukcj selekcji, napisz program, który liczb naturaln jednocyfrow za-
pisze sownie.
Zadanie 13.10.
Napisz program, który podan liczb naturaln mniejsz od 100 zapisze sowami.
Zadanie 13.11.
Napisz program, który podan liczb naturaln mniejsz od 1000 zapisze sowami.
Zadanie 13.12.
Napisz program, który sprawdzi poprawno daty z obecnego wieku, zapisanej w po-
staci dd.mm.rrrr, i wywietli odpowiedni komunikat.
Zadanie 13.13.
Napisz program, który dat podan w postaci dd.mm.rrrr zapisze w formacie rrrr-mm-
-dd. Przyjmij, e wprowadzana data jest poprawna (np. sprawdzona programem z za-
dania 13.12).
Zadanie 13.14.
Napisz program, który dat podan w formacie dd.mm.rrrr zapisze w postaci tradycyjnej:
a) z miesicem zapisanym sownie, np. 15 marca 2012;
b) z miesicem zapisanym w systemie rzymskim, np. 15 III 2012.
Zadanie 13.15.
Napisz program, który na podstawie daty podanej w formacie dd.mm.rrrr okreli, jaki
to dzie tygodnia. Przyjmij, e wprowadzona przez uytkownika data jest poprawna.
Najpierw jest wykonywana instrukcja, potem obliczana jest warto wyraenia lo-
gicznego (warunek). Jeli warunek ma warto true, to powracamy do wykonywania
instrukcji, i cykl si powtarza.
Cech charakterystyczn tej ptli jest to, e instrukcja wykona si co najmniej raz (do
instrukcja; while(false);). Naley zwróci uwag, aby instrukcja miaa wpyw
na badany warunek, poniewa moemy uzyska ptl nieskoczon (do instrukcja;
while(true);).
Zadanie 14.1.
Uytkownik wprowadza z klawiatury seri liczb rónych od zera, zero natomiast jest
sygnaem zakoczenia wprowadzania danych. Napisz program, który obliczy sum
tych liczb.
Zadanie 14.2.
Podczas wprowadzania danych niejednokrotnie potrzebujemy liczb speniajcych okre-
lone warunki, np. dodatnich. Napisz program, który przyjmie z konsoli wycznie
warto dodatni zmiennej. Jeli uytkownik poda liczb ujemn lub zero, to program
powinien ponowi danie podania waciwej wartoci.
Zadanie 14.3.
Napisz program, który wywietli w konsoli wielokrotnoci liczby 7 mniejsze od 100.
Zadanie 14.4.
Napisz program obliczajcy pole powierzchni koa. Promie koa uytkownik wpro-
wadza z klawiatury. Program powinien zasygnalizowa bdne dane (liczb ujemn
lub zero) i ponownie zapyta o dugo promienia.
Zadanie 14.5.
Napisz program obliczajcy pole powierzchni piercienia koowego o promieniu ze-
wntrznym R i wewntrznym r. Dugoci promieni uytkownik wprowadza z klawia-
tury. Program powinien zasygnalizowa bdne dane i ponownie zapyta o potrzebn
warto.
Zadanie 14.6.
Napisz program wywietlajcy w konsoli cig liczb Fibonacciego mniejszych od 1000.
Zadanie 14.7.
Napisz program obliczajcy, ile jest liczb w cigu Fibonacciego mniejszych od poda-
nej przez uytkownika liczby cakowitej n.
Zadanie 14.8.
Napisz program obliczajcy pole powierzchni trójkta równobocznego i umoliwiaj-
cy wielokrotne powtarzanie oblicze. Jako znak zakoczenia oblicze przyjmij poda-
nie dugoci boku równej 0. Dla wartoci ujemnych wywietl stosowny komunikat
i ponów pytanie o dugo boku.
Zadanie 14.9.
Napisz program umoliwiajcy wielokrotne wykonywanie oblicze (np. dugoci okr-
gu). Po wykonaniu oblicze program powinien wywietli pytanie Czy obliczamy da-
lej (t/n)?. W pytaniu zawarta jest sugestia sposobu udzielenia odpowiedzi: t — tak,
n — nie (inne odpowiedzi powinny by ignorowane).
Cech charakterystyczn tej ptli jest to, e instrukcja moe nie wykona si ani razu
(while(false) instrukcja;). Naley zwróci uwag, aby instrukcja miaa wpyw na
badany warunek, gdy moemy uzyska ptl nieskoczon (while(true) instrukcja;).
Poniewa skadnia ptli dopuszcza uycie instrukcji pustej, powstaje moliwo przy-
padkowego utworzenia ptli nieskoczonej w postaci while(true); instrukcja; (wsta-
wienie znaku rednika pomidzy warunek i instrukcj).
Zadanie 15.1.
Uytkownik wprowadza z klawiatury dwie liczby naturalne. Nie korzystajc z opera-
tora dodawania (+), oblicz sum tych liczb. Napisz program obliczajcy sum tych
liczb, majc do dyspozycji operatory inkrementacji (++) i dekrementacji (––).
Zadanie 15.2.
Uytkownik wprowadza z klawiatury dwie liczby cakowite. Napisz program oblicza-
jcy sum tych liczb, korzystajc z operatorów inkrementacji (++) i dekrementacji (––).
Zadanie 15.3.
Napisz program obliczajcy iloczyn liczb cakowitych, nie korzystajc z operatora *.
Do dyspozycji masz operatory + i ––. Zadanie rozwi:
a) dla pary liczb cakowitych dodatnich,
b) dla pary dowolnych liczb cakowitych.
Zadanie 15.4.
Korzystajc z operatora odejmowania (–), napisz program obliczajcy iloraz cakowity
pary liczb cakowitych.
Zadanie 15.5.
Korzystajc z operatora odejmowania (–), napisz program obliczajcy reszt z dziele-
nia pary liczb cakowitych.
Zadanie 15.6.
Napisz program obliczajcy cakowity pierwiastek kwadratowy z podanej liczby natu-
ralnej. Nie korzystaj przy tym z funkcji bibliotecznych oraz innych metod przyblio-
nego obliczania pierwiastka kwadratowego i zaokrglenia otrzymanego wyniku zmien-
noprzecinkowego do liczby cakowitej.
Zadanie 15.7.
Napisz program wyznaczajcy najmniejsz wspóln wielokrotno (NWW) dla pary
liczb cakowitych dodatnich.
Zadanie 15.8.
Korzystajc z algorytmu Euklidesa, napisz program wyznaczajcy najwikszy wspól-
ny dzielnik (NWD) pary liczb cakowitych dodatnich.
Zadanie 15.9.
Mamy dwie róne liczby cakowite dodatnie. Bierzemy mniejsz z nich i obliczamy
jej wielokrotno do chwili, gdy wielokrotno osignie lub przekroczy warto dru-
giej liczby. W przypadku równoci mamy ju gotowy wynik. Jeli jednak wielokrot-
no pierwszej liczby przekroczya warto drugiej liczby, to zaczynamy liczy wie-
lokrotnoci drugiej liczby i porównywa wyniki z obliczon wielokrotnoci pierwszej
liczby. Naprzemienne liczenie kolejnych wielokrotnoci zakoczymy w chwili, gdy
obie wielokrotnoci bd równe. Uzasadnij, e to postpowanie si zakoczy. Napisz
na tej podstawie program wyznaczajcy najmniejsz wspóln wielokrotno (NWW)
pary liczb cakowitych dodatnich.
lub:
for(int i = n; i > 0; --i) instrukcja; // odliczanie w dó
Zadanie 16.1.
Napisz program, który nie wykonujc mnoenia, obliczy kwadrat liczby naturalnej.
Wykorzystaj fakt, e suma kolejnych liczb nieparzystych jest kwadratem liczby na-
turalnej: 1 12 , 1 3 4 22 , 1 3 5 9 32 itd.
Zadanie 16.2.
Napisz program, który sprawdzi, czy wprowadzone z klawiatury sowo jest palindro-
mem, czyli brzmi tak samo czytane od strony lewej do prawej i od prawej do lewej.
Przykadem palindromu jest sowo kajak lub imi Anna (bez rozróniania wielkoci liter).
Zadanie 16.3.
Napisz program, który sprawdzi, czy wprowadzone z klawiatury zdanie jest palindro-
mem, czyli brzmi tak samo czytane od strony lewej do prawej i od prawej do lewej.
Przykadem zdania-palindromu jest Kobya ma may bok (bez rozróniania wielkoci
liter i uwzgldniania odstpów midzy sowami).
Zadanie 16.4.
Napisz program wywietlajcy na ekranie tabliczk mnoenia.
Zadanie 16.5.
Napisz program wywietlajcy na ekranie tabliczk dodawania i tabliczk mnoenia
w pitkowym ukadzie pozycyjnym.
Zadanie 16.6.
Napisz program obliczajcy sum n pocztkowych wyrazów cigu harmonicznego.
Liczb n uytkownik wprowadza z klawiatury.
Zadanie 16.7.
Napisz program obliczajcy silni liczby naturalnej n. Liczb n uytkownik wprowa-
dza z klawiatury.
Zadanie 16.8.
Napisz program umoliwiajcy wielokrotne obliczanie potg o wykadniku naturalnym
n i podstawie rzeczywistej a. Nie korzystaj z funkcji klasy Math. Podanie wykadnika
–1 powinno przerwa dziaanie programu.
Opcjonalny blok finally jest zawsze wykonywany przed powrotem do instrukcji wy-
stpujcej za konstrukcj try-catch.
Zadanie 17.1.
Podczas wprowadzania danych liczbowych uytkownik moe wiadomie lub przez
pomyk wprowadzi cig znaków niebdcy poprawnie zapisan liczb. Spowoduje
to przerwanie pracy programu. Napisz program umoliwiajcy wczytywanie z klawiatu-
ry liczby zmiennoprzecinkowej typu double przy uyciu metody nextDouble() z klasy
Scanner i reagujcy poprawnie na popeniony bd.
Zadanie 17.2.
Dane liczbowe ze standardowego wejcia moemy wczytywa w postaci acucha
znaków, a nastpnie konwertowa je na liczby odpowiedniego typu. Napisz program,
który w ten sposób wczyta z klawiatury liczb zmiennoprzecinkow i zareaguje po-
prawnie na popenione bdy.
Zadanie 17.3.
Napisz program, który odczyta i obliczy sum piciu liczb cakowitych, wprowadzo-
nych ze standardowego wejcia. Pomi liczby zmiennoprzecinkowe i acuchy znaków
niebdce liczbami.
Zadanie 17.4.
Napisz program obliczajcy odwrotno liczby cakowitej wprowadzonej z klawiatury.
a) Przechwy i obsu wszystkie wyjtki, jakie mog pojawi si podczas
wczytywania danych i wykonywania oblicze.
b) Zrealizuj zadanie bez obsugi wyjtków.
Zadanie 17.5.
Napisz program obliczajcy wynik dzielenia z reszt dwóch liczb cakowitych wpro-
wadzonych z klawiatury. Przechwy i obsu wyjtki, jakie mog pojawi si podczas
wczytywania danych i wykonywania oblicze.
wymi (rozkad tych liczb ma pewne regularnoci, które w wielu zastosowaniach mo-
emy pomin).
W Javie tablica jest obiektem. Rozmiar tablicy zapisany jest w polu length. Indek-
sowanie elementów tablicy rozpoczyna si od 0. Jeli podamy indeks spoza zakresu
(0..rozmiar_tablicy-1), to zostanie wygenerowany wyjtek java.lang.ArrayIndex-
OutOfBoundsException.
Zadanie 18.1.
Napisz program, który przeprowadzi symulacj 100 rzutów kostk i wywietli wyniki
w konsoli.
Zadanie 18.2.
Napisz program, który przeprowadzi symulacj 1000 rzutów kostk i sporzdzi zesta-
wienie wyników.
Zadanie 18.3.
Dwukrotnie rzucamy kostk do gry i zapisujemy sum wyrzuconych oczek. Napisz
program, który przeprowadzi symulacj 3000 powtórze dowiadczenia i sporzdzi
zestawienie wyników.
Zadanie 18.4.
Utwórz funkcj rand() z dwoma parametrami a i b, losujc liczb rzeczywist nale-
c do przedziau a, b , gdzie a i b s liczbami cakowitymi i a < b. Wynik losowa-
nia powinien by podany z precyzj do 0,1. Napisz program demonstrujcy dziaanie
tej funkcji.
Zadanie 18.5.
Napisz program losujcy 500 liczb rzeczywistych z przedziau 0, 5. Przedstaw roz-
kad wylosowanych liczb w przedziaach o dugoci 1.
Zadanie 18.6.
Utwórz funkcj (metod statyczn) lotto() losujc 6 rónych liczb z 49 i zwracajc
wynik w postaci tablicy liczb cakowitych. Napisz program demonstrujcy dziaanie
tej metody.
Zadanie 18.7.
Utwórz funkcj (metod statyczn) lotto() z dwoma parametrami m i n, losujc m
rónych liczb sporód liczb od 1 do n i zwracajc wynik w postaci tablicy liczb ca-
kowitych. Napisz program demonstrujcy dziaanie tej metody.
Zadanie 18.8.
Utwórz statyczn metod int[] rndArray(int n, int m) suc do budowania tabli-
cy liczb cakowitych o podanym wymiarze n, wypenionej pseudolosowymi wartocia-
mi z zakresu 0, 1, …, m-1. Zdefiniuj metody uatwiajce wywietlanie elementów ta-
blicy oddzielonych odstpem void arrayPrint(int[] tab) i void arrayPrintln(int[]
tab) — nazwy sugeruj rónic w dziaaniu tych metod. Utwórz równie metod do-
dajc do wszystkich elementów tablicy okrelon warto void addToArray(int[]
tab, int d). Napisz program demonstrujcy dziaanie tych metod.
Zadanie 18.9.
Utwórz statyczn metod int[] rndUniqueArray(int n, int m) suc do budowa-
nia tablicy liczb cakowitych o podanym wymiarze (n) i niepowtarzajcych si elemen-
Zadanie 18.10.
Utwórz statyczne metody int[] rndSortArray(int n, int m) i int[] rndSortUnique-
Array(int n, int m), które bd suy do budowania posortowanych tablic liczb
cakowitych o podanym wymiarze (n), wypenionych pseudolosowymi wartociami
z zakresu 0, 1, …, m-1. Druga metoda powinna zwraca tablic o niepowtarzajcych
si elementach. Napisz program demonstrujcy dziaanie tych metod. Docz je do
klasy MyRandomArray.
Zadanie 18.11.
Utwórz statyczn metod double[] rndArray(int n, double a), która bdzie suy
do budowania tablicy liczb zmiennoprzecinkowych typu double o podanym wymiarze
(n), wypenionej pseudolosowymi wartociami z przedziau 0, a . Zdefiniuj meto-
dy uatwiajce wywietlanie elementów tablicy oddzielonych odstpem void array-
Print(double[] tab), void arrayPrintln(double[] tab) i void arrayPrintf(String
spec, double[] tab) — nazwy sugeruj sposób dziaania tych metod. Ponadto utwórz
metod dodajc do wszystkich elementów tablicy okrelon warto void addToAr-
ray(double[] tab, double d). Napisz program demonstrujcy dziaanie tych metod.
Metody te maj nazwy takie same jak metody istniejce w klasie MyRandomArray,
ale róni si typami parametrów wywoania. Moemy wic te metody dodawa do
klasy MyRandomArray — wykorzystujemy tutaj moliwo przeciania metod.
Zadanie 18.12.
Utwórz statyczn metod double[] rndUniqueArray(int n, double a), która bdzie
suy do budowania tablicy liczb zmiennoprzecinkowych o podanym wymiarze (n)
i niepowtarzajcych si elementach, wypenionej pseudolosowymi wartociami z prze-
dziau 0, a . Napisz program demonstrujcy dziaanie tej metody. Docz j do klasy
MyRandomArray.
Zadanie 18.13.
Utwórz statyczne metody double[] rndSortArray(int n, double a) i double[] rnd-
SortUniqueArray(int n, double a), które bd suy do budowania posortowanych
tablic liczb zmiennoprzecinkowych o podanym wymiarze (n), wypenionych pseudo-
losowymi wartociami z przedziau 0, a . Druga metoda powinna zwraca tablic
o niepowtarzajcych si elementach. Napisz program demonstrujcy dziaanie tych
metod. Docz je do klasy MyRandomArray.
Zadanie 18.14.
Utwórz statyczn metod void roundArray(double[] tab, int prec), która bdzie
zaokrgla wszystkie liczby w tablicy tab do okrelonej liczby miejsc po przecinku
(parametr prec). Napisz program demonstrujcy dziaanie tej metody. Docz j do
klasy MyRandomArray.
Zadanie 18.15.
Utwórz statyczn metod double[] rndArray(int n, double a, int prec), która b-
dzie suy do budowania tablicy liczb zmiennoprzecinkowych o podanym rozmiarze
(n) i wartociach z przedziau 0, a oraz o okrelonej liczbie miejsc po przecinku (pa-
rametr prec). Napisz program demonstrujcy dziaanie tej metody. Docz j do klasy
MyRandomArray.
Zadanie 18.16.
Utwórz statyczn metod double[] rndArray(int n, double a, double step), która
bdzie suy do budowania tablicy liczb zmiennoprzecinkowych o podanym rozmiarze
(n) i wartociach z przedziau 0, a bdcych wielokrotnoci parametru step. Na-
pisz program demonstrujcy dziaanie tej metody. Docz j do klasy MyRandomArray.
Zadanie 18.17.
Utwórz statyczne metody void inputArray(int[] tab) i void inputArray(double[]
tab), które bd umoliwia wprowadzanie danych z klawiatury do tablicy odpowied-
niego typu. Napisz program demonstrujcy dziaanie tych metod. Utwórz klas MyAr-
ray i umie w niej te dwie metody oraz wczeniej zdefiniowane metody suce do
wywietlania zawartoci tablic jednowymiarowych i do zaokrglania wartoci w ta-
blicy liczb typu double (z klasy MyRandomArray).
Zadanie 18.18.
Utwórz statyczn metod konwertujc tablic liczb cakowitych na tablic liczb zmien-
noprzecinkowych (double[] intArrayToDouble(int[] tab)) oraz metod (int[] dou-
bleArrayToInt(double[] tab)) dziaajc odwrotnie.
W komentarzach mona umieszcza dowolny tekst, znaczniki jzyka HTML oraz spe-
cjalne znaczniki dokumentacyjne (zaczynajce si od znaku @).
Komentarz dokumentacyjny zaczyna si od znaku /** i koczy si znakiem */. Ko-
mentarze blokowe /* ... */ i liniowe // ... s podczas tworzenia dokumentacji
pomijane.
Zadanie 19.1.
Przygotuj „cigawk” z instrukcj obsugi aplikacji javadoc.exe dla uywanego ro-
dowiska JDK.
W konsoli wykonaj polecenie javadoc –help > opis.txt. W pliku opis.txt znajdziesz
wszystkie opcje aplikacji javadoc.exe.
Zadanie 19.2.
Utwórz plik ródowy Z19_2.java, który bdzie zawiera nastpujcy kod:
public class Z19_2 {
private static final String HELLO = "Hello World!";
Zadanie 19.3.
Utwórz plik ródowy Z19_3.java, który bdzie zawiera kod z zadania 19.2. Wstaw
komentarze w postaci /** tekst komentarza */ przed kodem klasy, definicj staej
i definicjami metod. W komentarzach zawrzyj zwize opisy przedstawianych elemen-
tów. Sporzd dokumentacj i przeanalizuj otrzymany dokument. Zastosuj opcje –d
<directory> i –private.
Zadanie 19.4.
Rozwizujc zadania 18.8, 18.11, 18.17 i 18.18, utworzylimy kilka statycznych me-
tod uatwiajcych prac z jednowymiarowymi tablicami liczb cakowitych typu int
i tablicami liczb zmiennoprzecinkowych typu double. Metody zostay zgromadzone
w klasie MyArray. Na tej podstawie utwórz klas MyIntArray, która bdzie zawiera
metody dziaajce na tablicach liczb cakowitych (moesz zmieni nazwy metod lub
doda dodatkowe metody), i sporzd dokumentacj tej klasy (dokumentacj zapisz
w folderze MyIntArray). W dokumentacji umie informacje o autorze i wersji klasy.
Zadanie 19.5.
Na podstawie rozwiza zada 18.8, 18.11, 18.17, 18.18 i 19.4 zbuduj klas MyDouble-
Array, która bdzie zawiera statyczne metody uatwiajce prac z jednowymiarowy-
Zadanie 19.6.
Na podstawie rozwizania zadania 19.5 zbuduj klas MyFloatArray, która bdzie za-
wiera statyczne metody uatwiajce prac z jednowymiarowymi tablicami liczb typu
float. Sporzd dokumentacj klasy i zapisz j w folderze MyFloatArray.
Zadanie 19.7.
W pliku MyRandomArray.java, utworzonym podczas rozwizywania zada z rozdzia-
u 18., wpisz komentarze dokumentacyjne. Utwórz dokumentacj klasy MyRandomArray
i zapisz t dokumentacj w folderze o tej samej nazwie.
Zadanie 20.1.
Zbuduj klas Fraction, która bdzie zawiera dwa prywatne pola reprezentujce licz-
nik i mianownik uamka. W klasie tej umie konstruktor z dwoma parametrami, który
bdzie budowa uamek na podstawie dwóch liczb cakowitych (licznika i mianowni-
ka), oraz publiczn metod toString(), zwracajc uamek w postaci acucha zna-
ków, np. "4/13" (licznik, kreska uamkowa / i mianownik). Napisz program pokazu-
jcy dziaanie konstruktora i zdefiniowanej metody.
Zadanie 20.2.
Dodaj do klasy Fraction konstruktor bezparametrowy budujcy uamek odpowiadaj-
cy liczbie 0 oraz konstruktor z jednym parametrem cakowitym m budujcy uamek
m/1. Napisz program pokazujcy dziaanie tych konstruktorów.
Zadanie 20.3.
Utwórz w klasie Fraction konstruktor kopiujcy i napisz program pokazujcy dziaa-
nie tego konstruktora.
Zadanie 20.4.
Zauwamy, e obiekty new Fraction(-3, 4) i new Fraction(3, -4) reprezentuj ten
3
sam uamek . Po zamianie obiektów na acuchy znaków (metod toString())
4
otrzymamy odpowiednio "-3/4" i "3/-4". Podobnie wygldaaby sytuacja dla obiek-
tów new Fraction(2, 5) i new Fraction(-2, -5) reprezentujcych uamek 2/5. Zapis
uamka w postaci "3/-4" lub "-2/-5" nie wyglda korzystnie (lepszy bdzie zapis
"-3/4" lub "2/5"). Mona przyj, e bdziemy zapamitywali zawsze dodatni mianow-
nik, a znak licznika zadecyduje o znaku uamka. Dodaj do klasy Fraction prywatn
metod, która wywoana wewntrz konstruktora skoryguje licznik i mianownik uam-
ka zgodnie z przyjt umow. Napisz program pokazujcy skutki dziaania tej metody.
Zadanie 20.5.
Zauwamy, e obiekty new Fraction(3, 4) i new Fraction(15, 20) reprezentuj ten
sam uamek 3/4. Dodaj do klasy Fraction publiczne metody suce do skracania
uamka (przez najwikszy wspólny dzielnik licznika i mianownika lub inn podan
warto) oraz publiczn metod pozwalajc na rozszerzanie uamka. Napisz program
pokazujcy dziaanie tych metod.
Metod skracajc uamek nazwij reduce() (ang. reducing fraction — skraca ua-
mek). Do realizacji tej metody niezbdna bdzie prywatna metoda obliczajca naj-
mniejszy wspólny dzielnik (ang. Greatest Common Factor — GCF). Proponujemy
w tym przypadku uycie polskiego skrótu nwd. Metod rozszerzajc uamek nazwij
equivalent() (ang. equivalent fraction — uamek).
Zadanie 20.6.
W klasie Fraction utwórz metody zwracajce nowy obiekt Fraction, bdcy iloczynem
uamka reprezentowanego przez ten obiekt i inny obiekt lub liczb cakowit. Napisz
program pokazujcy dziaanie tych metod.
Dziki moliwoci przeciania nazw metod obie metody mog mie t sam na-
zw mult() (ang. multiplication — mnoenie).
Zadanie 20.7.
W klasie Fraction utwórz metody statyczne (o nazwie product(), ang. product — ilo-
czyn) zwracajce obiekt Fraction, bdcy iloczynem dwóch uamków, uamka i licz-
by cakowitej lub dwóch liczb cakowitych. Napisz program demonstrujcy dziaanie
tych metod.
Zadanie 20.8.
W klasie Fraction utwórz metod zwracajc nowy obiekt Fraction, reprezentujcy
uamek odwrotny do uamka zawartego w obiekcie wywoujcym t metod. Utwórz
metod statyczn o podobnej funkcjonalnoci. Napisz program pokazujcy dziaanie
tych metod. Wykorzystaj odwrotno do obliczenia ilorazu dwóch uamków.
Zadanie 20.9.
W klasie Fraction utwórz metody zwracajce nowy obiekt Fraction, bdcy ilorazem
uamka reprezentowanego przez ten obiekt i inny obiekt lub liczb cakowit.
Zadanie 20.10.
W klasie Fraction utwórz metody statyczne (o nazwie quot(), ang. quotient — iloraz)
zwracajce obiekt Fraction, bdcy ilorazem dwóch uamków, uamka i liczby cakowitej
lub dwóch liczb cakowitych. Napisz program demonstrujcy dziaanie tych metod.
Zadanie 20.11.
W klasie Fraction utwórz metody (o nazwie add(), ang. addition — dodawanie) zwra-
cajce nowy obiekt Fraction, bdcy sum uamka reprezentowanego przez ten obiekt
i inny obiekt lub liczb cakowit. Napisz program pokazujcy dziaanie tych metod.
Zadanie 20.12.
W klasie Fraction utwórz metody statyczne (o nazwie sum(), ang. sum — suma) zwra-
cajce obiekt Fraction, bdcy sum dwóch uamków lub uamka i liczby cakowitej.
Napisz program demonstrujcy dziaanie tych metod.
Zadanie 20.13.
W klasie Fraction utwórz metod zwracajc nowy obiekt Fraction, reprezentujcy
uamek przeciwny do uamka zawartego w obiekcie wywoujcym t metod. Utwórz
metod statyczn o podobnej funkcjonalnoci. Napisz program pokazujcy dziaanie
tych metod. Wykorzystaj uamek przeciwny do obliczenia rónicy dwóch uamków.
Zadanie 20.14.
W klasie Fraction utwórz metody (o nazwie sub(), ang. subtraction — odejmowanie)
zwracajce nowy obiekt Fraction, bdcy rónic uamka reprezentowanego przez
ten obiekt i inny obiekt lub liczb cakowit. Napisz program pokazujcy dziaanie
tych metod.
a c ad bc ad bc
Odejmowanie moemy wykona wedug wzoru lub
b d bd bd bd
stosujc jako wspólny mianownik NWW(b, d). Proponujemy uproci spraw i za-
a c a c
stpi odejmowanie dodawaniem liczby przeciwnej: .
b d b d
Zadanie 20.15.
W klasie Fraction utwórz metody statyczne (o nazwie diff(), ang. difference — ró-
nica) zwracajce obiekt Fraction, bdcy rónic dwóch uamków lub uamka i licz-
by cakowitej. Napisz program demonstrujcy dziaanie tych metod.
Zadanie 20.16.
Dodaj do klasy Fraction metody (getNum() i getDen()) pozwalajce na odczytanie
wartoci prywatnych pól obiektu (licznika i mianownika uamka reprezentowanego
przez obiekt). Napisz program demonstrujcy dziaanie tych metod.
Zadanie 20.17.
Dopuszcza si zmiany wartoci prywatnych pól obiektu (przy uyciu metod) w celu
zmiany jego wartoci bez tworzenia nowej instancji obiektu. Zdefiniuj w klasie Frac-
tion metody setNum(int), setDen(int) i setFrac(int, int), które bd zmienia war-
to licznika, mianownika lub jednoczenie licznika i mianownika uamka (obiektu).
Napisz program demonstrujcy dziaanie tych metod.
Zadanie 20.18.
Metoda Object.equals() jest dziedziczona przez wszystkie klasy i pozwala ustali,
czy dwa obiekty s identyczne. W klasie Fraction za równe uznamy te obiekty, które
reprezentuj ten sam uamek. Utwórz i docz do klasy metod equals(), przesania-
a c
Do porównania uamków wykorzystaj zaleno ad bc . Metoda ta
b d
zawiedzie, gdy warto iloczynów (ad lub bc) przekroczy zakres liczb cakowitych.
Bezpieczniejszym rozwizaniem byoby doprowadzenie obu uamków do postaci
nieskracalnej — takie uamki bd równe wtedy i tylko wtedy, gdy bd miay rów-
12 4 20 4 12 20
ne liczniki i równe mianowniki, np. i , wic .
27 9 45 9 27 45
Zadanie 20.19.
Dodaj do klasy Fraction metody zwracajce warto dziesitn uamka reprezentowa-
nego przez obiekt. Napisz program demonstrujcy dziaanie tych metod.
Podziel licznik przez mianownik, pamitajc o tym, aby co najmniej jedn z liczb rzu-
towa przed wykonaniem dzielenia na typ zmiennoprzecinkowy. Sugerowane nazwy
metod to doubleValue() i floatValue(); dla metod statycznych: toDouble(Frac-
tion), toFloat(Fraction).
Zadanie 20.20.
Uamek moe by przedstawiony jako acuch znaków w postaci "4/7" (uamek zwy-
ky), "5" (liczba cakowita odpowiadajca uamkowi 5/1), "2.45" (uamek dziesitny
odpowiadajcy uamkowi 245/100) lub "2,45" (wedug zasad zapisu obowizujcych
w Polsce). Zbuduj konstruktor, który na podstawie acucha znaków utworzy odpo-
wiedni obiekt klasy Fraction lub zgosi wyjtek, gdy acuch znaków nie bdzie przed-
stawia uamka. Napisz program demonstrujcy dziaanie tego konstruktora.
Zadanie 20.21.
Zbuduj kilka metod statycznych o nazwie valueOf() z jednym parametrem (typu float,
double, int, String) lub dwoma parametrami (typu int), zwracajcych obiekt Fraction
Zadanie 20.22.
Okrelamy nieskoczony cig liczbowy w nastpujcy sposób: a1 1 , a2 1 1 ,
1
1 , 1 …. Korzystajc z obiektów i metod klasy Fraction, na-
a3 1 1
1 a4 1
1 1
1 1
1
1
pisz program obliczajcy 15 pocztkowych wyrazów cigu. Ile maksymalnie wyrazów
tego cigu mógby w tym programie obliczy?
Zadanie 20.23.
Korzystajc z obiektów i metod klasy Fraction, napisz program obliczajcy sumy cz-
ciowe nieskoczonego szeregu 1 1 1 1 1 ... .
2 4 8 16
Zadanie 20.24.
Korzystajc z obiektów i metod klasy Fraction, napisz program obliczajcy sumy cz-
ciowe nieskoczonego szeregu 1 1 1 1 1 ... .
2 4 8 16
Zadanie 20.25.
Napisz program rozwizujcy równanie o postaci ax b 0 w zbiorze liczb wymier-
nych, posugujc si obiektami i metodami klasy Fraction.
Zadanie 20.26.
Napisz program rozwizujcy metod wyznaczników ukad dwóch równa liniowych
z dwiema niewiadomymi w zbiorze liczb wymiernych. Wykorzystaj obiekty i metody
klasy Fraction. Utwórz metod det(), która bdzie oblicza wyznacznik, oraz metod
inputFraction() do wprowadzania z klawiatury wartoci obiektów klasy Fraction.
Zadanie 20.27.
Pierwiastek drugiego stopnia z liczby nieujemnej a moemy obliczy ze wzoru itera-
1§ a·
cyjnego x ¨ x ¸ , biorc warto pocztkow x = 1. Korzystajc z obiektów i me-
2© x¹
tod klasy Fraction, napisz program obliczajcy przyblienie liczby 5 w postaci uamka
zwykego.
Zadanie 21.2.
Docz do klasy Angle publiczne metody (radian() i degree()) zwracajce liczb typu
double, miar kta reprezentowanego przez obiekt wyraon w radianach i stopniach.
Napisz program demonstrujcy dziaanie tych metod.
Zadanie 21.3.
Docz do klasy Angle publiczn metod toString(), która bdzie zwraca acuch
znaków (o postaci 45°30'15") przedstawiajcy miar kta reprezentowanego przez
obiekt wyraon w stopniach, minutach i sekundach. Napisz program demonstrujcy
dziaanie tej metody.
Metoda toString() przesoni metod o tej samej nazwie, dziedziczon z klasy Ob-
ject. Metod t naley zdefiniowa z adnotacj Override (@Override).
Zadanie 21.4.
Docz do klasy Angle trzy konstruktory — z jednym, dwoma lub trzema parametrami
typu int — umoliwiajce zbudowanie obiektu reprezentujcego kt o podanej licz-
bie stopni, stopni i minut lub stopni, minut i sekund. Ogranicz liczb stopni do zakre-
su od 0° do 360°, a liczb minut i sekund do zakresu od 0 do 60. Napisz program de-
monstrujcy dziaanie tych konstruktorów.
Zadanie 21.5.
Cig znaków o postaci 105°30'15" przedstawia miar kta w stopniach, minutach i se-
kundach ktowych. Utwórz konstruktor w klasie Angle, który zbuduje obiekt reprezen-
tujcy kt o podanej w ten sposób mierze. Napisz program demonstrujcy dziaanie
tego konstruktora.
Zadanie 21.6.
Utwórz w klasie Angle sze metod o nazwie setOfXxx, gdzie Xxx oznacza nazw funk-
cji trygonometrycznej, ustawiajcych miar kta reprezentowanego przez obiekt na
podstawie podanej wartoci odpowiedniej funkcji (metody te odpowiadaj funkcjom
odwrotnym do funkcji trygonometrycznych). Metody zmieniaj warto obiektu, ale
nie zwracaj adnej wartoci. Napisz program demonstrujcy dziaanie tych metod.
Zadanie 21.7.
Na paszczy nie z ukadem wspórzdnych czsto potrzebujemy wyznaczy miar
kta nachylenia prostej przechodzcej przez pocztek ukadu wspórzdnych i punkt
P(x, y) do osi OX. Utwórz w klasie Angle metod o nazwie setOfPoint(), ustawiajc
miar tego kta jako warto obiektu. Napisz program demonstrujcy dziaanie meto-
dy setOfPoint().
Zadanie 21.8.
Utwórz w klasie Angle konstruktor z dwoma parametrami typu double, tworzcy no-
wy obiekt reprezentujcy miar kta nachylenia prostej przechodzcej przez pocztek
ukadu wspórzdnych i punkt P(x, y) do osi OX. Napisz program demonstrujcy dzia-
anie tego konstruktora.
Zadanie 21.9.
Zbuduj w klasie Angle statyczne funkcje o nazwie valueOf(), o rónych parametrach
(takich samych jak konstruktory zbudowane w zadaniach 21.1, 21.4, 21.5 i 21.8), zwra-
cajce obiekt klasy Angle odpowiadajcy ktowi o podanych parametrach. Napisz pro-
gram demonstrujcy dziaanie tych metod.
Zadanie 21.10.
Na miarach któw moemy wykonywa dodawanie i odejmowanie. Dodaj do klasy
Angle metody add() (sub()), które bd zwraca nowy obiekt, bdcy sum (rónic)
miary kta reprezentowanego przez obiekt wywoujcy metod i miary kta w obiek-
cie podanym jako parametr. Napisz program demonstrujcy dziaanie tych metod.
Zadanie 21.11.
Docz do klasy Angle statyczne metody sum() (diff()), które bd oblicza sum (ró-
nic) dwóch obiektów podanych jako parametry (miar któw reprezentowanych przez
te obiekty). Wynik powinien by obiektem klasy Angle. Napisz program demonstruj-
cy dziaanie tych metod.
Zadanie 21.12.
Miary któw mona mnoy (dzieli) przez liczb. Napisz metod mult() (div()), która
bdzie zwraca nowy obiekt, reprezentujcy kt o mierze bdcej iloczynem (ilorazem)
miary kta reprezentowanego przez obiekt i liczby podanej jako parametr (cakowitej
lub zmiennoprzecinkowej). Napisz program demonstrujcy dziaanie tych metod.
Zadanie 21.13.
Napisz metod prod() (quot()), która bdzie zwraca obiekt klasy Angle, reprezentu-
jcy kt o mierze bdcej iloczynem (ilorazem) miary kta (obiektu) podanego jako
parametr i liczby podanej jako drugi parametr. Napisz program demonstrujcy dziaa-
nie tych metod.
Zadanie 21.14.
Docz do klasy Angle statyczne pola przechowujce stae wartoci obiektów repre-
zentujcych wybrane kty: RIGHT_ANGLE (kt prosty), STRAIGHT_ANGLE (kt pópeny)
i FULL_ANGLE (kt peny), RADIAN (1 radian), DEGREE (1 stopie), ARCMINUTE (1 minuta k-
towa) i ARCSECOND (1 sekunda ktowa). Napisz program pokazujcy wartoci tych staych.
Zadanie 21.15.
Dodaj do klasy Angle metod compl() (ang. complementary angle — kt dopeniajcy),
zwracajc obiekt reprezentujcy dopenienie kta (obiektu) podanego jako parametr,
i metod suppl() (ang. supplementary angle — kt przylegy), zwracajc obiekt re-
prezentujcy miar kta przylegego do kta (obiektu) podanego jako parametr. Napisz
program demonstrujcy dziaanie tych metod.
Klasa Angle jest ju dostatecznie rozbudowana. W kilku kolejnych zadaniach pokae-
my przykady wykorzystania pochodzcych z niej obiektów i metod.
Zadanie 21.16.
Utwórz metod inputAngle() z jednym parametrem typu String (przeznaczonym do
opisania wprowadzanej wielkoci), zwracajc obiekt Angle reprezentujcy kt o mie-
rze podanej w stopniach. Metoda ta powinna poprawnie interpretowa takie dane: liczba
cakowita stopni, liczba rzeczywista (uamek dziesitny) bez podawania symbolu stop-
nia oraz cig znaków zawierajcych stopnie, minuty i sekundy ktowe z odpowiedni-
mi symbolami jednostek (np. 24°30'15").
Podczas wprowadzania danych symbol stopnia (°) moesz uzyska , wpisujc Alt+0176
(przytrzymaj lewy klawisz Alt i wprowad kod 0176 z klawiatury numerycznej). Sym-
bole minuty i sekundy to apostrof i cudzysów (dostpne bezporednio na klawia-
turze). Miary któw speniaj zaleno D 2E 180q .
Zadanie 21.17.
Napisz program rozwizujcy zadanie: W trójkcie równoramiennym kt przylegy
do podstawy ma miar E . Oblicz miar kta D lecego naprzeciw podstawy tego
trójkta. Sprawd obliczenia, dodajc miary wszystkich któw wewntrznych trójkta.
Zadanie 21.18.
Napisz program rozwizujcy zadanie: Oblicz miary któw w trójkcie równoramien-
nym o podstawie a i ramieniu dugoci b. Sprawd obliczenia, dodajc miary wszyst-
kich któw wewntrznych trójkta.
Zadanie 21.19.
Napisz program rozwizujcy zadanie: Oblicz miary któw w trójkcie równoramien-
nym o podstawie a i wysokoci (opuszczonej na podstaw) h. Sprawd obliczenia, do-
dajc miary wszystkich któw wewntrznych trójkta.
Zadanie 21.20.
Napisz program rozwizujcy zadanie: Oblicz miary któw w trójkcie o bokach a, b
i c. Sprawd obliczenia, dodajc miary wszystkich któw wewntrznych trójkta.
Zadanie 22.2.
Napisz program odczytujcy warto dziesitn liczby zapisanej znakami rzymskimi.
Dane wprowadzamy z klawiatury. Warunkiem zakoczenia programu powinno by
wprowadzenie pustego acucha znaków.
Zadanie 22.3.
Utwórz metod statyczn decToRoman(), która bdzie zamienia liczb naturaln z za-
kresu od 1 do 3999 na liczb w zapisie rzymskim. Napisz program demonstrujcy dzia-
anie tej metody.
Zadanie 22.4.
W procesie kodowania liczb rzymskich stosujemy dwie tablice — tablic z wartocia-
mi wybranych liczb rzymskich i tablic z odpowiadajcymi im wartociami dziesitny-
mi. Utwórz klas RN (ang. roman numbers), która bdzie zawiera dwa pola: pole typu
String (symbol rzymski) oraz pole typu int (warto dziesitna tej liczby rzymskiej).
Klasa powinna udostpnia jedynie tablic z parami wartoci ("M", 1000), ("CM", 900)
itd. Zmodyfikuj metod decToRoman() (z zadania 22.3) tak, aby wykorzystywaa tabli-
c z klasy RN.
Zadanie 22.5.
Utwórz metod statyczn romanToDec(), która bdzie zamienia liczb zapisan w syste-
mie rzymskim na liczb dziesitn. Napisz program demonstrujcy dziaanie tej metody.
Zadanie 22.6.
Utwórz klas Roman, która bdzie mie jedno pole typu int zawierajce liczb naturaln
z zakresu od 1 do 3999. W klasie tej zbuduj konstruktory tworzce obiekt na podsta-
wie parametru bdcego liczb cakowit lub acuchem znaków przedstawiajcym
liczb w zapisie rzymskim. Docz do klasy inne metody przydatne do pracy z licz-
bami rzymskimi. Napisz program demonstrujcy moliwoci tej klasy.
Zadanie 22.7.
Korzystajc z klasy Roman, napisz aplikacj sprawdzajc umiejtno odczytywania
wartoci liczb rzymskich. Liczba pyta powinna by z góry ustalona, a wartoci liczb
powinny by losowane z podanego zakresu.
Zadanie 22.8.
Korzystajc z klasy Roman, napisz aplikacj sprawdzajc umiejtno zapisywania
liczb w systemie rzymskim. Liczba pyta powinna by z góry ustalona, a wartoci
liczb powinny by losowane z podanego zakresu.
Zadanie 23.2.
Dodaj do klasy QuadratPoly pole delta przechowujce warto wyrónika trójmianu
kwadratowego ( ' b 2 4ac ) i metod getDelta() zwracajc warto wyrónika
trójmianu. Obliczenie wyrónika powinno by zrealizowane w konstruktorze podczas
tworzenia nowego obiektu. Napisz program demonstrujcy dziaanie tej metody.
Zadanie 23.3.
Utwórz i docz do klasy QuadratPoly metod toString() zwracajc trójmian w po-
staci tekstowej, np. "2x^2-x+3". Napisz program demonstrujcy dziaanie tej metody.
Zadanie 23.4.
Utwórz w klasie QuadratPoly metod sgnDelta() zwracajc znak wyrónika trójmia-
nu. Od znaku wyrónika zaley liczba pierwiastków trójmianu. Napisz program infor-
mujcy o liczbie rzeczywistych pierwiastków trójmianu kwadratowego.
Funkcja sgn (ac. signum — znak) zwraca –1, gdy argument jest ujemny, 1, gdy ar-
gument jest dodatni, oraz 0 dla wartoci zero.
Zadanie 23.5.
Docz do klasy QuadratPoly metody getX1() i getX2() zwracajce pierwiastki trój-
mianu kwadratowego reprezentowanego przez obiekt. Jeli trójmian nie ma pierwiast-
ków rzeczywistych, to metody mog zwraca warto NaN. Korzystajc z tych metod,
napisz program rozwizujcy równanie kwadratowe o wspóczynnikach cakowitych,
wprowadzonych z klawiatury.
Zadanie 23.6.
Wykresem trójmianu kwadratowego ax 2 bx c, a z 0 jest parabola. Charaktery-
stycznym punktem paraboli jest jej wierzchoek, czyli punkt o wspórzdnych (p, q),
gdzie p b i q ' . Docz do klasy QuadratPoly metody getP() i getQ() zwra-
2a 4a
cajce wspórzdne wierzchoka paraboli. Napisz program demonstrujcy dziaanie
tych metod.
Zadanie 23.7.
Docz do klasy QuadratPoly metod isAPositve() zwracajc warto true, gdy a jest
dodatnie, i false, gdy a jest ujemne. Napisz program wyznaczajcy zbiór wartoci dla
podanego trójmianu kwadratowego.
a < 0 — przedzia f, q .
Zadanie 23.8.
Napisz program, który dla danego trójmianu kwadratowego okreli jego warto ekstre-
maln (minimum lub maksimum). Dane trójmianu uytkownik wprowadzi z klawiatury.
Zadanie 23.9.
Docz do klasy QuadratPoly metod getVertex() (ang. vertex — wierzchoek), która
bdzie zwraca wspórzdne wierzchoka paraboli bdcej wykresem trójmianu re-
prezentowanego przez obiekt. Wynik powinien by podany w postaci acucha zna-
ków. Napisz program demonstrujcy dziaanie tej metody.
Zadanie 23.10.
Docz do klasy QuadratPoly metod getCodomain() (ang. codomain — przeciwdzie-
dzina funkcji), która bdzie zwraca zbiór wartoci trójmianu (przedzia liczbowy) zapi-
sany w postaci acucha znaków. Napisz program demonstrujcy dziaanie tej metody.
Zadanie 23.11.
Napisz program sporzdzajcy opis przebiegu zmiennoci funkcji kwadratowej
f ( x ) ax 2 bx c, a z 0 .
Opis zredaguj w punktach. Umie w opisie dziedzin funkcji, zbiór wartoci, mo-
notoniczno , ekstremum, miejsca zerowe i krótkie objanienie wykresu.
Zadanie 23.12.
Napisz program rozwizujcy nierówno kwadratow ax 2 bx c ! 0, a z 0 .
Zadanie 23.13.
Napisz program rozwizujcy nierówno kwadratow ax 2 bx c t 0, a z 0 .
Zadanie 23.14.
Docz do klasy QuadratPoly metod mult() z parametrem bdcym liczb cakowit
rón od zera, która zwraca nowy obiekt, iloczyn tej liczby i trójmianu reprezentowa-
nego przez obiekt wywoujcy t metod. Napisz program demonstrujcy jej dziaanie.
Zadanie 23.15.
Docz do klasy QuadratPoly metod solutionOfQE() (ang. solution — rozwizanie),
która bdzie zwraca rozwizanie równania kwadratowego w postaci zbioru pierwiast-
ków (acuch znaków), np. {–2, 0.5}, {–3} lub {} (odpowiednio: dwa róne pierwiast-
ki, pierwiastek dwukrotny lub brak pierwiastków rzeczywistych — zbiór pusty). Na-
pisz program demonstrujcy dziaanie tej metody.
W zestawie znaków dla konsoli nie znajdziemy symbolu zbioru pustego (), wic
proponujemy zastpienie go pust par nawiasów klamrowych {}.
Zadanie 23.16.
Docz do klasy QuadratPoly dwie prywatne metody: solutionQIe1() i solutionQIe2(),
które bd zwraca zbiór rozwiza nierównoci kwadratowej ax 2 bx c ! 0, a z 0
(pierwsza metoda) i ax 2 bx c t 0, a z 0 (druga metoda). Wynik powinien by
podany w postaci acucha znaków. Korzystajc z tych metod, zbuduj publiczn me-
tod solutionQIe() (ang. quadratic inequality — nierówno kwadratowa) z jednym
parametrem (typu String) o postaci "<", "<=", ">" lub ">=", okrelajcym typ nierów-
noci. Napisz program demonstrujcy rozwizywanie nierównoci kwadratowych.
( ax bx c d 0 ) ax 2 bx c ! 0
2
jest równowana nierównoci
( ax bx c t 0 ).
2
Zadanie 23.17.
Napisz program rozwizujcy równanie dwukwadratowe o wspóczynnikach cakowi-
tych ( ax 4 bx 2 c 0, a z 0 ).
Zadanie 23.18.
Trójmiany kwadratowe mona dodawa lub odejmowa. Wynik nie zawsze jednak
bdzie trójmianem kwadratowym. Docz do klasy metody add() i sub(), które bd
zwraca nowy obiekt QuadratPoly, odpowiednio sum i rónic obiektu wywoujce-
go metod i obiektu przekazanego jako parametr.
Zadanie 23.19.
Zbuduj klas FloatQP lub DoubleQP (ang. quadratic polynomial — trójmian kwadra-
towy), która bdzie umoliwia rozwizywanie rónych zada dotyczcych trójmianu
kwadratowego ( ax 2 bx c, a z 0 ) o wspóczynnikach zmiennoprzecinkowych (typu
float lub double). Jeli wynik nie jest obiektem klasy, to zgo wyjtek. Do klasy dodaj
metod div() zwracajc nowy obiekt, wynik dzielenia trójmianu przez liczb rón
od zera. Napisz program demonstrujcy dziaanie konstruktora i wybranych metod.
Liczb zespolon moemy zapisywa w postaci pary liczb rzeczywistych (a, b), gdzie
a oznacza cz rzeczywist liczby zespolonej, b — cz urojon. T par liczb moemy
interpretowa jako wspórzdne punktu na paszczy nie (tzw. paszczyzna zespolona).
Inn moliwoci jest zapis a+bi, czyli posta kanoniczna liczby zespolonej.
Zadanie 24.1.
Zbuduj klas Complex, której obiekty bd reprezentoway liczby zespolone. Klasa po-
winna posiada dwa prywatne pola typu double, co najmniej jeden konstruktor z dwoma
parametrami (typu double), metody ustawiajce warto czci rzeczywistej i urojonej
oraz moliwo przedstawienia liczby w postaci algebraicznej (kanonicznej). Napisz
aplikacj pokazujc dziaanie konstruktorów metod tej klasy.
Prywatne pola klasy Complex oznaczmy identyfikatorami re (ang. real — cz rze-
czywista liczby zespolonej) i im (ang. imaginary — cz urojona). Metody setRe
(double x) i setIm(double y) powinny umoliwi zmian wartoci liczby zespolo-
nej reprezentowanej przez obiekt, natomiast metoda toString() zwróci acuch
znaków reprezentujcy posta kanoniczn liczby.
Zadanie 24.2.
Napisz aplikacj rozwizujc równanie kwadratowe o wspóczynnikach rzeczywi-
stych w zbiorze liczb zespolonych.
Algorytm rozwizywania równania jest taki sam jak w zbiorze liczb rzeczywistych.
Jedynie w przypadku, gdy wyrónik jest ujemny ( ' 0 ), rozwizaniem równania
bdzie para liczb zespolonych, poniewa ' 'i .
Zadanie 24.3.
Docz do klasy Complex metody zwracajce sum (add() — ang. addition) i rónic
(sub() — ang. subtraction) wartoci zespolonej reprezentowanej przez obiekt i warto-
ci podanej jako parametr. Napisz aplikacj pokazujc dziaanie tych metod.
Zadanie 24.4.
Docz do klasy Complex metody zwracajce liczb zespolon przeciwn (opp() —
ang. opposite lub additive inverse), sprzon (conj() — ang. conjugate) i odwrotn
(rec() — ang. reciprocal lub multiplicative inverse) do wartoci zespolonej reprezen-
towanej przez obiekt. Napisz aplikacj pokazujc dziaanie tych metod.
Zadanie 24.5.
Docz do klasy Complex metody zwracajce iloczyn (mult() — ang. multiplication)
i iloraz (div() — ang. division) wartoci zespolonej reprezentowanej przez obiekt
i wartoci podanej jako parametr. Napisz aplikacj pokazujc dziaanie tych metod.
Zadanie 24.6.
Dodaj do klasy Complex stae ZERO (zero), ONE (jeden), I (jednostka urojona i — ang.
imaginary unit). Napisz aplikacj pokazujc znaczenie tych staych.
Staa ZERO jest elementem neutralnym dla dodawania, a staa ONE stanowi ele-
ment neutralny dla mnoenia. Korzystajc ze staej I, moemy pokaza potgi jed-
nostki urojonej.
Zadanie 24.7.
Docz do klasy Complex metody zwracajce bezwzgldn warto (modu) liczby ze-
spolonej (abs() — ang. absolute value) i argument gówny liczby zespolonej (arg())
reprezentowanej przez obiekt. Napisz aplikacj pokazujc dziaanie tych metod.
Zadanie 24.8.
Docz do klasy Complex metody zwracajce cz rzeczywist (getRe()) i cz uro-
jon (getIm()) liczby zespolonej reprezentowanej przez obiekt. Napisz aplikacj po-
kazujc dziaanie tych metod.
Zadanie 24.9.
Dodaj do klasy Complex bezparametrowe metody print() i println() wywietlajce
posta kanoniczn liczby zespolonej w konsoli. Zbuduj te metody równie z jednym
parametrem typu String. Podany acuch znaków powinien poprzedza wywietlan
liczb zespolon. Napisz aplikacj pokazujc dziaanie tych metod.
Zaproponowane metody skróc nam zapis wielu rozwiza zada. Rónica w dzia-
aniu metody println() i print() jest oczywista i w naszej implementacji nie po-
winna odbiega od przyjtego standardu.
Zadanie 24.10.
Docz do klasy Complex konstruktor kopiujcy oraz metod umoliwiajc porów-
nywanie obiektu wywoujcego t metod z innym obiektem podanym jako parametr.
Napisz aplikacj pokazujc porównywanie obiektów.
Zadanie 24.11.
Docz do klasy Complex konstruktor tworzcy obiekt na podstawie acucha znaków
przedstawiajcego liczb zespolon w postaci "–3.4+2.75i". Napisz aplikacj poka-
zujc dziaanie tego konstruktora.
Zadanie 24.12.
Zbuduj w klasie Complex metod statyczn parseComplex() zamieniajc acuch zna-
ków na liczb zespolon. Napisz aplikacj pokazujc dziaanie tej metody.
Zadanie 24.13.
Utwórz poza klas Complex funkcj power() obliczajc potg o wykadniku cakowi-
tym dla dowolnej liczby zespolonej. Napisz aplikacj pokazujc dziaanie tej funkcji.
Zadanie 24.14.
Dodaj opracowan w zadaniu 24.13 funkcj power() do klasy Complex jako metod
statyczn oraz niestatyczn. Napisz aplikacj pokazujc dziaanie metod power().
Zadanie 24.15.
Docz do klasy Complex metody obliczajce kwadrat liczby zespolonej (sqr()) i pier-
wiastek kwadratowy (sqrt()) z liczby zespolonej. Napisz aplikacj pokazujc dzia-
anie tych metod.
Zadanie 24.16.
Docz do klasy Complex metody printf() i printlnf(), które bd wywietla w kon-
soli liczb zespolon z okrelon precyzj domyln (6 miejsc po przecinku). Napisz
program demonstrujcy dziaanie tych metod.
Zadanie 24.17.
Napisz program rozwizujcy w zbiorze liczb zespolonych równanie kwadratowe
o wspóczynnikach zespolonych, np.: 1 2i z 2 iz 1 0 .
Zadanie 24.18.
Docz do klasy Complex cztery metody statyczne (sum(), diff(), prod() i quot()),
które bd realizowa cztery podstawowe dziaania (dodawanie, odejmowanie, mno-
enie i dzielenie) w zbiorze liczb zespolonych.
Zadanie 24.19.
Utwórz klas PolarComplex, której obiekty bd reprezentoway liczby zespolone po-
dane we wspórzdnych biegunowych (ang. polar coordinates). Zbuduj podstawowe
konstruktory klasy PolarComplex, metod zamieniajc obiekt klasy PolarComplex
na obiekt Complex i metod toString() zamieniajc obiekt na acuch znaków, np.
"[r=1,500000; fi=1,000000]". Napisz program demonstrujcy dziaanie tych kon-
struktorów i metod.
Zadanie 24.20.
Docz do klasy PolarComplex konstruktor kopiujcy i konstruktor z parametrem typu
Complex. Napisz program demonstrujcy dziaanie tych konstruktorów.
Zadanie 24.21.
Docz do klasy Complex konstruktor z parametrem typu PolarComplex i metod toPo-
larComplex(), która bdzie zwraca obiekt klasy PolarComplex odpowiadajcy obiekto-
wi Complex. Napisz program demonstrujcy dziaanie tego konstruktora i tej metody.
Zadanie 24.22.
Docz do klasy PolarComplex metod mult(), która bdzie zwraca iloczyn liczby ze-
spolonej reprezentowanej przez obiekt i liczby przekazanej jako parametr. Napisz pro-
gram demonstrujcy dziaanie tej metody.
Zadanie 24.23.
Docz do klasy PolarComplex metod div(), która bdzie zwraca iloraz liczby zespo-
lonej reprezentowanej przez obiekt i liczby przekazanej jako parametr. Napisz program
demonstrujcy dziaanie tej metody.
Zadanie 24.24.
Docz do klasy PolarComplex metody sqr() i cube(), które bd zwraca kwadrat
i szecian liczby zespolonej reprezentowanej przez obiekt. Napisz program demonstru-
jcy dziaanie tych metod.
Zadanie 24.25.
Docz do klasy PolarComplex metod power() z jednym parametrem n typu cakowi-
tego (int), która bdzie zwraca potg o wykadniku n liczby zespolonej reprezento-
wanej przez obiekt. Napisz program demonstrujcy dziaanie tej metody.
Zadanie 24.26.
Liczba zespolona ma dwa pierwiastki kwadratowe. Docz do klasy PolarComplex me-
tod sqrt() z jednym parametrem k typu int, która bdzie zwraca obiekt PolarCom-
plex wskazany przez parametr k — pierwiastek kwadratowy z liczby zespolonej. Na-
pisz program demonstrujcy dziaanie tej metody.
Wyznacz reszt z dzielenia k przez 2 (k%2) — reszta 0 lub 1 wskae numer pier-
wiastka.
Zadanie 24.27.
Liczba zespolona ma trzy pierwiastki szecienne (trzeciego stopnia). Docz do klasy
PolarComplex metod cbrt() z jednym parametrem k typu int, która bdzie zwraca
obiekt PolarComplex wskazany przez parametr k, pierwiastek trzeciego stopnia z licz-
by zespolonej. Napisz program demonstrujcy dziaanie tej metody.
Wyznacz reszt z dzielenia k przez 3 (k%3) — reszta 0, 1 lub 2 wskae numer pier-
wiastka.
Zadanie 24.28.
Docz do klasy PolarComplex bezparametrowe metody sqrt() i cbrt(), które bd
zwraca pierwiastki kwadratowe i szecienne z liczby reprezentowanej przez obiekt
w postaci tablicy obiektów klasy Complex. Napisz program demonstrujcy dziaanie
tych metod.
Zadanie 24.29.
Napisz program rozwizujcy w zbiorze liczb zespolonych równanie o wspóczynni-
kach rzeczywistych:
a) az c 0, a z 0 ,
2
b) z a
3
0.
Zadanie 24.30.
Napisz program rozwizujcy w zbiorze liczb zespolonych równanie o wspóczynni-
kach zespolonych:
a) az c 0 , a z 0 0i ,
2
b) z a
3
0.
Zadanie 24.31.
Liczba zespolona ma n pierwiastków n-tego stopnia. Docz do klasy PolarComplex
metod root() z dwoma parametrami n i k typu int, która bdzie zwraca obiekt Po-
larComplex wskazany przez parametr k — pierwiastek n-tego stopnia z liczby zespo-
lonej. Napisz program demonstrujcy dziaanie tej metody.
Zadanie 24.32.
Docz do klasy PolarComplex metod root() z jednym parametrem n okrelajcym
stopie pierwiastka, która bdzie zwraca tablic obiektów klasy Complex z pierwiast-
kami n-tego stopnia z liczby zespolonej reprezentowanej przez obiekt (wywoujcy
metod). Napisz program demonstrujcy dziaanie tej metody.
Zadanie 24.33.
Napisz program wyznaczajcy dla liczby naturalnej n podanej przez uytkownika z kla-
wiatury wszystkie pierwiastki równania:
a) z n 1 0,
b) z i
n
0,
c) z
2n
iz n 1 0 .
Zadanie 25.2.
Plik tekstowy tekst.txt zawiera jeden wiersz tekstu: Programowanie obiektowe. Ko-
rzystajc z obiektu i metod klasy FileWriter, napisz program dopisujcy do tego pli-
ku w pierwszym wierszu tekst: w jzyku Java, a w kolejnym wierszu tekst: jest bardzo
interesujce.
W systemie Windows koniec wiersza w pliku tekstowym skada si z dwóch znaków
CR (ang. carriage return, warto ASCII 13, znak '\r') i LF (ang. line feed warto
ASCII 10, znak '\n'). W systemach UNIX i Linux kocem wiersza jest LF, a w sys-
temie Mac OS — znak CR.
Zadanie 25.3.
Korzystajc z obiektu i metod klasy FileWriter, napisz program obliczajcy i zapi-
sujcy w pliku silnia.txt wartoci n! (n silnia) dla n = 1, 2, …, 12. Kady wynik zapisz
w odrbnym wierszu, w postaci 12! = 479001600.
W tym zadaniu i zadaniach podobnych starajmy si, aby plik wyjciowy nie zawie-
ra na kocu pustego wiersza (jeli obecno tego ostatniego wiersza nie jest za-
mierzona). Taki wiersz moe nam sprawi róne niespodzianki, gdy plik bdzie od-
czytywany.
Zadanie 25.4.
Napisz program zapisujcy w pliku pierwiastki.txt wartoci pierwiastków kwadrato-
wych i szeciennych dla liczb naturalnych od 2 do 15. Kady wiersz pliku powinien
zawiera trzy liczby oddzielone znakami tabulatora — liczb naturaln, pierwiastek
kwadratowy z tej liczby i pierwiastek szecienny. Pierwiastki podaj z precyzj do 8
miejsc po przecinku.
Zadanie 25.5.
Napisz program zapisujcy w pliku tekstowym sto.txt sto liczb cakowitych wyloso-
wanych z zakresu od 1 do 20. Liczby w pliku powinny by oddzielone odstpami.
Zadanie 25.6.
Napisz program zapisujcy w pliku tekstowym dane.txt 50 par liczb. Kada para liczb
powinna by umieszczona w odrbnym wierszu. Pierwsza liczba w parze powinna
by rzeczywista, dodatnia i nie wiksza od 10 oraz podana z dokadnoci do dwóch
miejsc po przecinku, druga liczba powinna by cakowita i ma nalee do przedziau
2, 8 . Liczby w wierszu oddzielamy odstpem.
Po rozwizaniu zada 25.1 – 25.6 bdziemy mieli w biecym folderze pi plików:
tekst.txt, silnia.txt, pierwiastki.txt, sto.txt i dane.txt. Zawarto tych plików bdziemy
odczytywali w kolejnych zadaniach.
Zadanie 25.7.
Korzystajc z obiektu i metod klasy FileReader, napisz program odczytujcy zawar-
to pliku tekstowego i wywietlajcy jego zawarto w konsoli.
Zadanie 25.8.
Korzystajc z obiektu i metod klasy FileReader, utwórz metod (readLine()) odczy-
tujc wiersz pliku tekstowego. Napisz program odczytujcy i wywietlajcy w kon-
soli wszystkie wiersze pliku tekstowego.
Klasa FileReader nie zawiera metody readLine(), wic musisz j sam zbudowa .
Plik tekstowy otwórz przed wywoaniem metody, obiekt (klasy FileReader) skojarzo-
ny z plikiem przeka jako parametr do metody readLine(), która przeczytany z pli-
ku wiersz tekstu zwróci w postaci acucha znaków.
Zadanie 25.9.
Napisz program wywietlajcy w konsoli kod ródowy programu w jzyku Java wraz
z numerami linii. Nazw pliku (bez rozszerzenia) uytkownik powinien podawa z kla-
wiatury. Jeli w okrelonej lokalizacji nie ma wskazanego pliku, to program powinien
wywietli odpowiedni komunikat.
Zadanie 25.10.
Napisz program zapisujcy do pliku kod ródowy programu w jzyku Java wraz z nu-
merami linii. Nazw pliku (bez rozszerzenia) uytkownik powinien podawa z kla-
wiatury. Jeli w okrelonej lokalizacji nie ma wskazanego pliku, to program powinien
wywietli odpowiedni komunikat. Nazwa pliku wyjciowego powinna by taka jak
nazwa pliku ródowego, rozszerzenie java zamienimy na rozszerzenie txt.
Zadanie 25.11.
W pliku tekstowym wpisany jest cig liczb cakowitych oddzielonych odstpami. Na-
pisz program, który odczyta i wywietli w konsoli liczby z pliku oraz obliczy ich sum.
Do testów moesz uy pliku sto.txt (rozwizanie zadania 25.5). Nie wykorzystuj
jednak faktu, e znasz ilo liczb zapisanych w tym pliku.
Zadanie 25.12.
W pliku tekstowym wpisany jest cig liczb cakowitych oddzielonych odstpami. Na-
pisz program, który znajdzie najmniejsz liczb w tym pliku oraz obliczy, ile razy ta
liczba w tym pliku wystpuje.
Do testów moesz uy pliku sto.txt (rozwizanie zadania 25.5). Nie wykorzystuj
jednak faktu, e znasz ilo liczb zapisanych w pliku.
Zadanie 25.13.
W pliku tekstowym zapisane s w kolejnych wierszach pary liczb — liczba zmienno-
przecinkowa i liczba cakowita. Napisz program, który odczytuje pary liczb z pliku,
oblicza iloczyn kadej pary i sumuje iloczyny. Wynik oblicze naley wypisa w kon-
soli i zapisa w ostatnim wierszu pliku z danymi.
Zadanie 26.1.
Napisz program obliczajcy wartoci wielomianu. Stopie wielomianu, wspóczynni-
ki i kolejne wartoci argumentu uytkownik bdzie wprowadza z klawiatury. Podanie
argumentu x = 0 bdzie sygnaem do zakoczenia pracy programu.
Zadanie 26.2.
Napisz program, który obliczy i zapisze w pliku tekstowym (wielomian.txt) tablic
wartoci wielomianu w( x) 2 x 3 5 x 2 x 3 w przedziale 2, 3 z krokiem h = 0,125.
Plik powinien zawiera trzy wiersze z informacjami o rozwizywanym zadaniu, we-
dug schematu: stopie wielomianu (pierwszy wiersz), wspóczynniki wielomianu
oddzielone odstpami w drugim wierszu (zaczynajc od wyrazu wolnego) i krace
przedziau oraz krok w trzecim wierszu. W kolejnych wierszach umiecimy pary liczb
(argument i warto) oddzielone odstpem.
Zadanie 26.3.
Napisz program, który obliczy i wywietli w konsoli sum dwóch wielomianów.
Zadanie 26.4.
Napisz program, który obliczy i wywietli w konsoli rónic dwóch wielomianów.
Zadanie 26.5.
Napisz program, który obliczy i wywietli w konsoli iloczyn wielomianu przez liczb.
Zadanie 26.6.
Napisz program, który obliczy i wywietli w konsoli iloczyn dwóch wielomianów.
Zadanie 26.7.
Napisz program, który obliczy i wywietli w konsoli pochodn wielomianu.
Zadanie 26.8.
Napisz program, który obliczy i wywietli w konsoli cak nieoznaczon (funkcj pier-
wotn) wielomianu.
Zadanie 26.9.
Utwórz klas Polynomial (plik Polynomial.java) umoliwiajc wykonywanie pod-
stawowych dziaa na wielomianach zapisanych w postaci tablicy wspóczynników.
Napisz aplikacj prezentujc moliwoci utworzonych metod i konstruktorów.
Zadanie 26.10.
Napisz program wykonujcy dzielenie wielomianu
w( x) a n x n a n 1 x n 1 ... a1 x a 0
Zadanie 26.11.
Docz do klasy Polynomial dwie metody — division() i remainder() — obliczajce
iloraz i reszt z dzielenia wielomianu reprezentowanego przez obiekt wywoujcy me-
tod przez dwumian (x-c), gdzie liczba c typu double jest parametrem wywoania me-
tody. Napisz program demonstrujcy dziaanie tych metod.
Zadanie 26.12.
b
w( x) a n x n a n 1 x n 1 ... a1 x a 0
Wszystkie potrzebne dane uytkownik powinien wprowadzi z klawiatury — najpierw
dane wielomianu (stopie i wspóczynniki), a pó niej granice cakowania.
Zadanie 26.13.
Majc dane wszystkie pierwiastki rzeczywiste wielomianu ( x1 , x2 , ..., xn ), napisz pro-
gram wyznaczajcy wspóczynniki wielomianu.
Czytelnik moe samodzielnie zmieni zestaw danych lub sposób ich pobierania przez
program — wprowadzanie danych z klawiatury lub odczytywanie z pliku. Naley
zwróci uwag na rozbienoci pomidzy zakresem indeksów. W tablicach w jzyku
Java indeksowanie rozpoczynamy od 0 i koczymy na indeksie o 1 mniejszym od
rozmiaru tablicy, natomiast we wzorach statystyki opisowej indeksy wartoci próbki
bd w granicach od 1 do n.
lub:
double suma = 0;
for(int i = 0; i < n; ++i))
suma += x[i];
Zadanie 27.1.
Dla podanej próbki n-elementowej x1, …, xn wyznacz najmniejsz i najwiksz war-
to w cigu oraz rozstp badanej cechy.
Zadanie 27.2.
Dla podanej próbki n-elementowej x1, …, xn wyznacz redni arytmetyczn.
1 n
redni arytmetyczn liczb x1, …, xn nazywamy liczb x ¦ xi
ni1
.
Zadanie 27.3.
Dla podanej próbki n-elementowej x1, …, xn wyznacz redni geometryczn.
n
redni geometryczn dodatnich liczb x1, …, xn nazywamy liczb g n
x
i 1
i .
1 n
Jeeli wszystkie xi > 0, to log g ¦ log xi
ni1
.
Zadanie 27.4.
Dla podanej próbki n-elementowej x1, …, xn wyznacz redni harmoniczn.
Zadanie 27.5.
Dla podanej próbki n-elementowej x1, …, xn wyznacz redni potgow rzdu r. Obli-
czenia wykonaj dla r = 2 i r = 3.
¦x
1
p (r ) r
i
r
. Dla r 1 otrzymujemy redni harmoniczn ( p ( 1) h ),
n i 1
Zadanie 27.6.
Dla podanej próbki n-elementowej x1, …, xn wyznacz median.
Posortuj tablic z danymi i wybierz element rodkowy, gdy n jest nieparzyste, lub
oblicz redni arytmetyczn dwóch rodkowych liczb, gdy n jest parzyste:
Zadanie 27.7.
Wyznacz warto modaln (dominant) n-elementowej próbki x1, …, xn.
Zadanie 27.8.
Oblicz wariancj n-elementowej próbki x1, …, xn. Wykorzystaj wszystkie niej poda-
ne wzory i porównaj uzyskane wyniki.
¦ x x
1 2
odchyle wartoci xi od redniej arytmetycznej x próbki: s 2 i
.
n i 1
n
¦x
1
Mona zastosowa wzory równowane s 2 2
i
x 2 lub
n i 1
n
Zadanie 27.9.
Oblicz odchylenie standardowe n-elementowej próbki x1, …, xn.
Zadanie 27.10.
Oblicz odchylenie przecitne d próbki x1, …, xn od staej a. Obliczenia wykonaj dla a = 2.
¦ x a .
1
d i
n i 1
Zadanie 27.11.
Oblicz odchylenie przecitne d1 próbki x1, …, xn od wartoci redniej x .
Zadanie 27.12.
Oblicz odchylenie przecitne d2 próbki x1, …, xn od mediany me .
Zadanie 27.13.
Wyznacz kwartyl dolny Q1 i kwartyl górny Q3 próbki x1, …, xn. Oblicz odchylenie
wiartkowe Q.
Zadanie 27.14.
Oblicz moment zwyky ml rzdu l próbki x1, …, xn. Obliczenia wykonaj dla l = 2, 3 i 4.
¦x ,
1
Wzór ml l
i
lN .
n i 1
Zadanie 27.15.
Oblicz moment centralny Ml rzdu l próbki x1, …, xn. Obliczenia wykonaj dla l = 2, 3 i 4.
¦ (x x) ,
1
Wzór M l i
l
l N . Z wasnoci redniej arytmetycznej wynika, e
n i 1
Zadanie 27.16.
Oblicz moment absolutny zwyky al rzdu l próbki x1, …, xn. Obliczenia wykonaj dla
l = 2, 3 i 4.
¦| x | ,
1
Wzór al i
l
lN .
n i 1
Zadanie 27.17.
Oblicz moment absolutny centralny bl rzdu l próbki x1, …, xn. Obliczenia wykonaj
dla l = 2, 3 i 4.
¦| x x | ,
1
Wzór bl i
l
l N . Absolutny moment centralny rzdu pierwszego
n i 1
Zadanie 27.18.
Oblicz wspóczynnik zmiennoci v próbki x1, …, xn.
s
Wzór v 100% , gdzie s jest odchyleniem standardowym, a x redni arytme-
x
tyczn próbki.
Zadanie 27.19.
Oblicz wspóczynnik nierównomiernoci H próbki x1, …, xn.
d1
Wzór H 100% , gdzie d1 jest odchyleniem przecitnym od redniej arytme-
x
tycznej x .
Zadanie 27.20.
Na podstawie problemów zawartych w zadaniach 27.1 – 27.19 utwórz klas Stat za-
wierajc metody statyczne do oblicze statystycznych. Napisz aplikacj konsolow
pokazujc dziaanie wybranych metod z klasy Stat. Sporzd dokumentacj tej klasy.
Zadanie 27.21.
Na podstawie problemów zawartych w zadaniach 27.1 – 27.19 utwórz klas Statpr
umoliwiajc utworzenie obiektu (próbki) zawierajcego metody do rozwizywania
tych problemów. Napisz aplikacj konsolow pokazujc dziaanie wybranych metod
z klasy Statpr. Sporzd dokumentacj tej klasy.
Zadanie 28.2.
W tablicy dwuwymiarowej nie wszystkie wiersze musz mie ten sam rozmiar. Napisz
program, który utworzy tablic liczb cakowitych o dziesiciu wierszach. Wypenij
tablic kolejnymi liczbami naturalnymi, zaczynajc od liczby 1. W pierwszym wier-
szu umie jedn liczb, w drugim dwie liczby, w trzecim trzy itd. — w dziesitym
dziesi liczb. Oblicz sumy liczb w kolejnych wierszach i sum wszystkich liczb za-
pisanych w tablicy. Wywietl w konsoli tablic liczb oraz obliczone sumy.
Zadanie 28.3.
Utwórz klas TInt, która bdzie zawiera metody statyczne input() i print() umo-
liwiajce wprowadzanie danych z konsoli do tablicy lub wywietlanie danych z tabli-
cy w konsoli. Parametrem wywoania tych metod powinna by tablica liczb cakowi-
tych jedno- lub dwuwymiarowa. Napisz program demonstrujcy dziaanie tych metod.
Zadanie 28.4.
Utwórz w klasie TInt metod statyczn setRandom(), która wypeni tablic liczb ca-
kowitych wartociami wylosowanymi z zakresu od 0 do n (liczba cakowita n > 0).
Tablic oraz zakres wartoci podaj jako parametry metody. Napisz program demon-
strujcy dziaanie tej metody.
Zadanie 28.5.
Dodaj do klasy TInt metod statyczn printf() wywietlajc tablic liczb cakowi-
tych w konsoli. Metoda ta powinna mie dwa parametry: acuch formatujcy i iden-
tyfikator tablicy. Napisz program demonstrujcy dziaanie tej metody.
Zadanie 28.6.
Na podstawie zada 28.3, 28.4 i 28.5 utwórz klas TDouble z metodami statycznymi
input(), print(), printf() i setRandom(), uatwiajcymi pobieranie i wypisywanie
danych oraz losowe ustawianie wartoci w jedno- i dwuwymiarowych tablicach liczb
zmiennoprzecinkowych typu double. Napisz program pokazujcy dziaanie wybranych
metod z tej klasy.
Macierz jest uporzdkowan prostoktn tablic liczb, dla której zdefiniowane s dzia-
ania algebraiczne dodawania (odejmowania) i mnoenia:
Dodawanie (odejmowanie) dwóch macierzy jest moliwe tylko dla macierzy
o jednakowych liczbach kolumn (n) i wierszy (m). Suma (rónica) macierzy
A i B jest macierz C tak, e cij aij bij ( cij aij bij ).
Mnoenie macierzy jest moliwe, gdy liczba kolumn pierwszej macierzy (m)
jest równa liczbie wierszy drugiej macierzy. Iloczyn macierzy A i B jest
m
macierz C tak, e cij ¦ aik bkj . Mnoenie macierzy nie jest przemienne.
k 1
Zadanie 28.7.
Utwórz metod sum() dodajc dwie macierze zapisane w postaci tablic dwuwymia-
rowych. Napisz program demonstrujcy dziaanie metody sum().
Zadanie 28.8.
Utwórz metod difference() obliczajc rónic dwóch macierzy zapisanych w po-
staci tablic dwuwymiarowych. Napisz program demonstrujcy dziaanie metody dif-
ference().
Zadanie 28.9.
Utwórz metod product() obliczajc iloczyn dwóch macierzy zapisanych w postaci
tablic dwuwymiarowych. Napisz program demonstrujcy dziaanie metody product().
Zadanie 28.10.
Utwórz metod product() obliczajc iloczyn macierzy zapisanej w postaci tablicy dwu-
wymiarowych przez liczb. Napisz program demonstrujcy dziaanie metody product().
Zadanie 28.11.
Zbuduj metod transp() tworzc macierz transponowan z macierzy podanej jako
parametr metody. Napisz program demonstrujcy dziaanie metody transp().
Zadanie 28.12.
Utwórz metod statyczn toDouble() konwertujc macierz o elementach cakowi-
tych na macierz o elementach zmiennoprzecinkowych. Napisz program demonstruj-
cy dziaanie tej metody. Docz j do klasy TInt.
Zadanie 28.13.
Docz do klasy TDouble metod statyczn o nazwie valueOf(), zwracajc tablic
(macierz) z elementami typu double o elementach odpowiadajcych elementom tabli-
cy (macierzy) liczb cakowitych. Napisz program demonstrujcy dziaanie tej metody.
Zadanie 28.14.
W klasie TDouble utwórz statyczn metod toInt(), która bdzie zwraca tablic (ma-
cierz) o wartociach cakowitych, odpowiadajcych (zamiana przez rzutowanie) tablicy
liczb zmiennoprzecinkowych podanej jako parametr. Napisz program demonstrujcy
dziaanie tej metody.
Zadanie 28.15.
W klasie TInt utwórz statyczn metod valueOf(), która bdzie budowa tablic (ma-
cierz) o wartociach cakowitych, odpowiadajcych (zamiana przez rzutowanie) tabli-
cy liczb zmiennoprzecinkowych podanej jako parametr. Napisz program demonstru-
jcy dziaanie tej metody.
Macierze, w których liczba wierszy jest równa liczbie kolumn, nazywamy ma-
cierzami kwadratowymi. Z macierzami kwadratowymi zwizany jest szereg
poj, takich jak: lad macierzy, wyznacznik macierzy, macierz diagonalna,
macierz trójktna, macierz jednostkowa i macierz odwrotna.
Zadanie 28.16.
Utwórz statyczn metod trace() wyznaczajc lad macierzy. Napisz program de-
monstrujcy dziaanie tej metody.
Zadanie 28.17.
Utwórz statyczn metod getI() zwracajc macierz jednostkow stopnia n (stopie
podamy jako parametr wywoania metody). Napisz program demonstrujcy dziaanie
tej metody.
Zadanie 28.18.
Utwórz statyczn metod setI() tworzc z macierzy kwadratowej podanej jako pa-
rametr macierz jednostkow. Napisz program demonstrujcy dziaanie tej metody.
Zadanie 28.19.
Utwórz metod statyczn det() obliczajc wyznacznik macierzy kwadratowej. Do
obliczenia wyznacznika uyj rozwinicia Laplace’a. Napisz program demonstrujcy
dziaanie tej metody.
Zadanie 28.20.
Utwórz metod statyczn upperTriangular() przeksztacajc macierz kwadratow
podan jako parametr na macierz trójktn górn. Napisz program demonstrujcy dzia-
anie tej metody.
Zadanie 28.21.
Utwórz metod statyczn lowerTriangular() przeksztacajc macierz kwadratow
podan jako parametr na macierz trójktn doln. Napisz program demonstrujcy dzia-
anie tej metody.
Zadanie 28.22.
Utwórz metod statyczn diagonal() przeksztacajc macierz kwadratow podan jako
parametr na macierz diagonaln. Napisz program demonstrujcy dziaanie tej metody.
Zadanie 28.23.
Utwórz metod statyczn inverse() obliczajc i zwracajc macierz odwrotn do
macierzy kwadratowej podanej jako parametr. Napisz program demonstrujcy dziaa-
nie tej metody.
Zadanie 28.24.
Napisz program rozwizujcy ukad n-równa liniowych z n niewiadomymi (n < 10).
Ukad równa rozwi, stosujc metod wyznaczników. Wszystkie niezbdne metody
umie w klasie programu.
Zadanie 28.25.
Napisz program rozwizujcy ukad n-równa liniowych z n niewiadomymi. Ukad
równa rozwi, stosujc rachunek macierzy: A X B , X A 1 B , gdzie A — ma-
cierz podstawowa ukadu, X — wektor niewiadomych, B — kolumna wyrazów wol-
nych. Wszystkie niezbdne metody umie w klasie programu.
Zadanie 28.26.
Napisz program rozwizujcy ukad n-równa liniowych z n niewiadomymi. Ukad
równa rozwi, stosujc metod eliminacji. Wszystkie niezbdne metody umie
w klasie programu.
Zadanie 28.27.
Utwórz klas Matrix, która na podstawie tablic dwuwymiarowych, podanych wymia-
rów macierzy lub innych obiektów klasy Matrix (konstruktor kopiujcy) bdzie umo-
liwia tworzenie obiektów reprezentujcych macierze. Utwórz metody uatwiajce do-
stp do elementów macierzy (pól obiektu), wprowadzanie i wywietlanie danych oraz
wypenianie macierzy wartociami losowymi. Napisz program demonstrujcy dziaa-
nie metod klasy Matrix.
Zadanie 28.28.
Docz do klasy Matrix metody umoliwiajce wykonywanie podstawowych dziaa
na macierzach: dodawanie, odejmowanie i mnoenie macierzy oraz mnoenie macie-
rzy przez skalar. Napisz program demonstrujcy dziaania na macierzach.
Zadanie 28.29.
Docz do klasy Matrix metody umoliwiajce przeksztacanie macierzy kwadratowych
na posta trójktn lub diagonaln. Napisz program demonstrujcy dziaanie tych metod.
Zadanie 28.30.
Docz do klasy Matrix metod umoliwiajc obliczanie wyznacznika macierzy. Na-
pisz program demonstrujcy dziaanie tej metody.
Zadanie 28.31.
Docz do klasy Matrix metod umoliwiajc obliczanie macierzy odwrotnej. Napisz
program demonstrujcy obliczanie macierzy odwrotnej. Sprawd uzyskany wynik, wy-
konujc odpowiednie mnoenie.
Zadanie 28.32.
Wykorzystujc moliwoci klasy Matrix i obliczenia na macierzach, rozwi ukad
n-równa liniowych z n niewiadomymi.
Zadanie 28.33.
Wykorzystujc moliwoci klasy Matrix i metod wyznaczników, rozwi ukad
n-równa liniowych z n niewiadomymi.
Zadanie 29.2.
x, gdy x d y x, gdy x t y
Okrelono dwie funkcje: min( x, y ) ® oraz max( x, y ) ® .
¯ y, gdy x ! y ¯ y, gdy x y
Utwórz klas MinMax z metodami min() i max() obliczajcymi i zwracajcymi wartoci
tych funkcji. Napisz aplikacj pokazujc dziaanie tych metod.
Zadanie 29.3.
1, gdy x 0
°
Okrelono funkcj f ( x) ®0, gdy x 0 . Co oblicza ta funkcja? Utwórz metod ob-
°1, gdy x ! 0
¯
liczajc warto tej funkcji. Napisz aplikacj pokazujc dziaanie zbudowanej metody.
Zadanie 29.4.
0, gdy x 0
°
Okrelono funkcj f ( x) ® x . Co oblicza ta funkcja? Utwórz metod ob-
° , gdy x z 0
¯x
liczajc warto tej funkcji. Napisz aplikacj pokazujc dziaanie zbudowanej metody.
Zadanie 29.5.
Napisz aplikacj testujc wartoci funkcji okrelonych wzorami:
x y x y
a) f x, y
2
x y x y
b) g x, y
2
c) h( x) f ( x, x)
Zadanie 29.6.
Napisz definicje metod square() i cube() obliczajcych kwadrat i szecian liczby x.
Zastosuj utworzone metody do obliczenia kwadratów i szecianów liczb:
a) cakowitych od 1 do 15,
b) rzeczywistych od 1 do 3 z krokiem 0,25.
Zadanie 29.7.
Potg o wykadniku cakowitym dodatnim okrelamy wzorem a n a
a ...
a . Utwórz
n
metod adoen() obliczajc an. Napisz aplikacj pokazujc dziaanie tej metody.
Zadanie 29.8.
Potg o wykadniku cakowitym nieujemnym moemy okreli wzorem rekurencyj-
1, dla n 0
nym: a n ® . Napisz definicj metody rekurencyjnej adoen() obli-
¯a a , dla n ! 0
n 1
Zadanie 29.9.
Szybkie potgowanie — inn wersj metody rekurencyjnej obliczajcej an (szybsz ze
wzgldu na mniejsz liczb wywoa rekurencyjnych i zredukowanie liczby mnoe)
moemy zrealizowa na podstawie wzoru:
°
°1 dla n 0
° § n 1 · 2
°
an ®a ¨ a ¸ dla n nieparzystego (n ! 0) .
2
° © ¹
° n 2
°§¨ a 2 ·¸ dla n parzystego (n ! 0)
¯°© ¹
Utwórz metod adoen() obliczajc an. Napisz aplikacj pokazujc dziaanie tej metody.
Zadanie 29.10.
Potg o podstawie a rónej od 0 i wykadniku cakowitym n moemy zdefiniowa
a a ... a, dla n ! 0
°
°
n
n
w nastpujcy sposób: a ®1, dla n 0 .
°1
° n , dla n 0
¯a
Napisz definicj metody power() (prototyp: double power(double a, int n)) oblicza-
jcej an dla dowolnej liczby cakowitej oraz aplikacj pokazujc dziaanie tej funkcji.
Funkcj adoen (zob. zadanie 29.7, 29.8 lub 29.9) obliczajc an dla n > 1 wykorzy-
1
stamy w funkcji power (do obliczania a n lub a n dla n 1, 2, 3, ... ).
an
Zadanie 29.11.
Pierwiastek drugiego stopnia z liczby dodatniej a moemy obliczy metod iteracyjn
1§ a·
na podstawie wzoru x ¨ x ¸ , przyjmujc jako pierwsze przyblienie x 1 . Ob-
2© x¹
liczenia kontynuujemy do chwili, gdy rónica pomidzy dwoma kolejnymi przyblie-
niami pierwiastka bdzie dostatecznie maa. Napisz metod sqrt() (ang. square root)
obliczajc pierwiastek kwadratowy z podanej liczby dodatniej. Zbuduj aplikacj po-
kazujc dziaanie metody sqrt() i porównujc otrzymane wyniki z wynikami metody
bibliotecznej Math.sqrt().
Zadanie 29.12.
Pierwiastek trzeciego stopnia z liczby dodatniej a moemy obliczy metod iteracyjn
na podstawie wzoru x 1 §¨ 2 x a ·¸ , przyjmujc jako pierwsze przyblienie x 1 . Ob-
3© x2 ¹
liczenia kontynuujemy do chwili, gdy rónica pomidzy dwoma kolejnymi przyblie-
niami pierwiastka bdzie dostatecznie maa. Napisz metod cbrt() (ang. cube root)
obliczajc pierwiastek trzeciego stopnia z podanej liczby dodatniej. Zbuduj aplikacj
pokazujc dziaanie metody cbrt() i porównujc otrzymane wyniki z wynikami me-
tody bibliotecznej Math.cbrt().
Zadanie 29.13.
Pierwiastek n-tego stopnia z liczby dodatniej a moemy obliczy metod iteracyjn
na podstawie wzoru x 1 §¨ n 1x a ·¸ , przyjmujc jako pierwsze przyblienie
n© x n 1 ¹
x 1 . Obliczenia kontynuujemy do chwili, gdy rónica pomidzy dwoma kolejnymi
przyblieniami pierwiastka bdzie dostatecznie maa. Na podstawie podanego wzoru
napisz metod nRoot() obliczajc pierwiastek n-tego stopnia z podanej liczby do-
datniej. Zbuduj aplikacj pokazujc dziaanie metody nRoot() i porównujc otrzy-
mane wyniki z wynikami uzyskanymi przy zastosowaniu funkcji bibliotecznej.
1
Poniewa n a a n , to warto pierwiastka moemy obliczy przy zastosowaniu
funkcji Math.pow(a, 1.0/n).
Zadanie 29.14.
W klasie Math zdefiniowano metody obliczajce funkcje hiperboliczne — sinus hiper-
boliczny (Math.sinh()) i cosinus hiperboliczny (Math.cosh()). Napisz program wywie-
tlajcy na ekranie tablice wszystkich funkcji hiperbolicznych w przedziale 5, 5
z krokiem 0,1. Wyniki oblicze zapisz w pliku tekstowym FunkcjeHiperboliczne.txt.
Wyniki pracy programu mona zapisa w pliku tekstowym, stosujc w konsoli po-
lecenie:
java Z29_14 > FunkcjeHiperboliczne.txt
(przyjmujemy, e rozwizanie zadania zapisano w pliku ródowym Z29_14.java).
Zadanie 29.15.
W klasie Math zdefiniowano metod Math.exp() obliczajc warto funkcji wykad-
niczej e x . Rozwi zadanie 29.14, nie korzystajc z metod Math.sinh() i Math.cosh().
e x e x
Wartoci funkcji mona wyliczy na podstawie wzorów: sinh x ,
2
e x e x itp.
cosh x
2
Zadanie 29.16.
Zbuduj klas FH (funkcje hiperboliczne) zawierajc metody statyczne obliczajce war-
toci wszystkich funkcji hiperbolicznych i funkcji do nich odwrotnych. Napisz aplika-
cj pokazujc dziaanie tych metod.
Zadanie 29.17.
Zbuduj klas FTD, która bdzie zawiera metody statyczne obliczajce warto szeciu
funkcji trygonometrycznych i szeciu funkcji do nich odwrotnych. Argumenty funkcji
trygonometrycznych i wartoci funkcji odwrotnych powinny by wyraane w stop-
niach. Udostpnij równie metody konwersji stopni na radiany i radianów na stopnie.
Napisz aplikacj pokazujc moliwoci metod statycznych zawartych w tej klasie.
Zadanie 29.18.
Zbuduj klas FTR, która bdzie zawiera metody statyczne obliczajce warto szeciu
funkcji trygonometrycznych i szeciu funkcji do nich odwrotnych. Argumenty funkcji
trygonometrycznych i wartoci funkcji odwrotnych powinny by wyraane w radia-
nach. Udostpnij równie metody konwersji stopni na radiany i radianów na stopnie.
Napisz aplikacj pokazujc moliwoci metod statycznych zawartych w tej klasie.
Zadanie 1.2.
Otwórz konsol (w Windows: Start/Uruchom… — w polu edycyjnym w pisz polece-
nie cmd i kliknij przycisk OK), wpisz w konsoli polecenie java i nacinij Enter. Jeli
w konsoli zostanie wywietlona informacja o sposobie uruchomiania programu (help),
to znaczy, e masz zainstalowane rodowisko uruchomieniowe Javy (JRE). Po wpisa-
niu polecenia java –version uzyskasz informacj o wersji posiadanej maszyny wirtu-
alnej Javy.
Wpisz w konsoli polecenie javac. Jeli w konsoli pojawi si informacja o sposobie
i opcjach uruchomienia kompilatora, to masz poprawnie zainstalowane rodowisko
JDK. Moesz sprawdzi wersj kompilatora (javac –version). Niepowodzenie testu,
w postaci komunikatu: Nazwa 'javac' nie jest rozpoznawana jako polecenie we-
wntrzne lub zewntrzne, program wykonywalny lub plik wsadowy, nie wiadczy
o braku JDK. By moe nie zostaa poprawnie ustawiona cieka dostpu (path) do
folderu bin zawierajcego kompilator javac.exe. Sprawd to.
Zadanie 1.3.
Uruchom aplikacj w linii komend i przekieruj wywietlane dane do pliku, np. java –?
> java.txt lub java –help > java.txt (wystarczy równie polecenie java > java.txt).
Nastpnie w dowolnym edytorze tekstowym sformatuj ten tekst wedug swoich po-
trzeb i wydrukuj. Moesz przetumaczy opisy (ale nie sowa bdce opcjami!) na j-
zyk polski, np.:
-? -help print this help message
-? -help wywietl komunikat pomocy
1
Wersja 32-bitowa JDK w 64-bitowym systemie operacyjnym Windows 7 zainstaluje si w folderze
C:\Program Files (x86)\Java\jdk1.6.0_27\bin.
Zadanie 1.4.
Uruchomienie aplikacji javac.exe bez podania parametrów powoduje wywietlenie na-
stpujcej instrukcji:
Usage: javac <options> <source files>
where possible options include:
-g Generate all debugging info
-g:none Generate no debugging info
-g:{lines,vars,source} Generate only some debugging info
-nowarn Generate no warnings
-verbose Output messages about what the compiler is doing
-deprecation Output source locations where deprecated APIs are used
-classpath <path> Specify where to find user class files and annotation
processors
-cp <path> Specify where to find user class files and annotation
processors
-sourcepath <path> Specify where to find input source files
-bootclasspath <path> Override location of bootstrap class files
-extdirs <dirs> Override location of installed extensions
-endorseddirs <dirs> Override location of endorsed standards path
-proc:{none,only} Control whether annotation processing and/or compilation
is done.
-processor <class1>[,<class2>,<class3>...] Names of the annotation processors
to run; bypasses default discovery process
-processorpath <path> Specify where to find annotation processors
-d <directory> Specify where to place generated class files
-s <directory> Specify where to place generated source files
-implicit:{none,class} Specify whether or not to generate class files for
implicitly referenced files
-encoding <encoding> Specify character encoding used by source files
-source <release> Provide source compatibility with specified release
-target <release> Generate class files for specific VM version
-version Version information
-help Print a synopsis of standard options
Przechwycenie tego tekstu poleceniem javac > opis.txt do pliku opis.txt si nie po-
wiedzie. Moemy natomiast tekst w konsoli zaznaczy (menu wywoane prawym przy-
ciskiem myszy) i skopiowa zaznaczony fragment lub cay tekst do schowka (naciska-
jc klawisz Enter).
Zadanie 1.5.
1. Plik console.bat — otwieranie konsoli w biecym folderze.
cmd
2
Na komputerze Czytelnika cieka moe by inna, zalena od tego, gdzie zainstalowano JDK. Autor
uywa cieki dla standardowego przebiegu procesu instalacji rodowiska Javy.
3
Autor w czasie opracowywania niniejszego zbioru zada korzysta z pendrive’a, który instalowa si
w systemie jako dysk H:. Na materiay zwizane z tworzonym zbiorem autor utworzy folder !JAVA_ZZ,
a pliki ródowe zapisywa w folderze !JAVA_ZZ\Pliki. Na komputerze Czytelnika cieka z plikami
moe by inna.
Rysunek 1.1.
Propozycja
konfiguracji
skrótu na
pulpicie
Prosta aplikacja w jzyku Java skada si z jednej publicznej klasy. Nazw klasy rozpoczyna-
my zwykle od wielkiej litery. Jeli nazwa klasy skada si z kilku sów, to czymy je w jedno
sowo, stosujc tzw. notacj wielbdzi (CamelCase), np.: MojaPierwszaKlasa.
Klasa ta musi zawiera publiczn i statyczn metod main, od której rozpoczyna si wykona-
nie aplikacji.
Nazwa pliku ródowego musi by zgodna (równie pod wzgldem wielkoci liter) z nazw kla-
sy. Wymagane jest rozszerzenie .java, np. MojaPierwszaKlasa.java.
Kompilujemy kod ródowy klasy, np. javac MojaPierwszaKlasa.java. Efektem kompilacji jest
kod bajtowy (B-kod, betakod, ang. bytecode) zapisany w pliku MojaPierwszaKlasa.class.
Aplikacj uruchamiamy, otwierajc wirtualn maszyn Javy (JVM) i przekazujc do interpreta-
cji (jako parametr) nazw skompilowanej klasy, np. java MojaPierwszaKlasa.
Umiesz ju przepisa kod, skompilowa plik ródowy i uruchomi aplikacj. Przeana-
lizujmy ten prosty przykad.
Zacznijmy od budowy klasy. Kod klasy skada si ze sowa kluczowego class, iden-
tyfikatora (nazwy klasy) i ciaa klasy ujtej w nawiasy klamrowe {}, np. class Pusta
{ }. W naszym przypadku wystpuje jeszcze sowo kluczowe public, okrelajce do-
stp (publiczny) do klasy.
Sowo kluczowe public oznacza, e metoda main() jest widoczna dla wszystkich ele-
mentów programu. Metoda statyczna (sowo kluczowe static) jest dostpna bez ko-
niecznoci tworzenia obiektu klasy. Przed nazw metody main wystpuje sowo klu-
czowe void, informujce, e metoda nie zwraca adnej wartoci (pusty typ wyniku).
W nagówku metody main() konieczne jest zadeklarowanie tablicy argumentów String
args[] lub String[] args (obie postacie deklaracji oznaczaj to samo). String jest
nazw klasy (typu obiektowego) sucej do wykonywania operacji na acuchach
znaków (tekstach), args jest identyfikatorem deklarowanego obiektu4, a symbol []
oznacza tablic zoon z kilku obiektów. Podczas uruchomienia aplikacji ta tablica
jest wypeniana przez system parametrami wywoania. Szczegóy wkrótce. W tym
przykadzie nie korzystamy z tablicy argumentów, ale taka deklaracja musi by w na-
gówku metody main().
W klasie System zdefiniowana jest statycznie zmienna obiektowa out. Metody tej zmien-
nej dziaaj na standardowym strumieniu wyjciowym. Uyta w przykadzie metoda
println() wysya na standardowe wyjcie (konsol) dane przekazane jako parametr
podczas wywoania metody i kod koca wiersza5. W tym przykadzie argumentem jest
staa warto tekstowa, czyli litera acuchowy "Hello World".
4
Ten identyfikator mona zmieni, ale nie ma potrzeby tego robi. Sowo args jest po prostu skrótem
od sowa argumenty (ang. arguments).
5
Parametr moe by wielkoci sta (literaem), zmienn dowolnego typu lub wyraeniem. Metoda
println() wywoana bez parametru powoduje tylko przeniesienie kursora na pocztek nowej linii. Ist-
nieje te podobnie dziaajca metoda print(), która wypisuje informacj na standardowym wyjciu,
ale nie przenosi kursora do nowego wiersza.
char[] witaj = {'D', 'z', 'i', 'e', ' ', ' ', 'd', 'o',
'b', 'r', 'y'};
System.out.println(witaj);
}
}
6
Dalej bd przedstawione inne kolekcje.
Ptla for bdzie dalej omówiona dokadniej; na razie zapamitaj, e zmienna i typu
cakowitego int bdzie w tym przypadku zmieniaa si od 0 (na pocztku inicjujemy
zmienn int i=0;) do wartoci dane.length–1. Instrukcja zawarta w ciele ptli wyko-
nuje si, gdy speniony jest warunek i < dane.length. Po kadym wykonaniu ptli
warto zmiennej i jest zwikszana o 1 (operator inkrementacji ++i7). Ptla wykona
si dokadnie tyle razy, ile elementów ma tablica dane, a zmienna i przyjmie kolejno
wartoci indeksów wszystkich elementów tablicy.
Sowo kluczowe int jest nazw typu do przechowywania liczb cakowitych w zakre-
sie od –231 do 231–1. Konstrukcja int a; jest deklaracj zmiennej a typu int, natomiast
int a = warto; deklaruje zmienn i inicjuje jej warto pocztkow (warto moe
by literaem lub wyraeniem).
7
Zapis ++i jest równowany podstawieniu i = i+1.
8
Zapis ––i jest równowany podstawieniu i = i–1.
W ptli for pobieramy kolejne znaki z tablicy, wywietlamy w konsoli ich posta znako-
w i warto jako cyfry w okrelonym ukadzie liczbowym. Sprawdzamy cyfry uka-
du dziesitkowego:
for(char z : znak)
out.println("Znak: "+z+" Cyfra: "+Character.digit(z, 10));
Metoda forDigit zwróci cyfry o wartoci wikszej od 9 jako mae litery (abcdef). Mo-
emy przyj takie rozwizanie lub dodatkowo zamieni te znaki na wielkie litery (sto-
sujc metod poznan w rozwizaniu zadania 3.2):
for(int i = 0; i < 16; ++i)
cyfry[i] = Character.toUpperCase(Character.forDigit(i, 16));
W przypadku acucha znaków nie musimy zamienia odrbnie kadego znaku (mae
litery na wielkie lub odwrotnie, wielkie na mae). Do rozwizania czci zadania za-
wartych w podpunktach c) i d) moemy wykorzysta metody toUpperCase lub toLower-
Case zwracajce acuch (obiekt) zapisany odpowiednio wielkimi lub maymi literami.
Jeli zamienimy acuch na tablic znaków, to moemy skorzysta z ptli typu for
each (podajemy fragment kodu) i rozwiza zadanie w sposób znany z rozwizania
zadania 3.2:
/* Zadanie 4.3a */
System.out.println("Pionowo: ");
for(char z : witaj.toCharArray())
System.out.println(z);
System.out.println();
/* Zadanie 4.3b */
System.out.print("Tekst rozstrzelony: ");
for(char z : witaj.toCharArray())
System.out.print(z+" ");
System.out.println();
Obiekt napis klasy String ma metod length() zwracajc liczb znaków w a-
cuchu, natomiast obiekt dane typu tablicowego (char[]) ma pole length zawiera-
jce liczb elementów tablicy (w tym przypadku liczb znaków). Ponadto inny jest
sposób odczytywania znaków o podanym indeksie.
Zastosowane tutaj dodawanie acuchów jest przemienne, wic poprawny bdzie zapis
wyraenia w postaci cyfry = (char)(i+48)+cyfry (nie mamy moliwoci skrócenia
wyraenia za pomoc operatora +=). Jaki bdzie efekt, Czytelnik moe sprawdzi sam.
Takiego zastosowania klasy String nie naley poleca . Kade dodawanie pojedyn-
czego znaku (lub innego acucha) powoduje tworzenie nowego acucha z wynikiem
(na szczcie nie musimy si troszczy o ich usuwanie). Póniej poznasz klasy
StringBuffer i StringBuilder lepiej nadajce si do rozwizywania podobnych zada.
Moemy równie skopiowa kod rozwizania zadania 3.8 i uzupeni go o jedn li-
nijk kodu String cyfryHex = String.valueOf(cyfry); lub String cyfryHex = new
String(cyfry);.
W Javie kada tablica jest obiektem, którego waciwo length zawiera liczb ele-
mentów tablicy. Zatem pole args.length zawiera liczb przekazanych argumentów.
Argumenty w programie s dostpne przy uyciu indeksów od 0 do args.length–1:
args[0], args[1],…, args[N–1], gdzie N oznacza liczb argumentów. Do przegldania
listy argumentów moemy zastosowa ptl typu for.
/* Lista argumentów - ptla typu for */
for(int i = 0; i < args.length; ++i)
System.out.println(args[i]);
Imi: Maria — rozdzielamy args[0] na dwie czci: pierwszy znak i reszta acucha;
pierwszy znak zamienimy na wielk liter, a reszt acucha wywietlimy maymi
literami:
System.out.println(Character.toUpperCase(args[0].charAt(0))
+args[0].substring(1).toLowerCase());
Do kadego argumentu dodawany jest znak odstpu. Za ostatnim argumentem ten znak
jest niepotrzebny (zreszt jest te niewidoczny, ale czasem mógby przeszkadza), wic
kasujemy ten odstp przy uyciu specjalnego znaku '\b' (ang. backspace).
Powysze uwagi zostan wykorzystane w rozwizaniach zada 6.1, 6.2, 6.3, 6.4, 6.5
i 6.6 oraz innych podobnych.
W rozwizaniu zadania pokaemy i porównamy dziaanie operatora XOR (^) oraz ope-
ratora nie jest równe (!=) dla wartoci logicznych.
public class Xor {
public static void main(String args[]) {
boolean[] bool = {false, true};
System.out.println("Operator alternatywy wykluczajcej (XOR)
- ^");
System.out.println(" p\t q\tp ^ q");
for(boolean p: bool)
for(boolean q: bool)
System.out.println(p+"\t"+q+"\t"+(p ^ q));
System.out.println();
System.out.println("Operator nie jest równe - !=");
System.out.println(" p\t q\tp != q");
for(boolean p: bool)
for(boolean q: bool)
System.out.println(p+"\t"+q+"\t"+(p != q));
System.out.println();
}
}
System.out.println("String: "+str1);
System.out.println("Dugo a cucha: "+str1.length());
System.out.println("Czy string jest pusty? "+str1.isEmpty());
}
}
for(char z : znaki)
System.out.print("\t"+Character.isWhitespace(z));
System.out.println();
}
}
b) Cig skada si z 7 znaków, s to: wielka litera , maa litera o, maa litera ,
znak podkrelenia _, cyfra 0, znak + i znak tabulatora (\t — kod dziesitny 9).
W kodzie programu TestChar zmieniamy jeden wiersz: String str = "o_4
-\t";. Dla tego acucha otrzymamy:
Znaki: o_0+
Znak o _ 0 +
Kod znaku 321 111 347 95 48 43
isDigit() false false false false true false
isLetter() true true true false false false
isLetterOrDigit() true true true false true false
isLowerCase() false true true false false false
isSpaceChar() false false false false false false
isUpperCase() true false false false false false
isWhitespace() false false false false false false
Znak # " Ä \ ä
Zwrómy uwag na moliwo parsowania tego samego cigu znaków (np. "-177")
w ukadach pozycyjnych o rónej podstawie. Skompilujmy i uruchommy ten program
dla rónych wartoci zmiennej a. Porównajmy sposób zapisu liczby dodatniej i ujem-
nej (np. 179 i –179) w rónych systemach liczbowych.
Metoda obj1.equals(obj2) zwraca warto false, gdy obiekty maj róne warto-
ci, i true w przypadku równych wartoci wszystkich pól obiektów obj1 i obj2 (o ile
w implementacji metody equals() nie zdecydujemy inaczej). Uycie operatora po-
równania obj1 == obj2 zwróci nam wynik porównania referencji obiektów, a nie
ich wartoci.
Metoda obj1.compareTo(obj2) zwraca 0, gdy obiekty s równe; –1, gdy warto
obj1 jest mniejsza od wartoci obj2, albo 1, gdy warto obj1 jest wiksza od
wartoci obj2.
W pierwszym przypadku najpierw jest wywietlany tekst "a + b = " przy uyciu me-
tody print(), a potem obliczana jest warto wyraenia a+b. Wynik przekazany jest
jako parametr wywoania metody println().
Zauwamy, e reszta z dzielenia przyjmuje znak dzielnej, natomiast znak ilorazu za-
ley od znaków dzielnej i dzielnika (iloraz jest dodatni, gdy dzielna i dzielnik maj
ten sam znak — ujemny, gdy operandy maj róne znaki).
Aplikacj uruchamiamy z dwoma parametrami, np. java Suma 231 -347. Jeli podczas
uruchomienia nie podamy dwóch argumentów lub argumenty nie bd poprawnie za-
pisanymi liczbami, to aplikacja przerwie prac i pojawi si odpowiedni komunikat.
Jeli uruchomimy aplikacj bez argumentów, to otrzymamy sum 0. Jeli natomiast który
z parametrów nie bdzie liczb cakowit, to dziaanie programu zostanie przerwane.
Uruchamiajc aplikacj, np. java Zamiana 2 255, otrzymamy wynik 255[10] = 1111
1111[2].
Najwiksz liczb cakowit dodatni 64-bitow ze znakiem (typu long) jest 263–1
(n = 9223372036854775807). W klasie opakowujcej Long reprezentuje t liczb staa
MAX_VALUE. Stosujc statyczn metod toBinaryString dla tej liczby, zobaczymy jej
posta binarn — cig 63 cyfr 1; szedziesity czwarty (najstarszy) bit ma warto 0
i nie jest wywietlany (pominicie tzw. zer nieznaczcych). W postaci szesnastkowej,
uzyskanej metod statyczn toHexString, otrzymujemy szesnacie cyfr — cyfr 7 (bi-
narnie 0111) i pitnacie cyfr f (binarnie 1111, dziesitnie 15).
long m = n+1;
System.out.println("m = "+m);
System.out.println("BIN: "+Long.toBinaryString(m));
System.out.println("HEX: "+Long.toHexString(m));
Tworzymy obiekt max (reprezentujcy liczb n) klasy opakowujcej Long. Stosujc me-
tod intValue, otrzymamy liczb typu int równ –1 (w postaci binarnej 11111111111
111111111111111111111 — 32 bity 1). Z liczby omiobajtowej (long) obcito cztery
starsze bajty i zostawiono reszt (cztery modsze bajty) — liczb 32-bitow typu int.
Podobny efekt mona uzyska, wykonujc rzutowanie liczby typu long na typ int.
System.out.println("Zamiana na typ int, m = "+(int)m);
System.out.println("BIN: "+Integer.toBinaryString((int)m));
System.out.println("HEX: "+Integer.toHexString((int)m));
HEX: 7fffffffffffffff
Zamiana na typ int, m = 0
BIN: 0
HEX: 0
Zamiana na typ int, m = -1
BIN: 11111111111111111111111111111111
HEX: ffffffff
System.out.println("\t"+Integer.toHexString(Integer.MAX_VALUE));
System.out.print("long "+Long.toBinaryString(Long.MAX_VALUE));
System.out.println("\t"+Long.toHexString(Long.MAX_VALUE));
}
}
bajtów o rozmiarze dwa razy mniejszym od rozmiaru acucha hex (byte[] tmp = new
byte[hex.length()/2]). W ptli for z acucha hex pobieramy po dwie cyfry szesnast-
kowe (hex.substring(2*i,2*i+2)), zamieniamy je na liczby i przechowujemy w tablicy
tmp. Na koniec zamieniamy tablic bajtów na acuch znaków (new String(tmp)).
public class Hex2Txt {
public static void main(String[] args) {
String hex = "737A796672";
System.out.print(hex+" -> ");
byte[] tmp = new byte[hex.length()/2];
for(int i = 0; i < tmp.length; ++i)
tmp[i] = Byte.parseByte(hex.substring(2*i,2*i+2), 16);
System.out.println(new String(tmp));
}
}
W skad tej reprezentacji wchodz: 0 (0 oznacza liczb dodatni), 11 bitów cechy 000
00000000 i 52 bity mantysy 0000000000000000000000000000000000000000000000000001.
Poniewa wszystkie bity cechy s zerami, wic mantysa jest zdenormalizowana (bez
bitu cakowitego 1) i ma posta binarn 0,00000000000000000000000000000000000000
00000000000001 (cyfra 1 na pidziesitej drugiej pozycji po przecinku), a to odpo-
wiada liczbie dziesitnej 2–52. Mnoc mantys przez liczb 21–1023, uzyskamy warto
2-52·21–1023 = 2–1074 = 4,9·10–324.
Zapis binarny liczby przeciwnej róni si jedynie bitem znaku: 1 oznacza liczb ujemn.
System.out.println();
}
}
}
x = 0.5
BIN: 0011111111100000000000000000000000000000000000000000000000000000
Bit znaku: 0
Cecha: 01111111110
Mantysa: 0000000000000000000000000000000000000000000000000000
x = 1.0
BIN: 0011111111110000000000000000000000000000000000000000000000000000
Bit znaku: 0
Cecha: 01111111111
Mantysa: 0000000000000000000000000000000000000000000000000000
x = 2.0
BIN: 0100000000000000000000000000000000000000000000000000000000000000
Bit znaku: 0
Cecha: 10000000000
Mantysa: 0000000000000000000000000000000000000000000000000000
x = 512.0
BIN: 0100000010000000000000000000000000000000000000000000000000000000
Bit znaku: 0
Cecha: 10000001000
Mantysa: 0000000000000000000000000000000000000000000000000000
Wszystkie liczby s dodatnie (bit znaku 0). Ich cechy s róne od zera, wic
mantysy s znormalizowane i równe (binarnie 1,0000…) 1. Cechy kolejnych
liczb s równe binarnie 01111111101, 01111111110, 01111111111,
10000000000 i 10000001000, co odpowiada liczbom dziesitnym 1021,
1022, 1023, 1024 i 1032. Po uwzgldnieniu przesunicia –1023 otrzymamy
wykadniki –2, –1, 0, 1 i 9. Poniewa mantysa jest równa 1 dla wszystkich
liczb z podanego zestawu, to wartoci tych liczb s równe 2–2 = 0,25; 2–1 = 0,5;
20 = 1; 21 = 2 i 29 = 512.
b) Podane liczby s potgami liczby 10.
double[] a = {0.01, 0.1, 1.0, 10.0, 100.0};
x = Infinity
BIN: 0111111111110000000000000000000000000000000000000000000000000000
Bit znaku: 0
Cecha: 11111111111
Mantysa: 0000000000000000000000000000000000000000000000000000
x = 4.9E-324
BIN: 0000000000000000000000000000000000000000000000000000000000000001
Bit znaku: 0
Cecha: 00000000000
Mantysa: 0000000000000000000000000000000000000000000000000001
000000). Zera nieznaczce mona pomin — ich obecno jednak nie wpywa na wy-
nik (w tym przypadku –Infinity, czyli nieskoczono ujemna).
Rozwaana sytuacja nie obejmuje najmniejszej liczby typu int (binarnie 1000000000
0000000000000000000000), której w typie float odpowiada warto –0.0 (zero ujem-
ne!). Moemy o tym si przekona, wykorzystujc nastpujcy wiersz kodu:
System.out.println(Float.intBitsToFloat(Integer.MIN_VALUE));
Moemy statycznie importowa klas Math i w zapisie wzorów pomin nazw klasy.
import static java.lang.Math.*;
public class Z10_2a {
public static void main(String[] args) {
System.out.printf("Liczba e = %15.10f\n", E);
System.out.printf("Liczba pi = %15.10f\n", PI);
System.out.printf("Liczba fi = %15.10f\n", (1+sqrt(5))/2);
}
}
1
Standard kodowania zaleca pisanie nazw staych wielkimi literami; ostateczna decyzja w tej sprawie
naley do programujcego.
Precyzja 6 miejsc po przecinku jest domylnie ustawiana dla metody printf(), wic
w tym zadaniu uyto specyfikatora %f zamiast %.6f. Zwrómy równie uwag na spo-
sób obliczania wykadnika — wyraenie 1.0/n daje nam zmiennoprzecinkow warto
uamka (1/n — dzielenie cakowite daoby wykadnik równy 0).
acuch znaków "ABCDEFGHIJKLMNOPQRSTUVWXYZ" zamieniamy, stosujc metod toChar
Array(), na tablic znaków znaki. W ptli for each przegldamy zawarto tablicy
znaków i wywietlamy w konsoli znak z oraz kod tego znaku (int)z (rzutowanie war-
toci typu char na typ int). W specyfikatorach wystpuj symbole %1$ i %2$. W miej-
sce %1$ wstawiana jest warto pierwszego parametru (znak z), a w miejsce %2$ —
warto drugiego parametru (kod znaku (int)z).
Aby zrozumie algorytm zamiany miary stopniowej kta wyraonej uamkiem dzie-
sitnym na stopnie (wyraone liczb cakowit), minuty i sekundy ktowe, przeled my
rachunek dla kta o mierze 1 radiana:
1 rad = 57.29577951308232° — wynik dziaania metody Math.toDegrees(1);.
1 rad = 57°18' — liczba stopni jest czci cakowit liczby
57.29577951308232 (st = (int)alfa;), a liczba minut jest czci cakowit
iloczynu 0,29577951308232·60 = 17,7467707849392, po zaokrgleniu
(min = (int)((alfa-st)*60+0.5);).
1 rad = 57°17'45" — tym razem nie zaokrglamy liczby minut, ale bierzemy
tylko cz cakowit (min = (int)((alfa-st)*60);). Liczba sekund jest
równa iloczynowi 0,7467707849392·60 = 44,806247096352 zaokrglonemu
do czci cakowitej (sek = (int)((alfa-st-min/60.0)*3600+0.5);).
st = (int)beta;
min = (int)((beta-st)*60+0.5);
System.out.printf("beta = %d\u00B0%02d\'\n", st, min);
/* odpowied d) */
System.out.println();
st = (int)alfa;
min = (int)((alfa-st)*60);
sek = (int)((alfa-st-min/60.0)*3600+0.5);
System.out.printf("alfa = %d\u00B0%02d\'%02d\"\n", st, min, sek);
st = (int)beta;
min = (int)((beta-st)*60);
sek = (int)((beta-st-min/60.0)*3600+0.5);
System.out.printf("beta = %d\u00B0%02d\'%02d\"\n", st, min, sek);
}
}
lub:
double t = input.nextDouble();
lub:
float t = Float.valueOf(s);
lub:
double t = Double.parseDouble(s);
lub:
double t = Double.valueOf(s);
Nie jest konieczne tworzenie obiektu s klasy String, moemy po prostu zapisa w jed-
nym wierszu float t = Float.parseFloat(input.next()).
lub:
int t = Integer.decode(s);
lub:
int t = Integer.valueOf(s);
Stosujc metod append(), dodamy na kocu acucha znaków (obiektu point) kolej-
no: warto pierwszej wspórzdnej wierzchoka paraboli (–b/(2*a)), przecinek i od-
stp (", "), warto drugiej wspórzdnej wierzchoka paraboli (–delta/(4*a)) i nawias
Bardzo wana jest kolejno wstawiania tych liczb do acucha pocztkowego "(, )".
/* Obliczenia i budowanie odpowiedzi */
double delta = b*b-4*a*c;
StringBuilder point = new StringBuilder("(, )");
point.insert(3, (-delta/(4*a))).insert(1, -b/(2*a));
System.out.println("Wierzchoek paraboli: "+point);
Z konsoli wczytujemy wiersz tekstu i usuwamy (metoda trim()) zbdne biae znaki
z pocztku i koca acucha String wekt = input.nextLine().trim(). Zakadamy,
e otrzymany acuch zawiera poprawn posta wspórzdnych wektora, i tworzymy
nowy obiekt, na którym wykonamy dalsze przeksztacenia (StringBuilder tmp = new
StringBuilder(wekt)).
import java.util.Scanner;
import java.util.Scanner;
Poniewa warunki a > 0 i a <= 0 nawzajem wykluczaj si, to bardzo czsto uywa-
my w takiej sytuacji konstrukcji if-else:
if (a > 0) {
double pole = a*a;
double obwod = 4*a;
System.out.println("Pole powierzchni P = "+pole);
System.out.println("Obwód kwadratu L = "+obwod);
} else
System.out.println("Bd! Dugo boku ma by liczb dodatni.");
(b i c) i obliczamy q '
b 2 4ac 4ac b 2
. Zbiór wartoci funkcji zaley od
4a 4a 4a
znaku wspóczynnika a i wartoci q:
import java.util.Scanner;
public class Z13_4 {
public static void main(String args[]) {
System.out.println("Podaj wspóczynniki funkcji kwadratowej:");
Scanner input = new Scanner(System.in);
System.out.print("a = ");
double a = input.nextDouble();
if (a == 0) {
System.err.println("a = 0, to nie jest funkcja kwadratowa.");
System.exit(0);
}
System.out.print("b = ");
double b = input.nextDouble();
System.out.print("c = ");
double c = input.nextDouble();
input.close();
double q = (4*a*c-b*b)/(4*a);
StringBuilder wynik = new StringBuilder();
if (a > 0)
wynik.append("<, +oo)").insert(1, q);
else
wynik.append("(-oo, >").insert(6, q);
System.out.println("Zbiór wartoci: "+wynik);
}
}
else
wynik.replace(p2, p2+2, "malejca").replace(p1, p1+2, "rosnca");
System.out.println(wynik);
Zamieniajc znak < na znak > w powyszym kodzie, otrzymamy program wyznacza-
jcy najwiksz z trzech liczb.
else
System.out.printf("%f, %f, %f.\n", a, c, b);
else
System.out.printf("%f, %f, %f.\n", c, a, b);
else
if (b <= c)
if (a <= c)
System.out.printf("%f, %f, %f.\n", b, a, c);
else
System.out.printf("%f, %f, %f.\n", b, c, a);
else
System.out.printf("%f, %f, %f.\n", c, b, a);
Zamieniajc znak <= na znak => w powyszym kodzie, otrzymamy program porzd-
kujcy trzy liczby w kolejnoci nierosncej.
W tym przypadku liczba porówna bdzie zaleaa od wartoci n i zmienia si w za-
kresie od 1 do 9 (zakadamy, e otrzymalimy do zamiany liczb jednocyfrow i ostat-
nie porównanie n == 9 jest zbdne).
Zwrómy uwag na uycie instrukcji warunkowej if (n >=0 && n < 10) {...} w celu
sprawdzenia, czy liczba n jest jednocyfrowa (wiksza lub równa 0 i mniejsza od 10).
i jako wynik wybiera odpowiedni warto z tej tablicy str[n] (dla n = 0, 1, …, 9).
StringBuilder wynik = new StringBuilder("Sownie: ");
if (n >=0 && n < 10)
System.out.println(wynik.append(str[n]).append("."));
else
System.out.println("Bdna warto liczby!");
Z liczby dwucyfrowej n moemy obliczy jej cyfr jednoci j = n%10 (reszta z dziele-
nia przez 10) oraz cyfr dziesitek d = n/10 (wynik dzielenia cakowitego n przez 10,
d równe zero, wiadczy o tym, e liczba n jest jednocyfrowa).
Wyraone sowami wartoci liczb moemy uzyska, stosujc instrukcje selekcji lub
tablice zawierajce poszczególne nazwy (zob. rozwizanie zadania 13.9).
import java.util.Scanner;
public class Z13_10 {
public static void main(String args[]) {
System.out.println("Sowny zapis liczby naturalnej mniejszej od 100");
Scanner input = new Scanner(System.in);
System.out.print("Podaj liczb naturaln mniejsz od 100, n = ");
int n = input.nextInt();
StringBuilder wynik = new StringBuilder("Sownie: ");
if (n >= 100 || n < 0) {
/* Bd. To nie jest liczba naturalna dwucyfrowa. */
System.out.println("Bdna warto liczby!");
} else if (n >= 20) {
/* Liczba dwucyfrowa wiksza lub równa 20 */
switch (n/10) { // Cyfra dziesitek
case 2: wynik.append("dwadziecia"); break;
case 3: wynik.append("trzydzieci"); break;
case 4: wynik.append("czterdzieci"); break;
case 5: wynik.append("pidziesit"); break;
case 6: wynik.append("szedziesit"); break;
case 7: wynik.append("siedemdziesit"); break;
case 8: wynik.append("osiemdziesit"); break;
case 9: wynik.append("dziewidziesit"); break;
}
int d = n%10; // Cyfra jednoci
if (d > 0) {
wynik.append(" ");
switch (d) {
case 1: wynik.append("jeden"); break;
case 2: wynik.append("dwa"); break;
case 3: wynik.append("trzy"); break;
case 4: wynik.append("cztery"); break;
case 5: wynik.append("pi"); break;
case 6: wynik.append("sze"); break;
/* Liczba od 10 do 19 */
} else {
if (d != 0) {
wynik.append(" ");
/* Dopisujemy pene dziesitki: 20, 30, ..., 90. */
}
if (j != 0) {
wynik.append(" ");
/* Dopisujemy jednoci: 1, 2, ..., 9. */
}
}
}
}
wynik.append(".");
System.out.println(wynik);
Kod moemy skróci, rezygnujc ze sprawdzania, czy w zapisie daty zastosowano cy-
fry. Podczas parsowania cigów bdny acuch dd, mm lub rrrr spowoduje przerwa-
nie pracy programu — zostanie zgoszony odpowiedni wyjtek. Do sprawdzania po-
prawnoci liczb moemy uy instrukcji wyboru. Oto zmieniony fragment kodu:
/* Sprawdzamy, czy podany acuch znaków ma waciw dugo (10 znaków)
oraz czy znaki o indeksie 2 i 5 s kropkami. */
boolean isDate = str.length() == 10 && str.charAt(2) == '.'
&& str.charAt(5) == '.';
/* Jeli acuch znaków ma posta dd.mm.rrrr, to próbujemy zamieni cigi
znaków dd, mm i rrrr na liczby cakowite, a nastpnie sprawdzimy
wartoci tych liczb. */
if (isDate) {
int dz = Integer.parseInt(str.substring(0, 2));
int mc = Integer.parseInt(str.substring(3, 5));
int rok = Integer.parseInt(str.substring(6, 10));
/* Sprawdzamy, czy rok naley do danego stulecia (wieku), czy numer
miesica naley do zakresu od 1 do 12 oraz czy numer dnia jest
wikszy od 0. */
isDate = rok >= 2000 && rok < 2100 && mc >= 1 && mc <= 12 && dz > 0;
/* Sprawdzamy, czy numer dnia nie przekracza liczby dni w miesicu. */
switch (mc) {
case 2: // luty
if (rok%4 == 0)
isDate = isDate && dz <= 29; // w roku przestpnym
else
isDate = isDate && dz <= 28; // w pozostaych latach
break;
case 4: case 6: case 9: case 11: // kwiecie, czerwiec
isDate = isDate && dz <= 30; // wrzesie, listopad
break;
default:
isDate = isDate && dz <= 31; // pozostae miesice
break;
}
}
Jeli jednak nie chcemy, aby bdnie podana data (np. 12.o6,2013 — litera o zamiast
cyfry 0) powodowaa przerwanie programu, to musimy sprawdza poprawno zna-
ków lub przechwyci i obsuy wyjtek.
if (isDate) {
try {
int dz = Integer.parseInt(str.substring(0, 2));
int mc = Integer.parseInt(str.substring(3, 5));
int rok = Integer.parseInt(str.substring(6, 10));
/* Sprawdzenie pozostawiamy bez zmian; bdzie wykonywane tylko
wtedy, gdy powysze instrukcje wykonaj si poprawnie. */
} catch (NumberFormatException e) {
isDate = false;
}
}
Obiekt data
Wykonywana operacja 111111 (index)
0123456789012345
StringBuilder data = new StringBuilder(str) 21.01.2012
data.replace(2, 3, "-") 21-01.2012
data.replace(5, 6, "-") 21-01-2012
data.append(data.substring(0,2)) 21-01-201221
data.delete(0, 2) -01-201221
data.insert(0, data.substring(4, 8)) 2012-01-201221
data.delete(8, 12) 2012-01-21
import java.util.Scanner;
public class Z14_1 {
public static void main(String args[]) {
System.out.println("Sumowanie serii liczb zako czonej zerem");
Scanner input = new Scanner(System.in);
double suma = 0;
double liczba;
do {
System.out.print("x = ");
liczba = input.nextDouble();
suma += liczba;
} while (liczba != 0);
input.close();
System.out.printf("Suma liczb %f\n", suma);
}
}
Ten kod moemy stosowa wszdzie tam, gdzie potrzebujemy danych speniajcych
okrelone warunki pocztkowe.
int n = 7;
do {
System.out.print(n+", ");
n += 7;
} while (n < 100);
System.out.println();
}
}
Moemy oddziela liczby innymi znakami, np. odstpem, lub zapisywa kad w in-
nym wierszu. Jeli nie podoba nam si przecinek (i niewidoczny odstp) na kocu cigu
liczb, to moemy nieco zmodyfikowa kod i wewntrz ptli zbada, jaki znak posta-
wi — przecinek czy kropk.
int n = 7;
do {
System.out.print(n);
n += 7;
if (n < 100)
System.out.print(", ");
else
System.out.print(".");
} while (n < 100);
input.close();
System.out.printf("Pole koa P = %f\n", Math.PI*r*r);
}
}
import java.util.Scanner;
public class Z14_7 {
public static void main(String args[]) {
System.out.println("Ilo liczb Fibonacciego mniejszych od n");
Scanner input = new Scanner(System.in);
System.out.print("Podaj liczb cakowit, n = ");
int n = input.nextInt();
input.close();
int licznik = 0;
if (n == 2)
licznik = 2;
else if (n > 2) {
int a = 1, b = 1;
int c = a+b;
licznik += 2; // dwa pocztkowe wyrazy
do {
++licznik; // kolejny wyraz cigu
a = b;
b = c;
c = b+a;
} while (c < n);
}
System.out.println(licznik);
}
}
Ptla wykona si co najmniej raz, a jej dalsze dziaanie zaley od pobranej (w instruk-
cji wewntrz ptli) wartoci zmiennej a. Dodatnia warto zmiennej (decyduje wynik
porównania a > 0) spowoduje powtórzenie cyklu, ujemna lub zero — zakoczenie ptli.
Przed gówn ptl tworzymy obiekt input klasy Scanner, a po jej zakoczeniu zamy-
kamy go. Stosujc metody obiektu input, odczytamy dane potrzebne do oblicze oraz
odpowied na pytanie, czy kontynuujemy obliczenia.
Po wyjciu z ptli zmienna odp moe mie wycznie warto 't' lub 'n'. Ta odpo-
wied zadecyduje o dalszym dziaaniu programu. Warunek s.isEmpty() || odp != 't'
&& odp != 'n' moemy zastpi równowanym warunkiem s.isEmpty() || !(odp
== 't' || odp == 'n').
Ptl realizujc obliczenia moemy zapisa równie tak: while (n-- > 0) ++m;. Za-
stosowana postdekrementacja (n--) w wyraeniu n-- > 0 powoduje skrócenie zapisu.
Dziaa to w taki sposób: tworzona jest kopia wartoci zmiennej n, warto zmiennej n
jest zmniejszana o 1, do porównywania z zerem brana jest przechowana kopia. Nie
wpywa to na liczb powtórze ptli, wic program dziaa tak samo. Pozostaje jednak
pewna rónica w wartoci kocowej zmiennej n. W tym programie nie ma to jednak
znaczenia.
W zalenoci od znaku zmiennej n wykona si albo pierwsza ptla (n > 0), albo druga
(n < 0), albo adna z nich (n = 0). Za kadym razem kocowa warto m bdzie szu-
kan sum.
import java.util.Scanner;
public class Z15_2 {
public static void main(String args[]) {
/* Wprowadzanie danych */
System.out.println("Podaj dwie liczby cakowite:");
Scanner input = new Scanner(System.in);
System.out.print("m = ");
int m = input.nextInt();
System.out.print("n = ");
int n = input.nextInt();
input.close();
/* Obliczenia i wynik */
while (n > 0) {
--n;
++m;
}
while (n < 0) {
++n;
--m;
}
System.out.printf("Suma liczb %d\n", m);
}
}
Upraszczajc zapis obu ptli, nie uzyskamy oczekiwanego rezultatu. Wynik bdzie
zawsze o 1 mniejszy od sumy liczb. Jest to efekt zmiany wartoci zmiennej n podczas
badania warunku, na co zwracano uwag w rozwizaniu zadania 15.1.
while (n-- > 0) ++m;
while (n++ < 0) --m;
Naley wystrzega si tego typu uproszcze, a jeli ju si na nie zdecydujemy, to mu-
simy dokadnie analizowa dziaanie kodu. Upraszczajc zapis, czynimy kod mniej
czytelnym.
int iloraz = 0;
while (m >= n) {
++iloraz;
m = m-n;
}
Jeli dzielna lub dzielnik s liczbami ujemnymi, ustalimy znak ilorazu (podobnie jak
znak iloczynu w zadaniu 15.3b), a obliczenia wykonamy dla bezwzgldnych wartoci
dzielnej i dzielnika. Pozostaje jeszcze problem dzielenia przez 0 — w takiej sytuacji
zgosimy wyjtek throw new ArithmeticException("dzielenie przez zero").
/* Obliczenia i wynik */
if (n == 0) {
throw new ArithmeticException("dzielenie przez zero");
} else {
int iloraz = 0;
int znak = 1;
if (m < 0) {
znak = -1;
m = -m;
}
if (n < 0) {
znak = -znak;
n = -n;
}
while (m >= n) {
++iloraz;
m = m-n;
}
if (znak == -1)
iloraz = -iloraz;
System.out.printf("Iloraz cakowity %d\n", iloraz);
}
if (znak == -1)
m = -m;
System.out.printf("Reszta z dzielenia %d\n", m);
}
Algorytm jest skuteczny, ale nie zawsze najszybszy. Np. dla pary liczb m = 1000 i n = 2
ptla nie wykona si ani razu, a wynikiem bdzie liczba 1000. Natomiast dla pary m = 2
i n = 1000 ptla wykona si 499 razy (1000:2–1), zanim zmienna nww osignie prawi-
dow warto. Wniosek nasuwa si sam — jako pocztkow warto nww wybierzmy
wiksz z liczb.
int nww;
if (m > n) {
nww = m;
while (nww%n != 0)
nww += m;
} else if (n > m) {
nww = n;
while (nww%m != 0)
nww += m;
} else
nww = m; // m i n s równe
System.out.printf("NWW(m, n) = %d.\n", nww);
Poniewa zmienne zainicjowane w ptli for maj zasig lokalny, ograniczony do ciaa
tej ptli, to deklaracja i inicjalizacja zmiennej kw musz nastpi przed ptl. Nic nie
Instrukcja w ciele ptli jest instrukcj pust (nie zapomnijmy o redniku), natomiast
instrukcje tworzce instrukcj modyfikujc musz by ustawione w odpowiedniej
kolejnoci. Takich „uproszcze” jednak nie polecamy.
lub
for(int i = n-1; i >= 0; --i)
if (s.charAt(i) != ' ')
str.append(s.charAt(i));
acuch s moe zawiera odstpy, a w odwróconym acuchu w obiekcie str odst-
pów nie ma, wic porównywanie tych acuchów nie da prawidowego rezultatu. Mo-
emy porówna acuch str.toString().toLowerCase() z acuchem odwróconym
(metod reverse()) str.reverse().toString().toLowerCase(). Naley pamita, e
wywoanie metody str.reverse() przestawi elementy w acuchu str.
/* Tabliczka mnoenia */
System.out.println("Tabliczka mnoenia");
System.out.println(linia);
System.out.print("| X |");
for(int i = 0; i <= 5; ++i)
System.out.printf("%3s |", Integer.toString(i, 5));
System.out.println();
System.out.println(linia);
for(int j = 0; j <= 5; ++j) {
System.out.printf("|%3s |", Integer.toString(j, 5));
for(int i = 0; i <= 5; ++i)
System.out.printf("%3s |", Integer.toString(i*j, 5));
System.out.println();
}
System.out.println(linia);
}
}
Znajc liczb wyrazów cigu, w ptli (for) obliczamy kolejne wyrazy i dodajemy je
do sumy (suma += 1.0/i — aby uzyska wynik zmiennoprzecinkowy, dzielna lub
dzielnik musi by liczb zmiennoprzecinkow. Alternatyw dla podanej instrukcji jest
instrukcja suma += 1/(double)i).
import java.util.Scanner;
public class Z16_6 {
public static void main(String args[]) {
System.out.println("Suma wyrazów cigu harmonicznego");
Scanner input = new Scanner(System.in);
int n;
do {
System.out.print("Liczba wyrazów, n = ");
n = input.nextInt();
} while (n <= 0);
input.close();
double suma = 0.0;
for(int i = 1; i <= n; ++i)
suma += 1.0/i;
System.out.printf("Suma %d wyrazów cigu harmonicznego jest
równa %f.\n", n, suma);
}
}
try {
System.out.print("x = ");
x = input.nextDouble();
end = true;
} catch(InputMismatchException e) {
System.out.println("To nie jest liczba!");
input.next();
end = false;
}
} while(!end);
input.close();
System.out.printf("Wprowadzona liczba, x = %f\n", x);
}
}
String s = input.next();
x = Double.parseDouble(s);
break;
} catch(NumberFormatException e) {
System.out.println("To nie jest liczba!");
}
}
Sposób II. W tym rozwizaniu przed wczytaniem tokenu ze skanera sprawdzimy, czy
jest to liczba cakowita (metoda hasNextInt()). Jeli wynik testu bdzie pozytywny,
to wczytamy liczb, dodamy j do sumy i zwikszymy licznik. W przeciwnym wypad-
ku przeczytamy token i zignorujemy jego warto (moemy wywietli odpowiedni
komunikat).
import java.util.Scanner;
public class Z17_3a {
public static void main(String args[]) {
System.out.println("Obliczanie sumy piciu liczb cakowitych");
System.out.println("Podaj pi liczb cakowitych:");
Scanner input = new Scanner(System.in);
int suma = 0, licznik = 0;
do {
if (input.hasNextInt()) {
int n = input.nextInt();
++licznik;
suma += n;
System.out.println("Liczba "+licznik+": "+n);
} else
System.out.println("To nie jest liczba cakowita: "+input.next());
} while(licznik < 5);
input.close();
System.out.printf("Suma liczb S = %d\n", suma);
}
}
Tak zdefiniowana statyczna metoda kostka() jest dostpna w pakiecie, w którym znaj-
duje si klasa Z18_1, i moe by wywoana poleceniem Z18_1.kostka().
Inn moliwo stwarza klasa java.util.Random. Najpierw tworzymy obiekt rnd, a na-
stpnie stosujemy metod rnd.nextInt(6) zwracajc liczb cakowit od 0 do 5 (nie-
osigajc wartoci 6). Po dodaniu liczby 1 otrzymamy wynik rzutu kostk.
/* Tworzymy obiekt rnd klasy Random. */
static Random rnd = new Random();
/* Tworzymy funkcj losujc rzut kostk. */
static int kostka(){
return 1+rnd.nextInt(6);
}
Uzyskane wyniki przedstawiamy, podajc liczb wystpie kadego wyniku oraz udzia
procentowy (wynik[i]*100.0/wynik[0]). Zwrómy uwag na sposób obliczenia: wy-
nik[i] mnoymy przez 100.0 (co daje rezultat zmiennoprzecinkowy) i nastpnie dzie-
limy przez liczb rzutów (wynik[0]). Wykorzystanie w wyraeniu liczby cakowitej
100 daoby wynik cakowity (z pominiciem czci uamkowej procentu). Uycie w a-
cuchu formatujcym symbolu %% jest potrzebne, aby wywietli znak procentu (%).
}
for(int i = 0; i < 5; ++i)
System.out.printf("<%d, %d): %4d - %4.1f%%\n", i, i+1, n[i],
n[i]*100.0/500);
}
}
Dalsze losowanie przebiega w ptli do {...} while (j<6);, która zakoczy si po
wylosowaniu wszystkich szeciu (rónych) wartoci. Po wylosowaniu kolejnej warto-
ci (n) ustawiamy zmienn logiczn jest na warto false (zakadamy, e liczba si
nie powtarza) i porównujemy warto wylosowan n z dotychczasow zawartoci
tablicy tmp.
for(byte i = 0; i < j; ++i)
if (n == tmp[i]) jest = true;
Jeli liczba jest w tablicy, to zmienna jest przyjmie warto true i losowanie trzeba
bdzie powtórzy. Natomiast gdy liczba n nie wystpi w tablicy tmp, to wstawimy do
tablicy t warto i zwikszymy j o 1.
if (!jest)
tmp[j++] = n;
import java.util.*;
public class Z18_10 {
/* Kod metody rndSortArray */
/* Kod metody rndSortUniqueArray */
public static void main(String args[]) {
/* 20 posortowanych liczb z zakresu od 0 do 9 */
MyRandomArray.arrayPrintln(rndSortArray(20, 10));
/* 10 posortowanych liczb z zakresu od 0 do 99 bez powtarzania */
MyRandomArray.arrayPrintln(rndSortUniqueArray(10, 100));
}
}
do {
double x = a*rnd.nextDouble();
boolean jest = false;
for(int i = 0; i < j; ++i)
if (x == tmp[i]) jest = true;
if (!jest)
tmp[j++] = x;
} while (j < n);
return tmp;
}
}
public static void main(String args[]) {
/* 20 posortowanych liczb z przedziau <0, 2.5) */
MyRandomArray.arrayPrintln(rndSortArray(20, 2.5));
/* 10 posortowanych liczb z przedziau <0, 10) bez powtarzania */
MyRandomArray.arrayPrintf("%10.3f", rndSortUniqueArray(10, 10.0));
}
}
Uamek zwyky
Uamek dziesitny (x) 0,333333333333… 0,666666666666…
Liczba miejsc po przecinku (prec) 3 3
Wspóczynnik (wsp) 103 = 1000 103 = 1000
Wyraenie: x*wsp 333,333333333… 666,666666666…
Wyraenie: x*wsp+0.5 333,833333333… 667,166666666…
Wyraenie: (int)(x*wsp+0.5) 333 667
Wyraenie: (int)(x*wsp+0.5)/wsp 0,333 0,667
Inn moliwo stwarza zdefiniowanie metody losujcej liczb z danego zakresu i za-
okrglon z okrelon precyzj, np.:
public static double random(double a, int prec) {
return MyRandomArray.round(a*Math.random(), prec);
}
tab (int n = tab.length). Wczytywanie danych, przy uyciu obiektu input klasy
Scanner, zorganizujemy w ptli for. W ten sposób moemy zbudowa metody wczy-
tywania danych do tablic z elementami dowolnego typu.
import java.util.Scanner;
public class Z18_17 {
public static void inputArray(int[] tab) {
int n = tab.length;
Scanner input = new Scanner(System.in);
for(int i = 0; i < n; ++i) {
System.out.printf("Liczba %d z %d, n = ", i+1, n);
tab[i] = input.nextInt();
}
}
public static void inputArray(double[] tab) {
int n = tab.length;
Scanner input = new Scanner(System.in);
for(int i = 0; i < n; ++i) {
System.out.printf("Liczba %d z %d, x = ", i+1, n);
tab[i] = input.nextDouble();
}
}
Generating Z19_2\constant-values.html...
Kod ródowy nie zawiera adnych komentarzy, zatem w pliku Z19_2.html nie znaj-
dziemy zbyt wielu informacji. Moemy jednak dowiedzie si, e:
Klasa Z19_2 dziedziczy po klasie java.lang.Object.
Kompilator utworzy domylny konstruktor Z19_2(), co pozwala tworzy
obiekty naszej klasy, np. Z19_2 x = new Z19_2().
Klasa posiada publiczn i statyczn metod main (nagówek: public static
void main(java.lang.String[] args)), czyli jest aplikacj uruchamian
poleceniem java Z19_2 w konsoli (po uprzednim skompilowaniu pliku
ródowego na plik Z19_2.class).
Drugi komentarz odnosi si do staej HELLO. Do amania wierszy uyto znacznika <br>,
wcicie w kodzie uzyskano, stosujc znak spacji nierozdzielajcej . Ten komen-
tarz pojawi si w dokumentacji, gdy podczas jej tworzenia uyjemy opcji –private.
/** Identyfikator staej (zmiennej, której wartoci nie moemy zmieni ),
* zawierajcej acuch znaków <code>Hello World!"</code>. Zwyczajowo
* takie identyfikatory zapisujemy wielkimi literami. Prywatna staa
* <code>HELLO</code> jest dostpna wycznie wewntrz klasy
* <code>Z19_3</code>. Zastosowanie staej przedstawimy w dwóch
* przykadach:
* <p><b>Przykad 1.</b>
* <code><br>static String hello() {<br>
* return HELLO;<br>}</code></p>
* <p><b>Przykad 2.</b>
* <code><br>System.out.println("Jeszcze raz: "+HELLO");</code></p>
*/
private static final String HELLO = "Hello World!";
Naley te zwróci uwag na pierwsze zdanie w komentarzu. To zdanie (do pierwszej
kropki) pojawia si w opisie skróconym staej, zmiennej lub metody (Summary). Cay
tekst natomiast pojawi si w opisie szczegóowym (Detail).
import java.util.Scanner;
/** Klasa <code>MyIntArray</code> zawiera statyczne metody, uatwiajce
* wprowadzanie danych do jednowymiarowej tablicy liczb cakowitych,
* wywietlanie zawartoci tablicy w konsoli oraz konwertowanie tablicy
* liczb zmiennoprzecinkowych na tablic liczb cakowitych.
* @author Wiesaw Rychlicki
* @version 1.0 (2012-02-06)
*/
public class MyIntArray {
/** Umoliwia wprowadzanie danych liczbowych (typu <code>int</code>)
* z konsoli do tablicy. Dane wprowadzane s przy uyciu metod z klasy
* <code>java.util.Scanner</code>. Podczas wprowadzania danych
* wywietlana jest informacja w postaci <code>Liczba 2 z 5, n = </code>.
* @param tab jednowymiarowa tablica liczb cakowitych.
*/
public static void input(int[] tab) {
int n = tab.length;
Scanner input = new Scanner(System.in);
for(int i = 0; i < n; ++i) {
System.out.printf("Liczba %d z %d, n = ", i+1, n);
tab[i] = input.nextInt();
}
}
/** Umoliwia wywietlanie liczb zawartych w tablicy w konsoli.
* Kolejne liczby oddzielane s odstpem.
* @param tab jednowymiarowa tablica liczb cakowitych.
*/
public static void print(int[] tab) {
int n = tab.length;
for(int i = 0; i < n; ++i)
System.out.print(tab[i]+" ");
}
/** Umoliwia wywietlanie liczb zawartych w tablicy w konsoli.
* Kolejne liczby oddzielane s odstpem. Po wywietleniu ostatniej
* liczby przesyany jest do konsoli znak koca linii.
* @param tab jednowymiarowa tablica liczb cakowitych.
*/
public static void println(int[] tab) {
int n = tab.length;
for(int i = 0; i < n; ++i)
System.out.print(tab[i]+" ");
System.out.println();
}
/** Zwraca jednowymiarow tablic liczb typu <code>double</code>
* o wartociach równych wartociom tablicy liczb cakowitych
* przekazanej jako parametr.
* @param tab jednowymiarowa tablica liczb cakowitych.
*/
public static double[] toDoubleArray(int[] tab) {
int n = tab.length;
double[] tmp = new double[n];
for(int i = 0; i < n; ++i)
tmp[i] = (double)tab[i];
return tmp;
}
/** Zwraca jednowymiarow tablic liczb typu <code>int</code>,
* o wartociach odpowiadajcych (zaokrglenie w dó) wartociom
* elementów tablicy liczb zmiennoprzecinkowych typu <code>double</code>
* przekazanej jako parametr.
Ponadto oprócz metody konwertujcej tablic liczb cakowitych tupu int na tablic
typu double (metoda toDoubleArray()) zdefiniowano metod konwertujc tablic
liczb typu float na tablic liczb typu double. Stosujemy przecienie metody, czyli
obie metody maj t sam nazw i typ wyniku, a róni si typem parametru.
/** Zwraca jednowymiarow tablic liczb typu <code>double</code>
* o wartociach równych wartociom elementów tablicy liczb
* zmiennoprzecinkowych typu <code>float</code> przekazanej jako
* parametr.
* @param tab jednowymiarowa tablica liczb zmiennoprzecinkowych typu
* <code>float</code>.
*/
public static double[] toDoubleArray(float[] tab) {
int n = tab.length;
double[] tmp = new double[n];
for(int i = 0; i < n; ++i)
tmp[i] = (double)tab[i];
return tmp;
}
}
* <code>0</code> do <code>m-1</code>.
* @param n liczba naturalna, rozmiar zwracanej tablicy,
* @param m liczba naturalna, okrelajca zakres losowanych wartoci
* (od <code>0</code> do <code>m-1</code>).
* @throws java.lang.NegativeArraySizeException, gdy podany wymiar
* tablicy (<code>n</code>) jest liczb ujemn.
* @throws java.lang.IllegalArgumentException, gdy podany zakres
* (<code>m</code>) nie jest liczb dodatni.
*/
public static int[] rndSortArray(int n, int m) {
Random rnd = new Random();
int[] tmp = new int[n];
for(int i = 0; i < n; ++i)
tmp[i] = rnd.nextInt(m);
Arrays.sort(tmp);
return tmp;
}
int k = (int)(a/step)+1;
double wsp = Math.pow(10.0, 1+(int)Math.log10(1/step));
double[] tmp = new double[n];
for(int i = 0; i < n; ++i)
tmp[i] = (int)(step*rnd.nextInt(k)*wsp+0.5)/wsp;
return tmp;
}
return tmp;
}
Do kodu klasy dodamy konstruktor, czyli metod o takiej samej nazwie (Fraction)
jak nazwa klasy. Konstruktor nie zwraca adnej wartoci — jego zadaniem jest inicjo-
wanie pól obiektu. Konstruktor jest wywoywany automatycznie podczas tworzenia
obiektu za pomoc operatora new. Znaczenie parametrów m i n jest objanione w komen-
tarzu dokumentacyjnym.
/** Tworzy nowy obiekt <code>Fraction</code> - uamek w postaci
* <code>m/n</code> - na podstawie wartoci cakowitych parametrów
* <code>m</code> i <code>n</code>.
* @param m liczba cakowita (licznik uamka),
* @param n liczba cakowita (mianownik uamka).
* @throws IllegalArgumentException, gdy podamy mianownik n = 0.
*/
Fraction (int m, int n) {
this.num = m;
if (n != 0)
this.den = n;
else
throw new IllegalArgumentException("Parametr n = 0!");
}
Podstawienie wartoci parametrów do pól obiektu nastpio przy uyciu sowa kluczo-
wego this, które umoliwia dostp do zmiennych egzemplarzowych i metod biecej
klasy (this.num = m; this.den = n;). Poniewa w tym przykadzie nazwy identyfi-
katorów (parametrów i pól klasy) nie powtarzaj si, wykorzystanie sowa this nie
byo konieczne — wystarczyoby podstawienie w postaci: num = m; den = n;. Poda-
nie mianownika równego 0 spowoduje zwrócenie wyjtku IllegalArgumentException.
Metoda toString() jest zaimplementowana w klasie Object i wskazane jest jej przy-
sonicie w kadej nowo tworzonej klasie. Uycie operatora + do czenia (konkate-
nacji) acucha z danymi innego typu powoduje zamian tych danych na acuchy
znaków i poczenie acuchów w jeden acuch. W przypadku dodawania obiektów
wykorzystywana jest w tym celu metoda toString() przesaniajca metod Object.
toString().
/** Zwraca acuch znaków reprezentujcy ten obiekt
* <code>Fraction</code>. Przykad zwracanego acucha
* <code>"3/4”</code>, <code>"-5/25”</code> itp.
*/
@Override public String toString() {
return num+"/"+den;
}
Operacja dodawania "a = "+a (acucha znaków "a = " i obiektu a) jest równowana
operacji dodawania "a = "+a.toString() i pokazuje dziaanie metody toString().
Ten konstruktor równie mógby mie posta Fraction() {this(0, 1);} — uywajc
sowa kluczowego this, wywoamy w ten sposób konstruktor z dwoma parametrami
i zbudujemy obiekt reprezentujcy uamek 0/1.
Tworzymy obiekt a (Fraction a = new Fraction(3, 11)) i drugi obiekt, b, bdcy jego
kopi (Fraction b = new Fraction(a)). Obiekty reprezentuj ten sam uamek 3/11.
Operator == porównuje referencje obiektów, a nie ich wartoci. Wyraenie a == b
przyjmuje warto false.
Rozszerzanie uamka nie powoduje zmiany jego wartoci i polega na pomnoeniu licz-
nika i mianownika uamka przez t sam liczb rón od zera.
/** Rozszerza uamek reprezentowany przez obiekt przez podan liczb
* cakowit <code>n ≠ 0</code>.
* @param n liczba cakowita typu <code>int</code> róna od 0.
* @throws IllegalArgumentException, gdy podamy <code>n = 0</code>.
*/
public Fraction equivalent(int n) {
if (n == 0)
throw new IllegalArgumentException("Parametr n = 0!");
this.den *= n;
this.num *= n;
this.correction(); // mianownik powinien pozosta dodatni
return this;
}
am
Mnoenie uamka przez liczb cakowit wykonujemy podobnie a m .
b b
/** Zwraca nowy obiekt <code>Fraction</code> - iloczyn uamka
* reprezentowanego przez obiekt wywoujcy metod i liczby cakowitej
* typu <code>int</code> przekazanej jako parametr.
* @param m liczba cakowita typu <code>int</code>.
*/
public Fraction mult(int m) {
return new Fraction(this.num*m, this.den).reduce();
}
Moemy zdefiniowa mnoenie uamka przez liczb naturaln przy uyciu konstruk-
tora jednoargumentowego i wyej okrelonego mnoenia uamków:
public Fraction mult(int m) {
return this.mult(new Fraction(m));
}
lub:
public Fraction mult(int m) {
return new Fraction(m).mult(this);
}
System.out.println("b = "+b);
System.out.println("a*b = "+a.mult(b));
System.out.println("b*a = "+b.mult(a));
System.out.println("a*2 = "+a.mult(2));
System.out.println("a*(-14) = "+a.mult(-14));
}
}
Mnoenie uamka (obiektu Fraction) przez liczb cakowit lub mnoenie liczby przez
uamek:
/** Zwraca obiekt klasy <code>Fraction</code> bdcy iloczynem obiektu
* <code>Fraction</code> i liczby cakowitej typu <code>int</code>.
* @param x obiekt klasy <code>Fraction</code>,
* @param m liczba cakowita typu <code>int</code>.
*/
public static Fraction prod(Fraction x, int m) {
return x.mult(m);
}
Kilka przykadowych dziele pokazuje dziaanie przecionych metod quot() dla ró-
nych par argumentów (dzielenie uamka przez uamek, uamka przez liczb cakowit,
liczby cakowitej przez uamek oraz dzielenie dwóch liczb cakowitych z wynikiem
typu Fraction).
/** <h3>Zadanie Z20.10</h3>
* Tworzenie metod statycznych realizujcych dzielenie dwóch obiektów
* <code>Fraction</code>, obiektu <code>Fraction</code> przez liczb
* cakowit, liczby cakowitej przez obiekt oraz dzielenie dwóch liczb
* cakowitych z wynikiem typu <code>Fraction</code>.
*/
public class Z20_10 {
/** Prezentuje dziaanie metod statycznych obliczajcych iloraz uamka
* przez uamek, uamka przez liczb cakowit, liczby cakowitej przez
* uamek i iloraz dwóch liczb cakowitych z wynikami typu
* <code>Fraction</code>.
*/
public static void main(String[] args) {
Fraction a = new Fraction(4, 7);
System.out.println("a = "+a);
Fraction b = new Fraction(7, 15);
System.out.println("b = "+b);
System.out.println("a/b = "+Fraction.quot(a, b));
System.out.println("a/4 = "+Fraction.quot(a, 4));
System.out.println("-3/b = "+Fraction.quot(-3, b));
System.out.println("4/12 = "+Fraction.quot(4, 12));
try {
Fraction c = new Fraction(0, 5);
System.out.println("c = "+c);
System.out.println("a/c = "+Fraction.quot(a, c));
} catch(ArithmeticException e) {
System.out.println(e.getMessage());
}
try {
System.out.println("a/0 = "+Fraction.quot(a, 0));
} catch(ArithmeticException e) {
System.out.println(e.getMessage());
}
}
}
Do kompletu metod (sum()) doczymy metod dodajc dwie liczby cakowite i zwra-
cajc wynik w postaci obiektu klasy Fraction.
/** Zwraca obiekt klasy <code>Fraction</code> reprezentujcy sum
* dwóch liczb cakowitych typu <code>int</code>.
* @param m liczba cakowita typu <code>int</code>,
* @param n liczba cakowita typu <code>int</code>.
*/
public static Fraction sum(int m, int n) {
return new Fraction(m+n);
}
Kolejna metoda odejmuje dwie liczby cakowite i zwraca wynik w postaci obiektu
Fraction.
/** Zwraca obiekt klasy <code>Fraction</code> reprezentujcy rónic
* dwóch liczb cakowitych typu <code>int</code>.
* @param m liczba cakowita typu <code>int</code> (odjemna),
* @param n liczba cakowita typu <code>int</code> (odjemnik).
*/
public static Fraction diff(int m, int n) {
return new Fraction(m-n);
}
} catch (IllegalArgumentException e) {
System.out.println("Mianownik: "+e.getMessage());
}
}
}
Jeli porównanie nie zakoczyo si, to sprawdzamy, czy parametr o jest referencj do
jakiegokolwiek obiektu. Spenienie równoci o == null spowoduje zwrócenie warto-
ci false (obiekt wywoujcy metod ma referencj rón od null). Warto false
zwrócimy równie wtedy, gdy parametr o jest obiektem innej klasy ni Fraction, czyli
nie jest obiektem tej klasy (!(o instanceof Fraction)).
Jeli porównywanie trwa nadal, to mamy ju do czynienia z dwoma obiektami klasy
Fraction. Tworzymy nowy obiekt klasy Fraction i rzutujemy parametr o klasy Object
na typ obiektowy Fraction (Fraction c = (Fraction) o). Teraz pozostaje porównanie
dwóch obiektów klasy Fraction — obiektu wywoujcego metod i obiektu c:
if (this.num*c.den == this.den*c.num)
return true;
else
return false;
i mianowników (bez mnoenia). Kopi obiektu robimy po to, aby w wyniku skracania
nie zmieni pól obiektu wywoujcego metod.
Fraction d = new Fraction(this);
c.reduce();
d.reduce();
if (d.num == c.num && d.den == c.den)
return true;
else
return false;
Analiz kodu przykadu zastosowania metody equals() dla obiektów klasy Fraction
pozostawiamy Czytelnikowi.
/** <h3>Zadanie Z20.18</h3>
* Tworzenie metody equals() do porównywania obiektu <code>Fraction</code>
* z innymi obiektami tej samej klasy lub innych klas.
*/
public class Z20_18 {
/** Prezentuje dziaanie metody equals() przesaniajcej metod
* Object.equals.
*/
public static void main(String[] args) {
Fraction a = new Fraction(4, 7);
Fraction b = new Fraction(12, 21);
Fraction c = new Fraction(20, 35);
Fraction d = new Fraction(20, 36);
System.out.println("Trzy róne obiekty reprezentuj t sam
liczb 4/7.");
System.out.println("a = "+a);
System.out.println("b = "+b);
System.out.println("c = "+c);
System.out.println("Czwarty obiekt reprezentuje inn liczb
20/36 = 5/9.");
System.out.println("d = "+d);
System.out.println("Metoda equals() jest relacj równowanoci:");
System.out.println(" * jest zwrotna:");
System.out.println("a.equals(a): "+a.equals(a));
System.out.println(" * jest symetryczna:");
System.out.println("a.equals(b): "+a.equals(b));
System.out.println("b.equals(a): "+b.equals(a));
System.out.println();
1
Opracowane na podstawie: J. Bloch, Java. Efektywne programowanie. Wydanie II, Helion 2009.
System.out.println("a.equals(d): "+a.equals(d));
System.out.println("d.equals(a): "+d.equals(a));
System.out.println(" * jest przechodnia:");
System.out.println("a.equals(b): "+a.equals(b));
System.out.println("b.equals(c): "+b.equals(c));
System.out.println("a.equals(c): "+a.equals(c));
System.out.println("Podstawiamy d = a, obie referencje wskazuj
ten sam obiekt.");
d = a;
System.out.println("a.equals(d): "+a.equals(d));
System.out.println("d.equals(a): "+d.equals(a));
System.out.println("Porównujemy obiekty rónych typów:");
System.out.println("a.equals(5): "+a.equals(5));
System.out.println("Zmieniamy warto obiektu a. Referencja d
nadal wskazuje ten sam obiekt.");
a.setFrac(5, 1);
System.out.println("a = "+a);
System.out.println("d = "+d);
System.out.println("a.equals(d): "+a.equals(d));
System.out.println("d.equals(a): "+d.equals(a));
System.out.println("Porównujemy obiekty rónych typów:");
System.out.println("a.equals(Integer.valueOf(5)): "
+a.equals(Integer.valueOf(5)));
System.out.println("Podstawiamy d = null, referencja d nie
wskazuje adnego obiektu.");
d = null;
System.out.println("a.equals(d): "+a.equals(d));
System.out.println("b.equals(null): "+b.equals(null));
}
}
*/
public static double toDouble(Fraction x) {
return (double)x.num/x.den;
}
Gdy acuch str nie jest poprawnym zapisem liczby cakowitej, to uyta
do konwersji metoda Integer.parseInt() rzuci wyjtek.
b) Znajdujcy si na pozycji i = str.indexOf('/') znak slash (/) rozdziela
acuch znaków na dwie liczby — licznik (str.substring(0, i)) i mianownik
(str.substring(i+1)). Polom obiektu przypisujemy wartoci:
this.num = Integer.parseInt(str.substring(0, i));
this.den = Integer.parseInt(str.substring(i+1));
if (this.den == 0)
throw new ArithmeticException("Dzielenie przez 0!");
Drugi podcig wyznacza mianownik uamka (potga liczby 10) — liczba cyfr
jest równa liczbie zer w mianowniku.
int k = str.length()-i; // liczba cyfr po kropce
this.den = 1;
int n = 1;
while (n++ < k)
this.den *= 10;
*/
public static Fraction valueOf(double x) {
return new Fraction(""+x);
}
Kolejne metody statyczne zwracaj obiekt klasy Fraction odpowiadajcy liczbie ca-
kowitej m (m/1) lub parze liczb cakowitych m i n (m/n).
/** Zwraca obiekt klasy <code>Fraction</code> reprezentujcy okrelon
* warto typu cakowitego <code>int</code>.
* @param m liczba cakowita.
*/
public static Fraction valueOf(int m) {
return new Fraction(m);
}
System.out.println("b = "+Fraction.valueOf("2,45"));
System.out.println("c = "+Fraction.valueOf("15/45"));
System.out.println("d = "+Fraction.valueOf(15, 45));
System.out.println("e = "+Fraction.valueOf(5));
try {
Fraction e = Fraction.valueOf("45;35");
} catch (NumberFormatException e) {
System.out.println("Niewaciwy parametr - "+e.getMessage());
}
try {
Fraction e = Fraction.valueOf("15/0");
} catch (ArithmeticException e) {
System.out.println("Niewaciwy parametr - "+e.getMessage());
}
}
}
ax by e
Do rozwizania mamy ukad dwóch równa z dwiema niewiadomymi: ® .
¯cx dy f
a b
Obliczamy gówny wyznacznik ukadu W ad cb oraz wyznaczniki
c d
e b
Wx ed fb (wspóczynniki przy zmiennej x zastpujemy wyrazami wol-
f d
a e
nymi) i W y af ce (wspóczynniki przy zmiennej y zastpujemy wyrazami
c f
import java.util.Scanner;
/** <h3>Zadanie Z20.26</h3> */
public class Z20_26 {
private static final Fraction ZERO = new Fraction();
private static Fraction inputFraction(String s) {
Scanner input = new Scanner(System.in);
System.out.print(s);
return Fraction.valueOf(input.next());
}
private static Fraction det(Fraction a, Fraction b, Fraction c,
Fraction d) {
return Fraction.diff(Fraction.prod(a, d), Fraction.prod(c, b));
}
public static void main(String[] args) {
System.out.println("Podaj wspóczynniki równania ax+by=e");
Fraction a = inputFraction("a = ");
Fraction b = inputFraction("b = ");
Fraction e = inputFraction("e = ");
System.out.println("Podaj wspóczynniki równania cx+dy=f");
Fraction c = inputFraction("c = ");
Fraction d = inputFraction("d = ");
Fraction f = inputFraction("f = ");
Fraction W = det(a, b, c, d);
Fraction Wx = det(e, b, f, d);
Fraction Wy = det(a, e, c, f);
if (!W.equals(ZERO)) {
System.out.println("Ukad oznaczony:");
System.out.println("x = "+Wx.div(W));
System.out.println("y = "+Wy.div(W));
} else if(Wx.equals(ZERO) && Wy.equals(ZERO))
System.out.println("Ukad nieoznaczony.");
else
System.out.println("Ukad sprzeczny.");
}
}
S
Przykadowe obliczenia wykonamy dla któw D rad i E 1 rad .
4
}
if (min != 0 || (deg != 0 && sek != 0))
str.append(min).append("\'");
if (sek != 0)
str.append(sek).append("\"");
return str.toString();
}
Zwrómy uwag na warunkowe pomijanie zerowych wartoci stopni, minut lub sekund
w wyjciowym acuchu oraz indywidualne potraktowanie przypadku kta 0 rad =
0°. Jeli w wyniku zaokrglenia otrzymamy 60", to zamieniamy t warto na 1' i do-
dajemy do liczby sekund. Teraz moe zdarzy si, e otrzymamy 60' — zamienimy
to na 1° i skorygujemy liczb stopni. Przykadowe obliczenia wykonamy dla któw
S
D rad i E r1 rad .
4
/** Zadanie Z21.3 */
public class Z21_3 {
public static void main(String args[]) {
Angle alfa = new Angle(Math.PI/4);
System.out.println("alfa = "+alfa.radian()+" rad");
System.out.println("alfa = "+alfa);
Angle beta = new Angle(1.0);
System.out.println("beta = "+beta.radian()+" rad");
System.out.println("beta = "+beta);
beta = new Angle(-1.0);
System.out.println("beta = "+beta.radian()+" rad");
System.out.println("beta = "+beta);
}
}
Obliczenia przykadowe podamy dla kilku któw, np. 15°, 22°30' i 10°30" (zero mi-
nut pominlimy w tym zapisie, ale musimy przekaza do metody warto 0 jako drugi
parametr).
/** Zadanie Z21.4 */
public class Z21_4 {
public static void main(String args[]) {
Angle alfa = new Angle(15);
System.out.print("alfa = "+alfa);
System.out.println(" = "+alfa.radian()+" rad");
System.out.print("alfa = "+alfa);
System.out.println(" = "+alfa.radian()+" rad");
}
}
Jeli dane wejciowe s poprawne, to moemy zamieni odczytane wartoci deg, min
i sek na miar kta w radianach i podstawi uzyskan warto do pola x obiektu: this.x
= (deg+min/60.0+sek/3600.0)/180.0*Math.PI;.
public Angle(String st) {
int deg, min, sek;
int p = st.indexOf("\u00B0"); // stopie
int q = st.indexOf("\'"); // minuta ktowa
int r = st.indexOf("\""); // sekunda ktowa
try {
deg = Integer.parseInt(st.substring(0, p));
min = Integer.parseInt(st.substring(p+1, q));
sek = Integer.parseInt(st.substring(q+1, r));
} catch (Exception e) {
throw new IllegalArgumentException(st);
}
this.x = (deg+min/60.0+sek/3600.0)/180.0*Math.PI;
}
pozwoli pomija w cigu danych liczb sekund i symbol sekundy ("). Dopuszczalna
jest posta danych bez sekund, np. 22°30'. Zainicjujmy dodatkowo min = 0 i dodajmy
instrukcje warunkowe:
if (q > 0) {
min = Integer.parseInt(st.substring(p+1, q));
if (r > 0)
sek = Integer.parseInt(st.substring(q+1, r));
}
Teraz moemy wprowadza dane w postaci 22°15'37", 22°15' lub 22°. Nie mona
pomin minut, gdy wystpuj sekundy — kt 15°30" musimy zapisa jako 15°0'30"
— oraz nie mona pomin stopni — musimy pisa 0°45' zamiast 45'. To ju nie jest
zbyt dua niedogodno.
Liczba minut i liczba sekund powinny przyjmowa wartoci wycznie dodatnie z zakresu
od 0 do 59. Fakt ten sprawdzimy przed przeliczaniem podanej miary kta na radiany:
if ((min < 0) || (min > 59) || (sek < 0) || (sek > 59))
throw new IllegalArgumentException(st);
if ((min < 0) || (min > 59) || (sek < 0) || (sek > 59))
throw new IllegalArgumentException(st);
boolean znak =false;
if (deg < 0) {
znak = true;
deg = -deg;
}
this.x = (deg+min/60.0+sek/3600.0)/180.0*Math.PI;
if (znak)
this.x = -this.x;
}
S S
Zwykle przyjmujemy takie dziedziny funkcji odwrotnych: , dla funkcji arcus
2 2
S S
sinus i arcus cosecans, 0, S dla arcus cosinus i arcus secans, §¨ , ·¸ dla funkcji
© 2 2¹
arcus tangens i 0, S dla arcus cotangens.
Zbiór wartoci funkcji tangens i cotangens jest zbiorem wszystkich liczb rzeczywistych,
czyli argumenty funkcji odwrotnych nie podlegaj ograniczeniom.
public void setOfTan(double x) {
this.x = Math.atan(x);
}
public void setOfCot(double x) {
if (x == 0.0)
this.x = Math.PI/2;
else
this.x = Math.PI+Math.atan(1/x);
}
Funkcje secans i cosecans przyjmuj wartoci ze zbioru f, 1 1, f , wic ar-
gumenty funkcji odwrotnych nie mog nalee do przedziau 1, 1 .
public void setOfSec(double x) {
if (x > -1 && x < 1)
throw new IllegalArgumentException();
else
this.x = Math.acos(1/x);
}
Tworzc program demonstrujcy dziaanie tych metod wybieramy takie wartoci argu-
mentu x, dla których wywietlone wyniki bd atwe do zweryfikowania.
/** Zadanie Z21.6 */
public class Z21_6 {
public static void main(String args[]) {
Angle alfa = new Angle(0);;
double x = Math.sqrt(2)/2;
alfa.setOfSin(x);
System.out.printf("sin x = %.6f, ", x);
System.out.println("alfa = "+alfa);
alfa.setOfCos(-x);
S 3 S
We my znan warto sin 60q sin cos cos 30q . Std moemy obliczy
3 2 6
S 2 S
csc 60q csc sec sec 30q . Wykonujc powyszy program, uzyskamy tak
3 3 6
odpowied (dla metod setOfSec() i setOfCsc()), zgodn z oczekiwaniem:
sec x = 1,154701, alfa = 30°
csc x = 1,154701, alfa = 60°
a.setOfPoint(x, y);
System.out.printf("P(%.2f, %.2f), ", x, y);
System.out.println("kt "+a.degree()+"\u00B0");
x = 0.0; y = -5.0;
System.out.printf("P(%.2f, %.2f), ", x, y);
a.setOfPoint(x, y);
System.out.println("kt "+a.degree()+"\u00B0");
}
}
}
}
W aktualnej postaci klasy Angle dla punktu A(4, 3) poprawne bd konstrukcje
Angle a = new Angle(4.0, 3.0), Angle a = new Angle(4.0, 3) i Angle a = new
Angle(4, 3.0), którym odpowiada kt 36°52'12". Natomiast konstrukcja Angle
a = new Angle(4, 3) zbuduje kt 4°3', korzystajc z konstruktora Angle(int, int)
pochodzcego z rozwizania zadania 21.4.
Metoda zwraca obiekt reprezentujcy kt o podanej cakowitej liczbie stopni. Moe-
my zamieni podan liczb stopni deg na radiany i wywoa podstawowy konstruktor
Angle(double), znany z zadania 20.1 (nie ma kontroli zakresu dla zmiennej deg):
public static Angle valueOf(int deg) {
return new Angle(deg/180.0*Math.PI);
}
lub wykorzysta konstruktor z zadania 21.4 (uyty konstruktor sprawdzi, czy zmienna
deg mieci si w zakresie od 0° do 360°):
public static Angle valueOf(int deg) {
return new Angle(deg);
}
lub:
public static Angle valueOf(int deg, int min) {
return new Angle(deg, min);
}
public static Angle valueOf(int deg, int min, int sek) {
return new Angle(deg, min, sek);
}
Zamian cigu znaków (postaci xxx°yy'zz") na obiekt klasy Angle moemy zrealizowa,
uywajc metody statycznej wykorzystujcej odpowiedni konstruktor:
public static Angle valueOf(String st) {
return new Angle(st);
}
W tej postaci metoda akceptuje nastpujce cigi znaków: 15°, 15°33', 15°33'25",
15°25", 33', 33'25", 25". Za bdne uznaje cigi cyfr bez jakichkolwiek symboli (tyl-
ko liczba bez znaku stopnia, minuty lub sekundy), niebdce liczbami (zawierajce
litery lub inne znaki niedozwolone w zapisie liczb), oraz poprawnie zbudowane cigi
znaków ze znakiem minus na pocztku, np. –22°30'. Ten ostatni przypadek wynika
z ogranicze narzuconych przez uyty konstruktor (liczba stopni od 0 do 360) — ko-
strutor ten jednak sprawdza poprawno liczby minut i sekund, wic nie bdziemy
z niego rezygnowa.
Pozostaje jeszcze metoda zwracajca obiekt — kt wyznaczony przez punkt P(x, y),
rodek ukadu wspórzdnych i o OX:
public static Angle valueOf(double x, double y) {
return new Angle(x, y);
}
na nastpujcy:
w.append(" = ").append(x.toString());
}
public static Angle quot(Angle x, int n) {
return x.div(n);
}
Kty przylege maj wspólne jedno rami i ich suma jest ktem pópenym ( D E 180q ,
czyli E 180q D ).
public static Angle suppl(Angle x) {
if (x.x < 0.0 && x.x > STRAIGHT_ANGLE.x)
throw new IllegalArgumentException();
return STRAIGHT_ANGLE.sub(x);
}
W trójkcie równoramiennym kty przy podstawie ( E ) maj równe miary. Suma k-
tów wewntrznych trójkta jest ktem pópenym: D 2E 180q , czyli 2E 180q D
180q D
(do oblicze wykorzystamy metod suppl()). Std E , co moemy wyrazi
2
formu Angle beta = Angle.suppl(alfa).div(2). Sprawdzenie oblicze wykonamy,
dodajc miary wszystkich któw trójkta: beta.mult(2).add(alfa).
import java.util.Scanner;
/** Zadanie Z21.16 */
public class Z21_16 {
/* Tu wstaw kod metody inputAngle. */
public static void main(String args[]) {
System.out.println("Obliczanie miar któw w trójkcie
równoramiennym.");
Angle alfa = inputAngle("Kt przy wierzchoku trójkta
równoramiennego,\nalfa = ");
Angle beta = Angle.suppl(alfa).div(2);
System.out.println("Kt przy wierzchoku trójkta
równoramiennego, alfa = "+alfa);
System.out.println("Kt przy podstawie trójkta równoramiennego,
beta = "+beta);
System.out.println("Sprawdzenie - suma któw w trójkcie:"+
beta.mult(2).add(alfa));
}
}
b2 c2 a2
Podstawiajc b = c we wzorze cos D , otrzymamy
2bc
b2 b2 a 2 2b 2 a 2 a2
cosD 1
2bb 2b 2 2b 2
h 2h
Podobnie obliczymy tan E , wic:
a a
2
beta.setOfTan(2*h/a); // kt beta
lub:
Angle gamma = Angle.STRAIGHT_ANGLE.sub(alfa.add(beta));
Kod zamieniajcy liczb n na cig znaków w systemie rzymskim jest obszerny, ale
niezbyt trudny do zrozumienia. Liczb n zmniejszamy kolejno, jeli jest to moliwe,
o wartoci 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1. W zamian za to do wy-
niku dodajemy odpowiednio znaki M, CM, D, CD, C, XC, L, XL, X, IX, V, IV, I. Znaki
M, C, X i I mog wystpi co najwyej trzykrotnie (std uycie ptli while), pozostae
tylko raz. Naley zauway, e wystpienie CM wyklucza pojawienie si D, CD i C
w dalszej czci cigu znaków, podobnie D wyklucza CD i C oraz CD wyklucza C
(stosujemy zagniedone instrukcje warunkowe). Podobne reguy obowizuj dla ze-
stawu znaków XC, L, XL i X oraz IX, V, IV i I.
StringBuilder tmp = new StringBuilder("");
/* Znaki rzymskie M, CM, D i CD - liczby 1000, 900, 500, 400 */
while (n >= 1000) {
n -= 1000;
tmp.append("M");
}
if (n >= 900) {
n -= 900;
tmp.append("CM");
} else if (n >= 500) {
n -= 500;
tmp.append("D");
} else if (n >= 400) {
n -= 400;
tmp.append("CD");
}
tmp.append("IV");
}
/* Znak I - liczba 1 */
while (n >= 1) {
n -= 1;
tmp.append("I");
}
Obiekt tmp zawiera pocztkow warto liczby n w zapisie rzymskim (aktualna war-
to n jest zerem).
System.out.println(liczba+" = "+tmp.toString());
} while (liczba !=0);
}
}
n -= ar[i];
tmp.append(rz[i]);
}
}
Na pocztku warto zmiennej n jest równa konwertowanej liczbie i mieci si w za-
kresie od 1 do 3999. Elementy w obu tablicach s uporzdkowane od wartoci najwik-
szej (1000) do najmniejszej (1). Bierzemy kolejne wartoci i dopóki liczba jest wiksza
od tej wartoci, dopóty do cigu znaków rzymskich dodajemy odpowiedni symbol,
a liczb zmniejszamy o t warto. Po dojciu do koca tablicy mamy poprawnie za-
kodowan liczb w systemie rzymskim.
Cig symboli CMD oznaczaby liczb 900+500 = 1400, któr poprawnie zapisujemy
w postaci MCD (1000+400). Kolejny cig CMC mona interpretowa jako 900+100 =
1000, ale to nie ma sensu, bo 1000 zapisujemy jednym znakiem M. Podobnie jest z po-
zostaymi cigami uznanymi za bdne i zapisanymi w tablicy err.
Najpierw sprawdzimy, czy podany cig znaków (roman) nie zawiera niedozwolonych
cigów zapisanych w tablicy err. Przegldajc tablic bdnych sekwencji znaków,
sprawdzamy, czy wystpuj w acuchu roman. Jeli tak si zdarzy, to metoda indexOf()
zwróci warto -1 i zostanie zgoszony wyjtek.
for (String x: err)
if (roman.indexOf(x) != -1)
throw new ArithmeticException("Niewaciwy cig znaków: "+x+
" w "+roman);
Jeli cig wejciowy nie zawiera niedozwolonych sekwencji, moemy ustali poczt-
kow warto wyniku (tmp) i zainicjowa indeks analizowanego znaku rzymskiego
(pobieranego z tablicy rz).
int tmp = 0;
int index = 0; // indeks analizowanego znaku rzymskiego
Zerujemy (int powt = 0) licznik powtórze symbolu rz[i]. W ptli (while) spraw-
dzamy, ile razy symbol rzymski (rz[i]) pojawia si w cigu znaków roman. Kada
pozytywna odpowied powoduje zwikszenie zmiennej tmp (tmp += ar[i]) o warto
(ar[i]) odpowiadajc sprawdzanemu symbolowi (rz[i]), zwikszenie indeksu o roz-
miar symbolu (index += rz[i].length()) i zwikszenie licznika powtórze (++powt).
Badany na pocztku ptli while warunek roman.startsWith(rz[i], index) sprawdza,
czy w acuchu roman na pozycji o indeksie index rozpoczyna si cig znaków rz[i]
— wynik jest wartoci logiczn (true lub false). Po wyjciu z ptli while spraw-
dzamy, czy symbol rz[i] nie wystpi zbyt wiele razy (if (powt > lp[i])...). Jeli
liczba powtórze przekracza dozwolon liczb (zapisan w tabeli lp), to zgaszany
jest wyjtek.
Poniszy kod zamienia acuch znaków roman na liczb tmp lub zgasza wyjtek:
for (String x: err)
if (roman.indexOf(x) != -1)
throw new ArithmeticException("Niewaciwy cig znaków: "+
x+" w "+roman);
int tmp = 0; // warto pocztkowa wyniku
int index = 0; // indeks analizowanego znaku
for (int i = 0; i < 13; i++) {
int powt = 0;
while (roman.startsWith(rz[i], index)) {
tmp += ar[i];
index += rz[i].length();
++powt;
}
if (powt > lp[i])
throw new ArithmeticException("Za duo znaków: "+rz[i]+" w "+roman);
}
if (index != roman.length())
throw new ArithmeticException("Niewaciwa liczba rzymska: "+roman);
W gównej ptli programu (do {...} while(true);) wczytujemy liczb rzymsk, do-
konujemy jej zamiany na liczb dziesitn i wywietlamy wynik. Ptla zostanie prze-
rwana (wiadomie przez uytkownika) po wprowadzeniu pustego acucha znaków
lub w wyniku bdnej postaci liczby (wystpi wyjtek). Ewentualne przechwycenie
i obsuenie wyjtku pozostawimy Czytelnikowi.
import java.util.Scanner;
/** Zadanie Z22.2 */
public class Z22_2 {
System.out.println(roman+" = "+tmp);
} while (true);
}
}
Definicje tablic rz i ar moemy umieci w kodzie klasy (tak jak w zadaniu 21.1 lub
21.2) i usun z kodu metody decToRoman().
Kody obu klas (RN i Z22_4) znajdoway si w jednym pliku: Z22_4.java. Po kompi-
lacji otrzymujemy dwa pliki: RN.class i Z22_4.class — kada skompilowana klasa
znajduje si w odrbnym pliku.
public Roman(int n) {
if(n < 1 || n > 3999)
throw new ArithmeticException("Liczba poza zakresem");
else
this.n = n;
}
}
oraz metod statyczn zwracajc obiekt klasy Roman odpowiadajcy podanej liczbie
cakowitej:
public static Roman valueOf(int n) {
return new Roman(n);
}
Z klasy w tej postaci jest jeszcze niewielki poytek. Do jej kodu dodamy wewntrzn
klas RN (z rozwizania zadania 22.4), dopisujc w nagówku modyfikator static:
private static final class RN {
final String r;
final int d;
private RN(String r, int d) {
this.r = r; this.d = d;
};
static final RN[] rn = {new RN("M", 1000), new RN("CM", 900),
new RN("D", 500), new RN("CD", 400), new RN("C", 100),
new RN("XC", 90), new RN("L", 50), new RN("XL", 40),
new RN("X", 10), new RN("IX", 9), new RN("V", 5),
new RN("IV", 4), new RN("I", 1)};
}
oraz metody statyczne korzystajce z tablicy rn zdefiniowanej w tej klasie (tym razem
zadeklarowane jako publiczne): decToRoman() (zadanie 22.4) i romanToDec() (zada-
nie 22.5).
public static String decToRoman(int n) {
StringBuilder tmp = new StringBuilder("");
for(int i = 0; i<13; ++i) {
while (n >= RN.rn[i].d) {
n -= RN.rn[i].d;
tmp.append(RN.rn[i].r);
}
}
return tmp.toString();
}
index += RN.rn[i].r.length();
}
if (!s.equals(decToRoman(tmp)) || tmp > 3999)
throw new ArithmeticException("Niewaciwa liczba rzymska: "
+s);
return tmp;
}
Klasa RN jest klas wewntrzn klasy Roman i jej kod ródowy znajduje si w pliku
Roman.java. Po kompilacji otrzymujemy dwa pliki: Roman.class i Roman$RN.class
— kada skompilowana klasa znajduje si w odrbnym pliku. Klasa RN jest dostp-
na jednak wycznie wewntrz klasy Roman.
Ustalimy liczb punktów (int pkt = 0). W ptli zamieniamy liczb z tablicy na obiekt
klasy Roman. Wypisujemy liczb rzymsk w konsoli. Uytkownik podaje warto dzie-
sitn tej liczby. Jeli podana warto jest równa liczbie rzymskiej (n == roman.int
Value()), powikszamy liczb punktów (++pkt). Po zakoczeniu ptli wywietlimy
wynik — sum zdobytych punktów.
import java.util.Scanner;
/** Zadanie Z22.7 */
public class Z22_7 {
public static void main(String args[]) {
Scanner input = new Scanner(System.in);
int pytania = 10; // 10 pyta
int zakres = 50; // najwiksza liczba 50
int[] a = MyRandomArray.rndUniqueArray(pytania, zakres);
MyRandomArray.addToArray(a, 1);
int pkt = 0;
Roman roman;
for(int i = 0; i < pytania; ++i) {
roman = Roman.valueOf(a[i]);
System.out.print(roman+" = ");
int n = input.nextInt();
if (n == roman.intValue()) ++pkt;
}
System.out.println("Wynik: "+pkt+" z "+pytania+".");
}
}
public QuadratPoly() {}
public QuadratPoly(int a, int b, int c) {
if (a == 0)
throw new ArithmeticException("Niedozwolony parametr
a = 0!");
this.a = a;
this.b = b;
this.c = c;
}
public int value(int n) {
return (a*n+b)*n+c;
}
public double value(double x) {
return (a*x+b)*x+c;
}
}
Drugi czon trójmianu wypisujemy tylko wtedy, gdy wspóczynnik b nie jest zerem.
Dla wartoci dodatnich wypisujemy znak +, warto wspóczynnika b i symbol x; dla
wartoci ujemnych wypisujemy tylko warto wspóczynnika b i symbol x. Podobnie
postpujemy w przypadku wspóczynnika c.
@Override public String toString() {
StringBuilder wz = new StringBuilder();
if (a == -1)
wz.append("-");
else if (a != 1)
wz.append(a);
wz.append("x^2");
if (b == -1)
wz.append("-x");
else if (b == 1)
wz.append("+x");
else if (b > 1)
wz.append("+").append(b).append("x");
else if (b < -1)
wz.append(b).append("x");
if (c > 0)
wz.append("+").append(c);
else if (c < 0)
wz.append(c);
return wz.toString();
}
import java.util.Scanner;
/** Zadanie Z23.4 */
public class Z23_4 {
public static void main(String args[]) {
Scanner input = new Scanner(System.in);
System.out.println("Podaj wspóczynniki trójmianu kwadratowego
ax^2+bx+c");
int a, b, c;
do {
System.out.print("a = ");
a = input.nextInt();
} while (a == 0);
System.out.print("b = ");
b = input.nextInt();
System.out.print("c = ");
c = input.nextInt();
QuadratPoly w = new QuadratPoly(a, b, c);
System.out.println("Trójmian kwadratowy: "+w);
System.out.println("Liczba rzeczywistych pierwiastków: "+
(1+w.sgnDelta()));
}
}
s.append("(-oo, ").append(w.getQ()).append(">");
System.out.println("Zbiór wartoci trójmianu "+w+": "+s);
}
}
Wynik zwracany przez metod moe by wykorzystany podczas konstruowania opi-
sów waciwoci trójmianu.
/** Zadanie Z23.9 */
public class Z23_9 {
public static void main(String args[]) {
QuadratPoly w = new QuadratPoly(2, -5, 1);
System.out.println("Wierzchoek paraboli y = "+w+
" ma wspórzdne "+w.getVertex()+".");
}
}
Wynik zwracany przez metod moe by wykorzystany podczas opisywania waci-
woci trójmianu kwadratowego.
/** Zadanie Z23.10 */
public class Z23_10 {
public static void main(String args[]) {
QuadratPoly w = new QuadratPoly(-2, -3, 1);
System.out.println("Zbiór wartoci trójmianu "+w+
": "+w.getCodomain());
w = new QuadratPoly(2, 3, -5);
System.out.println("Zbiór wartoci trójmianu "+w+
": "+w.getCodomain());
}
}
case 1:
if (w.isAPositive()) {
s.append("(-oo, ").append(w.getX1()).append("> lub <");
s.append(w.getX2()).append(", +oo)");
} else {
s.append("<").append(w.getX2()).append(", ");
s.append(w.getX1()).append(">");
}
break;
case 0:
if (w.isAPositive())
s.append("R (zbiór liczb rzeczywistych)");
else
s.append("{").append(w.getX1()).append("}");
break;
case -1:
if (w.isAPositive())
s.append("R (zbiór liczb rzeczywistych)");
else
s.append("{} (zbiór pusty)");
break;
}
System.out.println("Zbiór rozwiza Z = "+s);
case 1:
s.append(getX1()).append(", ").append(getX2()).append("}");
break;
case 0:
s.append(getX1()).append("}");
break;
case -1:
s.append("}");
break;
}
return s.toString();
}
if (isAPositive())
s.append("R");
else
s.append("{}");
break;
}
return s.toString();
}
return this.mult(-1).solutionQIe2();
else
throw new IllegalArgumentException("Niewaciwy parametr "+typ);
}
} else {
System.out.println("x1 = "+x[0]);
System.out.println("x2 = "+x[1]);
System.out.println("x3 = "+x[2]);
System.out.println("x4 = "+x[3]);
}
}
}
Drugi konstruktor, z jednym parametrem x typu double, buduje obiekt (liczb zespo-
lon) odpowiadajcy liczbie rzeczywistej x (x+0i — z zerow czci urojon).
public Complex(double x) {
this.re = x;
this.im = 0;
}
Metody setRe() i setIm() wywoane przez obiekt ustawiaj cz rzeczywist lub uro-
jon (stosownie do nazwy metody) liczby zespolonej reprezentowanej przez ten obiekt
na warto podan jako parametr (x typu double).
public void setRe(double x) {
this.re = x;
}
if (delta < 0) {
double re = -b/(2*a);
double im = Math.sqrt(-delta)/(2*a);
Complex z1 = new Complex(re, -im);
System.out.println("z1 = "+z1);
Complex z2 = new Complex(re, im);
System.out.println("z2 = "+z2);
} else if (delta > 0) {
Complex z1 = new Complex((-b-Math.sqrt(delta))/(2*a));
System.out.println("z1 = "+z1);
Complex z2 = new Complex((-b+Math.sqrt(delta))/(2*a));
System.out.println("z2 = "+z2);
} else {
Complex z = new Complex(-b/(2*a));
System.out.println("Pierwiastek dwukrotny z = "+z);
}
}
}
Kod metod add() i sub() doczamy do klasy Complex i sprawdzamy ich dziaanie, wy-
konujc kilka przykadowych oblicze.
public class Z24_3 {
public static void main(String[] args) {
Complex a = new Complex(4.5, 7);
System.out.println("a = "+a);
Complex b = new Complex(-2, 3.3);
System.out.println("b = "+b);
System.out.println("a+b = "+a.add(b));
System.out.println("b+a = "+b.add(a));
System.out.println("a-b = "+a.sub(b));
System.out.println("a-1 = "+a.sub(new Complex(1)));
}
}
Dzielenie przez liczb zespolon zastpimy mnoeniem przez jej odwrotno (skorzy-
stamy z metody rec() podanej w rozwizaniu zadania 24.4).
public Complex div(Complex x) {
return this.mult(x.rec());
}
System.out.println("a*a = "+a.mult(a));
Complex b = new Complex(3, 4);
System.out.println("b = "+b);
System.out.println("b/a = "+b.div(a));
}
}
§b·
°arctan¨ a ¸, gdy a ! 0
° © ¹
° §b·
°arctan¨ ¸ S , gdy a 0 i b t 0
° ©a¹
°
°arctan§¨ b ·¸ S , gdy a 0 i b 0
Arg z ® ©a¹
°
° S , gdy a 0 i b ! 0
°2
°
° S , gdy a 0 i b ! 0
° 2
°0, gdy a 0 i b 0
¯
Naley doda, e pojcie argumentu nie jest jednoznaczne. Nasza metoda arg() wy-
znacza tzw. argument gówny liczby zespolonej. Pozostae argumenty tej liczby ró-
ni si od gównego o wielokrotno 2S . W przykadzie obliczymy modu i argument
dla dwóch wybranych liczb zespolonych 4–3i i 4+4i. Argument drugiej z tych liczb
podajemy w stopniach.
public class Z24_7 {
public static void main(String[] args) {
Complex a = new Complex(4, -3);
System.out.println("a = "+a);
System.out.println("|a| = "+a.abs());
System.out.println("Arg(a) = "+a.arg());
a.setIm(4);
System.out.println("a = "+a);
System.out.println("|a| = "+a.abs());
System.out.println("Arg(a) = "+Math.toDegrees(a.arg())+"°");
}
}
Dwie liczby zespolone s równe wtedy i tylko wtedy, gdy równe s ich czci rze-
czywiste i urojone. Porównanie wartoci obiektów moemy ograniczy wycznie do
obiektów klasy Complex:
public boolean equals(Complex z) {
return re == z.re && im == z.im;
}
lub wzorujc si na rozwizaniu zadania 20.18, zbudowa metod przesaniajc me-
tod Object.equals().
@Override public boolean equals(Object o) {
if (this == o)
return true;
if (o == null || !(o instanceof Complex))
return false;
Complex c = (Complex) o;
if (this.re == c.re && this.im == c.im)
return true;
else
return false;
}
2
Opracowane na podstawie: J. Bloch, Java. Efektywne programowanie. Wydanie II, Helion 2009.
Gdy jednostka urojona i wystpuje w acuchu, powinna w nim by ostatnim zna-
kiem. Jeli tak nie jest, to acuch nie jest poprawn liczb zespolon (np. "2+i5" lub
"3.4–5ix").
Kopiujemy kod metody po raz drugi, usuwany sowo kluczowe static i parametr a
z nagówka funkcji. W ciele metody zmienn a zastpujemy sowem kluczowym this.
public Complex power(int n) {
Complex p = Complex.ONE;
if (n > 0)
for(int i = 0; i < n; ++i)
p = p.mult(this);
else if (n < 0)
for(int i = 0; i < -n; ++i)
p = p.div(this);
return p;
}
lub:
public static Complex sqr(Complex z) {
return z.sqr();
}
a2 b2 a a 2 b2 a
Z ukadu równa otrzymamy x i y H , gdzie H ozna-
2 2
cza znak czci urojonej liczby podpierwiastkowej (znak b: –1 lub 1). Std mamy dwa
pierwiastki r x yi . Przypadek b = 0 naley rozpatrywa osobno. Dla a t 0 otrzy-
mamy w wyniku liczb rzeczywist r a , a dla a 0 liczb urojon r i a .
public Complex sqrt() {
if (im == 0)
if (re >= 0)
return new Complex(Math.sqrt(re));
else
return new Complex(0.0, Math.sqrt(-re));
else
return new Complex(Math.sqrt((abs()+re)/2),
Math.signum(im)*Math.sqrt((abs()-re)/2));
}
Zadanie 24.18.
Oznaczmy x a bi oraz y c di .
Suma: x y a bi c di a c b d i .
public static Complex sum(Complex x, Complex y) {
return new Complex(x.re+y.re, x.im+y.im);
}
Rónica: x y a bi c di a c b d i .
public static Complex diff(Complex x, Complex y) {
return new Complex(x.re-y.re, x.im-y.im);
}
Iloczyn: x y a bi c di ac bd ad bc i .
public static Complex prod(Complex x, Complex y) {
return new Complex(x.re*y.re-x.im*y.im, x.re*y.im+x.im*y.re);
}
Iloraz:
x a bi a bi c di ac bd bc ad i ac bd bc ad
i.
y c di c di c di c d2 2
c2 d 2 c2 d 2
public static Complex quot(Complex x, Complex y) {
double s = x.re*x.re+y.re*y.re;
return new Complex((x.re*y.re+x.im*y.im)/s, (x.im*y.re-x.re*y.im)/s);
}
public PolarComplex(double r) {
this.r = Math.abs(r);
if (r >= 0.0)
this.fi = 0.0;
else
this.fi = -Math.PI;
}
Wartoci pól obiektu (r i fi) typu double zamienimy na acuchy znaków reprezen-
tujce liczby z szecioma miejscami po przecinku, z których nastpnie budujemy wy-
nik (acuch wyjciowy). Do formatowania liczby uywamy obiektu formatter klasy
DecimalFormat (dziedziczcej z klasy java.text.NumberFormat — niezbdne jest im-
portowanie odpowiednich klas w klasie PolarComplex):
import java.text.DecimalFormat;
import java.text.NumberFormat;
System.out.println("b = "+b);
System.out.println("a·b = "+a.mult(b));
}
}
Obliczymy iloraz dwóch liczb i podobnie jak w rozwizaniu zadania 24.22, wywie-
tlimy wyniki w postaci kanonicznej oraz w postaci biegunowej.
/** Zadanie Z24.23 */
public class Z24_23 {
public static void main(String[] args) {
PolarComplex a = new PolarComplex(1, Math.PI/4);
a.toComplex().printlnf("a = ");
PolarComplex b = new PolarComplex(-2, Math.PI/2);
b.toComplex().printlnf("b = ");
Complex x = a.div(b).toComplex();
x.printlnf("x = a/b = ");
Complex y = b.div(a).toComplex();
y.printlnf("y = b/a = ");
x.mult(y).printlnf("x·y = ");
System.out.println("a = "+a);
System.out.println("b = "+b);
System.out.println("a/b = "+a.div(b));
System.out.println("b/a = "+b.div(a));
}
}
Jako przykad dziaania metody obliczymy pierwiastki stopnia drugiego z liczby urojonej 2i.
/** Zadanie Z24.26 */
public class Z24_26 {
public static void main(String[] args) {
PolarComplex a = new PolarComplex(2, Math.PI/2);
System.out.print("a = "+a+" = ");
a.toComplex().printlnf();
System.out.println("Pierwiastki drugiego stopnia");
PolarComplex x1 = a.sqrt(0);
System.out.print("x1 = "+x1+" = ");
x1.toComplex().printlnf();
PolarComplex x2 = a.sqrt(1);
System.out.print("x2 = "+x2+" = ");
x2.toComplex().printlnf();
}
}
}
a = new PolarComplex(new Complex(0, 8));
System.out.println("Pierwiastki szecienne z liczby 8i:");
for(Complex x: a.cbrt()) {
x.printf("x = ");
System.out.println(" = "+x.toPolarComplex());
}
}
}
x.sqrt(1).toComplex().printlnf("z2 = ");
} else
System.out.println("Równanie sprzeczne lub nieoznaczone.");
}
}
b) Równanie z a a . Równanie to ma
3
0 jest równowane równaniu z 3
trzy pierwiastki zespolone z a (w tym jeden jest zawsze rzeczywisty)
3
import java.util.Scanner;
/** Zadanie Z24.30a */
public class Z24_30a {
public static void main(String[] args) {
System.out.println("Równanie az^2+c = 0 o wspóczynnikach
zespolonych");
Scanner input = new Scanner(System.in);
System.out.print("a.re = ");
double re = input.nextDouble();
System.out.print("a.im = ");
double im = input.nextDouble();
Complex a = new Complex(re, im);
a.printlnf("a = ");
System.out.print("c.re = ");
re = input.nextDouble();
System.out.print("c.im = ");
im = input.nextDouble();
Complex c = new Complex(re, im);
c.printlnf("c = ");
if (!a.equals(Complex.ZERO)) {
PolarComplex x = c.opp().div(a).toPolarComplex();
x.sqrt(0).toComplex().printlnf("z1 = ");
x.sqrt(1).toComplex().printlnf("z2 = ");
} else
System.out.println("Równanie sprzeczne lub nieoznaczone.");
}
}
b) Równanie z a a (a.opp()), a to
3
0 jest równowane równaniu z 3
równanie ma trzy (róne) pierwiastki zespolone z a lub pierwiastek
3
for(Complex x: a.root(8)) {
System.out.print("x = ");
x.printf();
System.out.println(" = "+x.toPolarComplex());
}
}
}
oraz
PolarComplex a = new Complex(0, -1).toPolarComplex();
Metoda write() wpisuje do pliku acuch znaków. Na koniec musimy pamita o za-
mkniciu pliku (metoda close()).
import java.io.IOException;
import java.io.FileWriter;
/** Zadanie Z25.1 */
public class Z25_1 {
public static void main(String[] args) throws IOException {
FileWriter fout = new FileWriter("tekst.txt");
fout.write("Programowanie obiektowe");
fout.close();
}
}
Wszelkie sytuacje bdne, zwizane z otwarciem pliku lub zapisem do pliku, wygene-
ruj wyjtek, który przerwie prac programu. Wyjtki moemy przechwyci i obsuy.
public static void main(String[] args) {
try {
FileWriter fout = new FileWriter("tekst.txt");
fout.write("Programowanie obiektowe");
fout.close();
} catch (IOException e) {
System.err.println("Bd "+e);
}
}
metody write() moe by pojedynczy znak (liczba typu int traktowana jako kod zna-
ku), tablica znaków lub acuch znaków (String). Z dwóch liczb i tekstu, wykorzystujc
waciwoci operatora konkatenacji tekstów, budujemy wiersz odpowiedzi i zapisu-
jemy go do pliku fout.write(i+"! = "+silnia). Koniec linii wpisujemy warunkowo
we wszystkich wierszach odpowiedzi z wyjtkiem ostatniego (dwunastego wiersza)
if (i < 12) fout.write("\r\n"). Na koniec zamykamy plik (fout.close()).
/** Zadanie Z25.3 */
import java.io.IOException;
import java.io.FileWriter;
public class Z25_3 {
public static void main(String[] args) {
try {
FileWriter fout = new FileWriter("silnia.txt");
int silnia = 1;
for(int i = 1; i < 13; ++i) {
silnia *= i;
fout.write(i+"! = "+silnia);
if (i < 12)
fout.write("\r\n");
}
fout.close();
} catch (IOException e) {
System.err.println("Bd "+e);
}
}
}
fout.write(String.format("%2d\t", n));
fout.write(String.format("%.12f\t", Math.sqrt(n)));
fout.write(String.format("%.12f", Math.cbrt(n)));
if (n < 15)
fout.write("\r\n");
}
fout.close();
} catch (IOException e) {
System.err.println("Bd "+e);
}
}
}
System.err.println("Bd "+e);
}
}
}
Tworzymy zmienn typu int do przechowywania kodu odczytanego znaku (int i).
W ptli odczytujemy kod znaku i = fin.read() i jeli znak zosta odczytany (i nie
jest równe –1), to wywietlamy znak w konsoli System.out.print((char)i). Niezbdne
jest rzutowanie kodu znaku na typ char. Odczytana warto zmiennej i równa –1 oznacza
koniec pliku (nie ma dalszych znaków do odczytywania). Na koniec naley zamkn
plik (fin.close()).
/** Zadanie Z25.7 */
import java.io.IOException;
import java.io.FileReader;
public class Z25_7 {
public static void main(String[] args) {
try {
FileReader fin = new FileReader("silnia.txt");
int i;
do {
i = fin.read();
if (i != -1) System.out.print((char)i);
} while (i != -1);
fin.close();
} catch (IOException e) {
System.err.println("Bd "+e);
}
}
}
Analiza kodu reszty programu nie wymaga szerszego komentarza — podobna sytuacja
zostaa omówiona w rozwizaniu zadania 25.7.
/** Zadanie Z25.8 */
import java.io.IOException;
import java.io.FileReader;
public class Z25_8 {
Moemy ten zapis uj w jednym wierszu programu (bez tworzenia zmiennej obiek-
towej isr):
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Do wywietlania numeru wiersza (n) i zawartoci wiersza (s) uyjemy metody printf()
umoliwiajcej sformatowanie wyniku: System.out.printf("%3d. %s\n", ++n, s).
/** Zadanie Z25.9 */
import java.io.InputStreamReader;
import java.io.File;
import java.io.FileReader;
import java.io.BufferedReader;
class Z25_9 {
public static void main(String args[]) throws Exception {
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
System.out.print("Podaj nazw pliku bez rozszerzenia: ");
String filename = br.readLine();
br.close();
isr.close();
File file = new File(filename+".java");
if (file.exists()) {
FileReader fr = new FileReader(file);
br = new BufferedReader(fr);
String s;
int n = 0;
while((s = br.readLine()) != null)
System.out.printf("%3d. %s\r\n", ++n, s);
fr.close();
} else
System.out.println("Nie znaleziono pliku: "+filename
+".java");
}
}
Po sprawdzeniu, czy plik istnieje, tworzymy plik wyjciowy o tej samej nazwie i roz-
szerzeniu .txt oraz obiekt fout klasy PrintWriter, umoliwiajcy zapisywanie danych
do tego pliku:
PrintWriter fout = new PrintWriter(new File(filename+".txt"));
strumienia. Jeli w strumieniu znajdzie si token róny od liczby cakowitej, to wczy-
tywanie i sumowanie danych zostanie zakoczone. W przypadku poprawnie zbudowa-
nego pliku zakoczenie sumowania nastpi po odczytaniu z niego wszystkich liczb.
/** Zadanie Z25.11 */
import java.util.Scanner;
import java.io.File;
class Z25_11 {
public static void main(String args[]) throws Exception {
File file = new File("sto.txt");
Scanner fin = new Scanner(file);
int suma = 0, n;
while(fin.hasNextInt()) {
n = fin.nextInt();
suma += n;
System.out.printf("%d ", n);
}
fin.close();
System.out.println();
System.out.println("Suma liczb: "+suma);
}
}
Nieznaczna modyfikacja kodu pozwoli na pomijanie tych tokenów, które nie s licz-
bami cakowitymi:
while(fin.hasNext()) {
if (fin.hasNextInt()) {
n = fin.nextInt();
suma += n;
System.out.printf("%d ", n);
} else
fin.next();
}
Po tej zmianie moemy sprawdzi dziaanie programu dla plików silnia.txt (zsumo-
wane zostan tylko wartoci silni, tokeny o postaci 5! lub = bd pominite), pierwia-
stek.txt (suma liczb z pierwszej kolumny), tekst.txt (otrzymamy sum równ zeru, bo
ten plik nie zawiera adnej liczby) itp.
Jeli ostatni wyraz tablicy s ma warto 0, co moe zdarzy si wycznie wtedy, gdy
dugoci tablic a i b (stopnie dodawanych wielomianów) s równe, usuwamy ten wy-
raz z tablicy (postpowanie bdzie prowadzone do chwili uzyskania ostatniego wspó-
czynnika w tablicy rónego od zera lub uzyskania wielomianu stopnia zerowego):
if(s[s.length-1] == 0) {
int n = s.length;
while (s[n-1] == 0 && n > 1) --n;
s = Arrays.copyOf(s, n);
}
Moemy zbudowa metod korekta(), która usunie z koca tablicy wszystkie elementy
o wartoci 0 (elementy zerowe wewntrz tablicy musz bezwzgldnie pozosta).
private static double[] korekta(double[] w) {
int n = w.length;
while (w[n-1] == 0 && n > 1) --n;
return Arrays.copyOf(w, n);
}
W szczególnym przypadku zwracana tablica moe zawiera tylko jeden element odpo-
wiadajcy wielomianowi zerowego stopnia. Metod t moemy wykorzysta do skory-
gowania ostatecznego wyniku (if(s[s.length-1] == 0) s = korekta(s);) lub danych
wejciowych (np. a = korekta(a)) wprowadzonych przez uytkownika programu.
w( x )
( x c) bn 1 x n 1 bn 2 x n 2 ... b0 r
.
bn 1 x bn 2 cbn 1 x
n n 1
bn 3 cbn 2 x n 2 ... b0 cb1 x r cb0
Reszt z dzielenia wielomianu przez dwumian (x–c) zwróci nam metoda remainder().
Tym razem pomijamy uzyskany w trakcie oblicze iloraz (wielomian tmp) i zwraca-
my jedynie reszt (liczb typu double).
public double remainder(int c) {
double[] tmp = new double[this.w.length-1];
int i = tmp.length-1;
tmp[i] = this.w[i+1];
while (i > 0) {
tmp[i-1] = this.w[i]+tmp[i]*c;
--i;
}
return this.w[i]+tmp[i]*c;
}
import java.util.Arrays;
public class Z27_1 {
public static void main(String[] args) {
System.out.println("Próbka:");
double[] x = {1.35, 2.45, 2.05, 1.20, 2.15, 1.70, 1.45, 1.95,
2.00, 1.65, 1.65, 2.05, 1.75, 1.25, 2.25, 1.40};
System.out.println(Arrays.toString(x));
/* Element minimalny */
double minX = x[0];
for (double xi: x)
if (xi < minX)
minX = xi;
System.out.println("Element minimalny: "+minX);
/* Element maksymalny */
double maxX = x[0];
for (double xi: x)
if (xi > maxX)
maxX = xi;
System.out.println("Element maksymalny: "+maxX);
/* Rozstp badanej cechy */
double r = maxX-minX;
System.out.println("Rozstp badanej cechy: "+r);
}
}
Rozwizania zada 27.2 – 27.19 bd zbudowane wedug schematu (XX — oznacza jedno-
lub dwucyfrowy numer zadania):
import java.util.Arrays;
public class Z27_XX {
public static double zaokr(double x) {
double prec = 100.0;
return (int)(x*prec+0.5)/prec;
}
}
}
W odpowiedziach do zada podamy wycznie fragmenty kodu odpowiedzialne za rozwizanie
problemu zawartego w zadaniu.
for(double xi: x)
sg *= xi;
sg = Math.pow(sg, 1.0/n);
System.out.println("rednia geometryczna: "+zaokr(sg));
Nastpnie musimy policzy, ile rónych wartoci zawiera próbka. Zewntrzna ptla
typu while pozwala na przejrzenie wszystkich wartoci próbki (tablicy x), natomiast
wewntrzna ptla pomija kolejne, powtarzajce si wartoci (tablica x jest posortowa-
na w kolejnoci niemalejcej). Licznik (zmienna licznik) jest inkrementowany tylko
wtedy, gdy nastpny element jest róny od biecego.
int n = x.length;
int i = 0;
int licznik = 0;
while (i < n) {
while (i < n-1 && x[i+1] == x[i])
++i;
++licznik;
++i;
}
Teraz zmienna licznik zawiera liczb rónych wartoci w badanej próbce. Moemy
utworzy tablic o odpowiednim rozmiarze i zbudowa szereg rozdzielczy punktowy.
Dane[] y = new Dane[licznik];
i = 0;
int j = 0;
while (i < n) {
/* przechowanie kolejnej wartoci próbki w szeregu rozdzielczym */
y[j] = new Dane();
y[j].x = x[i];
/* liczenie powtórze tej wartoci */
y[j].n = 1;
while (i < n-1 && x[i+1] == x[i]) {
++i;
++y[j].n;
}
/* nastpna warto */
++j;
++i;
}
jest = false;
/* Znaleziono kolejn warto , która moe by dominant. */
else if (w.n > dominanta.n) {
dominanta.x = w.x;
dominanta.n = w.n;
jest = true;
}
}
System.out.print("Wzór nr 2: ");
s2 = 0.0;
for (double xi: x)
s2 += Math.pow(xi, 2);
s2 /= n;
s2 -= sa*sa;
System.out.println(s2);
System.out.print("Wzór nr 3: ");
double a = 2.0; // dowolna liczba, np. 2.0
s2 = 0.0;
for(double xi: x)
s2 += Math.pow(xi-a, 2);
s2 /= n;
s2 -= Math.pow(sa-a, 2);
System.out.println(s2);
Poniewa odchylenie przecitne próbki (od rónych wartoci) jest czsto obliczane, to
zdefiniujemy metod:
static double odchyleniePrzec(double[] x, double a) {
double d = 0.0;
for(double xi: x)
d += Math.abs(xi-a);
return d/x.length;
}
Liczebno próbki Q1 Q2 Q3
ªn º ªnº
ªnº x « 1» x « » ª 3n º
n = 4k x« » ¬2 ¼ ¬2¼ x « 1»
¬4¼ ¬4 ¼
2
ª n 1º ª n 1º ª 3n 3 º
n = 4k+1 x« x« x«
¬ 4 »¼ ¬ 2 »¼ ¬ 4 »¼
ªn 2º ªn 2º ªn º ªnº ª 3n 6 º ª 3n 2 º
x« x x « 1» x « » x« x
n = 4k+2 ¬ 4 »¼ «¬ 4 »¼ ¬2 ¼ ¬2¼ ¬ 4 »¼ «¬ 4 »¼
2 2 2
ª n 3 º ª n 1º ª 3n 5 º ª 3n 1º
x« x ª n 1º x« x
n = 4k+3 ¬ 4 »¼ «¬ 4 »¼ x« ¬ 4 »¼ «¬ 4 »¼
¬ 2 »¼
2 2
import java.util.Arrays;
public class Z27_13 {
static double zaokr(double x) {
}
}
i obliczenia w ptli:
/* Momenty centralne 2., 3. i 4. rzdu */
for(int r=2; r < 5; ++r) {
System.out.printf("Moment centralny rzdu "+r);
System.out.println(" jest równy "+zaokr(momentCent(x, r, sa)));
}
Ostatni (trzeci) parametr metody momentCent() jest redni arytmetyczn próbki. Mo-
emy zbudowa metod bez tego parametru, która obliczy najpierw redni arytme-
tyczn, a potem moment centralny zwyky.
static double momentCent(double[] x, int rz) {
double sa = 0.0; // rednia arytmetyczna
for(double xi: x)
sa += xi;
sa /= x.length;
Obie metody (z dwoma i trzema parametrami) mog istnie w tej samej klasie, pod
jedn (przecion) nazw momentCent.
¦| x | ,
1
rzdu l al i
l
l N , dostrzeemy rónic, któr naley uwzgldni w kodzie:
n i 1
for(double xi: x)
a += power(Math.abs(xi), rz);
1 n
lutny centralny rzdu l bl
n i1 ¦
| xi x |l , l N , dostrzeemy rónic, któr naley
napiszemy:
for(double xi: x)
a += power(Math.abs(xi-sa), rz);
sa += xi;
return sa/x.length;
}
Metody statyczne z klasy Stat (zob. rozwizanie zadania 27.20 lub rozwizania zada
od 27.1 do 27.19) przeksztacamy na metody dziaajce na polu pr obiektu klasy Statpr.
public double minX() {
double min = pr[0];
for(double xi: pr)
if (xi < min) min = xi;
return min;
}
W ten sam sposób budujemy dalsze metody. Nie naley zapomnie o przesoniciu
metody toString() z klasy Object (metoda ta uatwi wywietlanie danych w konsoli):
@Override public String toString() {
return Arrays.toString(pr);
}
Tablica dwuwymiarowa jest po prostu tablic tablic (tablic trzech wierszy, a kady
wiersz jest tablic dziesiciu liczb cakowitych). Przekonamy si o tym podczas wy-
wietlania zawartoci tablicy dwuwymiarowej na ekranie:
for(int[] x: a)
System.out.println(Arrays.toString(x));
W ptli for pobieramy z tablicy a jednowymiarowe tablice x (typu int[]), które wy-
wietlamy w konsoli po ich zamianie na acuch znaków (Arrays.toString(x)).
import java.util.Arrays;
public class Z28_1 {
public static void main(String[] args) {
int[][] a = new int[3][10];
for(int i = 0; i < 10; ++i) {
a[0][i] = i+1;
a[1][i] = a[0][i]*a[0][i];
a[2][i] = a[1][i]*a[0][i];
}
for(int[] x: a)
System.out.println(Arrays.toString(x));
}
}
wiersz += a[i][j];
System.out.printf("Suma liczb w %d. wierszu : %d\n",
i, wiersz);
suma += wiersz;
}
System.out.printf("Suma liczb w tablicy: %d\n", suma);
}
}
System.out.printf(format, x[i][j]);
System.out.println();
}
}
Dla macierzy (tablic) typu double wystarczy w kodzie zamieni typ tablic z int na
double. Demonstrujc dziaanie metody, pomnoymy dwie przykadowe macierze (wy-
penione losowymi wartociami).
public class Z28_9 {
/* Tu wstaw kod metody product(). */
W wyniku transponowania macierzy 2×3 (dwa wiersze, trzy kolumny) powstanie ma-
cierz 3×2 (trzy wiersze, dwie kolumny).
public class Z28_11 {
/* Tu wstaw kod metody transp(). */
public static void main(String[] args) {
double[][] a = new double[2][3];
TDouble.setRandom(a, 100);
double[][] b = transp(a);
System.out.println("Macierz A");
TDouble.printf("%6.2f", a);
System.out.println("Macierz transponowana");
TDouble.printf("%6.2f", b);
}
}
1
Rekurencja polega na odwoywaniu si metody (funkcji, definicji) do samej siebie. W rozdziale 29.
Czytelnik znajdzie wicej zada, których rozwizania zawieraj metody rekurencyjne.
Jeli podana macierz nie jest kwadratowa, to zgaszany jest wyjtek. Po utworzeniu
kopii (tmp) przeksztacanej macierzy w ptli (for(int i = 0; i < n-1; ++i)) pobie-
ramy elementy z gównej przektnej (tmp[i][i]) — od pierwszego do przedostatniego.
Dla wszystkich wierszy o indeksie j > i odejmujemy od wiersza o indeksie j wiersz
o indeksie i pomnoony przez wspóczynnik p = tmp[j][i]/tmp[i][i]. Operacj mo-
emy wykona, gdy element tmp[i][i] jest róny od zera (elementy tmp[j][i] przyj-
muj warto 0).
if (tmp[i][i] != 0.0) {
double p = tmp[j][i]/tmp[i][i];
for(int k = 0; k < n; ++k)
tmp[j][k] -= tmp[i][k]*p;
}
Jeli element t[i][i] jest zerem, to szukamy w wierszach poniej najbliszego wier-
sza k takiego, e element tmp[k][i] jest róny od zera. Przestawiamy te wiersze i w ten
sposób na przektnej (w tmp[i][i]) znajdzie si element róny od zera. Przestawianie
wierszy (lub kolumn) macierzy powoduje zmian znaku wyznacznika. Aby temu za-
pobiec, mnoymy przestawiony wiersz przez –1 (realizuje to zmiana znaku temp w ope-
racji przestawiania elementów tmp[k][m] = -temp). Po przestawieniu wierszy konty-
nuujemy dziaanie ptli ze zmienn j (odejmujemy od wiersza o indeksie j wiersz
o indeksie i pomnoony przez wspóczynnik p). Gdyby si okazao, e dla k > i nie
ma wiersza z elementem tmp[k][i] rónym od zera, to warto 0 pozostanie na gównej
przektnej.
private static double[][] upperTriangular(double[][] x) {
if (x.length != x[0].length)
throw new ArithmeticException("To nie jest macierz kwadratowa");
/* Kopia macierzy */
int n = x.length;
double[][] tmp = new double[n][n];
for(int i = 0; i < n; ++i)
for(int j = 0; j < n; ++j)
tmp[i][j] = x[i][j];
/* Tworzenie macierzy trójktnej górnej */
for(int i = 0; i < n-1; ++i)
for(int j = i+1; j < n; ++j) {
if (tmp[i][i] != 0.0) {
double p = tmp[j][i]/tmp[i][i];
Sposób tworzenia macierzy trójktnej dolnej jest podobny do sposobu tworzenia ma-
cierzy trójktnej górnej (zob. rozwizanie zadania 28.20). Rónica polega na kolejno-
ci pobierania elementów z gównej przektnej macierzy — elementy pobieramy od
ostatniego do drugiego (for(int i = n-1; i > 0; --i)). Wykonujemy odejmowanie
wierszy (for(int j = i-1; j >= 0; --j)) i poszukiwanie wiersza z niezerowym ele-
mentem (for(int k = i-1; k >= 0; --k)) „od dou do góry”.
Program demonstrujcy dziaanie moe by podobny jak w zadaniu 28.20 lub 28.21.
Pozostae wyznaczniki obliczymy (w ptli) w ten sam sposób, ale przed liczeniem wy-
znacznika w miejsce i-tej kolumny podstawimy (ostatni) kolumn wyrazów wolnych.
Do tego celu utworzymy metod swapLast():
private static void swapLast(double[][] x, int col) {
int n = x.length;
for(int row = 0; row < n; ++row) {
double tmp = x[row][col];
x[row][col] = x[row][n];
x[row][n] = tmp;
}
}
1. Wyznacznik gówny (w) jest róny od zera, wic ukad równa jest oznaczony
wi
xi dla i = 1, 2, …, n.
w
2. Wyznacznik gówny jest równy 0 i wszystkie pozostae wyznaczniki s równe
0 (suma s bezwzgldnych wartoci tych wyznaczników jest równa zero), wic
ukad równa jest nieoznaczony.
3. Wyznacznik gówny jest równy 0 i co najmniej jeden z pozostaych
wyznaczników nie jest równy 0 (suma s bezwzgldnych wartoci tych
wyznaczników nie jest zerem), zatem ukad równa jest sprzeczny.
import java.util.Scanner;
public class Z28_24 {
private static Scanner cin = new Scanner(System.in);
/* Tu wstaw kod metody det(). */
/* Tu wstaw kod metody swapLast(). */
/* Tu wstaw kod metody input(). */
Jeli na gównej przektnej macierzy podstawowej pojawi si warto 0, to ukad jest
sprzeczny lub nieoznaczony (moemy to rozstrzygn, porównujc zerowe wartoci
z przektnej macierzy podstawowej z wartociami z kolumny wyrazów wolnych).
}
break;
}
}
}
}
/* Wyznaczamy rozwizanie ukadu. */
for(int i = 0; i < n; ++i)
if (x[i][i] != 0.0)
for(int j = 0; j < n; ++j) {
x[i][n] /= x[i][i];
x[i][i] = 1.0;
}
else if (x[i][i] == x[i][n])
throw new ArithmeticException("Ukad sprzeczny lub nieoznaczony");
}
private double[][] M;
public Matrix(double[][] x) {
int r = x.length; // liczba wierszy (rows)
int c = x[0].length; // liczba kolumn (columns)
M = new double[r][c];
for(int i = 0; i < r; ++i)
for(int j = 0; j < c; ++j)
M[i][j] = x[i][j];
}
public Matrix(Matrix x) {
int r = x.M.length;
int c = x.M[0].length;
M = new double[r][c];
for(int i = 0; i < r; ++i)
for(int j = 0; j < c; ++j)
M[i][j] = x.M[i][j];
}
2
Gdy programujemy w Javie, jestemy przyzwyczajeni do zapisywania identyfikatorów staych wiel-
kimi literami. W tym przypadku M nie oznacza staej, lecz jest identyfikatorem tablicy, która odpowia-
da macierzy reprezentowanej przez obiekt. W kilku nastpnych zadaniach bdziemy oznaczali macie-
rze wielkimi literami (tak jak przyjmuje si w podrcznikach do matematyki).
C.random().printf("%8.2f");
System.out.println("Liczba wierszy: "+C.getRows());
System.out.println("Liczba kolumn: "+C.getColumns());
System.out.println("Element C[0][1]: "+C.getAt(0, 1));
System.out.println("Podstawiam C[0][0] = -3.5");
C.setAt(0, 1, -3.5);
System.out.println("Element C[0][0]: "+C.getAt(0, 1));
System.out.println("Macierz C");
Matrix C = new Matrix(3, 2).random().printf("%8.2f");
System.out.println("Macierz D");
Matrix D = new Matrix(2, 4).random().printf("%8.2f");
System.out.println("Iloczyn macierzy, C*D = ");
C.mult(D).printf("%10.4f");
System.out.println("Macierz C");
C.printf("%10.4f");
System.out.println("Iloczyn macierzy przez skalar, 3*C = ");
C.mult(3).printf("%10.4f");
}
}
Macierz trójktna górna — wszystkie elementy poniej gównej przektnej maj war-
to zero.
public Matrix upperTriangular() {
if (M.length != M[0].length)
throw new ArithmeticException("To nie jest macierz kwadratowa");
int n = M.length;
Macierz trójktna dolna — wszystkie elementy poniej gównej przektnej maj war-
to zero.
public Matrix lowerTriangular() {
if (M.length != M[0].length)
throw new ArithmeticException("To nie jest macierz kwadratowa");
int n = M.length;
Matrix tmp = new Matrix(this);
for(int i = n-1; i > 0; --i)
for(int j = i-1; j >= 0; --j) {
if (tmp.M[i][i] != 0.0) {
double p = tmp.M[j][i]/tmp.M[i][i];
for(int k = 0; k < n; ++k)
tmp.M[j][k] -= tmp.M[i][k]*p;
} else {
for(int k = i-1; k >= 0; --k) {
if (tmp.M[k][i] != 0.0) {
for(int m = 0; m < n; ++m) {
double temp = tmp.M[i][m];
tmp.M[i][m] = tmp.M[k][m];
tmp.M[k][m] = -temp;
}
break;
}
}
}
}
return tmp;
}
Macierz diagonalna — wszystkie elementy poza gówn przektn maj warto zero.
public Matrix diagonal() {
if (M.length != M[0].length)
System.out.println("Macierz diagonalna");
A.diagonal().printf("%8.2f");
}
}
double d = 1.0;
for(int i = 0; i < n; ++i)
d *= tmp.M[i][i];
return d;
}
1
ª x1 º ª a11 a12 a1n º ª b1 º
«x » «a a22 a2 n »» ««b2 »»
« 2» « 21
«» « » «»
« » « » « »
¬ xn ¼ ¬ a n1 an 2 ann ¼ ¬bn ¼
Wyraenie to moemy w atwy sposób zapisa przy uyciu obiektów i metod klasy
Matrix (X = A.inverse().mult(B)). Podobnie wykonamy sprawdzenie, obliczajc
A.mult(X) i porównujc z kolumn wyrazów wolnych B (wizualnie, po wywietleniu
wyników w konsoli lub po zbudowaniu metody equals() w klasie Matrix).
class Z28_32 {
public static void main(String[] args) {
/* Ukad równa - macierz odwrotna */
Matrix A = new Matrix(3, 3).random();
Matrix B = new Matrix(3, 1).random();
Matrix X;
System.out.println("Ukad równa A*X = B");
System.out.println("Macierz gówna A = ");
A.printf("%8.2f");
System.out.println("Kolumna wyrazów wolnych B = ");
B.printf("%8.2f");
System.out.println("Rozwizanie ukadu X = ");
X = A.inverse().mult(B).printf("%8.2f");
System.out.println("Sprawdzenie A*X = ");
A.mult(X).printf("%8.2f");
}
}
class Z28_33 {
public static void main(String[] args) {
/* Ukad równa - metoda wyznaczników */
int n = 4;
Matrix A = new Matrix(n, n).random().mult(10);
Matrix B = new Matrix(n, 1).random().mult(5);
Matrix X = new Matrix(n, 1);
Jeli wyznacznik gówny jest zerem, to wywietlilimy informacj, e ukad jest sprzecz-
ny lub nieoznaczony. Czytelnik moe ten fragment rozbudowa o analiz wartoci
wszystkich wyznaczników i orzeczenie, czy ukad jest sprzeczny (co najmniej jeden
wyznacznik róny od zera), czy nieoznaczony (wszystkie wyznaczniki równe zero).
Jedynie dla liczby 0,0 zamiast spodziewanej wartoci 0,0 otrzymamy –0,0. Wynika to
z istnienia w typach liczb zmiennoprzecinkowych dwóch reprezentacji zera. Wspo-
mnian niedogodno (dotyczc zera) moemy wyeliminowa, modyfikujc nieznacz-
nie kod metody:
static double abs(double x) {
return (x >= 0)?x:-x;
}
Kod metody sgn() obliczajcej warto tej funkcji moemy zapisa, uywajc instruk-
cji warunkowych:
static int sgn(double x) {
if (x < 0)
return -1;
else if (x == 0.0)
return 0;
else
return 1;
}
W taki sam sposób zdefiniujemy metod sgn() dla innych typów argumentów.
public class Z29_3 {
/* Tu wstaw kod metody sgn(). */
public static void main(String[] args) {
System.out.println("Znak liczby -3.56: "+sgn(-3.56));
System.out.println("Znak liczby 0.0: "+sgn(0.0));
System.out.println("Znak liczby 4.2: "+sgn(4.2f));
}
}
Wyraenie x przyjmuje warto 1 dla x > 0 i –1 dla x < 0. Zatem funkcja f x zwraca
x
znak liczby (zob. rozwizanie zadania 29.3). Metod obliczajc warto tej funkcji
moemy nazwa sgn (skrót od ac. signum):
lub:
static int sgn(double x) {
return ((x == 0.0)?0:(int)(Math.abs(x)/x));
}
c) Wród liczb x i –x wiksz jest liczba dodatnia, a zatem metoda h() zwraca
bezwzgldn warto liczby x.
public static double h(double x) {
return f(x, -x);
}
Test dziaania metod f() i g() przeprowadzimy na 9 parach liczb, natomiast metod
h() przetestujemy dla 6 wartoci.
class Z29_5 {
/* Tu wstaw kod funkcji f, g, h. */
public static void main(String[] args) {
double[] a = {-3.3, 0.0, 1.25};
double[] b = {-5.12, 0.25, 1.5};
for(double x: a)
for(double y: b) {
System.out.printf("f(%f, %f) = %f\n", x, y, f(x, y));
System.out.printf("g(%f, %f) = %f\n", x, y, g(x, y));
}
for(double x: a)
System.out.printf("h(%f) = %f\n", x, h(x));
for(double x: b)
System.out.printf("h(%f) = %f\n", x, h(x));
}
}
Dziaanie metody moemy sprawdzi, np. wykonujc obliczenia kilku wartoci potg
liczby 2.
for(int i = 0; i <= 10; ++i)
System.out.println(adoen(2, i));
Metod adoen() utworzymy na podstawie rozwizania zadania 29.7, 29.8 lub 29.9
(w tym ostatnim przypadku potrzebna bdzie metoda sqr()). Dziaanie funkcji spraw-
dzimy, wykonujc obliczenia kilku wartoci potg liczby 2.
for(int i = -10; i <= 10; ++i)
System.out.println(power(2, i));
pw = x;
x = ((n-1)*x+a/adoen(x, n-1))/n;
} while (Math.abs(pw-x) >= 0.00000001);
return x;
}
1 1 x
area tangens hiperboliczny artanh x ln — funkcja odwrotna
2 1 x
do tangensa hiperbolicznego:
static double artanh(double x) {/* area tangens hiperboliczny */
return Math.log((1+x)/(1-x))/2;
}
1 x 1
area cotangens hiperboliczny arcoth x ln — funkcja odwrotna
2 x 1
do cotangensa hiperbolicznego:
static double arcoth(double x) {/* area cotangens hiperboliczny */
return Math.log((x+1)/(x-1))/2;
}
§ 1 1·
area secans hiperboliczny arsech x ln¨¨ 2 1 ¸¸ — funkcja odwrotna
© x x¹
do secansa hiperbolicznego:
static double arsech(double x) {/* area secans hiperboliczny */
return Math.log(Math.sqrt(1/(x*x)-1)+1/x);
}
§ 1 1·
area cosecans hiperboliczny arcsch x ln¨¨ 1 2 ¸¸ — funkcja odwrotna
© x x¹
do cosecansa hiperbolicznego:
static double arcsch(double x) {/* area cosecans hiperboliczny */
return Math.log(Math.sqrt(1+1/(x*x))+1/x);
}
Testujc dziaanie funkcji odwrotnych, obliczymy miary któw ostrych w tzw. trójk-
cie egipskim (trójkt prostoktny o bokach dugoci 3, 4 i 5 jednostek).
System.out.println("\nFunkcje odwrotne do funkcji trygonometrycznych");
System.out.println("Obliczanie miary kta ostrego w trójkcie egipskim");
System.out.println("(a = 3, b = 4 i c = 5)\n");
double a = 3.0, b = 4.0, c = 5.0; // boki trójkta egipskiego
System.out.println("sin A = "+a/c+",\tA = "+FTD.arcsin(a/c)+"°");
System.out.println("cos A = "+b/c+",\tA = "+FTD.arccos(b/c)+"°");
System.out.println("tan A = "+a/b+",\tA = "+FTD.arctan(a/b)+"°");
System.out.println("cot A = "+b/a+",\tA = "+FTD.arccot(b/a)+"°");
System.out.println("sec A = "+c/b+",\tA = "+FTD.arcsec(c/b)+"°");
System.out.println("csc A = "+c/a+",\tA = "+FTD.arccsc(c/a)+"°");
Na koniec sprawdzimy, ile stopni ma radian i jak czci radiana jest stopie.
System.out.println("\nKonwersja miar któw");
System.out.println("1 rad = "+FTD.degToRad(1)+"°");
System.out.println("1° = "+FTD.radToDeg(1)+" rad");
return Math.sin(x);
}
/* itd. */
Przykadowe obliczenia wykonamy dla kta o mierze 60°, zaczynajc od zamiany miary
stopniowej kta na miar ukow (w radianach):
public class Z29_18 {
public static void main(String args[]) {
double a = FTR.degToRad(60);
System.out.println("a = "+a+" rad");
System.out.println("sin a = "+FTR.sin(a));
System.out.println("cos a = "+FTR.cos(a));
System.out.println("tan a = "+FTR.tan(a));
System.out.println("cot a = "+FTR.cot(a));
System.out.println("sec a = "+FTR.sec(a));
System.out.println("csc a = "+FTR.csc(a));
System.out.println("a = "+FTR.radToDeg(a)+"\u00B0");
}
}