Урок 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.Визначення рівності двох змінних типу 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), типів даних. Вони поділяються на три підгрупи:
short
int
long
char (також є цілочисловим типом)
double
Булеві значення та умови названі на честь відомого математика 19 ст. Джоржа Буля, який вперше описав те,що зараз називають булевою логікою.
Логічний (булевий) тип. Логічний тип представлений лише одним типом boolean, який може зберігати всього два можливі значення - true і false. Величини саме цього типу виходять в результаті операцій порівняння.
Над булевими аргументами можна проводити наступні операції:
операції порівняння (повертають булеві значення): ==, ! =
&, |, ^
& &, | |
Операція конкатенації з рядком перетворює булеву величину в текст "true" або "false" залежно від значення.
Логічні операції:
- цілочисельні
short
int
long
char (також є цілочисловим типом)
- дробові
double
- булеві
Булеві значення та умови названі на честь відомого математика 19 ст. Джоржа Буля, який вперше описав те,що зараз називають булевою логікою.
2. Другу групу складають об'єктні, або вказівні (від англійського reference), типи даних. Це всі класи, інтерфейси та масиви. У стандартних бібліотеках перших версій Java перебувало кількасот класів і інтерфейсів, зараз їх вже тисячі. Крім стандартних, написано багато класів та інтерфейсів.
Над булевими аргументами можна проводити наступні операції:
операції порівняння (повертають булеві значення): ==, ! =
- логічні операції (повертають булеві значення):
&, |, ^
& &, | |
- оператор з умовою « ? : »
- оператор конкатенації з рядком +
Операція конкатенації з рядком перетворює булеву величину в текст "true" або "false" залежно від значення.
Логічні операції:
• заперечення (NOT) ! (позначається знаком оклику);
• кон’юнкція (AND) & (амперсанд);
• диз’юнкція (OR) | (вертикальна риска);
• виключне АБО (XOR) ^ (каре).
Вони виконуються над логічними даними, їх результатом буде також логічне значення true або false.
Таблиця 1.1. Логічні операції
Словами ці правила можна виразити так:
• заперечення змінює значення істинності;
• кон'юнкція істинна, тільки якщо обидва операнди істинні;
• диз'юнкція хибна, тільки якщо обидва операнди хибні;
• виключне АБО істинно, тільки якщо значення операндів різні.
Якби Шекспір був програмістом, то фразу "То 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.
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 – складеними ({}).
На рисунку подано блок-схему повного і скороченого розгалуження.
Умова – логічний вираз, простий або складений, команда – одна або група команд програми.
Якщо в конкретний момент програми умова розгалуження виконується (має логічне значення "істинність", тобто 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
}
}
• кон’юнкція (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 не дозволяє співпадіння ідентифікаторів локальних та глобальних змінних та констант.
Локальними є змінні та константи, оголошені усередині блоку. Глобальними щодо блоку є змінні та константи, оголошені перед даним блоком. На відміну від мов С/С++, 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 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”);
}
//виведення є для обох випадків
}
}
Література для класної роботи:
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),
[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),
- [Jaworsky], p.89: № 1 (п.7).