Laboratorium z informatyki sem.II/ćw.2 Wydział Transportu PW 2020/21
Materiały do użytku wewnętrznego strona 1
M
ATERIAŁY POMOCNICZE DO ĆWICZENIA2 Wczytywanie danych z klawiatury
W Javie operacje we/wy opierają się na strumieniach, czyli obiektach, z których można odczytywać dane (strumienie wejściowe) lub zapisywać do nich dane (strumienie wyjściowe). W pakiecie java.lang są zdefiniowane standardowe strumienie: System.in (zazwyczaj wejście z klawiatury) oraz System.out (zazwyczaj wyjście na monitor ekranowy).
Na poprzednich zajęciach korzystaliśmy już ze strumienia System.out oraz jego metod print(), println().
Aby odczytać dane z klawiatury należy:
▪ Utworzyć obiekt klasy InputStreamReader, czyli czytnik strumienia wejściowego powiązany ze standardowym strumieniem wejściowym przez parametr konstruktora:
new InputStreamReader(System.in)
▪ Utworzyć obiekt klasy BufferedReader (czytnik buforowany), powiązany z czytnikiem strumienia wejściowego przez parametr konstruktora:
new BufferedReader(new InputStreamReader(System.in))
▪ Zadeklarować zmienną obiektową klasy BufferedReader i przypisać do niej nowo utworzony obiekt tej klasy:
BufferedReader we = new BufferedReader(new InputStreamReader(System.in));
▪ Wykorzystać metodę readline() obiektu we klasy BufferedReader, która zwraca jedną linię tekstu
odczytanego przez czytnik InputStreamReader ze strumienia wejściowego (tu System.in, czyli z klawiatury):
line = we.readLine();
Obiekt klasy BufferedReader buforuje strumień bajtów przekazywany przez obiekt klasy InputStreamReader, pozwalając na odczytanie od razu całych wierszy tekstu (metodą readLine()) zamiast czytać znak po znaku.
Importowanie klas z innych pakietów Javy
▪ Klasy Javy są zorganizowane w pakiety. Nazwa pakietu podana jest na początku treści pliku definiującego klasę Javy, np. package projekt2;
▪ Klasy zawarte w tym samym pakiecie mogą się do siebie wzajemnie odwoływać.
▪ Pozostałe klasy, zdefiniowane w bibliotekach Javy (a w ogólności, w pakietach innych niż ten, z którego następuje odwołanie) muszą być importowane. Klauzule importu muszą poprzedzać definicję klasy, która się do nich odwołuje, np.: import java.io.BufferedReader;
▪ Wyjątkiem jest pakiet java.lang, którego zawartość – na przykład klasa System jest standardowo dostępna dla wszystkich programów Javy. Klasa System zawiera m.in. deklaracje pól statycznych in oraz out reprezentujących standardowe wejście i wyjście z programu. Zmienna out jest obiektem klasy PrintStream (strumień wydruku) i posiada szereg metod drukowania (bądź wyświetlania na ekranie, zależnie od technicznej realizacji wyjścia standardowego). Jedną z nich jest metoda System.out.println() użyta w programie do wyświetlania wiersza tekstu podanego jako parametr.
Typy proste
▪ Obok klas obiektów, w Javie występują typy proste dla wartości liczbowych, znakowych i logicznych. Poniżej zestawiono wybrane typy proste, które wykorzystujemy w ćwiczeniach.
Nazwa typu Liczba bajtów Znaczenie-typy proste Dopuszczalne wartości
int 4 Liczby całkowite -2147483648.. 2147483647
double 8 Liczby rzeczywiste -1,8e308..1,8e308
float 4 Liczby rzeczywiste -3,4e38..3,4e38
boolean 1 Wartości logiczne true lub false
Typom prostym odpowiadają uzupełniające je klasy (typy obiektowe), które definiują szereg właściwości i metod związanych z operacjami na odpowiednich wartościach.
Jednym z prostych typów całkowitych jest typ int. Odpowiadająca mu klasa Integer definiuje m.in. metodę o nazwie
parseInt(), która konwertuje łańcuch znaków (ciąg cyfr ew. poprzedzony znakiem „-”) podany jako parametr na wartość typu int. Jednym z przykładów użycia tej metody jest następująca instrukcja:
m = Integer.parseInt(args[i]);
Typy float i double
Java udostępnia 2 typy liczbowe wykorzystywane do reprezentacji liczb rzeczywistych. Różnią się one liczbą bitów przeznaczonych na zapis danych oraz zakresem dopuszczalnych wartości. Wartości typu float(pojedynczej precyzji) zapisywane są na 32 bitach i należą do zakresu od +/-1.4*10-45 do +/-3.4*1038 . Wartości typu double (podwójnej precyzji) zapisywane są na 64 bitach i należą do zakresu od +/-4.9*10-324 do +/-1.8*10308 Aby literał rzeczywisty był typu float musi być zakończony znakiem f lub F, w przeciwnym przypadku będzie typu double, na przykład:
10.5 - wartość typu double 10.5f - wartość typu float
Laboratorium z informatyki sem.II/ćw.2 Wydział Transportu PW 2020/21
Materiały do użytku wewnętrznego strona 2
Konwersja tekstu na liczby rzeczywiste
Do przekształcania tekstów w liczby rzeczywiste stosuje się statyczną metodę parseDouble()klasy Double, np:
String t = "125.5";
double a = Double.parseDouble(t);
Przy przekształcaniu tekstów w liczby rzeczywiste pojedynczej precyzji stosuje się analogiczną metodę parseFloat ()
klasy Float, np:
float c =Float.parseFloat(t);
Przy przekształcaniu tekstu w liczbę może pojawić się błąd i metoda tworzy wtedy wyjątek klasy
NumberFormatException, dlatego należy ją wywoływać w bloku try ... catch
Konwersja liczb na łańcuchy String
▪ Do konwersji liczb na typ String służy metoda toString()
, zdefiniowana we wszystkich klasach
reprezentujących liczby. Jest ona wywoływana automatycznie, jeśli w wyrażeniu zamienianym na łańcuch występują składniki typu
String połączone operatorem + ze składnikami o wartościach liczbowych▪ Metoda ta może być wywołana jawnie, na przykład poniższe instrukcje spowodują zamianę na łańcuchy zmiennej n typu int oraz zmiennej a typu double:
String s1 = Integer.toString(n); String s2 = Double.toString(a);
Wybrane funkcje matematyczne i stałe klasy
Math Funkcje matematyczne Javy są zawarte w klasie Math.Metody klasy Math -zwykle operują na liczbach rzeczywistych typu double i zwracają wartości typu double. Poniżej przedstawione są wybrane metody klasy Math.
Metoda Opis
abs(double d)
Zwraca wartość bezwzględną liczby typu
double abs(int n)Zwraca wartość bezwzględną liczby typu
int cos(double d)Zwraca wartość funkcji cosinus
sin(double d)
Zwraca wartość funkcji sinus
tan(double d)
Zwraca wartość funkcji tangens
exp(double d)
Zwraca wartość funkcji eksponencjalnej (e do potęgi
d)
log((double d)
Zwraca wartość logarytmu naturalnego (przy podstawie e)
log10(double d)
Zwraca wartość logarytmu przy podstawie
10 max(double a,double b)Zwraca większą z dwóch wartości typu
double max(int k, int n)Zwraca większą z dwóch wartości typu
int min(double a, double b)Zwraca mniejszą z dwóch wartości typu
double min(int k, int n)Zwraca mniejszą z dwóch wartości typu
intpow(double a,double b)
Zwraca wartość potęgi o podstawie
ai wykładniku
b round(double a)Zwraca liczbę całkowitą powstałą z zaokrąglenia liczby
arandom()
Zwraca liczbę losową z przedziału
< 0, 1.0)signum(double x) Zwraca wartość funkcji signum argumentu x:
0 - gdy argoment ma wartość 0 1.0 - gdy argument jest dodatni, -1.0 - gdy argument jest ujemny
sqrt(double x)
Zwraca pierwiastek kwadratowy z liczby
xtoDegrees(double d)
Zamienia wartość kąta w radianach na stopnie
toRadians(double d)
Zamienia wartość kąta w stopniach na radiany
Klasa Math zawiera również dwa pola z wartościami stałych stosowanych w obliczeniach matematycznych:
Nazwa pola Opis
PI
Zawiera wartość liczby pi=3,141592653589793…
E
Zawiera wartość liczby Eulera e=2.718281828459045…
(Podane wyżej wartości są najbliższym możliwym przybliżeniem odpowiednich stałych matematycznych, ze względu na skończoną dokładność przedstawienia liczb rzeczywistych w formacie zmiennoprzecinkowym typu double.)
Laboratorium z informatyki sem.II/ćw.2 Wydział Transportu PW 2020/21
Materiały do użytku wewnętrznego strona 3
Instrukcja
forInstrukcja iteracyjna ma poniższą postać, przy czym:
for(wyr1; war; wyr2) { //instrukcje }
Przykład:
for(int i=0; i<10; i++) {
System.out.println("i = " + i);
}
gdzie: ++ operator inkrementacji ( zwiększenia wartości o 1)
Operator inkrementacji ++
Operator ++ oznacza zwiększenie wartości o jeden. Może być zastosowany w postaci przedrostkowej (prefix) np. ++i lub przyrostkowej (postfix) np. i ++. Rozróżnienie tych postaci ma znaczenie, jeśli operator jest użyty w złożonym wyrażeniu. W postaci przedrostkowej zwiększenie wartości zmiennej jest wykonywane przed wykorzystaniem tej wartości, w postaci przyrostkowej – dotychczasowa wartość zmiennej jest wykorzystana w wyrażeniu, a następnie wartość zmiennej jest zwiększana o 1.
Analogiczne znaczenie i postaci ma operator dekrementacji -- , czyli zmniejszania o 1.
Symbole specjalne
W ćwiczeniu wykorzystano następujące symbole specjalne (dwuznaki) Javy:
++ to operator inkrementacji,
+= to operator sumowania z przypisaniem (suma += i; zastępuje instrukcję suma = suma + i;);
<= to operator relacji nieostrej mniejszości.
1. jednorazowo wyliczane jest wyrażenie wyr1 (tu może pojawić się deklaracja zmiennych, wraz z inicjalizacją),
2. każdorazowo przed wejściem do (bloku) instrukcji sprawdzany jest warunek war i jeśli jego wartość jest true, wykonywane są instrukcje, w
przeciwnym przypadku następuje koniec pętli for, 3. po wykonaniu (bloku) instrukcji wyliczane jest
wyrażenie wyr2.