Wczytywanie danych wejściowych z klawiatury
edytor kodu przykładowy
Wczytywanie wartości
Do wczytywania danych wejściowych z klawiatury można wykorzystać obiekty klasy Scanner
Tabela 2.17. Wybrane metody klasy Scanner
Metoda | Przykład | Opis |
nextByte | byte x; Scanner keyboard = new Scanner(System.in); System.out.print("Wprowadź wartość typu byte: "); x = keyboard.nextByte(); | TZwraca dane wejściowe jako wartość typu byte. |
nextDouble | double number; Scanner keyboard = new Scanner(System.in); System.out.print("Wprowadź wartość typu double: "); number = keyboard.nextDouble(); | Zwraca dane wejściowe jako wartość typu double. |
* | Znaczenie | Typ |
/ | Znaczenie | Typ |
% | Znaczenie | Typ |
Wczytywanie znaków
Czasem chcesz wczytać jeden znak z klawiatury. Przykładowo, program może zadawać pytania z odpowiedziami tak/nie i informować, że należy wprowadzić T (oznaczające „tak”) lub N (oznaczające „nie”). Klasa Scanner nie udostępnia jednak metody do wczytywania pojedynczych znaków.
Do wczytywania można zastosować następujący sposób wczytywania znaków:
można użyć metody nextLine klasy Scanner do wczytania łańcucha znaków z klawiatury, a następnie metodą charAt klasy String pobrać pierwszy znak tego łańcucha. Pobierany jest wtedy znak wprowadzony przez użytkownika za pomocą klawiatury. Oto przykład:
Tabela 2.18. Metody do konwersji łańcuchów znaków na liczby Metoda Służy do… Przykładowy kod Byte.parseByte przekształcania łańcucha znaków na typ byte. byte num; num = Byte.parseByte(str); Double.parseDouble przekształcania łańcucha znaków na typ double. double num; num = Double.parseDouble(str); Float.parseFloat przekształcania łańcucha znaków na typ float. float num; num = Float.parseFloat(str); Integer.parseInt przekształcania łańcucha znaków na typ int. int num; num = Integer.parseInt(str); Long.parseLong przekształcania łańcucha znaków na typ long. long num; num = Long.parseLong(str); Short.parseShort przekształcania łańcucha znaków na typ short. short num; num = Short.parseShort(str);
Przekształcanie tekstowych danych wejściowych na liczby
Typ danych boolean umożliwia tworzenie zmiennych, które mogą przyjmować jedną z dwóch wartości: true lub false.
public class Main { public static void main(String[] args) { boolean bool; bool = true; System.out.println(bool); bool = false; System.out.println(bool); } }
true false |
Pierwszeństwo operatorów
Można pisać wyrażenia matematyczne obejmujące wiele operatorów. Poniższa instrukcja
przypisuje sumę operandów 17, x, 21 i y do zmiennej answer:
answer = 17 + x + 21 + y;
Jednak niektóre wyrażenia nie są równie proste. Przyjrzyj się następującej instrukcji:
outcome = 12 + 6 / 3;
Jaka wartość zostanie zapisana w zmiennej outcome? Liczba 6 jest tu operandem zarówno
operatora dodawania, jak i operatora dzielenia. Do zmiennej outcome może zostać
przypisana liczba 6 lub 14; zależy to od momentu dzielenia. Rzeczywisty wynik to 14,
ponieważ operator dzielenia ma pierwszeństwo przed operatorem dodawania.
Wyrażenia matematyczne są przetwarzane od lewej do prawej. Gdy dwa operatory
dotyczą tego samego operandu, najpierw wykonywany jest operator o najwyższym
pierwszeństwie. Mnożenie i dzielenie mają pierwszeństwo względem dodawania i odejmowania,
dlatego przedstawiona instrukcja działa w następujący sposób:
25cf99c780a4a42042bf2a66d34da04b
90 Rozdział 2. Podstawy Javy
1. 6 jest dzielone przez 3, co daje wynik 2.
2. 12 jest dodawane do 2, co daje wynik 14.
Tabela 2.8. Pierwszeństwo operatorów arytmetycznych (od najwyższego do najniższego)
Najwyższe pierwszeństwo – (jednoargumentowa negacja)
* / %
Najniższe pierwszeństwo + –
Operatory mnożenia, dzielenia i modulo mają ten sam poziom pierwszeństwa. Operatory
dodawania i odejmowania też mają to samo pierwszeństwo. Jeśli dwa operatory
powiązane z tym samym operandem mają to samo pierwszeństwo, działają zgodnie
z zasadą łączności. Łączność może być lewostronna (operacje wykonywane od lewej
do prawej) lub prawostronna (operacje wykonywane od prawej do lewej). W tabeli 2.9
wymieniono operatory i ich łączność.
Tabela 2.9. Łączność operatorów arytmetycznych
Operator Łączność
– (jednoargumentowa negacja) Prawostronna
* / % Lewostronna
+ – Lewostronna
Klasa Math
Metoda Math.pow
W Javie podnoszenie liczb do potęgi wymaga użycia metody Math.pow. Oto przykład jej
zastosowania:
result = Math.pow(4.0, 2.0);
Metoda Math.sqrt
Metoda Math.sqrt przyjmuje wartość typu double i zwraca pierwiastek kwadratowy tej wartości. Oto przykład ilustrujący, jak używać tej metody:
result = Math.sqrt(9.0);
Złożone operatory przypisania
Złożone operatory przypisania łączą operator przypisania z operatorem arytmetycznym.
Tabela 2.12. Różne instrukcje przypisania (w każdej z nich x = 6)
Instrukcja Działanie instrukcji Wartość x po wykonaniu instrukcji
x = x + 4; Dodaje 4 do x. 10
x = x – 3; Odejmuje 3 od x. 3
x = x * 10; Mnoży x przez 10. 60
x = x / 2; Dzieli x przez 2. 3
x = x % 4; Przypisuje do x resztę z dzielenia x / 4. 2
Operacje tego rodzaju są w programowaniu często wykonywane. Dla wygody programistów
Java udostępnia specjalny zestaw operatorów zaprojektowanych specjalnie pod
kątem takich operacji. W tabeli 2.13 pokazano złożone operatory przypisania, nazywane
też operatorami złożonymi.
Tabela 2.13. Złożone operatory przypisania
Operator Przykładowe zastosowanie Odpowiednik instrukcji
+= x += 5; x = x + 5;
–= y –= 2; y = y – 2;
*= z *= 10; z = z * 10;
/= a /= b; a = a / b;
%= c %= 3; c = c % 3;
Konwersja prostych typów danych na inne takie typy
Aby wartość można było zapisać w zmiennej, typ danych wartości musi być zgodny z typem danych zmiennej. Java automatycznie przeprowadza niektóre konwersje typów danych, jednak nie wykonuje automatycznie żadnych przekształceń, które mogą skutkować utratą danych. Ponadto w Javie stosowany jest zestaw reguł w trakcie przetwarzania wyrażeń arytmetycznych zawierających różne typy danych. Java to język ze ścisłą kontrolą typów. To oznacza, że przed przypisaniem wartości do zmiennej Java sprawdza typy danych zmiennej i wartości, aby ustalić, czy są one zgodne. Przyjrzyj się następującym instrukcjom: int x; double y = 2.5; x = y; Instrukcja przypisania próbuje zapisać wartość typu double (2.5) w zmiennej typu int. Gdy kompilator Javy natrafi na ten wiersz kodu, wyświetli komunikat o błędzie. Pakiet JDK wyświetli wtedy komunikat o możliwej utracie precyzji. Jednak nie wszystkie instrukcje z różnymi typami danych są odrzucane przez kompilator. Przyjrzyj się poniższemu fragmentowi programu: int x; short y = 2; x = y;
Typowe błędy, których należy unikać
Na poniższej liście opisano błędy często popełniane w trakcie nauki zagadnień z tego tematu.
Oblicz i sprawdź
(5 + 2) * 4 =
10 / (5 – 3) =
8 + 12 * (6 – 2) =
(4 + 17) % (2 – 1) =
(6 – 3) * (2 + 7) / 3 =
Odpowiedzi /kolejnośc przypadkowa/
9 , 28, 46, 5, 0
Oblicz
6 + 3 * 5 _______
12 / 2 – 4 _______
9 + 14 * 2 – 6 _______
5 + 19 % 3 – 1 _______
(6 + 2) * 3 _______
14 / (11 – 4) _______
9 + 12 * (8 – 3) _______
2.23. Czy dzielenie w poniższym kodzie jest całkowitoliczbowe, czy zmiennoprzecinkowe?
Jaka wartość zostanie zapisana w zmiennej portion?
double portion;
portion = 70 / 3;
Zadeklaruj operacje przypisania
2.24. Napisz z użyciem złożonych operatorów przypisania instrukcje wykonujące następujące operacje:
a) dodawanie 6 do x,
b) odejmowanie 4 od amount,
c) mnożenie y przez 4,
d) dzielenie total przez 27,
e) zapisywanie w x reszty z dzielenia x przez 7.
Karta pracy
Pytania kontrolne
2.25. W programie znajduje się następująca deklaracja: short totalPay, basePay = 500, bonus = 1000; W tym samym programie występuje taka instrukcja: totalPay = basePay + bonus; a) Czy druga instrukcja zostanie poprawnie skompilowana, czy spowoduje błąd? b) Jeśli instrukcja spowoduje błąd, to z jakiego powodu tak się stanie? Potrafisz rozwiązać problem? 2.26. Zmienna a jest typu float, a zmienna b jest typu double. Napisz instrukcję, która przypisuje wartość b do a, nie powodując błędu w momencie kompilacji programu.
Podsumowanie
Rozwiązania do ćwiczeń z tej strony
2.12. Nazwa 99bottles jest niedozwolona, ponieważ rozpoczyna się od cyfry. Nazwa r&d jest błędna, ponieważ znak & jest niedozwolony.
2.13. Te nazwy nie są identyczne, ponieważ jedna rozpoczyna się wielką literą S, natomiast
druga — małą literą s. Wielkość znaków w nazwach zmiennych jest istotna.
2.14. a) short
b) int
c) 22.1, ponieważ jest przechowywany za pomocą typu double.
2.15. 6.31E17
2.16. Należy dodać F do literału liczbowego; oto przykład:
number = 7.4F;
2.17. true i false.
2.18. a) char letter;
b) letter = 'A';
c) System.out.println(letter);.
2.19. Kod litery „C” to 67, kod litery „F” to 70, a kod litery „W” to 87.
2.20. 'B' to literał znakowy.
2.21. Nie można przypisać literału tekstowego do zmiennej typu char. Należy zastosować instrukcję: char letter = 'Z';