- Умовний оператор - що це таке Умовний оператор IF служить для програмування ситуацій вибору (моделювання...
- Крапка з комою перед else
- Операторні дужки умовного оператора
- Повна і неповна форми оператора IF
- Повна форма умовного оператора IF
- Неповна форма умовного оператора IF
- Розбір задач
- Приклад №2 - повна форма, по одному дії в кожній гілці
- Приклад №3 - логічні вираження і оператор розгалуження IF
- Приклад №4 - вкладені умовні оператори
- Приклад №5 - вкладені умовні оператори
- Приклад №6 - життєвий вибір
- Приклад №7 Вкладення оператора if в неповній формі в оператор if в повній формі
- Самостійна робота
- Джерела (що ще почитати)
Умовний оператор - що це таке
Умовний оператор IF служить для програмування ситуацій вибору (моделювання різних варіантів розвитку ситуації, з яким ми стикаємося в житті, але тепер уже всередині програми).
Структура умовного оператора. блочность
Умовний оператор в загальному вигляді складається з трьох частин:
- Перевірка логічного значення
- Гілка істинності (обов'язкова) - виконається якщо логічне значення істинне (true)
- Гілка хибності (необов'язкова) - виконається якщо логічне значення помилково (false)
Відразу відзначимо, що логічне значення - це фактично відповідь на питання формату "так / ні", нагадаємо, що логічним типом значенням володіють:
- логічні літерали
- логічні змінні
- і логічні вираження
- точно також як і будь-який простий тип даних може бути представлений літералами, змінними або виразами з них.
У програмному коді структуру умовного оператора можна проілюструвати наступною схемою:
if (<логіческое_значеніе>) then // перевірка вираження і початок тіла гілки істинності begin {тут код, який виконається, якщо логічне значення істинне} end else // початок неправдивої гілки (її тіла) begin {тут код, який виконається, якщо логічне значення помилково} end; // кінець помилкової гілки і оператор розгалуження
наприклад:
if (5> 7) then // перевірка вираження і початок тіла гілки істинності begin writeln ( '5> 7 вірно'); writeln ( '5> 7 вірно'); end else // початок неправдивої гілки (її тіла) begin writeln ( '5> 7 невірно'); writeln ( '5> 7 невірно'); end; // кінець помилкової гілки і оператор розгалуження
- в даному випадку виконається "помилкова" гілка, так як $ 5> 7 $ повертає результат false .
Крапка з комою перед else
Зауважте (див. Приклади вище і нижче), що перед else крапка з комою не ставиться.
Операторні дужки умовного оператора
У попередньому прикладі зверніть увагу на операторні дужки , Навколишні тіла гілок оператора розгалуження - begin і end необхідні, якщо в гілці виконується більш однієї операції, якщо ж в гілці міститься тільки одна операція, то операторні дужки не потрібні.
Наприклад для ситуації, зображеної на цій блок-схемі:
Цю ж ситуацію можна проілюструвати кодом:
if (5> 7) then // перевірка вираження і початок тіла гілки істинності writeln ( '5> 7 вірно'); // кінець гілки істинності else // початок неправдивої гілки (її тіла) writeln ( '5> 7 невірно'); // кінець гілки хибності
- тут в обох гілках тільки одна операція, а тому операторні дужки не потрібні.
Повна і неповна форми оператора IF
Оператор IF в програмі може бути представлений в наступних формах:
- Повна форма - форма оператора if, в якій присутні обидві гілки - і then і else
- Неповна форма - форма в якій присутня тільки then.
Повна форма умовного оператора IF
У повній формі оператора IF присутні обидві гілки - саме повну форму ми розглядали вище, наприклад:
if (a> 5) then b: = 2 // в гілки істинності одну дію else begin b: = 3; // в гілки хибності два дії a: = 2; end.
- тут як умову ми порівнювали змінну з числом, а потім описували два сценарії, один з яких виконається в залежності від значення умови.
В останньому прикладі коду, у нас в гілці істинності одна операція, а в гілки хибності 2 - цю ситуацію можна зобразити на блок-схемі так (з якимось попередніми дією до if):
Неповна форма умовного оператора IF
У неповній формі умовного оператора є тільки сценарій істинності, гілка хибності ж взагалі не описується, наприклад:
if (a> 5) then b: = 2 // в гілки істинності одну дію
- в гілці хибності тут взагалі нічого немає, тобто якщо $ a $ не більше $ 5 $, то і ніяких дій зроблено не буде.
На блок-схемі неповна форма оператора розгалуження виглядає так:
- правило використання операторних дужок діє і тут: якщо в гілці більше однієї операції, то begin і end потрібні.
Розбір задач
Приклад №1 - неповна форма IF
Порівняйте два числа, якщо перше більше другого, то виведіть на екран "22" і потім окремим викликом writeln () число 555.
- в цьому завданні вказано, що треба робити якісь дії тільки в одному випадку ( "якщо перше більше другого"), а значить буде використовувати оператор розгалуження в неповній формі:
var a, b: integer; begin writeln ( 'vvedite dva celih chisla:'); readln (a, b); if (a> b) then // порівнюємо begin writeln (22); writeln (555); end; readln (); end.
- в гілці істинності тут було дві операції, а тому ми використовували для неї операторні дужки.
Приклад №2 - повна форма, по одному дії в кожній гілці
Порівняйте два числа, якщо перше більше другого, то виведіть на екран "22", а інакше виведете на екран 'abc'.
- в цьому завданні вказані два альтернативних дії, а тому будемо використовувати оператор розгалуження в його повній формі:
var a, b: integer; begin writeln ( 'vvedite dva celih chisla:'); readln (a, b); if (a> b) then // порівнюємо writeln (22) // якщо так else writeln ( 'abc'); // якщо немає readln (); end.
- зверніть увагу, що перед else крапка з комою не ставиться.
Приклад №3 - логічні вираження і оператор розгалуження IF
завдання:
Коля набрав $ k $ балів, Міша $ n $ балів, а Петя $ d $ балів в ході змагань. якщо:
- сума балів Колі і Міші більше $ 20 $
- і сума балів Петі і Міші менше $ 55 $
--то тоді вивести в консоль повідомлення про те, що нічия, в іншому випадку вивести повідомлення, що переміг Коля.
У цій як умову слід дотримуватися відразу двох підумови, причому не одного з них - а двох одночасно, тому в логічному вираженні для if ми будемо використовувати логічну операцію AND , Тоді можна вирішити якось так:
var k, n, d: integer; // змінні для зберігання балів, набраних хлопцями begin // спочатку отримуємо дані від користувача writeln ( 'vvedite chislo ballov Koli:'); readln (k); writeln ( 'vvedite chislo ballov Mishi:'); readln (n); writeln ( 'vvedite chislo ballov Peti:'); readln (d); // далі починаємо перевірку умов if ((k + n> 20) AND (n + d <55)) then // використовуємо "логічне І" (одночасність) writeln ( 'Pobedila druzhba!') Else writeln ( 'Pobedil Kolya! '); readln (); end.
Приклад №4 - вкладені умовні оператори
Оператори можуть вкладатися один в інший так, як як це показано на блок-схемі (на ділі внутрішній оператор вкладається в одну з гілок зовнішнього):
Розглянемо задачу, рішення якої буде відповідати цій блок-схемі:
Отримайте від користувача два цілих числа, якщо перше більше другого, то виведіть на екран їх суму, а потім їх різницю, інакше:
- спочатку порівняйте їх суму з числом $ 25 $, якщо вона більше, то виведіть на екран перше число, а якщо менше, то друге.
- потім виведіть на екран друге число в квадраті
Реалізуємо рішення у вигляді програми:
var a, b: integer; begin writeln ( 'vvedite dva celih chisla:'); readln (a, b); if (a> b) then begin writeln ( 'ih summa:', a + b); writeln ( 'ih raznost:', a - b); end // перед else крапка з комою не ставиться навіть після end else begin {вкладені оператор умови - перша вкладена операція в гілці хибності зовнішнього оператора} if ((a + b)> 25) then writeln ( 'vivodim peroe:', a ) else writeln ( 'vivodim vtoroe:', b); // кінець вкладеного оператора розгалуження і його гілки хибності (так як немає операторних дужок, то до гілки вкладеності відноситься тільки одна операція) writeln (b * b); // друга вкладена операція end; readln (); // утримуємо косол end.
Приклад №5 - вкладені умовні оператори
Наприклад завдання з більш раннього прикладу:
Коля набрав $ k $ балів, Міша $ n $ балів, а Петя $ d $ балів в ході змагань. якщо:
- сума балів Колі і Міші більше $ 20 $
- і сума балів Петі і Міші менше $ 55 $
--то тоді вивести в консоль повідомлення про те, що нічия, в іншому випадку вивести повідомлення, що переміг Коля.
можна було б вирішити за допомогою вкладених блоків умовного оператора IF:
program Project1; var k, n, d: integer; // змінні для зберігання балів, набраних хлопцями begin // спочатку отримуємо дані від користувача writeln ( 'vvedite chislo ballov Koli:'); readln (k); writeln ( 'vvedite chislo ballov Mishi:'); readln (n); writeln ( 'vvedite chislo ballov Peti:'); readln (d); // далі починаємо перевірку умов if ((k + n)> 20) then if ((n + d) <25) then // вкладаємо друга умова writeln ( 'Pobedila druzhba!') Else writeln ( 'Pobedil Kolya!') else writeln ( 'Pobedil Kolya!'); readln (); end.
- зверніть увагу, що begin і end не потрібні для гілки істинності зовнішнього оператора, так як в нього вкладено лише один if - а інші рядки ставляться до цього вкладеного if.
ВАЖЛИВО: В цьому примі тут у наявності дублювання коду, що є поганим стилем . Більш того вкладені блоки в коді важче розуміти, тому:
Якщо можна не використовувати вкладеність - не використовуйте її, краще використовуйте більш складні умови з логічними операціями .
Приклад №6 - життєвий вибір
Тобто ситуацію, в яку потрапив богатир на цій ілюстрації:
Можна запрограмувати таким чином:
{Програма життєвого вибору} program qwe; var a: integer; // число, що означає вибір користувача (богатиря) res: string; // його майбутнє begin writeln ( 'vvedite: 1 esli napravo, 2 esli pryamo, 3 esli nalevo'); readln (a); // читаємо, куди піде користувач // далі визначаємо майбутнє if (a = 1) then res: = 'konya poteryaesh' else if (a = 2) then res: = 'zhenat budesh' else if (a = 3) then res : = 'ubitum budesh' else // якщо користувач вибрав щось інше res: = 'buduchee ne izvestno'; writeln ( 'otvet:', res); readln (); end.
- по суті це теж кілька вкладених один в іншій операторів розгалуження, причому вкладення тут на будь-яких двох молодших рівнях відбувається в гілку хибності.
Приклад №7 Вкладення оператора if в неповній формі в оператор if в повній формі
При вирішенні завдань або при перегляді / аналізі коду написаного НЕ вами може виникнути проблема розуміння того, до якого саме then відноситься даний else, зазвичай така проблема виникає в разі, якщо кількість else не дорівнює кількості then (якщо ці кількості рівні, то зрозуміти що у що вкладено не важко).
Розглянемо приклад (фрагмент коду), в якому є підступ:
if (a> b) then if (a> c) then writeln ( 'змінна а найбільша!') else // увазі, що працює коли a <= b writeln ( 'змінна a не більш b');
- даний код відформатований невірно, адже він як би показує що else відноситься до першого then, в той час як Паскаль буде вважати (завжди), що else відноситься до найближчого then (не «відділений" від цього else операторними дужками ), Отже, повторимо цю ідею ще раз, назвемо її правило "прикріплення" else:
У разі якщо число else не дорівнює числу then (а це може бути тільки при вкладених блоках), else завжди "прикріплюється" (належить) до найближчого »не ізольованому" від нього операторними дужками then.
Виходячи з цього правила можна зрозуміти, що написаний вище код насправді має структуру:
if (a> b) then if (a> c) then writeln ( 'змінна а найбільша!') else //! виявляється спрацює якщо: c> = a> = b writeln ( 'змінна a не більш b'); // значить цей вислів невірно!
- але це означає, що вже невірна логіка рішення, через те, що на ділі при подібній записи else відноситься до найближчого then (ми показали це правильним форматуванням і коментарями).
Але як же нам досягти задуманого на початку, тобто тієї ситуації, коли в разі якщо a> b не вірно, ми отримали б повідомлення "" змінна a не більш b ""?
Для цього нам доведеться відокремити найближчий then від else операторними дужками, тобто зробити так:
if (a> b) then begin if (a> c) then writeln ( 'змінна а найбільша!') end else // працює коли a <= b writeln ( 'змінна a не більш b');
Тепер найближчим не ізольовано операторними дужками від else словом then виявляється перше (то, де "if (a> b)"), а не друге (тобто не те, де "if (a> c)") - що ми і хотіли спочатку запрограмувати;)
Самостійна робота
питання
- Для чого потрібен оператор розгалуження (умовний оператор)?
- Які гілки умовного оператора ви знаєте?
- Чим повна форма умовного оператора відрізняється від неповної?
- Коли потрібні операторні дужки в гілках оператора IF, а коли ні?
завдання
- Порівняйте два числа, якщо перше більше другого, то виведіть на екран "12". (Тут потрібно використовувати неповну форму умовного оператора)
- Порівняйте два числа, якщо перше більше другого, то виведіть на екран "12", а якщо немає, то виведіть на екран "888".
- Дано три цілих числа: $ A $, $ B $, $ C $. Перевірити істинність висловлювання: «Число $ A $ знаходиться між числами $ B $ і $ C $» - виведіть "так", якщо істинно і "ні" якщо помилково.
ПРИМІТКА: ця наступна задача базуються на те, що ми вже вирішували (Див. Завдання в кінці уроку).
- Дано три цілих числа: $ A $, $ B $, $ C $. Перевірити істинність висловлювання: «Число $ A $ і число $ B $ більше 17, а $ C $> 7». - виведіть "так", якщо істинно і "ні" якщо помилково.
- Користувач вводить два числа, знайдіть з них максимальне. (Тут все просто)
- Користувач вводить три числа, знайдіть з них максимальне.
Вирішіть трьома способами:
- З використанням логічної операції and.
- З вкладеними блоками (без and).
- Без вкладених блоків (без and) - запам'ятавши максимум з двох в спеціальній змінній.
Вказівка: Спочатку посрать написати все три рішення самостійно (по 20 хвилин роздуми на кожну задачу хоча б), якщо не виходить (або після рішення) також можна подивитися це відео-пояснення .
- Користувач вводить чотири числа, знайдіть з них максимальне.
- Коля набрав $ k $ балів, Міша $ n $ балів, а Петя $ d $ балів в ході змагань. якщо:
- сума балів Колі і Міші більше $ 20 $
- або твір балів Петі і Міші менше $ 55 $
--то тоді вивести в консоль повідомлення про те, що нічия, в іншому випадку вивести повідомлення, що переміг Коля.
Джерела (що ще почитати)
- Урок 8. Блок-схема оператора if: http: //learnpascal.ru/operator-if/blok-s ...
Які гілки умовного оператора ви знаєте?
Чим повна форма умовного оператора відрізняється від неповної?
Коли потрібні операторні дужки в гілках оператора IF, а коли ні?