Wczytywanie danych wejściowych z klawiatury


Zagadnienia
  • Pojęcie klasy Scanner
  • Pojęcie klasy System.in
  • Przydatne narzędzia/oprogramowanie

  • Pakiet NetBeans

  • 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

    MetodaPrzykładOpis
    nextBytebyte 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.
    nextDoubledouble 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.
    *ZnaczenieTyp
    /ZnaczenieTyp
    %ZnaczenieTyp
    Opis: nextFloat Przykład zastosowania: float number; Scanner keyboard = new Scanner(System.in); System.out.print("Wprowadź wartość typu float: "); number = keyboard.nextFloat(); Opis: Zwraca dane wejściowe jako wartość typu float. nextInt Przykład zastosowania: int number; Scanner keyboard = new Scanner(System.in); System.out.print("Wprowadź wartość typu int: "); number = keyboard.nextInt(); Opis: Zwraca dane wejściowe jako wartość typu int. nextLine Przykład zastosowania: String name; Scanner keyboard = new Scanner(System.in); System.out.print("Wprowadź swoje imię: "); name = keyboard.nextLine(); Opis: Zwraca dane wejściowe jako wartość typu String. nextLong Przykład zastosowania: long number; Scanner keyboard = new Scanner(System.in); System.out.print("Wprowadź wartość typu long: "); number = keyboard.nextLong(); Opis: Zwraca dane wejściowe jako wartość typu long. nextShort Przykład zastosowania: short number; Scanner keyboard = new Scanner(System.in); System.out.print("Wprowadź wartość typu short: "); number = keyboard.nextShort(); Opis: Zwraca dane wejściowe jako wartość typu short.

    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:

          String input; // Przechowywanie wiersza danych wejściowych.
          char answer; // Przechowywanie jednego znaku.
          // Tworzenie obiektu typu Scanner do pobierania danych wejściowych z klawiatury.
          Scanner keyboard = new Scanner(System.in);
          // Zadawanie pytania użytkownikowi.
          System.out.print("Czy dobrze się bawisz? (T=tak, N=nie) ");
          input = keyboard.nextLine(); // Pobieranie wiersza danych wejściowych.
          answer = input.charAt(0);
          // Pobieranie pierwszego znaku.
          //Zmienna input wskazuje obiekt typu String. Ostatnia instrukcja w tym kodzie wywołuje
          //metodę charAt klasy String, aby pobrać znak z pozycji 0; jest to pierwszy znak
          //z łańcucha. Po wykonaniu tej instrukcji w zmiennej answer znajdzie się znak wprowadzony
          //przez użytkownika za pomocą klawiatury
          
          

    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.

  • Używanie symbolu = zamiast == do porównywania wartości typów prostych. Pamiętaj, że = to operator przypisywania, a == służy do sprawdzania równości.
  • Używanie == zamiast metody equals do porównywania obiektów typu String. Do porównywania zawartości obiektu typu String z innym łańcuchem znaków nie można używać operatora ==. Zamiast tego należy posługiwać się metodą equals lub compareTo.
  •  Zapominanie o umieszczaniu wyrażenia logicznego w instrukcji if w nawiasie. Java wymaga, aby wyrażenie logiczne sprawdzane w instrukcji if znajdowało się w nawiasie. Pominięcie nawiasu lub zastosowanie innego symbolu grupowania spowoduje błąd.  Umieszczanie średnika na końcu klauzuli if. Gdy umieścisz średnik na końcu klauzuli if, Java przyjmie, że warunkowo wykonywanym poleceniem jest pusta instrukcja.  Zapominanie o umieszczaniu grupy warunkowo wykonywanych instrukcji w nawiasie klamrowym. Instrukcja if zwykle wykonuje warunkowo tylko jedno polecenie. Aby warunkowo wykonywać grupę instrukcji, trzeba umieścić je w nawiasie klamrowym.  Pomijanie końcowego else w instrukcji if-else-if. Nie jest to błąd składniowy, ale taka sytuacja może prowadzić do błędów logicznych. Jeśli pominiesz końcowe else w instrukcji if-else-if, to jeżeli wszystkie wyrażenia logiczne w instrukcji będą miały wartość false, żaden kod nie zostanie wykonany.  Brak kompletnych wyrażeń logicznych po obu stronach operatora logicznego && lub ||. Po obu stronach operatorów logicznych && i || trzeba umieścić kompletne wyrażenie logiczne. Na przykład wyrażenie x > 0 && < 10 jest nieprawidłowe, ponieważ < 10 nie jest kompletnym wyrażeniem. Ten kod należy zapisać tak: x > 0 && x < 10.  Próba porównywania łańcuchów znaków bez uwzględniania wielkości liter za pomocą metod equals i compareTo klasy String. Do porównywania łańcuchów znaków bez uwzględniania wielkości liter służą metody equalsIgno reCase i compareToIgnoreCase klasy String. 25cf99c780a4a42042bf2a66d34da04b 204 Rozdział 3. Struktury decyzyjne  Używanie w instrukcji switch wyrażenia, które nie jest typu int, short, byte, char lub String. W instrukcji switch można sprawdzać jedynie wyrażenia typów int, short, byte, char i String.  Używanie w klauzuli case wyrażenia, które nie jest literałem lub zmienną z modyfikatorem final. Ponieważ kompilator musi ustalić wartość wyrażenia w klauzuli case w czasie kompilacji, tym wyrażeniem musi być literał lub zmienna z modyfikatorem final.  Pominięcie dwukropka na końcu instrukcji case. W każdej klauzuli case po wyrażeniu musi znajdować się dwukropek.  Pominięcie instrukcji break w sekcji case. Nie jest to błąd składniowy, jednak taka sytuacja może skutkować błędami logicznymi. Program nie wyjdzie wtedy z instrukcji switch do momentu napotkania polecenia break lub końca danej instrukcji switch.  Pominięcie sekcji default w instrukcji switch. Nie jest to błąd składniowy, jednak taka sytuacja może prowadzić do błędów logicznych. Jeśli pominiesz sekcję default, to gdy żadne z wyrażeń w klauzulach case nie będzie pasować do wyrażenia z instrukcji switch, żaden kod nie zostanie wykonany.  Zastąpienie miejscami symboli ? i : w operatorze warunkowym. W operatorze warunkowym znak ? pojawia się jako pierwszy, a dalej znajduje się znak :.  Zapis opcji, szerokości pola i precyzji w niewłaściwej kolejności w trakcie formatowania liczb za pomocą metody System.out.printf lub String.format.  Podanie niewłaściwego określnika typu (%f = typy zmiennoprzecinkowe, %d = typy całkowitoliczbowe, %s = łańcuchy znaków) w specyfikatorze formatowania w metodach System.out.printf i String.format.



    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







    Przykładowe rozwiązania oraz komentarze do wybranych ćwiczeń i zadań


  • 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';