Temat C10. Stosowanie instrukcji warunkowej i iteracyjnych w języku Java

przez | 29 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 C4 i C5 z podręcznika „Teraz bajty. Informatyka dla szkół ponadpodstawowych. Zakres podstawowy. Klasa I” albo z tematami 55-60 lub 67-72 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. Instrukcja warunkowa w języku Java
    1. Operatory porównania
    2. Operatory logiczne
  2. Instrukcje iteracyjne
    1. Instrukcja for
    2. Instrukcja while
    3. Instrukcja do … while

1. Instrukcja warunkowa w języku Java

Problem: Chcemy napisać program sprawdzający, czy wprowadzona z klawiatury liczba jest dodatnia czy niedodatnia (ujemna albo równa zero). W jaki sposób napisać program realizujący sytuację warunkową w języku Java?

Aby napisać program realizujący algorytm z warunkami w języku Java, korzystamy z instrukcji warunkowej, której postać jest taka sama jak w języku C++, a działanie takie samo jak w językach C++ i Python.

Instrukcja warunkowa if (warunek1) {
    lista_instukcji1;
} else if(warunek2) {
    lista_instukcji2;
} else {
    lista_instrukcji3;
}
kolejna_instrukcja;
Uproszczona postać instrukcji warunkowej,
bez else if
if (warunek) {
    lista_instukcji1;
} else {
    lista_instrukcji2;
}
kolejna_instrukcja;
Uproszczona postać instrukcji warunkowej,
tylko instrukcja if
if (warunek) {
    lista_instukcji1;
}
kolejna_instrukcja;

Działanie instrukcji warunkowej jest w większości języków programowania podobne. Sprawdzany jest warunek logiczny (po słowie kluczowym if) – jeśli jest prawdziwy, wykonywana jest instrukcja (instrukcje) umieszczona (umieszczone) po warunku (lista_instrukcji1); jeśli fałszywy – sprawdzamy kolejny warunek zdefiniowany po else if. Jeżeli ten warunek jest prawdziwy, to wykonywana jest lista_instrukcji2; jeżeli jednak i ten warunek jest fałszywy, to wykonywana jest instrukcja (instrukcje) po słowie else (lista_instrukcji3), a jeśli brak tej części instrukcji – wykonywana jest od razu kolejna_instrukcja zapisana po instrukcji warunkowej.

Jako lista_instrukcji1 i lista_instrukcji2 mogą wystąpić również kolejne instrukcje warunkowe lub blok instrukcji (blok kodu). W języku Java (podobnie jak w języku C++) blok instrukcji wyznaczają nawiasy klamrowe {}. Jeżeli w liście instrukcji jest tylko jedna instrukcja, to można pominąć nawiasy klamrowe, chociaż często pozostawia się je nawet w takim przypadku aby zachować czytelność kodu.

Warunek w instrukcji musi być wyrażeniem zwracającym wartość logiczną prawda/fałsz i może być:

  • odwołaniem do zmiennej typu boolean,
  • prostym porównaniem,
  • złożonym warunkiem logicznym.
Rys. 1. Program z instrukcją warunkową sprawdzającą wartość zmiennej i wynik jego uruchomienia

Zauważmy, że na rysunku 1. IDE zakreśliło wykorzystanie zmiennej a w warunku instrukcji if. To dlatego, że IDE wykryło, że wartość tej zmiennej zawsze będzie równa false, i że właściwie można uprościć całą instrukcję warunkową.

Dodatkowo widać tu również, że aby umieścić znak cudzysłowu w ramach literału String, należy poprzedzić go odwrotnym ukośnikiem \.

Warunki często buduje się również wykorzystując operatory porównania i operatory logiczne.

1.1. Operatory porównania

Operator Opis Przykład Znaczenie
== równy a == b a równe b
!= różny a != b a różne od b
mniejszy a < b a mniejsze od b
większy a > b a większe od b
<= mniejszy lub równy a <= b a mniejsze lub równe b
>= większy lub równy a >= b a większe lub równe b
Tabela 1. Operatory porównania w języku Java

Zauważmy, że operator porównania to dwa znaki ==, a operator przypisania to jeden znak =. Jeżeli przy tworzeniu warunku pomylimy te dwa operatory, to kompilator wykryje to jako błąd. Jest to zachowanie różne od tego, znanego z C++.

Przykład 1. Instrukcja warunkowa z warunkiem wykorzystującym operator porównania

Zadanie: Oblicz wartość bezwzględną dowolnej liczby całkowitej.
Dane: dowolna liczba całkowita: x.
Wynik: wartość bezwzględna liczby x.

package pl.migra.ir.java; import java.util.Scanner; public class Porownanie {    public static void main(String[] args) {       System.out.println("Podaj liczbę x: ");       Scanner scanner = new Scanner(System.in);       int liczba = scanner.nextInt();       int wartoscBezwzgledna;       if (liczba < 0) {          wartoscBezwzgledna = -liczba;       } else {          wartoscBezwzgledna = liczba;       }       System.out.println("Wartość bezwzględna liczby x = " + wartoscBezwzgledna);    } }

Ćwiczenie 1. Realizujemy algorytm obliczania wartości bezwzględnej liczby w języku Java

  1. Otwórz projekt Warunki i Petle.zip, w którym są zapisane wszystkie programy potrzebne do rozwiązania ćwiczeń w temacie C6.
  2. Otwórz program Porownanie.java. Uruchom program.
  3. Przetestuj program i sprawdź, czy jest zgodny ze specyfikacją zadania. Wyjaśnij, która instrukcja zostanie wykonana, gdy warunek będzie prawdziwy, a która – gdy warunek będzie fałszywy.
  4. Uruchom program kilka razy dla różnych wartości.

1.2. Operatory logiczne

Problem: Właściciel sklepu z elektroniką zdecydował się na wprowadzenie promocji telewizorów polegającej na obniżeniu ceny bazowej o 10%. Telewizor jest objęty promocją, jeżeli jest wprowadzony do sprzedaży w poprzednim roku i nie jest już objęty żadną inną promocją.

Jest to przykład sytuacji warunkowej z warunkiem logicznym złożonym. Jeśli rok wprowadzenia do sprzedaży i inne promocje danego telewizora spełniają pewne warunki, to telewizor jest objęty nową promocją. Mamy tu do czynienia z logiczną koniunkcją. Zastosujemy zatem instrukcję warunkową z warunkiem złożonym. W instrukcjach warunkowych warunki złożone zapisujemy, stosując odpowiednie operatory logiczne (tabela 2.).

Operator Określenie Przykład warunku logicznego Interpretacja wyrażenia
&& koniunkcja logiczna (lub) a < 10 && a > -10 a mniejsze niż 10 i a większe niż -10
|| alternatywa logiczna (i) a < -5 || a > 5 a mniejsze od –5 lub a większe od 5
! negacja logiczna (nie) !b nie b
Tabela 2. Operatory logiczne w języku Java

Kolejność wykonywanych operacji, o ile nie zastosowano nawiasów, jest następująca: najpierw negacja, później koniunkcja, a na końcu alternatywa. Poniższe zapisy są równoważne:

!a || b && c ((!a) || (b && c))

Przykład 2. Zapisywanie algorytmu z warunkiem logicznym złożonym w języku Java

Zadanie: Właściciel pewnego sklepu z elektroniką zdecydował się na wprowadzenie promocji na telewizory. Napisz program, który poda czy telewizor jest objęty promocją w przypadku, gdy rok wprowadzenia do sprzedaży (rokWprowadzenia) jest równy 2021 i nie jest objęty żadnymi innymi promocjami (innePromocje).

Dane:

  • liczba rzeczywista większa od zera cena, oznaczająca pierwotną cenę telewizora z złotych,
  • liczba całkowita większa od zera rokWprowadzenia, oznaczająca rok wprowadzenia telewizora do sprzedaży,
  • wartość logiczna innePromocje, oznaczająca istnienie innych promocji na dany telewizor.

Wynik: liczba rzeczywista oznaczająca cenę telewizora z możliwym uwzględnieniem nowej promocji.

Opis rozwiązania: W rozwiązaniu zastosujemy instrukcję warunkową (w wersji uproszczonej) z warunkiem złożonymzawierającym operator koniunkcji && i negacji !. Zastosujemy wersję uproszczoną, ponieważ niezależnie od tego, czy warunek zostanie spełniony czy nie, na ekranie ma się wyświetlać aktualna cena telewizora.

package pl.migra.ir.java; import java.util.Scanner; public class Promocja {    public static void main(String[] args) {       Scanner scanner = new Scanner(System.in);       System.out.println("Podaj cenę telewizora: ");       double cena = scanner.nextDouble();       System.out.println("Podaj rok wprowadzenia do sprzedaży: ");       int rokWprowadzenia = scanner.nextInt();       System.out.println("Czy są inne promocje?: ");       boolean innePromocje = scanner.nextBoolean(); // true albo false       if (rokWprowadzenia == 2021 && !innePromocje) {          cena = 0.9 * cena;       }       System.out.println("Cena telewizora: " + cena);    } }
Uwaga: W tym ćwiczeniu do przechowywania wartości pieniężnej użyliśmy zmiennej typu rzeczywistego (double), aby uprościć nasz program. W rzeczywistych zastosowaniach należy w takim celu używać klasy BigDecimal z pakietu java.math, ponieważ umożliwia ona kontrolę nad sposobem zaokrągleń (jej szczegóły są jednak poza zakresem tego materiału).

Ćwiczenie 2. Realizujemy algorytm z warunkiem logicznym złożonym w języku Java

  1. Otwórz program Propomocja.java (z projektu Warunki i Petle). Wyjaśnij, co się dzieje w poszczególnych wierszach programu. Dlaczego zastosowano instrukcję warunkową w wersji uproszczonej (bez części z else)? Uzasadnij odpowiedź.
  2. Wykonaj program dla kilku różnych wartości zmiennych.

Ćwiczenie 3. Realizujemy algorytm z warunkiem logicznym złożonym w języku Java

  1. W programie z ćwiczenia 2. zmień komunikat tak, aby w przypadku objęcia promocji jasno o tym informował. Np. „Promocyjna cena telewizora: ”.
  2. Dodaj możliwość wczytania wysokości promocyjnej obniżki z klawiatury z komunikatem np. „Podaj % zniżki: ”.

2. Instrukcje iteracyjne

Problem: Chcemy napisać program obliczający sumę n liczb. W algorytmie mamy do czynienia z powtarzaniem poleceń wprowadzania liczby i dodawania. W jaki sposób napisać program realizujący iterację w języku Java?

Aby w języku programowania napisać program realizujący algorytm iteracyjny, stosujemy instrukcje iteracyjne (zwane też instrukcjami pętli).

W języku Java są dostępne trzy instrukcje iteracyjne: for, while i do ... while i są one bardzo podobne do tych znanych z języka C++.

2.1. Instrukcja for

Instrukcję for możemy stosować, gdy liczba powtórzeń (iteracji) jest z góry określona lub wprowadzana z klawiatury po uruchomieniu programu. Do określania kroków iteracji (powtórzeń) w instrukcji for stosujemy zwykle tzw. zmienną sterującą.

Instrukcja iteracyjna for for(wyrażenie_początkowe; warunek; wyrażenie_pętli) {
   lista_instrukcji;
}

Najpierw wykonywane jest wyrażenie_początkowe(np. i = 0), zwykle ustalające wartość początkową zmiennej sterującej. Następnie, dopóki spełniony jest warunek, wykonywana jest lista_instrukcji, a potem obliczana wartość wyrażenia_pętli, służącego zazwyczaj do zwiększenia (lub zmniejszenia) wartości zmiennej sterującej. Jeżeli w liście instrukcji jest tylko jedna instrukcja, to można pominąć nawiasy klamrowe, chociaż często pozostawia się je nawet w takim przypadku, aby zachować czytelność kodu.

Zwyczajowo początkową wartość zmiennej sterującej przyjmuje się jako równą 0, a warunek zapisuje jako np. i < n (jeśli chcemy, aby liczba iteracji wynosiła n).

Wyrażenie i++ oznacza „zmiennej i przypisz wartość i zwiększoną o 1”. Jest to skrót instrukcji przypisania: i = i + 1.

Przykład 3. Instrukcja pętli for

Zadanie: Zbierasz pieniądze na zakup nowego komputera. Wpłacasz co miesiąc dowolną kwotę na swoje konto. Chcesz obliczyć sumę pieniędzy wpłaconych w ciągu roku. Jak zapisać rozwiązanie tego zadania w języku Java?

Dane: dwanaście dodatnich liczb rzeczywistych oznaczających kwoty miesięcznych wpłat.
Wynik: dodatnia liczba rzeczywista oznaczająca sumę wpłat.
Opis rozwiązania: W przedstawionym problemie powtarzają się dwie czynności: wprowadzania wpłacanej kwoty i powiększania sumy pieniędzy o tę kwotę. Mamy do czynienia z algorytmem iteracyjnym, w którym liczba powtórzeń (iteracji) jest z góry określona (pieniądze wpłacamy przez rok co miesiąc, czyli dwanaście razy). Wykorzystujemy instrukcję for, ponieważ z góry znamy liczbę wpłat, którą trzeba zsumować.

package pl.migra.ir.java; import java.util.Scanner; public class OszczedzanieRok {    public static void main(String[] args) {       Scanner scanner = new Scanner(System.in);       double suma = 0;       for(inti = 0; i< 12; i++) {          System.out.println("Podaj wpłatę: ");          suma = suma + scanner.nextDouble();       }       System.out.println("Suma wpłat: " + suma);    } }

Ćwiczenie 4. Stosujemy instrukcję iteracyjną for

  1. Otwórz program OszczedzanieRok.java (z projektu Warunki i Petle). Wyjaśnij, co się dzieje w poszczególnych wierszach programu.
  2. Wykonaj program dla kilku różnych wartości zmiennych.

2.2. Instrukcja while

Problem: Chcesz dalej oszczędzać na zakup nowego komputera, ponieważ potrzebna jest większa kwota. Zamierzasz wpłacać pieniądze, dopóki suma wpłat nie przekroczy potrzebnej kwoty. Jak przedstawić ten problem w wybranym języku programowania?

Nie wiemy z góry, ilu wpłat musimy dokonać, aby osiągnąć lub przekroczyć kwotę potrzebną na zakup komputera. Liczba iteracji zależy w tym przypadku od spełnienia warunku przekroczenia założonej kwoty.

Do zapisywania algorytmów iteracyjnych, w których liczba iteracji nie jest z góry określona, możemy zastosować instrukcje iteracyjne:

  • while,
  • do ... while.
Instrukcja iteracyjna while while(warunek) {
   lista_instrukcji;
}
kolejna_instrukcja;

Działanie pętli while: najpierw sprawdzany jest warunek; jeśli jest spełniony, to wykonywana jest lista_instrukcji. Wewnątrz bloku lista_instrukcji powinna być zawsze umieszczona instrukcja, która zmienia wartość warunku – w przeciwnym wypadku pętla nigdy się nie zakończy. W szczególnej sytuacji, gdy warunek od razu nie jest spełniony, lista_instrukcji w ogóle nie zostanie wykonana. Jeżeli w liście instrukcji jest tylko jedna instrukcja, to można pominąć nawiasy klamrowe, chociaż często pozostawia się je nawet w takim przypadku aby zachować czytelność kodu.

W realizacji algorytmów iteracyjnych ważne jest prawidłowe określenie sposobu zakończenia działań. Nieprawidłowe określenie tych warunków może spowodować, że obliczenia nigdy się nie zakończą, czyli nastąpi zapętlenie programu.

Przykład 4. Stosowanie instrukcji while w języku Java

Zadanie: Napisz program obliczający sumę wpłat aż do osiągnięcia lub przekroczenia założonej kwoty.

Dane:

  • dodatnia liczba rzeczywista oznaczająca kwotę potrzebną na zakup komputera,
  • ciąg dowolnych dodatnich liczb rzeczywistych oznaczających kolejne comiesięczne wpłaty.

Wynik: dodatnia liczba rzeczywista oznaczająca sumę wszystkich wpłat.

package pl.migra.ir.java; import java.util.Scanner; public class OszczedzanieKwota {    public static void main(String[] args) {       Scanner scanner = new Scanner(System.in);       System.out.println("Podaj potrzebną kwotę: ");       double kwota = scanner.nextDouble();       double suma = 0;       while(suma < kwota) {          System.out.println("Podaj wpłatę: ");          suma = suma + scanner.nextDouble();       }       System.out.println("Suma wpłat: " + suma);    } }

Ćwiczenie 5. Analizujemy, testujemy i modyfikujemy gotowy program

  1. Otwórz program OszczedzanieKwota.java (z projektu Warunki i Petle). Wyjaśnij, co się dzieje w poszczególnych wierszach programu. Sprawdź, czy program jest zgodny ze specyfikacją zadania. Uruchom i przetestuj program dla kilku różnych wartości zmiennych. Objaśnij działanie instrukcji while, m.in. odpowiedz na pytanie: Kiedy zostanie wykonana instrukcja System.out.println("Suma wpłat: " + suma);?
  2. Zmodyfikuj program, aby na ekranie wyświetlała się również bieżąca suma, uzyskana po każdej wpłacie, a na koniec − różnica pomiędzy kwotą wpłaconą a założoną (nadpłata). Dodaj odpowiednie komunikaty.

Ćwiczenie 6. Stosujemy instrukcję iteracyjną while

  1. Napisz specyfikację zadania i program, który będzie obliczał sumę liczb całkowitych wprowadzanych z klawiatury aż do wprowadzenia zera. Wprowadzenie zera kończy zliczanie. Wynik sumowania wyprowadź na ekran.
  2. Zapisz program w pliku pod nazwą SumaWhile.

Wskazówka: Na początku programu przypisz zmiennej liczba wartość różną od zera, np. 1, a zmiennej suma – 0. Początkową wartość można przypisać zmiennej podczas jej deklaracji: int liczba = 1, suma = 0;

2.3. Instrukcja do … while

Drugą instrukcją iteracyjną, którą możemy zastosować w przypadku, gdy nie znamy liczby iteracji jest instrukcja: do ... while.

Instrukcja iteracyjna do ... while do {
   lista_instrukcji;
} while (warunek);
kolejna_instrukcja;

W instrukcji do ... while najpierw jest wykonywana lista_instrukcji, a dopiero potem jest sprawdzany warunek. Instrukcje w pętli (lista_instrukcji) są wykonywane, dopóki warunek jest prawdziwy. Jeśli warunek jest fałszywy – wykonywana jest kolejna_instrukcja. Niezależnie od wartości początkowej warunku, lista_instrukcji zostanie wykonana przynajmniej raz. Jeżeli w liście instrukcji jest tylko jedna instrukcja, to można pominąć nawiasy klamrowe, chociaż często pozostawia się je nawet w takim przypadku, aby zachować czytelność kodu.

Przykład 5. Stosowanie instrukcji do ... while w języku Java

Zadanie: Napisz program zliczający napisy wprowadzane z klawiatury aż do wprowadzenia kropki. Wprowadzenie kropki kończy zliczanie. Wyprowadź na ekran odpowiedni komunikat i liczbę wprowadzonych napisów łącznie z kropką.

Dane: ciąg napisów wprowadzanych z klawiatury.

Wynik: liczba całkowita oznaczająca liczbę napisów wprowadzonych z klawiatury.

package pl.migra.ir.java; import java.util.Scanner; public class ZliczanieZnakow {    public static void main(String[] args) {       Scanner scanner = new Scanner(System.in);       String napis;       int liczbaNapisow = 0;       do {          System.out.print(Wprowadz znak: );          napis = scanner.next();          liczbaNapisow ++;       } while (!napis.equals("."));       System.out.print("Liczba wprowadzonych znaków wynosi: " + liczbaNapisow);    } }
Uwaga! Zmienna napis to ciąg znaków. W języku Java takie dane są zapisywane jako obiekty klasy String i są porównywane metodą equals. Instrukcja !napis.equals(".") oznacza porównanie zmiennej napis do pojedynczej kropki i zaprzeczenie tego wyniku przez operator negacji.

Ćwiczenie 7. Analizujemy, testujemy i modyfikujemy gotowy program

  1. Otwórz program ZliczanieZnakow.java (z projektu Warunki i Petle). Wyjaśnij, co się dzieje w poszczególnych wierszach programu. Sprawdź, czy program jest zgodny ze specyfikacją zadania. Uruchom i przetestuj program dla kilku różnych wartości zmiennych. Objaśnij działanie instrukcji do ... while, m.in. odpowiedz na pytanie: Kiedy zostanie wykonana instrukcja System.out.print("Liczba wprowadzonych znaków wynosi: " + liczbaNapisow);?
  2. Zmodyfikuj program, aby nie zliczał kropki.

Ćwiczenie 8. Stosujemy instrukcję iteracyjną do ... while w języku Java

  1. Napisz specyfikację zadania i program, który będzie obliczał różnicę dwóch liczb całkowitych (odjemna, odjemnik) wprowadzanych z klawiatury, dopóki wynik odejmowania (roznica) będzie dodatni. Wynik niedodatni kończy obliczenia. Zliczaj wykonane działania odejmowania, których wynik jest dodatni, i wyprowadź ich liczbę na ekran.
  2. Zapisz program w pliku pod nazwą Roznice.
  3. Wskazówka: W warunku logicznym instrukcji do ... while sprawdzaj, czy wynik odejmowania (różnica) jest dodatni.

Zadania

  1. Znajdź w Internecie wartość średniej temperatury w Polsce w poszczególnych miesiącach – w dzień i w nocy. Napisz program obliczający na podstawie tych danych średnie roczne temperatury w dzień i w nocy. Wyniki wyświetl na ekranie. Zapisz program w pliku pod nazwą Temperatury.
  2. Napisz program obliczający i wyświetlający na ekranie iloraz dwóch liczb całkowitych (dzielna, dzielnik) wprowadzanych z klawiatury aż do wprowadzenia dzielnika równego zero. Ponieważ nie da się obliczyć ilorazu dla dzielnika równego zero, program powinien wyświetlić odpowiedni komunikat. Zapisz program w pliku pod nazwą Iloraz.
  3. Napisz program obliczający i wyświetlający na ekranie objętość sześcianu o danym boku aż do wprowadzenia niedodatniej wartości zmiennej bok. Zapisz program w pliku pod nazwą Objetosc_szescianu.
  4. Napisz specyfikację zadania i program zliczający, ile jest liczb podzielnych przez 3 spośród liczb całkowitych wprowadzanych z klawiatury. W przypadku wprowadzenia zera program ma zakończyć działanie. Zapisz program w pliku pod nazwą PodzielnePrzez3. Czy zero jest podzielne przez 3?
  5. Dla zainteresowanych
  6. Masz pewną kwotę pieniędzy na kupienie upominków dla znajomych. Upominki możesz kupować, dopóki starczy ci pieniędzy. Ceny upominków wprowadzaj z klawiatury. Nie możesz przekroczyć kwoty ani wydać mniej. Jeśli cena ostatniego upominku przekroczy kwotę n, musisz kupić coś tańszego. Program kończy się, gdy wydasz dokładnie n zł. Napisz odpowiedni program i zapisz go w pliku pod nazwą Upominki.
  7. Napisz program obliczający część całkowitą pierwiastka kwadratowego z podanej liczby naturalnej n. Zapisz program pod nazwa Pierwiastek.
    Wskazówka: Istnieją różne algorytmy obliczania pierwiastka. Można na przykład obliczać kwadraty kolejnych liczb naturalnych aż do uzyskania liczby większej lub równej n.