Тема: Логічний тип даних. Операція відношення. Логічна операція. Логічний вираз.
Мета: навчитися описувати умовний оператор на мові програмукваннята розглянути типові задачі.
Структурні оператори
Структурні оператори визначають порядок виконання групи операторів. Є такі структурні оператори:
оператор об’єднання begin …end;
умовні оператори:
оператори циклу:
оператор приєднання для записів with … do … .
Оператор об’єднання BEGIN …END
Оператор begin …end об’єднує групу операторів в єдине ціле, після чого конструкція begin оператори end вважається єдиним оператором. Оператор об’єднання використовується в таких структурних операторах, в яких синтаксис мови Паскаль дозволяє використовувати один оператор. Наприклад, в операторі повторення while … do …після службового слова do за синтаксисом може бути записано один оператор.
Умовний оператор IF … THEN … ELSE…
Використовується для виконання однієї із двох або декількох можливих послідовностей операторів, в залежності від вказаної умови. Умовний оператор може бути записано в повній та неповній формах:
Неповна форма запису |
Повна форма запису |
if логічний вираз then оператор; |
if логічний вираз then оператор1 else оператор2; |
Порядок виконання :
обчислюється логічний вираз;
якщо результат має значення True(так), то виконується оператор1, що слідує за службовим словом then;
якщо результат має значення False(ні), то виконується оператор2, що слідує за службовим словом else.
Приклад. З’ясувати, чи дійсне число A від’ємне. |
var A : Real; begin Write(‘ A= ’); ReadLn(A); if A < 0 then WriteLn(' число ', A ,' від’ємне ') else WriteLn(' число ', A ,' невід’ємне '); end. |
У випадку, коли умовний оператор записано в неповній формі, і результат логічного виразу приймає значення False, то управління передається оператору, що слідує безпосередньо за умовним оператором. Приклад. Якщо ціле число A парне, то збільшити його на одиницю, інакше – залишити його без змін. |
var A : Integer; begin Write (‘ A= ’); ReadLn ( A ); if A Mod 2 = 0 then A := A + 1; WriteLn (' A= ', A ); end. |
Синтаксичні особливості:
перед службовим словом else символ “;”(крапка з комою) не ставиться;
В мові Паскаль оператори, розділи опису відокремлюються символом “;”(крапка з комою). В наведеному прикладі символ крапка з комою, що знаходиться перед службовим словом else, відокремлює умовний оператор від іншого оператора. А це приводить до синтаксичної помилки, оскільки оператора, що починається службовим словом else в мові програмування Паскаль не має. |
if A > B |
якщо після службового слова then або else потрібно виконати одразу декілька операторів, то необхідно скористатися оператором об’єднання begin … end .
Приклад. Якщо два цілих числа мають різні знаки, зменшити їх на одиницю, інакше збільшити їх на одиницю. Оператори, вміщені в оператор об’єднання, теж повинні розділятися символом крапка з комою. |
if A * B < 0 then begin A := A + 1; B := B + 1; end else begin A := A – 1; B := B – 1; End; |
Узагальнені форми умовного оператора
Кількість операторів |
Форма запису |
|
then |
else |
|
один |
відсутні |
if логічний вираз then оператор; |
декілька |
відсутні |
if логічний вираз then begin оператори end; |
один |
один |
if логічний вираз then оператор else оператор; |
декілька |
один |
if логічний вираз then begin оператори end else оператор; |
один |
декілька |
if логічний вираз then оператор else begin оператори end; |
декілька |
декілька |
if логічний вираз then begin оператори end else begin оператори end; |
після службових слів then і else може слідувати будь-який оператор, в тому числі і умовний. Якщо умовний оператор розміщено в межах оператора об’єднання, невизначеності не виникає, так як, службові слова begin end чітко обмежують послідовність операторів.
Однак, якщо умовний оператор є єдиним оператором, що слідує за службовим словом then, то може виникнути неоднозначність відповідності if else (правда, тільки для користувача). В таких випадках слід користуватися правилом: службове слово else пов’язане з найближчим службовим словом if, що знаходиться перед ним. |
if логічний вираз then if логічний вираз then оператор else оператор else оператор; |
Можна дати такі поради:
більш чітко визначати структуру умовного оператора записом; |
if логічний вираз then if логічний вираз then оператор else оператор else оператор; |
використовувати оператор об’єднання, навіть, якщо умовний оператор – єдиний оператор, який слідує за службовими словами then або else. |
if логічний вираз then begin if логічний вираз then оператор else оператор end else оператор; |
Приклад. Задано дійсні числа a, b, c. Якщо існує трикутник із довжинами сторін a, b, c, то визначити, чи він рівносторонній.
var a, b, c : Real; begin Write(‘ a,b,c -’);ReadLn( a, b, c ); if ( a < b + c ) And ( b < a + c ) And ( c < a + b ) then begin if ( a = b ) And ( b = c ) then WriteLn(‘ Трикутник рівносторонній ’) esle WriteLn(‘ Трикутник не рівносторонній ’) end; end. |
ПРИКЛАДИ РОЗВ'ЯЗУВАННЯ ЗАДАЧ
Знайти найбільше з двох дійсних чисел. Якщо числа рівні, то за найбільше взяти одне з них.
Розв’язання.
Введемо потрібні змінні з визначенням типу даних:
a, b – змінні дійсного типу: задані дійсні числа,
max2 – змінна дійсного типу: шукане найбільше число.
Алгоритм розв’язання задачі схематично запишемо так:
введення даних a, b;
знаходження max2;
виведення на екран результату – max2.
Запишемо алгоритм мовою Паскаль двома способами:
Повна форма умовного оператора |
Не повна форма умовного оператора |
var a, b, max2 : Real; begin Write(‘ Введіть два дійсних числа – ’); ReadLn( a, b ); if a > b then max2 := a else max2 := b; WriteLn(‘ max –’, max2 ) end. |
var a, b, max2 : Real; begin Write(‘ Введіть два дійсних числа – ’); ReadLn( a, b ); max2 := a; if b > a then max2 := b; WriteLn(‘ max –’, max2 ) end. |
Знайти найбільше з трьох дійсних чисел.
Розв’язання.
Введемо потрібні змінні з визначенням типу даних:
a,b,c – змінні дійсного типу: задані дійсні числа,
max3 – змінна дійсного типу: шукане найбільше число.
Алгоритм розв’язання задачі схематично запишемо так:
введення даних a, b, c;
знаходження max3;
виведення на екран результату – max3.
Запишемо алгоритм мовою Паскаль декількома способами:
1-й спосіб.
Логічний вираз, істинність якого вказує на те, що а – більше за числа b і c складається з двох операцій відношення a >= b, a >= c поєднаних логічною операцією And і має вид (a > b) And (a >= c). Аналогічно сформуємо логічні вирази, істинність яких вказує на те, що
b – найбільше число |
(b >= a) And (b >= c) |
c – найбільше число |
(c >= a) And (c >= b). |
Отже,
var a, b, c, max3: Real; begin Write(‘ a,b,c -’);ReadLn(a,b,c); if ( a > = b ) And ( a >= c ) then max3 : = a; if (b > = a ) And ( b >= c ) then max3 : = b; if ( c > = b ) And ( c >= a ) then max3 : = c; WriteLn(‘ max - ’,max3 ) end. |
2-й спосіб.
Алгоритм:
змінній max3 надамо значення найбільшого з чисел a, b.
порівняємо число max3 з числом с.
якщо число max3 менше від с, то max3 надамо значення змінної с, інакше max3 і є найбільшим з чисел a, b, c
Отже,
var a, b, c, max3: Real; begin Write(‘ a,b,c -’);ReadLn(a,b,c); max3 := a; if (b>max3) then max3 : = b; if (c>max3) then max3 : = c; WriteLn(‘ max - ’,max3) end. |
Розв’язати лінійне рівняння.
Розв’язання.
Лінійне рівняння має вид ax + b = 0, де a, b – будь-які дійсні числа.
Розглянемо можливі випадки:
Якщо a ≠ 0, то x=-.
Якщо a = 0 і b = 0, то розв’язком є будь-яке дійсне число.
Якщо a = 0 і b ≠ 0, то розв’язку не має.
Отже, практично ми описали алгоритм розв’язання задачі. Запишемо два варіанта програми :
var a, b: Real; begin Write(‘ a,b – ’); ReadLn(a, b); if a <> 0 then WriteLn(‘ x= ’, -b/a); if (a = 0) And (b = 0) then WriteLn(‘ x R ’); if (a = 0) And (b <> 0) then WriteLn(‘ x ’); end. |
var a, b, max2 : Real; begin Write(‘ a,b – ’); ReadLn(a, b); if a <> 0 then WriteLn(‘ x= ’ ,-b/a) else if b = 0 then WriteLn(‘ x R ’) else WriteLn(‘ x ’); end. |
Розв’язати квадратне рівняння.
Розв’язання.
Квадратне рівняння має вид ax2+bx+c=0, a0.
Обчислимо дискримінант d = b2- 4 a c.
Якщо d 0, то , , інакше x.
Введемо позначення:
a, b ,c – змінні дійсного типу для збереження значень коефіцієнтів;
d – змінна дійсного типу для збереження результату обчислення дискримінанту;
x1, x2 – змінні дійсного типу для збереження значень коренів квадратного рівняння.
Як видно з схеми розв’язання, в програмі потрібно використати умовний оператор повної форми, причому, з використанням вкладеного оператора об’єднання. Отже:
var a, b, c, x1,x2: Real; begin Write(‘ a,b,c -’);ReadLn(a,b,c); d : = b*b-4*a*c; if d >= 0 then begin x1 : = (-b+sqrt(d))/2/a; x2 : = (-b+sqrt(d))/2/a; WriteLn(‘x1=’,x1,’ x2=’,x2) end else WriteLn(‘ x’) end. |
Задано дійсне число a. Обчислити f(a), якщо
Розв’язання.
Слідуючи вказаній схемі обчислення значення функції в програмі потрібно використати три умовні оператори не повної форми. Ми використаємо інший підхід, що зменшить кількість умовних операторів. Перепишемо схему так:
Якщо x 0, то f(x)=0,
інакше якщо x > 1, то f(x)=x2-sinx,
інакше f(x)=x2-x.
Введемо позначення:
a – змінна дійсного типу для збереження значення аргументу функції.
var a : Real; begin Write(‘ a -’);ReadLn(a); Write(‘ f( ‘,a:5:2,’)=’); if a <= 0 then WriteLn(0) else if x > 1 then WriteLn(a*a-sin(Pi*a)) else WriteLn(a*a-a) end. |
Обчислити суму, добуток, різницю або частку двох дійсних чисел в залежності від вказаної арифметичної операції.
Розв’язання.
Введемо позначення:
a, b – змінні дійсного типу збереження заданих чисел;
znak – змінна символьного типу: знак арифметичної операції;
result – змінна дійсного типу для збереження результату обчислення арифметичного виразу.
Отже,
var a, b, result : Real; znak : Char; begin Write(‘ a, b -’);ReadLn(a, b); Write(‘ +, –, *, / :’); ReadLn(znak); if znak = ‘ +’ then result : = a + b; if znak = ‘–’ then result : = a – b; if znak = ‘ *’ then result : = a * b; if znak = ‘/’ then result : = a / b; WriteLn(a, znak, b, ‘ = ‘, result) end. |
Зауваження. В програмі не передбачено перевірку коректності введених даних: введений символ може не бути символом зазначених арифметичних операцій; не здійснюється перевірка ділення на нуль. Якщо врахувати зауваження, програма матиме вид:
var a, b, result : Real; znak : Char; begin Write(‘ a, b -’);ReadLn(a, b); Write(‘ +, –, *, / :’); ReadLn(znak); if Not(( znak = ‘ +’) Or (znak = ‘–’) Or (znak = ‘ *’) Or (znak = ‘/’)) then WriteLn(‘ не введено знак арифметичної операції ’) else begin if znak = ‘ +’ then result : = a + b; if znak = ‘–’ then result : = a – b; if znak = ‘ *’ then result : = a * b; if (znak = ‘/’) And (b=0) then WriteLn(‘ ділення на нуль ’) else begin if znak = ‘/’ then result : = a / b; WriteLn(a, znak, b, ‘ = ‘, result) end end; end. |