Назад Зміст Вперед

Урок 2.1. Операції порівняння. Формат boolean. Оператори if та if-else

Урок 2.1. Операції порівняння. Формат boolean. Оператори if та if-else
План уроку

1.Визначення рівності двох змінних типу int за допомогою оператора “==” на противагу оператору присвоєння “=” (classCondition_1).

2.Тип даних boolean (classCondition_2).

3. Операції порівняння (classCondition_3).

4.Оператор if, блоки програм у фігурних дужках (classCondition_4, classCondition_5), блок-схема розгалуження.

5.Область видимості змінної (scoping)(classCondition_6).

6.Оголошення та присвоєння логічних змінних всередині оператора if(classCondition_7).

7.Оператор if-else(classCondition_8, classCondition_9), блок-схема розгалуження.

2. Тип даних boolean.
Всі типи даних поділяються на дві групи.
1. Першу складають 8 простих, або примітивних (від англійського primitive), типів даних. Вони поділяються на три підгрупи:
  • цілочисельні
byte
short
int
long
char (також є цілочисловим типом)

  • дробові
float
double

  • булеві
boolean

Булеві значення та умови названі на честь відомого математика 19 ст. Джоржа Буля, який вперше описав те,що зараз називають булевою логікою.

2. Другу групу складають об'єктні, або вказівні (від англійського reference), типи даних. Це всі класи, інтерфейси та масиви. У стандартних бібліотеках перших версій Java перебувало кількасот класів і інтерфейсів, зараз їх вже тисячі. Крім стандартних, написано багато класів та інтерфейсів.

Логічний (булевий)  тип. Логічний тип представлений лише одним типом boolean, який може зберігати всього два можливі значення - true і false. Величини саме цього типу виходять в результаті операцій порівняння.

Над булевими аргументами можна проводити наступні операції:
операції порівняння (повертають булеві значення): ==,  ! =
  • логічні операції (повертають булеві значення):
          !
          &,  |,  ^
          & &,  | |
  • оператор з умовою « ? : »
  • оператор конкатенації з рядком +
У оператора з умовою « ? : » Першим аргументом може бути тільки значення типу boolean. Також допускається, щоб другий і третій аргументи одночасно мали логічний тип.

Операція конкатенації з рядком перетворює булеву величину в текст "true" або "false" залежно від значення.

Логічні операції:
• заперечення (NOT) ! (позначається знаком оклику);
• кон’юнкція (AND) & (амперсанд);
• диз’юнкція (OR) | (вертикальна риска);
• виключне АБО (XOR) ^ (каре).
Вони виконуються над логічними даними, їх результатом буде також логічне значення true або false.

Таблиця 1.1. Логічні операції
b1
b2
!b1
b1&b2
b1|b2
b1^b2
true
true
false
true
true
false
true
false
false
false
true
true
false
true
true
false
true
true
false
false
true
false
false
false
Словами ці правила можна виразити так:
   • заперечення змінює значення істинності;
   • кон'юнкція істинна, тільки якщо обидва операнди істинні;
   • диз'юнкція хибна, тільки якщо обидва операнди хибні;
   • виключне АБО істинно, тільки якщо значення операндів різні.

Якби Шекспір був програмістом, то фразу "То be or not to be" він написав би так: 2b | ! 2b.

Крім перерахованих чотирьох логічних операцій є ще дві логічні операції скороченого обчислення:
   • скорочена кон'юнкція (conditional-AND) &&;
   • скорочена диз'юнкція (conditional-OR) ||.
Здвоєні знаки амперсанда і вертикальної риски слід записувати без пробілів.

Правий операнд скорочених операцій обчислюється тільки в тому випадку, якщо від нього залежить результат операції, тобто якщо лівий операнд кон'юнкції має значення true, або лівий операнд диз'юнкції має значення false.

Це правило дуже зручне і вправно застосовується , наприклад, можна записувати вирази (n != 0) && (m/n > 0.001) або (n == 0) || (m/n > 0.001) не боячись ділення на нуль.

Практично завжди в Java використовуються якраз скорочені логічні операції.

3. Операції порівняння
В мові Java є шість звичайних операцій порівняння цілих чисел по величині:
• більше >;
• менше <;
• більше або дорівнює >=;
• менше або дорівнює <=;
• рівно ==;
• не рівно !=.

Спарені символи записуються без пробілів, їх не можна переставляти місцями, запис => буде невірним. Результат порівняння — логічне значення:
true, в результаті, наприклад, порівняння 3 != 5; або
false, наприклад, в результаті порівняння 3 == 5.

Для запису складних порівнянь слід застосовувати логічні операції. Наприклад, в обчисленнях часто приходиться робити перевірку типу а < х < b. Подібний запис в мові Java приведе до повідомлення про помилку, оскільки перше порівняння, а < х, дасть true або false, a Java не знає, більше це, ніж b, чи менше. В даному випадку слід написати вираз (а < х) && (х < b), причому тут дужки можна опустити, написати просто а < х && х < b.

4. Оператор if  

      if (Condition)
                   Statement1 (s);
      else
                   Statement2 (s);

Наприклад:
     int a = 1;
    int b = 2;
    if(a<b)
     System.out.println("a<b");
    else
     System.out.println("a не менше за b");

Параметр оператора if повинен мати тип boolean. Частина else не є обов'язковою.
Оператори if можуть бути вкладеними, а вирази 1 та 2 – складеними ({}).

4. Область видимості змінної

Під «видимістю змінних» розуміють місця в коді, де до цієї змінної можна звернутися. До деяких змінним можна звертатися звідусіль в програмі, до інших тільки в межах їх класу, до третіх же тільки всередині одного методу.
Наприклад, не можна звернутися до змінної раніше, ніж вона оголошена.

Локальними є змінні та константи, оголошені усередині блоку. Глобальними щодо блоку є змінні та константи, оголошені перед даним блоком. На відміну від мов С/С++, Java не дозволяє співпадіння ідентифікаторів локальних та глобальних змінних та констант.

1. Змінна, оголошена в методі, існує / видна з початку оголошення до кінця методу.

2. Змінна, оголошена в блоці коду, існує до кінця цього блоку коду.3. Змінні - аргументи методу - існують скрізь всередині методу.

4. Змінні класу / об'єкта існують весь час життя містить їх об'єкта. Їх видимість додатково регулюється спеціальними модифікаторами доступу: public, private.

5. Статичні змінні класів існують весь час роботи програми. Їх видимість також визначається модифікаторами доступу.

Модифікатори доступу

 Слова public і private називають модифікаторами доступу. Можна управляти доступом (видимістю) методів і змінних класу з інших класів. Кожному методу або змінній можна вказувати тільки один модифікатор доступу.

1. Модифікатор «public».

До змінної, методу або класу, позначеного модифікатором public, можна звертатися з будь-якого місця програми. Це найвища ступінь відкритості - ніяких обмежень немає.

2. Модифікатор «private».

До змінної або методу, поміченого модифікатором private, можна звертатися тільки з того ж класу, де він оголошений. Для всіх інших класів позначений метод або змінна - невидимі і «як б не існують». Це найвища ступінь закритості - тільки свій клас.

3. Без модифікатора.

Якщо змінна або метод не позначені ніяким модифікатором, то вважається, що вони позначені «модифікатором за замовчуванням». Змінні або методи з таким модифікатором видно всім класам пакету, в якому вони оголошені. І тільки їм. Цей модифікатор ще іноді називають «package», натякаючи, що доступ до змінних і методам відкритий для всього пакету, в якому знаходиться їх клас.

Таблиця з поясненням ...
МодифікаториДоступ із…
Свого класуСвого пакетуБудь-якого класу
privateЄНемаєНемає
без модифікатора (package)ЄЄНемає
publicЄЄЄ


6.Оголошення та присвоєння логічних змінних всередині оператора if

 if (умова) Оператор;


  • Якщо є тільки один оператор в блоці, фігурні дужки не є обов'язковими, але це є поганим стилем. 
  • classCondition_7

7.Оператор if-else, блок-схема розгалуження.

Розгалуження – алгоритмічна структура, яка передбачає вибірковість виконання тих чи інших команд, в залежності від істинності деякої умови в конкретний момент виконання програми.
На рисунку подано блок-схему повного і скороченого розгалуження.

Умова – логічний вираз, простий або складений, команда – одна або група команд програми.
Якщо в конкретний момент програми умова розгалуження виконується (має логічне значення "істинність", тобто true), то виконується блок команд 1 (чи команда 1, якщо вона одна в
блоці). Якщо ж умова не виконується, то виконуються команди 2 (для повного розгалуження) або відбувається перехід до команд, які йдуть після розгалуження.
Загальний синтаксис Java для даних структур має вигляд:
if (умова) {
команди 1;
}
else {
команди 2;
}

if (умова) {
команди 1;
}

Приклади:
if (x>2) {
y=2*x;
}
else {
y=x+5;
}

if (x>2) {
y=2*x;
}
Зауваження. Якщо команда у блоці лише одна, то дужки { … } можна не ставити. Однак, якщо блок містить дві і більше команд, дужки обов’язкові, інакше це може спричинити семантичні
(змістовні) помилки. Семантичні помилки виявляти набагато складніше, ніж синтаксичні – на помилки синтаксису вказує компілятор.


Програми:

public class Condition_1 {
   public static void main(Stringargs[]) {
//оператори тотожної рівності == та присвоєння =
            int x = 75;
            int y = 10;
            int z = 39;
System.out.println(x = y); //результат 10 замість false
System.out.println(y == z); //очікуваний результат false
System.out.println(y!= z); //очікуваний результат true
   }
}

public class Condition_2 {
   public static void main(Stringargs[]) {
//тип даних boolean
            boolean haveMoney = false;
            boolean haveTime = false;
            boolean haveFriends = true;
            System.out.println(haveMoney=haveTime);//результат false –  присвоєння
            System.out.println(haveTime == haveFriends);//очікуваний результат false
  }
}

public class Condition_3 {
   public static void main(Stringargs[]) {
//оператори порівняння
            int x = 75;
            int y = 10;
            int z = 39;
            System.out.println(x>y); //очікуваний результат true
            System.out.println(y<= z); //очікуваний результат true
            System.out.println(y!= z); //очікуваний результат true
   }
}

public class Condition_4 {
   public static void main(Stringargs[]) {
//операторif, блоки програм у фігурних дужках
            int x = 75;
            int y = 100;
            int max = x;
            if(y>x) max = y; // відсутність фігурних дужок не викликає
// помилки немає, проте є поганим стилем
            System.out.println(max);// очікуваний результат максимуму 100
   }
}

public class Condition_5 {
   public static void main(Stringargs[]) {
//операторif, блоки програм у фігурних дужках
            int x = 75;
            int y = 100;
            int max = x;
            int min = y;
// неправильний код після умовного оператора
            if(y>x) max = y; // відсутність фігурних дужок викликає помилки
            min = x;
            System.out.println(max); // очікуваний результат максимуму 100
            System.out.println(min); //результат мінімуму 100 замість 75
// код після умовного оператора необхідно взяти у фігурні дужки:
            if(y>x) {
            max = y;
            min = x;
      }
   }
}

public class Condition_6 {
public static void main(Stringargs[]) {
//область видимості змінної (scoping)
            int x = 75;
            int y = 100;
            if(y>x) {
            int max = y;
            }
            System.out.println(max); // помилка – змінна max є невидимою
   }
}
public class Condition_7 {
   public static void main(Stringargs[]) {
//оголошення та присвоєння змінних всередині оператора if
            int x = 75;
            int y = 100;
            boolean a = true;
            boolean b = false;
            if(y=x) { } // помилка – присвоєння змінних типу int
            if(booleanc =a) { } // помилка – не можна оголошувати змінних
            if(b=a) { } // коректно – логічні змінні можуть бути присвоєні
   }
}

public class Condition_8 {
   public static void main(Stringargs[]) {
//оператор if-else
            boolean haveMoney = false;
            if (haveMoney) {
            System.out.println(“Go To Cinema”);
            }
//коректно, проте немає виведення – враження про зависання коду
   }
}

public class Condition_9 {
   public static void main(Stringargs[]) {
//оператор if-else
            boolean haveMoney = false;
            if (haveMoney) {
            System.out.println(“Go To Cinema”);
            }else{
            System.out.println(“Go To Home Video”);
            }
//виведення є для обох випадків
   }
}

Література для класної роботи:
[Хорстманн], ст.95…98 (пп.4, 7),
[Sangera], р.154 (п.6),
р.47 (п.8).

Тести для класної роботи:
[task-mughal]: 5.1 (п.7),
[Heller], сh.2: № 8 (п.8).

Література для домашньої роботи:
Шилдт]: с.73 (пп.1…4).
[Шилдт], ст.113 (пп.4, 7),
[Шилдт], с. 77…79 (п.6),
[Шилдт]: с.110-111 (п.8),
[Вязовик], лек.4: ст.10,11 (п.8).

Java для начинающих. УРОК J-8. JAVA ЛОГИЧЕСКИЕ И УСЛОВНЫЕ ОПЕРАТОРЫ (IF, IF-ELSE И SWITCH)

Тести для домашньої роботи
[Heller], AssesmentTest: № 18, 22 (п.2),
сh.2: № 2 (п.4),
сh.5: № 4 (п.7),
[Блинов], гл.2: № 2.1 (п.2),
№ 2.2 (п.4),
[Raposa],ch.1: № 19 (п.7),
  1. [Jaworsky], p.89: № 1 (п.7).
.