Temat C9. Wprowadzenie do programowania w języku Java

przez | 28 września 2022

Wszystkie treści na stronie ir.migra.pl chronione są prawami autorskimi. Więcej informacji znajdziesz tutaj.

Uwaga: Zapoznaj się wcześniej z tematem C2 lub C3 z podręcznika „Teraz bajty. Informatyka dla szkół ponadpodstawowych. Zakres podstawowy. Klasa I” albo z tematem 54 lub 66 z podręcznika „Informatyka 1-3. Podręcznik dla szkół ponadpodstawowych. Zakres podstawowy”. Wykonaj zawarte tam ćwiczenia i zadania.

Zapisy podstawy programowej realizowane w temacie:

I. Rozumienie, analizowanie i rozwiązywanie problemów.

Zakres rozszerzony. Uczeń spełnia wymagania określone dla zakresu podstawowego, a ponadto:

  1. w zależności od problemu rozwiązuje go, stosując metodę wstępującą lub zstępującą;
  2. do realizacji rozwiązania problemu dobiera odpowiednią metodę lub technikę algorytmiczną i struktury danych;

II. Programowanie i rozwiązywanie problemów z wykorzystaniem komputera i innych urządzeń cyfrowych.

Zakres rozszerzony. Uczeń spełnia wymagania określone dla zakresu podstawowego, a ponadto:

  1. sprawnie posługuje się zintegrowanym środowiskiem programistycznym przy pisaniu, uruchamianiu i testowaniu programów;

Spis treści

  1. Środowisko programistyczne języka Java
    1. Pierwszy program w języku Java
    2. Elementy programu w języku Java
    3. Etapy tworzenia programu
    4. Błędy kompilacji w programie Java
  2. Stosowanie zmiennych w języku Java
    1. Wykonywanie obliczeń
    2. Wprowadzanie danych z klawiatury
  3. Wyprowadzanie komunikatów i wyników działania programu na ekran monitora

1. Środowisko programistyczne języka Java

Java to jeden z najpopularniejszych języków na świecie. Powstał w latach 90. XX wieku i został zaprojektowany do pracy w różnych systemach operacyjnych i na różnym sprzęcie. Jest to język programowania obiektowego. Wykorzystuje się go często w aplikacjach biznesowych.

Aby pisać programy w języku Java, należy zainstalować zintegrowane środowisko programistyczne (IDE) przeznaczone do tego języka, np. darmowe IntelliJ IDEA Community Edition, które można pobrać ze strony https://www.jetbrains.com/idea/.

Rys. 1. Oficjalna strona do pobierania IntelliJ IDEA

Oprócz IDE instalowanych lokalnie na komputerze istnieją również uproszczone środowiska programistyczne dostępne w Internecie poprzez przeglądarkę internetową, np.:

W tym podręczniku będziemy korzystać z IntelliJ IDEA Community Edition.

Po zainstalowaniu IntelliJ IDEA uruchamiamy IDE, odnajdując jego ikonę w menu Start. Pokaże się wtedy powitalne okno, w którym utworzymy pierwszy projekt (rys. 2.).

Rys. 2. Okno powitalne IntelliJ IDEA

Istotne jest, aby w oknie tworzenia projektu upewnić się, że wybraliśmy zainstalowany JDK (ang. Java Development Kit), czyli zestaw narzędzi do tworzenia programów w języku Java, zawierający kompilator. Jeżeli nie mamy zainstalowanego JDK, możemy go pobrać w oknie tworzenia projektu  (rys. 3.) – np. EclipseTemurin 17.0.4 (rys. 4.).

Rys. 3. Tworzenie nowego projektu i pobieranie JDK

Wybieramy wersję 17, ponieważ wspiera ona najnowszą wersję języka Java (LTS, and. Long Term Support).

Rys. 4. Wybór wersji JDK

IntelliJ IDEA umożliwia programowania w innych językach niż Java oraz korzystanie z różnych narzędzi do kompilowania plików źródłowych programów, jednak upewnijmy się, że wybranym językiem jest Java (rys. 3.) i nie zmieniajmy domyślnych ustawień.

1.1. Pierwszy program w języku Java

Program źródłowy w języku Java składa się z jednego pliku lub wielu plików z kodem źródłowym, czyli tekstem programu, o rozszerzeniu java. Wykonywanie programu zaczyna się od wywołania przez komputer metody main() zdefiniowanej w jednym z plików źródłowych.

Przykładowy program składający się z jednego pliku z metodą main() pokazujemy na rysunku 5. po uruchomieniu tej metody na ekranie zobaczymy komunikat “Witaj świecie!”. Wyprowadzanie danych na ekran opiszemy dokładnie w późniejszej sekcji tego tematu.

// Deklaracja klasy zawierającej metodę main public class Program { // Deklaracja metody main public static void main(String[] args) { // Przykładowa instrukcja System.out.println("Witaj świecie!"); } }
Rys. 5. Przykładowa metoda main()

Metoda main() jest metodą statyczną klasy Program. Oznacza to, że nie trzeba tworzyć instancji obiektu tej klasy, aby wywołać main().

Rys. 6. Tworzenie nowej klasy

W przykładowej funkcji main() (rys. 7.) użyto komentarzy, które umieszcza się po znakach //, tak samo jak w języku C++.

Rys. 7. Różne sposoby uruchomienia programu i wynik uruchomienia

Ćwiczenie 1. Tworzymy pierwszy program w języku Java

  1. Utwórz nowy plik źródłowy i napisz program wyświetlający na ekranie napis „Witaj świecie!” – przepisz instrukcje pokazane na rysunku 5.
  2. Zapisz program w pliku pod nazwą Pierwszy Projekt Java.
  3. Skompiluj i uruchom program. Jeśli kompilator wykrył błędy, popraw je. Zapisz program w pliku pod tą samą nazwą. Ponownie skompiluj i uruchom program.

1.2. Elementy programu w języku Java

package pl.migra.ir.java; // deklaracja pakietu // deklaracja importująca // dzięki niej możemy się odwołać do DayOfWeek.FRIDAY import java.time.DayOfWeek; // nazwa klasy (KolejnyProgram), odpowiadająca nazwie pliku public class KolejnyProgram { // treść (ciało) klasy – elementy składające się na klasę // deklaracja metody main public static void main(String[] args) { // ciało metody // deklaracja zmiennej i przypisanie jej wartości int liczba = 2; // przykładowe instrukcje System.out.println("Pierwiastek z dwóch to: " + Math.sqrt(liczba)); System.out.println("Piątek to: " + DayOfWeek.FRIDAY); } // koniec ciała metody } // koniec ciała klasy

Rys. 8. Przykładowa klasa z wieloma elementami składni

Pliki z rozszerzeniem java zawierające kod źródłowy są umieszczane w katalogu src. IDE oznacza ten katalog kolorem niebieskim, wskazującym na to, że tam znajdują się źródła programu.

Plik może być wewnątrz pakietu. W takiej sytuacji na początku pliku źródłowego jest również deklaracja pakietu (rys. 8.).

Pakiet jest podkatalogiem, w którym przechowuje się pliki z kodem źródłowym. Nazwa pakietu odpowiada ścieżce podkatalogu, ale do łączenia jej elementów używa się kropki. Np. pakiet pl.migra.ir.java odpowiada podkatalogowi pl/migra/ir/java w katalogu src naszego projektu. Przyjmuje się, że nazwy pakietów zaczynają się literą i zawierają wyłącznie małe łacińskie litery i cyfry. Pakiety ułatwiają zachowanie porządku w projektach, które obejmują wiele plików z kodem źródłowym.

Jeżeli w ramach programu odwołujemy się do klas albo metod zdefiniowanych w innych pakietach, należy użyć deklaracji import, która to umożliwi.

W programie Java domyślnie są importowane wszystkie klasy z pakietu java.lang i nie ma potrzeby ich jawnie importować. Klasy z innych pakietów wymagają deklaracji import.

Przykładowo możemy użyć klas System i Math z pakietu java.lang w poniższy sposób bez deklaracji import:
System.out.println(Math.sqrt(2));

Plik powinien zawierać deklarację klasy publicznej – przed nazwą klasy muszą pojawić się słowa kluczowe public class. Jej nazwa musi odpowiadać nazwie pliku. Dlatego klasę Program zdefiniowaliśmy w pliku Program.java, a klasę KolejnyProgram zapiszemy w pliku KolejnyProgram.java. Nazwy klas muszą zaczynać się literą, znakiem podkreślenia lub dolara, a mogą zawierać jedynie wielkie i małe litery łacińskie, cyfry oraz znaki podkreślenia i dolara. Przyjmuje się, że nazwy klas zaczynają się wielką literą, a wieloczłonowe nazwy są sklejone, np. KolejnyProgram.

Po nazwie klasy następuje nawias klamrowy oznaczający ciało klasy. Przyjmuje się stosowanie wcięć, które można wstawić automatycznie, wciskając Ctrl + Alt + L.

W ramach ciała klasy możemy zdefiniować metody, np. main, które mogą mieć określony rodzaj dostępu (np. public) oraz mogą być zadeklarowane jako statyczne. Deklaracja metody musi określić typ danej zwracanej przez metodę. W przypadku metody main jest to typ void, co oznacza brak zwracanej wartości (podobnie jak w języku C++).

Przyjmuje się, że nazwy metod są tworzone podobnie do nazw klas, z tym że zaczynają się one małą literą. W nawiasach po nazwie metody określona jest lista parametrów formalnych ( parametrów) metody. Parametry są oddzielone przecinkami, a każdy z nich jest określony typem i nazwą. W przypadku metody main() mamy jeden parametr o typie String[] (tablica łańcuchów znaków).

W treści („ciała”) metody możemy deklarować zmienne, przypisywać im wartości i wykonywać inne instrukcje.

Po większości deklaracji i instrukcji występuje średnik. Gdy deklaracja lub instrukcja zawiera blok  (nawiasy klamrowe), średnik nie jest wymagany.

We wszystkich nazwach zmiennych, klas, metod itp. wielkie i małe litery są rozróżniane, więc np. napis i Napis będą oznaczać dwie różne zmienne (klasy, metody).

1.3. Etapy tworzenia programu

Kod źródłowy programu napisanego w języku Java (pliki z rozszerzeniem java) jest kompilowany do postaci pośredniej (ang. bytecode) zapisywanej jako pliki z rozszerzeniem class. To zadanie jest realizowane przez kompilator wchodzący w skład JDK. Postać pośrednia nie zawiera instrukcji wewnętrznego języka procesora i jest niezależna od rodzaju procesora, na którym będzie uruchomiony skompilowany program. W naszym projekcie pliki ze skompilowanymi źródłami znajdują się w podkatalogu /out.

Kompilacja do postaci pośredniej uda się jedynie, gdy kod źródłowy jest napisany poprawnie składniowo i będzie się poprawnie odwoływał do istniejących zmiennych, klas itp.

Aby uruchomić skompilowany program, należy użyć odpowiedniego dla niego procesora i systemu operacyjnego środowiska uruchomieniowego (JRE z ang. – Java Runtime Environment), które zamieni kod pośredni na instrukcje procesora. Dopiero wykonanie tych instrukcji będzie skutkowało faktycznym uruchomieniem programu. Wynika z tego, że do napisania programu w języku Java potrzebne jest JDK, ale do jego uruchomienia wystarczy jego część, czyli JRE.

Nawet poprawnie skompilowany i uruchomiony program należy przetestować, aby upewnić się, że rzeczywiście rozwiązuje on zadany problem. Dlatego właśnie kolejnym etapem tworzenia programu jest testowanie. Będziemy testować nasze programy, uruchamiając je dla wielu różnych danych i samodzielnie zweryfikujemy ich wyniki.

Cały ten proces jest wspomagany przez IDE, które nie tylko pozwala na uruchomienie programu, ale również na bieżąco zaznacza błędy w pisanym programie, sugeruje kolejne jego elementy i udostępnia wiele szybkich sposobów na wykonanie częstych czynności.

Ćwiczenie 2.

W ciele metody napisz sout i zatwierdź sugestię klawiszem Enter tak jak na rysunku 9. Możesz też podobnie napisać main w ciele klasy.

Rys. 9. Użycie skrótu „sout” w IDE

1.4. Błędy kompilacji w programie Java

Kod źródłowy, który zawiera błędy składniowe, nie może zostać skompilowany. IDE na bieżąco sprawdza poprawność kodu i zaznacza błędy. Czasami nawet oferuje automatyczne rozwiązania.

Rys. 10. Błędy wykryte przez IDE

Na rysunku 10. widać, że IDE znajduje nie tylko błędy uniemożliwiające kompilację, ale również literówki i błędy ortograficzne w komentarzach. Domyślnie IDE rozpoznaje w komentarzach wyłącznie słowa z języka angielskiego. Aby dodać polski słownik, należy kliknąć w głównym menu File/Settings/Editor/Natural Languages i dodać kolejny język – polski.

Jeżeli spróbujemy uruchomić program zawierający błędy kompilacji, również zostaniemy o nich powiadomieni w okienku Build (po wybraniu opcji Build/Build Project) – rys. 11.

Rys. 11. Błąd kompilacji przy próbie uruchomienia programu

Ćwiczenie 3. Poznajemy etapy tworzenia programu w języku Java

  1. Utwórz nowy plik źródłowy i napisz program wyświetlający na ekranie napis „Zaczynamy lekcje z programowania w języku Java!”.
  2. Zapisz program w pliku pod nazwą Napis.
  3. Skompiluj i uruchom program. Jeśli kompilator wykrył błędy, popraw je. Zapisz program w pliku pod tą samą nazwą. Ponownie skompiluj i uruchom program.

2. Stosowanie zmiennych w języku Java

Chcemy obliczyć iloczyn dwóch liczb całkowitych. Jak napisać program w języku Java umożliwiający wprowadzenie dwóch liczb całkowitych z klawiatury, obliczający ich iloczyn i wyprowadzający wynik obliczeń na ekran?

Program, który utworzyliśmy w ćwiczeniu 1., wyświetlał na ekranie napis – nie używaliśmy w nim zmiennych i nie wykonywaliśmy obliczeń. Struktura kolejnych programów będzie bardziej rozbudowana, m.in. dodamy deklarację zmiennych.

Zmienną deklarujemy, podając jej typ oraz nazwę. Nazwy zmiennych tworzymy tak samo jak nazwy metod. Zmienna, której nie nadamy wartości, jest bezużyteczna, bo odwołanie do takiej zmiennej powoduje błąd kompilacji. Z tego powodu na ogół jednocześnie z deklaracją zmiennej nadajemy jej wartość, czyli ją inicjalizujemy.

int zmienna; // zmienna typu całkowitego zmienna = 5; // przypisanie wartości całkowitej double zmiennaDouble = 3.02; // zmienne typu rzeczywistego float kolejnaZmienna = 3.02F; // zmienna przechowująca ciąg znaków String napis = "To jest mój napis";

Rys. 12. Deklaracja zmiennych różnych typów i inicjalizacja tych zmiennych

Jak wiemy, typ zmiennej oznacza rodzaj danej, którą można zapisać w danej zmiennej. Typy double i float służą do przechowywania liczb rzeczywistych. Różnią się zakresem i precyzją (Java preferuje typ double). Szczegółowe dane o typach w Javie zawarto w tabeli 1.

W praktyce najczęściej korzysta się głównie z typów boolean, int, double i String. Pozostałych typów używamy, gdy pojawi się szczególna potrzeba, np. konieczność oszczędzania pamięci albo obsługi bardzo dużych liczb.

Nazwa typu Opis Zakres Deklaracja i inicjalizacja zmiennej
boolean Wartość logiczna true / false
(prawda / fałsz)
boolean zmiennaLogiczna = true;
byte Liczba całkowita 〈-128, 127〉 byte b = -122;
short 〈-32768, 32767〉 short niewielkaLiczba = 455;
int 〈-231, 231-1〉 int liczba = -5458934;
long 〈-263, 263-1〉 long duzaLiczba = 99999999999L;
float Liczba rzeczywista 32-bitowa liczba rzeczywista float kolejnaLiczba = 102.444F;
double 64-bitowa liczba rzeczywista dobule liczbaRzeczywista = -42343.23;
char Znak Znak Unicode char znak = 'A’;
char znakNowejLinii = '\n’;
String Ciąg znaków Ciąg znaków Unicode String ciagZnakow = ″To jest jakiś napis″;
Tabela 1. Typy w języku Java
Java jest językiem obiektowym, więc można w nim również definiować klasy i używać ich jako typów zmiennych.

2.1. Wykonywanie obliczeń

W języku Java obliczenia możemy zapisywać, korzystając z instrukcji przypisania oraz operatorów arytmetycznych. Operatory w języku Java są takie same jak w języku C++: + (dodawanie), – (odejmowanie), * (mnożenie), / (dzielenie) oraz % (reszta z dzielenia). Operator / oznacza dzielenie, w zależności od typu danych – całkowite (z obcięciem części ułamkowej) lub zmiennoprzecinkowe (z zachowaniem części ułamkowej), a operator % – obliczenie reszty z dzielenia dwóch liczb całkowitych.

Operator
 
 
Działanie Przykład instrukcji przypisania Wynik działania dla danych:
a = 11 i b = 4
 
+ dodawanie suma = a + b; 11 + 4 = 15
odejmowanie roznica = a – b; 11 – 4 = 7
* mnożenie iloczyn = a * b; 11 * 4 = 44
/ dzielenie w zależności
od typu danych:
  • całkowite (z obcięciem części ułamkowej) – dla wartości typu całkowitego
iloraz = a / b; 11 / 4 = 2
  • zmiennoprzecinkowe (z zachowaniem części ułamkowej) – jeśli przynajmniej jedna liczba jest wartością typu rzeczywistego
iloraz = a / b; 11 / 4 = 2.75
% obliczenie reszty z dzielenia dwóch liczb całkowitych reszta = a % b; 11 % 4 = 3
Tabela 2. Podstawowe operatory arytmetyczne w języku Java (takie same jak w języku C++)

2.2. Wprowadzanie danych z klawiatury

Dane z klawiatury możemy wprowadzić za pomocą obiektu klasy Scanner. Na rysunku 13. użyto do przypisania nowego obiektu do zmiennej nazwy scanner dla zmiennej, ale zapisano ją z małej litery (Nazwy Scanner i scanner to dwie różne nazwy, bo w języku Python wielkie i małe litery w nazwach traktowane są odmiennie).

package pl.migra.ir.java; // zaimportowanie klasy Scanner import java.util.Scanner; public class WczytywanieZKlawiatury { public static void main(String[] args) { // tworzenie obiektu Scanner czytającego standardowe wejście // przypisanie nowego obiektu do zmiennej Scanner scanner = new Scanner(System.in); // deklaracja dwóch zmiennych int a, b; // wczytanie pierwszej wartości a = scanner.nextInt(); // wczytanie drugiej wartości b = scanner.nextInt(); // obliczenie iloczynu int iloczyn = a * b; // wypisanie iloczynu na ekran System.out.println(iloczyn); } }

Rys. 13. Wprowadzanie danych z klawiatury

Po uruchomieniu tego programu w IDE trzeba kliknąć w obszar wyników ekranu, żeby przenieść tam kursor i wprowadzić dane.

Rys. 14. Uruchomienie programu do wprowadzania danych

Klasa Scanner może być użyta do wczytania wielu typów danych. W tym celu można skorzystać z metod podanych w tabeli 2.

Metoda Typ zwracany Przykładowy tekst do wpisania
nextBoolean() boolean true
nextByte() byte 120
nextShort() short 222
nextInt() int 54305
nextLong() long -34353453
nextFloat() float 102,22
nextDouble() double -203,33
nextLine() String Dowolny tekst w jednej linii
Tabela 3. Metody klasy Scanner i ich działanie
Uwaga! Język Java uwzględnia ustawienia językowe systemu operacyjnego, w związku z tym w polskiej wersji systemu Windows dane – liczby rzeczywiste zawierające część ułamkową – wpisujemy z przecinkiem, natomiast w kodzie programu używamy kropki.

Ćwiczenie 4. Stosujemy zmienne w programie

  1. Przepisz program z rysunku 13. Skompiluj program, uruchom go oraz przetestuj.
  2. Zapisz program w pliku pod nazwą Iloczyn.
  3. Sprawdź zachowanie programu dla poprawnych i dla niepoprawnych danych:
  • zamiast liczb wpisz teksty,
  • użyj bardzo dużych liczb,
  • wpisz liczby rzeczywiste zamiast liczb całkowitych.

3. Wyprowadzanie komunikatów i wyników działania programu na ekran monitora

W ćwiczeniach 1., 2. i 3. wyprowadzaliśmy komunikaty na ekran monitora, używając polecenia: System.out.println("Komunikat").

W języku Java System to nazwa klasy z pakietu java.lang. Ten pakiet jest zawsze domyślnie importowany i nie trzeba tego zapisywać. System.out to zmienna, która reprezentuje standardowe wyjście, czyli najczęściej terminal tekstowy wyświetlany na ekranie komputera. System.out.println() to metoda, która wypisuje daną będącą parametrem metody i przechodzi do nowej linii.

Jako argument do tej metody możemy użyć dowolnego wyrażenia typu String, boolean, int albo double. Wyrażeniem może być zmienna, wynik operacji lub konkretna wartość.

Operator + (dodawanie) może być również użyty do łączenia łańcuchów znaków. Np. "Napis" + " i jego dalszy ciąg" tworzy ciąg znaków "Napis i jego dalszy ciąg". Podobnie gdy użyjemy tego operatora, mając po jednej stronie ciąg znaków, a po drugiej zmienną liczbową, wynikiem będzie ciąg znaków z dołączoną tekstową reprezentacją liczby. Przykładowo w wyniku da "To jest liczba 2.0".

package pl.migra.ir.java; public class Komunikaty { public static void main(String[] args) { System.out.println("Komunikaty o liczbach"); int liczba = 155; System.out.println("Liczba to: " + liczba); int drugaLiczba = liczba + 33; System.out.println(drugaLiczba); System.out.println(drugaLiczba + 10); } }

Rys. 15. Przykładowe komunikaty wykorzystujące zmienne

Ćwiczenie 5. Dodajemy komunikaty do programu

  1. Do programu z ćwiczenia 3. dodaj komunikaty zachęcające do wprowadzenie liczb i prezentujące wynik.
  2. Zapisz plik pod tą samą nazwą.

Zadania

  1. Zmień program z ćwiczenia 3., aby przyjmował liczby rzeczywiste zamiast całkowitych. Zmień deklaracje zmiennych i wywoływaną metodę z obiektu Scanner.
  2. Napisz program obliczający pole powierzchni prostokąta dla danych długości boków a i b, wprowadzanych z klawiatury. Po uruchomieniu programu na ekranie powinny pojawiać się w kolejnych wierszach komunikaty: „Podaj długość boku a:”, „Podaj długość boku b:”. Po podaniu danych, w trzecim wierszu powinny wyświetlić się: napis „Pole prostokąta wynosi” oraz wartość pola. Zapisz program w pliku pod nazwą Pole.
  3. Napisz program realizujący algorytm obliczania kwadratu i sześcianu wprowadzanej z klawiatury liczby rzeczywistej. Zapisz program w pliku pod nazwą Potegi.
  4. Napisz program obliczający drogę S przebytą w czasie t przez pojazd poruszający się ze średnią prędkością v. Zapisz program w pliku pod nazwą Droga.
  5. Otwórz plik przekazany przez nauczyciela. W pliku zapisano program zawierający błędy, pokazany na rysunku 16. Po wprowadzeniu z klawiatury liczby program powinien wyświetlić na ekranie liczbę o 2 większą od wprowadzonej. Skompiluj program. Jakie błędy pojawiły się w zapisie programu? Zmodyfikuj program, aby działał poprawnie. Zapisz ponownie plik pod tą samą nazwą, skompiluj program, uruchom go i sprawdź jego działanie.

    Rys. 16. Niepoprawny program do zadania 5.
  6. Napisz program do zadania: Jaki procent liczby a stanowi liczba b? Zapisz program w pliku pod nazwą Procenty.
  7. Dla zainteresowanych
  8. Dane są suma i iloczyn dwóch liczb całkowitych. Napisz program znajdujący te liczby. Zapisz program w pliku pod nazwą Liczby.