Lipiec 30, 2018

Obsługa klawiatury – Scanner

Obsługa klawiatury – Scanner

W tej lekcji kursu zaznajomimy się z klasą Scanner, która umożliwia nam obsługę klawiaturę. Dzięki temu, możemy bez problemu wczytywać wartości do aplikacji lub odpowiednio reagować na konkretne wciśnięcie konkretnego klawisza.

Zacznijmy!

Rozpocznijmy standardowo od pustego projektu z klasą oraz metodą Main.

public class Main {

    public static void main(String[] args) {
  
    }
}

Do obsługi klawiatury potrzebujemy wykorzystać jakąś bibliotekę – w naszym przypadku padło na klasę Scanner. Stwórzmy jej obiekt przy użycia operatora new w metodzie main.

Scanner scanner = new Scanner(System.in);

Na razie nie musisz wiedzieć czym jest obiekt – wystarczy Ci wiedzieć, że stworzyliśmy sobie właśnie jeden egzemplarz obiektu typu Scanner, który umożliwia nam m.in. odczyt wciśniętych klawiszy na klawiaturze.

Możliwe, że teraz w Intellij Idea Scanner został podświetlony na czerwono – oznacza to, że coś jest nie tak. W tym przypadku po prostu IDE nie wie skąd ma wziąć ten scanner – dlatego musimy mu to wskazać.

Importowanie

Przed nami pierwsze importowanie klasy, z której skorzystamy. Możemy to zrobić w prostszy sposób.

Najechać kursorem na wyraz Scanner, naciśnać Alt + Enter oraz wybrać opcję Import class (zaimportuj klasę) z pakietu java.util. Po tej operacji powinna pokazać Ci się w górnej cześci pliku następującka linia kodu:

import java.util.Scanner;

Oczywiście możemy tę linię kodu napisać ręcznie – nic nie stoi na przeszkodzie.

Importowanie – czyli załączanie innych klas – służy do tego, aby kompilator wiedział o jaki Scanner nam chodzi i skąd ma brać wszystkie potrzebne informację. Na tą chwilę tyle wystarczy, idźmy dalej – użyjmy scannera.

Pierwsze wczytanie

Abyśmy mogli coś wczytać z klawiatury potrzebujemy na początku zmiennej, gdzie będziemy mogli zapisać wczytane dane np. liczbę.

Po ostatniej lekcji powinieneś już potrafić deklarować zmienne, jeżeli nie to wróć do poprzedniej lekcji!

Zadeklarujmy na początek dwie zmienne, pierwsza typu int, druga typu float.

int firstValue;
float secondValue;

Czas na wczytywanie wartości – do tego celu użyjemy metod nextInt oraz nextFloat – jak nazwy wskazują, pierwsza służy do wczytywania liczb całkowitych, kolejna do liczb zmiennoprzecinkowych.

System.out.println("Podaj liczbe calkowita: ");
firstValue = scanner.nextInt();

I jeszcze druga liczba:

System.out.println("Podaj liczbe zmiennoprzecinkowa: ");
secondValue = scanner.nextFloat();

Wypiszmy sobie jeszcze na ekran wczytane liczby przy użyciu System.out.println

System.out.println("Pierwsza liczba to: "+firstValue);
System.out.println("Druga liczba to: "+secondValue);

Ostatecznie nasz program powinien wyglądać tak:

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int firstValue;
        float secondValue;

        System.out.println("Podaj liczbe calkowita: ");
        firstValue = scanner.nextInt();

        System.out.println("Podaj liczbe zmiennoprzecinkowa: ");
        secondValue = scanner.nextFloat();

        System.out.println("Pierwsza liczba to: "+firstValue);
        System.out.println("Druga liczba to: "+secondValue);
    }
}

Czas na kompilację i uruchomienie naszego programu, klikamy Shift + F10 i testujemy nasz krótki program.

Po uruchomieniu programu wg instrukcji podajemy liczby – pierwsza całkowita, druga zmiennoprzecinkowa (przy użyciu przecinka, a nie kropki).

Po podaniu poprawnych danych powinnyśmy otrzymać taki rezultat:

Pierwsza liczba to: 5
Druga liczba to: 4.3

Wczytywanie tekstu

Skoro wczytaliśmy już pierwsze liczby to czas na wczytywanie tekstu, może będzie to bardziej emocjonujące przeżycie. 😉

Do przetrzymywania ciągu znaków użyjemy Stringa – jest to tak naprawdę tablica (zbiór) wielu charów – typ prymitywny char został obudowany klasą String, aby można było łatwiej operować na ciągach znaków.

Na razie klasę Scanner i String możesz traktować jako pudełko, które dostarcza nam gotowych funkcjonalności, z których możemy korzystać – nie musimy na razie wchodzi w szczegóły tych pudełek. 😉

Rozpocznijmy od pustego projektu – jednak w tym przypadku już z obiektem typu Scanner.

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
    }
}

Czas na stworzenie zmiennej – tym razem typu String, aby móc zapisać wczytane słowo.

String inputText;

Teraz możemy wczytać słowo z klawiatury przy użyciu funkcji next() – która zwraca ciąg znaków – mogą to być znaki specjalne jak i cyfry.

inputText = scanner.next();

Jednak może kojarzysz zasadę z poprzedniej lekcji: „zmienne należy deklarować jak najpóźniej jak to jest możliwe” – dlatego, możemy to zapisać w jednej linii.

String inputText = scanner.next();

A przed wczytaniem użytkownikowi jeszcze dać informację:

System.out.println("Podaj słowo: ");

Na koniec wyświetlmy wczytane słowo.

System.out.println("Podałeś: "+inputText);

I cały nasz kod wygląda tak:

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.println("Podaj słowo: ");
        String inputText = scanner.next();

        System.out.println("Podałeś: "+inputText);
    }
}

Czas na testowanie, skompilujmy i odpalmy program przy użyciu SHIFT + F10 oraz podajmy jakieś słowo.

Podałeś: kurs-java

Jak widać program działa poprawnie.

Spróbujmy teraz podać coś dłuższego, np. zdanie: „Kurs java na 1024kb.pl” i po uruchomieniu programu otrzymujemy taki efekt:

Podałeś: Kurs

Jak widać nie wczytano całego zdania – co jest problemem?

Wczytywanie zdania

Funkcja (metoda) next() wczytując znaki z klawiatury robi to aż do napotkania białych znaków tzn. spacje, tabulatory, new line itd. – aby móc wczytać zdanie ze znakami białymi trzeba skorzystać z funkcji nextLine().

Aby nasz program działał poprawnie wystarczy zmienić jedną linię kodu z:

String inputText = scanner.next();

na

String inputText = scanner.nextLine();

I teraz podając zdanie „Kurs java na 1024kb.pl” otrzymujemy taki o to rezultat:

Podałeś: Kurs java na 1024kb.pl

Czyli wszystko działa poprawnie!

Podsumowanie

W tej choć trochę długiej lekcji mam nadzieję, że wytłumaczyłem Ci wszystkie zagadnienia związane z wczytywanie liczb oraz tekstu z klawiatury do naszej aplikacji przy użyciu klasy Scanner.

Dodatkowo poznałeś typ String, który służy do przechowywanie ciągów znakowych, a można go również inicjalizować przy użyciu podwójnych apostrofów.

String name = "Kamil";

Po lekcji czas na rozwiązanie krótkich zadań w celu sprawdzenia swojej wiedzy.

  1. Wczytaj od użytkownika tekst, a następnie wyświetl go na ekran konsoli.
  2. Wczytaj od użytkownika imię, nazwisko, wiek, wzrost oraz wagę, a następnie wyświetl na ekran konsoli napis: „Nazywasz się {imię} {nazwisko}, masz {wiek} lat, masz {wzrost} cm wzrostu oraz ważysz {waga} kg”.
  3. Wczytaj dwie liczby całkowite od użytkownika, a następnie wyświetl wynik dodawania i odejmowania przy użyciu operatorów – np. wynik = liczbaA + liczbaB, wynik = liczbaA – liczbaB.

Rzwiązania zadań możesz znaleźć tutaj.

Więcej o operatorach matematycznych opowiem w następnej lekcji kursu, jeżeli jesteś w stanie to już teraz wykonaj drugie zadanie.

Pamiętaj, aby nazwy zmiennych zapisywać w języku angielskim – od samego początku wyrabiaj w sobie dobre nawyki!