Temat C12. Stosowanie tablic w Języku Java

przez | 7 listopada 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 C3 z podręcznika „Teraz bajty. Informatyka dla szkół ponadpodstawowych. Zakres podstawowy. Klasa II” albo z tematami 63-64 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;
  3. 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:
  4. sprawnie posługuje się zintegrowanym środowiskiem programistycznym przy pisaniu, uruchamianiu i testowaniu programów;

Spis treści

  1. Tablice w języku Java
  2. Deklarowanie zmiennych przechowujących tablice
  3. Tworzenie i inicjalizowanie tablic
  4. Dostęp do elementów tablicy
  5. Tablice wielowymiarowe

1. Tablice w języku Java

W języku Java odpowiednikiem zmiennej indeksowanej są tablice.

Tablice wykorzystujemy do przechowywania stałej liczby uporządkowanych elementów tego samego typu, do których odwołujemy się za pomocą indeksu.

Podobnie jak w języku C++, tablice w języku Java przed użyciem należy zadeklarować i utworzyć. Do elementów tablicy można się odwołać, wykorzystując nawiasy kwadratowe. Indeksy elementów tablicy zaczynają się od zera.

Tablica ciągów znaków jest parametrem metody main(), której używaliśmy w poprzednich tematach.

Przykład 1. Program prezentujący tablice w języku Java

// plik tablice.java
package pl.migra.ir.java; public class Tablice {
   // metoda main z parametrem typu tablicy ciągów znakowych
   public static void main(String[] args) {        int[] pierwszaTablica;          // deklaracja zmiennej przechowującej tablicę
       pierwszaTablica = new int[10];  // utworzenie tablicy z 10 elementami o domyślnych wartościach
       pierwszaTablica[5] = 7;         // przypisanie wartości elementowi tablicy
       wypiszTablice(pierwszaTablica); // wypisanie zawartości tablicy        // deklaracja zmiennej przechowującej tablicę, nawias za nazwą zmiennej
       // oraz jednoczesne utworzenie tablicy z elementami o podanych wartościach
       int drugaTablica[];
       drugaTablica = new int[] {1, 2, 3};
       wypiszTablice(drugaTablica);        // deklaracja zmiennej przechowującej tablicę
       // oraz jednoczesne utworzenie tablicy z elementami o podanych wartościach
       int[] trzeciaTablica = {1, 2, 3, 4, 10};
       wypiszTablice(trzeciaTablica);
   }    // metoda wypisująca zawartość tablicy na ekran
   private static void wypiszTablice(int[] tablica) {
       int liczbaElementow = tablica.length; // odczytanie liczby elementów tablicy
       for (int i = 0; i < liczbaElementow; i++) {
           int elementTablicy = tablica[i]; // odczytanie elementu tablicy
           System.out.print(elementTablicy + " ");
       }
       System.out.println(); // przejście do nowej linii po wypisaniu elementów tablicy
   }
}

Ćwiczenie 1. Poznajemy stosowanie tablic w języku Java

  1. Otwórz projekt Tablice, w którym zapisano wszystkie programy potrzebne do rozwiązania ćwiczeń z tematu C8.
  2. Otwórz plik Tablice.java. Skompiluj i uruchom program.
  3. Wyjaśnij, co się dzieje w poszczególnych częściach programu. Zapisz treść zadania realizowanego przez program, wymień również zadania cząstkowe, które są realizowane przez poszczególne metody.

2. Deklarowanie zmiennych przechowujących tablice

Tablice w języku Java można zadeklarować na dwa sposoby różniące się pozycją nawiasów kwadratowych.

Deklaracja zmiennejPrzykład
Sposób 1.typ[] nazwaZmiennej;int[] pierwszaTablica;
Sposób 2.typ nazwaZmiennej[];int drugaTablica[];

Oba sposoby realizują dokładnie to samo zadanie, ale częściej używa się pierwszego, ponieważ  jest czytelniejszy. Drugi sposób jest taki sam jak metoda znana z języka C++. IDE podpowiada automatyczną zmianę na pierwszy sposób (rys. 1.).

Rys. 1. Sugestia IDE dotycząca stylu deklarowania tablicy

3. Tworzenie i inicjalizowanie tablic

Podobnie jak w przypadku innych zmiennych, zmiennej przechowującej tablicę należy nadać wartość. Oznacza to zarezerwowanie pamięci na wszystkie elementy tablicy. Można to zrobić na wiele sposobów.

Deklaracja i utworzenie tablicy 10 liczb całkowitych z elementami o domyślnych wartościach. Drugą instrukcję można również połączyć w jedną instrukcję z deklaracją.int[] pierwszaTablica; pierwszaTablica = new int[10];
Deklaracja i utworzenie tablicy z elementami o podanych wartościach. Liczba elementów tablicy zostanie ustalona na podstawie tych wartości. Drugą instrukcję można również połączyć w jedną instrukcję z deklaracją.int[] drugaTablica;
drugaTablica = new int[] {1, 2, 3};
Skrócona postać deklaracji i utworzenie tablicy z zadanymi wartościami. Nie można ich w tej formie rozdzielić.int[] trzeciaTablica = {1, 2, 3, 4, 10};

Jeżeli tablicę utworzono bez podawania wartości elementów, to ich początkowa wartość jest równa:

  • zero – dla typów liczbowych,
  • false – dla typu logicznego boolean.
Tablice w języku Java są obiektami i mają swoje pola oraz metody. W polu length tablice przechowują swój rozmiar, więc nie ma konieczności przechowywania go w dodatkowej zmiennej.


Rozmiar tablicy ustalamy podczas jej tworzenia i nie można go później zmienić. Można natomiast przypisać do zmiennej nową tablicę tego samego typu, ale innego rozmiaru.

int liczbaElementow = tablica.length;

Tablice są indeksowane od zera (podobnie jak w językach C++ i Python), co oznacza, że dla tablicy t będą istnieć elementy o indeksach od 0 aż do t.length-1 włącznie.

Ćwiczenie 2. Inicjalizujemy dużą tablicę

  1. Napisz program, który utworzy tablicę zawierającą liczby całkowite od 1 do 100. Do inicjalizacji wartości elementów użyj pętli for.
  2. Czy da się użyć w tym celu innego sposobu nadania wartości elementom tablicy? Czy jest to wygodne?
  3. Zmień program tak, aby tablica zawierała liczby od 1 do n, gdzie n jest wczytywane z klawiatury.

4. Dostęp do elementów tablicy

Po utworzeniu możemy odczytać wartości elementów tablicy oraz przypisać im nowe wartości. Aby odwołać się do konkretnego elementu tablicy, należy użyć nawiasów kwadratowych.

Odczyt elementu tablicyint elementTablicy = tablica[i];
Zapis nowej wartości do elementu tablicypierwszaTablica[5] = 7;

Częstą operacją jest iterowanie po elementach tablicy. Taka operacja jest wykorzystywana w metodzie wyprowadzającej wartości elementów tablicy na ekran.

// metoda wypisująca zawartość tablicy na ekran
private static void wypiszTablice(int[] tablica) {
   // odczytanie liczby elementów tablicy
   int liczbaElementow = tablica.length;
   for (int i = 0; i < liczbaElementow; i++) {
       // odczytanie elementu tablicy
       int elementTablicy = tablica[i];
       System.out.print(elementTablicy + " ");
   }
   // przejście do nowej linii po wypisaniu elementów tablicy
   System.out.println();
}
Rys. 2. Metoda wyprowadzająca elementy tablicy na ekran.

IDE podpowiada inną postać pętli for, która realizuje to samo zadanie bez użycia nawiasów kwadratowych i indeksów. Jest to forma pętli bardzo podobna do tej znanej z języka Python.

// metoda wypisująca zawartość tablicy na ekran
private static void wypiszTablice(int[] tablica) {
   // odczytanie liczby elementów tablicy
   for (int elementTablicy : tablica) {
       // odczytanie elementu tablicy
       System.out.print(elementTablicy + " ");
   }
   // przejście do nowej linii po wypisaniu elementów tablicy
   System.out.println();
}
Rys. 3. Metoda wyprowadzająca elementy tablicy na ekran z użyciem pętli bez indeksu

Kiedy w wyniku błędu w programie spróbujemy się odwołać do elementu tablicy o indeksie spoza przedziału ⟨0; rozmiar_tablicy-1⟩, program zakończy działanie i wyświetli komunikat o błędzie.

Ćwiczenie 3. Modyfikujemy elementy tablicy

  1. Otwórz plik Tablice.java.
  2. Dodaj metodę przyjmującą tablicę jako parametr i zwiększającą każdy jej element o 1.
  3. Użyj dodanej metody i sprawdź jej działanie dla różnych tablic.

5. Tablice wielowymiarowe

Podobnie jak w innych językach programowania, w języku Java można definiować wielowymiarowe tablice. W takim wypadku przy deklaracji dostawiamy więcej niż jedną parę nawiasów kwadratowych.

Przykład 2. Deklarowanie tablicy dwuwymiarowej

// deklaracja i stworzenie tablicy
String[][] tablicaZDomslnymiWartosciami = new String[3][3];
// wyprowadzenie wartości elementu na ekran
System.out.println(tablicaZDomslnymiWartosciami[0][1]);
// ustawienie wartości
tablicaZDomslnymiWartosciami[0][1] = "wartość";
// ponowne wyprowadzenie wartości elementu na ekran
System.out.println(tablicaZDomslnymiWartosciami[0][1]);

W przykładzie 2. tworzymy tablicę dwuwymiarową o wymiarach 3 X 3, która może przechowywać ciągi znaków, czyli obiekty String. Obiekty nie posiadają wartości domyślnej, więc wszystkie elementy tablicy będą miały wartość null, co oznacza brak obiektu. W przykładzie ustawiamy również wartość jednego z elementów tablicy i  wyświetlamy ją na ekranie.

Przykład 3. Deklarowanie tablicy z podanymi wartościami

// deklaracja i stworzenie tablicy z podanymi wartościami
String[][] roznejDlugosciWiersze = {
       {"A0", "A1", "A2"},
       {"B0", "B1", "B2", "B3"},
       {"C0", "C1", "C2", "C3", "C4"},
       {},
       {"E0"}
};
for(String[] wiersz : roznejDlugosciWiersze) {
   wypiszTabliceJednowymiarowa(wiersz);
}

Tablice wielowymiarowe są w istocie tablicami, których wartościami są inne tablice. Dlatego też ich „wiersze” mogą mieć różne długości. Można się również odwoływać do pojedynczych „wierszy” takiej tablicy, jak w przykładzie 3. Zauważmy, że jeden z wierszy tablicy jest tablicą o długości 0, czyli pustą tablicą. Deklarując tablice wielowymiarowe i inicjalizując ich wartości, warto pamiętać o formatowaniu kodu w taki sposób, aby na pierwszy rzut oka można było zorientować się co do ich struktury („kształtu”).
W przykładzie 3. wykorzystujemy metodę pomocniczą do wyprowadzenia tablicy jednowymiarowej na ekran, którą przedstawiamy w przykładzie 4.

Przykład 4. Wyprowadzenie tablicy jednowymiarowej na ekran

// metoda wypisująca zawartość tablicy na ekran
private static void wypiszTabliceJednowymiarowa(String[] tablica) {
   System.out.println(String.join(" ", tablica));
}

W przykładzie 4. wykorzystujemy przydatną metodę statyczną join z klasy String, która tworzy ciąg znaków, łącząc ciągi będące elementami podanej tablicy (drugi argument) i dodatkowo rozdzielając je podanym ciągiem znaków (pierwszy argument). Tę metodę można również stosować, podając ciągi znaków do złączenia jako oddzielne argumenty, jak pokazano poniżej:

String.join("-", "Łączenie", "różnych", "napisów")

Wynikiem tego wywołania będzie ciąg znaków "Łączenie-różnych-napisów".

Ćwiczenie 4. Poznajemy stosowanie tablic wielowymiarowych w języku Java

  1. Otwórz plik TabliceWielowymiarowe.java. Skompiluj i uruchom program.
  2. Wyjaśnij, co się dzieje w poszczególnych częściach programu. Zapisz treść zadania realizowanego przez ten program, w tym wymień zadania cząstkowe realizowane przez poszczególne metody.

Aby dowiedzieć się więcej o metodach oraz innych elementach, można skorzystać z dokumentacji prezentowanej w IDE. Wystarczy, trzymając kursor w nazwie metody, nacisnąć Ctrl + Q – IDE zaprezentuje okienko z dokumentacją w języku angielskim.

Rys. 4. Dokumentacja pokazywana w IDE po użyciu skrótu Ctrl + Q

Zadania

  1. Napisz program, który umożliwi wprowadzenie dziesięciu liczb rzeczywistych i wyprowadzenie ich w kolumnie na ekranie, ale w odwrotnej kolejności.
  2. Napisz program, który wczytuje liczby całkowite do tablicy ośmioelementowej, a wypisuje na ekran indeks elementu tablicy lub listy, którego wartość wynosi zero. Jeśli nie ma takiego elementu, program powinien wyświetlić komunikat „brak elementu zerowego”.
  3. Napisz program obliczający sumę elementów umieszczonych na głównej przekątnej tablicy (elementy tablica[0][0], tablica[1][1], tablica[2][2] itd.) składającej się z 5×5 liczb całkowitych.
  4. Dla zainteresowanych
  5. Z ciągu n liczb naturalnych wypisz liczby, których suma cyfr jest większa od 100. W programie wykorzystaj metodę sumaCyfr(liczba), która obliczy sumę cyfr liczby podanej jako parametr. W celu obliczenia wartości cyfry skorzystaj z możliwości obliczenia reszty z dzielenia przez 10.
  6. Napisz program, który wyświetli „tabliczkę mnożenia” dla liczb naturalnych z zakresu ⟨1; 10⟩. Zastosuj tablicę dwuwymiarową.
  7. Napisz program do gry w kółko i krzyżyk. Zastosuj dwuwymiarową tablicę ciągów znaków.