Розгалуження в програмі

Наступний ранок був повною протилежністю до попереднього. Вранішнє сонце вставало неначе вмитим, майже прозорим, і ніби кожним промін­чиком, якось по-дитячому несміливо, просило ви­бачення за вчорашній часто похмурий, часто сльозливий день. А ось роси було стільки, що ні пройти, ні проїхати. Трави аж вгнулися, кожна високорос­ла рослинка стогнала під масою води, а кожне де­рево стало душовою установкою. На те, що зранку допустять до комп’ютера, годі було й сподіватися. Маркіз за таких обставин надумав продовжити за­йматися математичною підготовкою Барсика, але Барсик проявив іншу ініціативу:

  • Коли ми займемося вдосконаленням моєї програми відгадування чисел? — було перше, що він, навіть не привітавшись, запитав, зустрівши Маркіза.
  • Не так скоро, як тобі хотілося б, — відповів Маркіз і, бачачи нерозуміння в очах товариша, спробував пояснити свою позицію. — Для цього необхідно, щоб ти уяснив, що таке умовний опе­ратор, або команда розгалуження...
  • Це те, про що ви вчора говорили з дядьком Миколою? — пригадав Барсик і вже зацікавлено додав: — Що ж тут такого особливого? Чому опе­ратор умовний, чи він не дійсний, не існуючий?
  • Чому ж? — Маркіз був явно не готовий до уроку, але продовжив: — Він дійсно існує, а пра­цює цей оператор з огляду на умову. Особливим є те, що залежно від умови цей оператор сам ви­бирає, яку команду в подальшому виконувати. Якщо умова виконується, то виконується одна послідовність команд, якщо ж умова не викону­ється, то виконується інша послідовність команд. Щось зрозумів? Наприклад, пригадай учорашній і попередні дні. Залежно від погоди ми працювали на комп’ютері або були надворі. Для складання

планів нашої роботи на майбутнє нам потрібно враховувати погодний фактор, а в планах запи­сати таке складнопідрядне речення: «Якщо буде дощ, то розв’язуємо задачі, інакше — вчимося на комп’ютері». Ось таку форму має умовний опера­тор: «Якщо умова, то дія 1, інакше — дія 2».

Тут несподівано Маркізові спав на думку, як він вважав, вдалий приклад: — Ти пам’ятаєш пе­ремикач води у ванні? Якщо ручечку перемика­ча повернути вліво, то вода побіжить по гусачку в саму ванну...

  • А якщо вправо, — не дав йому закінчити Барсик, — то по стояку на душову лійку. Так ти хотів сказати? Але ж тут керує потоком води не програма, а користувач...
  • Я хотів сказати, що вода потече в тому чи іншому напрямку залежно від положення пере­микача, — уточнив Маркіз.
  • Отже, в цьому прикладі умову встановлює перемикач? — забубонів Барсик. — Якщо переми­кач уліво, то потече вниз, а якщо вправо — то вго­ру. До чого ж тоді «інакше»?
  • Перемикач має два положення: вліво і впра­во, — спробував прояснити ситуацію Маркіз, — тоді немає потреби вдруге формулювати проти­лежну умову і можна сказати: «Якщо перемикач вліво, то потече вниз, інакше — вгору». Тут сло­во «інакше» заперечує умову «перемикач вліво», а якщо не вліво — то куди? Звичайно, вправо.
  • Давай краще, на числах, мовою Паскаль, а то я щось не дуже... — попросив Барсик.
  • Паскаль — то Паскаль, — погодився Мар­кіз. — І мені так легше буде. Так ось, нехай змін­на х дійсного типу набуває значень на проміжку від —1000 до 1000, а змінна у залежить від значен­ня х і дорівнює абсолютній величині змінної х або, як кажуть у математиці, модулю х. Пам’я­таєш? Ми не так давно говорили про це. Завдяки умовному оператору мовою Паскаль це запишеться так: If х>=0 then у:=х else у :=-х;, тобто у формі: If умова then команда 1 else команда2;

Барсик довго вдивлявся у цей запис, врешті запитав: «Можна, я запишу так (див. табл.)

 

if

x>=0

then

у:=х

else

у:=-х

Якщо

X

неві­

д’ємне

то

У

присво­

їти

значен­ня X

інак­

ше

у   присвоїти значення про­тилежне X

 

 

  • Так ти зрозумів, що я хотів пояснити сто­совно умовного оператора, — зрадів Маркіз. — А якщо умову х > 0 змінити на протилежну, як ти запишеш умовний оператор? — Маркіз хитрувато примружився.
  • Можливо, так, — неспішно почав Барсик, — If х<0 then у:=-х else у:=х;
  • Знаєш, з тебе можуть вийти люди, якщо до осені мухи не заклюють, — пожартував Маркіз.
  • Ти неправильно побудував фразу, — підтри­мав жарт товариша Барсик. — Потрібно було ска­зати так: «Якщо мухи не заклюють, то можуть вийти люди...». Стривай. А де ж «інакше»? Щось тут не те, чи чогось не вистачає.
  • А ти, виявляється, уважний. Молодець, — похвалив свого підопічного Маркіз. — Справа в тому, що в моєму прикладі умовний оператор за­писано у так званій повній формі, а є ще скороче­на. Розглянемо задачу: визначити відстань х від точки числової прямої, заданої її координатою х, до початку відліку. Наприклад, точку числової

прямої, що лежить праворуч від початку коорди­нат на відстані 5 одиничних відрізків, позначили буквою А, тобто А(5). Пригадав? Нарисуй пряму. Познач початок. Як його позначити? Ну, звичай­но, підпишемо, як на лінійці, знизу 0. Відклади вправо п’ять однакових відрізків. Кінець остан­нього познач зверху буквою А, а знизу підпиши число 5. А тепер відклади вліво від початку три таких, як відкладав вправо, маленьких відрізки. Саму ліву поділку познач зверху буквою В. Яке число підпишеш під нею?

Барсик мовчки написав число -3 і поглянув на товариша.

  • Молодець, — знову похвалив його Маркіз. — Наука в ліс не йде... І пам’ять хороша. Так ось, згідно з умовою задачі, якщо координата х = 5 , то відстань х = 5 ; якщо координата х = -3 , то від­стань х = 3, тобто д; = -(-3) = 3. Мовою Паскаль я записав би це так: If х<0 then х:=-х; Це і є скорочена форма умовного оператора If умова then команда;. Тепер же запиши програми роз­в’язування обох задач, а я збігаю, подивлюся, що там у нас на сніданок.

Коли Маркіз повернувся, на піску красувала­ся таблиця:

 

 

Повна форма умовного оператора

Скорочена форма умовного оператора

Program Прикладі; var х,у: Real;

begin

write('Введіть число'); read(х);

if х<0 then у:=-х else у:=х;

write('Модуль цього числа',у); end.

Program Приклад2; var х: Real; begin

write('Введіть координату'); read (х);

if х<0 then х:=-х;

write('Відстань до початку',х); end.

 

 

Після сніданку, так і не дочекавшись запро­шення до хати, друзі, хоча й ситі, проте розчаро­вані, повернулися до свого класу під відкритим небом, як охрестив Барсик купу піску.

  • Що ми тепер будемо робити? — розпхинь- кався Барсик.
  • Те, що й учора. Розв’язувати задачі, писати програми, — відповів Маркіз, не знаючи чим заці­кавити малого. Йти до комп’ютера — мало напра- цювань, розв’язувати задачі — не завжди цікаво.
  • Ти знаєш, що кожне парне число ділить­ся на 2 без остачі? — це питання, бадьорий голос Маркіза змусили Барсика перемкнути свої безна­дійні думки на робочий режим.
  • Парні — це 2, 4, 6, 8, 10...? — все ще в’яло перепитав він.
  • Парні — це ті, що діляться на 2 без остачі,
  • повторив Маркіз. — Парні — це ті, що кратні 2, парні — це ті, що ти назвав, і ще безліч тих, що закінчуються парною цифрою.
  • І що з того? — чекаючи чогось несподіваного чи якихось підводних рифів, Барсик зосередився.
  • Чого наїжачився? — покепкував з нього Маркіз. — Давай напишемо програму, яка вка­зувала б, парне введене з клавіатури число чи не­парне, а заодно познайомишся з процедурою зна­ходження остачі від ділення одного цілого числа на друге, теж ціле число. Отже...

 

Та Барсик раптом жваво встряв у розмову:

  • Отже, названі мною числа «парні», а ті, які я пропустив — «дєвкі»? Так, чи що?

Маркіз пропустив мимо вух «випад» малого і продовжив:

  • Операцію визначення остачі від ділення двох натуральних а і Ь чисел мовою Паскаль за­писують так: а mod b. Наприклад: 5 mod 2 = 1; 12 mod 5 = 2; 4 mod 2 = 0; 25 mod 5 = 0; 100 mod 10 = 0...
  • Якщо я зрозумів правильно, — вихопився Барсик, — то парні числа при діленні на 2 дадуть в остачі нуль. Точно! Непарні числа при діленні на 2... Стривай... Остача не може бути нулем... не може бути більшою за 2... Остача буде 1. Все пра­вильно. Слухай: якщо число парне, то остача від ділення на 2 буде нуль, якщо ж непарне, то 1.
  • Ось ти й сформулював ключову фразу, — втрутився Маркіз. — Якщо a mod 2 = 0, то а пар­не, інакше а непарне. Пиши програму, тільки пам’ятай, що операція «остача від ділення» вико­нувана на множині натуральних чисел, тобто ці­лих додатних.

Барсика не потрібно було довго вмовляти, і че­рез кілька хвилин з’явився текст:

Program ПрикладЗ;

 var a: Integer;

begin

write('Введіть натуральне число ');

read(а) ;

    if (a mod 2)=0 then write(a,'- парне.')

        else write(а,'-непарне.') ;

end.

  • Оціни! — Барсик, явно задоволений, звер­нувся до Маркіза.
  • Ця програма має шанс на життя, — запевнив його Маркіз. — А тепер склади програму, яка ви­значала б більше із двох введених дійсних чисел.
  • Легко! — запевнив Барсик і, не знаючи які підводні камені чатують на нього, написав:

Program Прикладі; var a,b: Real;

begin

write('Введіть два числа ');

read(а,b);

if a>b then write(а:5:2, ' більше ‘ b:5:2)

else write(b:5:2,' більше ',а:5:2);

end.

  • Ця програма буде непогано працювати, але якщо користувач введе два рівних числа, то вона

виведе повідомлення про те, що друге число біль­ше за перше. Ти зрозумів? — Маркіз підсунув перший камінчик. — Ввели рівні числа, а програ­ма пише, що одне з них більше за друге. Ти ввів дві п’ятірки, а на екрані написано: «5 більше 5».

  • Але ж я думав правильно, — знітився Бар­сик, — і писав правильно. Що ти видумуєш?
  • Правильно для випадку, коли числа різні, а ми говоримо про випадок, коли числа рівні, — стояв на своєму Маркіз, але, бачачи нерозуміння в очах Барсика, вкотре пожалів малого, — між двома числами можуть бути не два, як у програмі, а три види відношень: числа рівні; перше введене більше, ніж друге; перше менше, ніж друге. У тво­їх позначеннях це запишеться так: а = b, або а>b , або а<b.
  • Тоді я напишу: «Введіть два різні числа», — випалив Барсик перше, що спало на думку.
  • Ми вже говорили з тобою про «недобросовіс­ного» користувача... — зупинив його Маркіз. — Ти краще думай, як вберегти твою програму від подібних проколів...— і, не втримавшись, підка­зав: — Може, ще щось допишеш? Я маю на увазі в програмному плані, а не у вигляді таблички «Не ходіть по газонах».
  • А якщо нам написати ще один рядок... — невпевнено почав Барсик. — Щось таке, чи що, не знаю, що це дасть, напишемо: «If   a=b  then  write (а : 5 : 2, ' = ', b : 5 : 2 ) ;». А ось де тепер його вставити? Вирішив! Напишемо так:

Program Приклад4;

var a,b: Real;

begin

write('Введіть два числа ');

 read(а,b);

if a=b then write(а:5 : 2,' = ',b:5:2);

if a>b then write(а:5:2 , ' > v,b;5:2) else write(a:5:2,' < ',b:5:2);

end.

  • Рішення, будемо вважати, правильне, — Маркіз був явно задоволений. — І ще ти молодець
  • сам вписав умовний оператор, та ще й у непо­вній формі. Твою програму можна було б записа­ти і так:

 

Program Приклад4а;

var a,b: Real;

begin

write ('Введіть два числа ') ;

read(a,b);

if a>b then write(а:5:2 ,' > ',b:5:2)

else if a=b then write (a: 5 : 2 , ' =

,b:5:2)

else write (a:5:2,' < ',b:5:2);

 end.

 

  • У твоєму варіанті програми, — у Барси­ка брови поповзли вгору, — говорять, що коман­ди розгалуження записані або виконуються по­слідовно, а в моєму — що ці команди вложено одна в одну. І ще одне. Ти бачиш, що програма, написана сходу, не завжди правильна, тому-то ми пишемо чорновий варіант тексту не зразу на комп’ютері, аналізуємо його, виправляємо, якщо знайшли помилки або недоліки тощо, виправляє­мо. Уяви, що ти написав ту свою першу програму, почав її випробовувати, а вона працює некорек­тно. Ти сидиш, напружено думаєш, перебираєш у голові можливі варіанти правок, а комп’ютер простоює. Зарубай собі на носі, що програміс­ти більше пишуть на папері, ніж на комп’ютері. Твоя писанина на піску приносить більше корис­ті, ніж сидіння біля комп’ютера, — а далі при­мирливо: — Взагалі-то, ця задача — відомий в інформатиці алгоритм «Більше з двох», хоча за­писується трохи інакше. Показати? — і, помітив­ши в очах товариша питання і згоду, продовжив. Найбільше значення математики називають мак­симумом, а найменше — мінімумом і позначають відповідно max та min. І максимум і мінімум — числа того ж типу, що й числа послідовності, для якої визначають найбільше чи найменше значен­ня. Отже, програма:

Program Max2;

Заголовок програми, ім’я якої Мах2

var a,b,max:real;

Змінні дійсного типу

begin

Початок

write('Введіть два числа');

Введення аргументів

read(a,b);

if a>=b then max:=a else max:=b;

Визначаємо найбільше серед даних, якщо вве­дені числа рівні, то най­більше — будь-яке з них

write('Найбільше з них ',max:5:2);

Виведення результату

end.

Кінець програми

 

 

  • Є питання чи ти все зрозумів? а>=b читають як більше або дорівнює, а два символи а<=b озна­чають менше або дорівнює. Як говоримо, у такій

же послідовності і пишемо символи відношень між числами.

  • Питання є, коли тебе немає, — жартома від­повів Барсик і знову «заспівав своєї»: — Коли ж ми вже дорвемося до комп’ютера? У нас є вже три робочі програми, а випробувати ніяк не вдається. У мене вже лапи сверблять. Так, так, усі чотири.
  • Добре, що не вуса, — відповів Маркіз і за­пропонував: — Ти краще поміркуй над програ­мою, яка визначала б більше з трьох різних чисел. Зверни увагу на те, що числа повинні бути різні.
  • Якщо а>b і b>с, то а — найбільше... — Барсик сподівався, що ця задача не набагато важ­ча за попередню, тим більше, що він все-таки розв’язав її. Проте Маркіз, скоріше за все, щоб зе­кономити час, чи з якихось інших міркувань не дав йому закінчити:
  • А що буде, коли а>b і с>b? Може статись, що с> а?
  • Тоді скажемо так, — Барсик охопила впев­неність, — якщо а>Ь і а >с, то число а найбіль­ше, потім... — Барсик на мить замислився і знову впевнено продовжив, — якщо b> а і b > с, то чис­ло b найбільше і, врешті-решт, якщо с> а і с>b, то число с найбільше. Отже, я запишу три послі­довні команди розгалуження...
  • Стривай, а як я за­пишу, що а>Ь і а>с? Як записати дві умови під­ряд?

 

 

 

А

Not А

1

0

0

1

 

 

 

А

В

A and В

1

1

1

1

0

0

0

1

0

0

0

0

А

В

A or В

1

1

1

1

0

1

0

1

1

0

0

0

 

 

  • Ось тут ми й прийшли з тобою до поняття складних умов, — розгладжуючи вуса, промовив Маркіз, а ще якось поважно додав: — Для цього доведеться нам з тобою зайнятися наукою, яка на­зивається «логіка». А тепер — увага! З усього ска­заного тобою чи будь-ким іншим можна вибрати речення, про які можна сказати, істинні вони чи хибні. Такі речення ми будемо називати тверджен­нями. Наприклад, твердження «5 — непарне чис­ло» істинне, а твердження «5 — парне число» хиб­не, а ось про вислів «натуральне число а парне», не знаючи значення а, сказати, істинний він чи ні, не можна. Із простих тверджень, таких як «сьо­годні чудовий день», «мене звати Маркіз», за до­помогою сполучників «і» та «або» можна утворю­вати складні твердження і, залежно від істинності

кожного з простих тверджень, визначати істин­ність складних. У Паскалі, якщо твердження іс­тинне, то говорять true, якщо хибне — false. На практиці істинність і хибність тверджень познача­ють символами відповідно « + » і «-», а найчастіше приписують значенню true 1, а значенню false — 0. Щоб зекономити час, я познайомлю тебе з та­блицями істинності, у яких твердження будемо позначати великими латинськими літерами А і В, їх істинність — 0 або 1, сполучник «і» — латиною and, «або» — or. Колись на дозвіллі на конкрет­них прикладах, якщо після програмування тебе потягне на логіку, перевіриш. Домовились? А те­

пер ще одна логічна операція —- заперечення, ла­тиною not. Тобто якщо твердження А істинне, то його заперечення хибне, і навпаки. Подивись у третю таблицю.

  • Дай я трохи розберуся, — заклопотано від­повів Барсик. — Можливо, я на перших порах буду користуватися цими таблицями, поки не ви­вчу або поки не зрозумію. Бідна моя голівонька. Скільки інформації...
  • То я тепер можу написати таку програму, — Барсик почав писати, але у п’ятому рядку Маркіз порадив відношення взяти в дужки:

 

 

 

 

 

 

 

 

 

Program МахЗ;

Заголовок програми з іменем МахЗ

var a,b,c,max: Real;

Опис змінних дійсного типу

Begin

Початок програми

write('Введіть три числа') ;

Блок введення аргументів

read(a,b,c);

if (a>b) and (a>c) then max:=a;

Якщо перше число більше за інші, то воно найбільше

if (b>a) and (b>c) then max:=b;

Якщо друге число більше за інші, то воно найбільше

if (c>a) and (c>b) then max:=c;

Якщо третє число більше за інші, то воно найбільше

write ('Найбільше з них ',max:5:2);

Виведення результатів

end.

Кінець програми

 

 

  • А що робити, якщо користувач введе три рівних числа, я не знаю, — чесно зізнався Барсик.
  • Тоді ми змусимо його вводити трійки чисел до тих пір, поки він не стане « законослухняним », — запевнив Маркіз. —• Для цього ми використаємо оператор безумовного переходу, або, як інакше кажуть, оператор переходу на мітку, який записують так: до^ N.
  • Це як в операторі вибору case N of? — пе­репитав Барсик.
  • І так, і не так, — відповів Маркіз. — У блоці описів потрібно спочатку оголосити мітку — на­туральне число — і тільки після цього можна здійснити перехід на цю мітку. Доречно сказа­ти, що міток може бути кілька. Ось, наприклад, так:

Program МахЗ;

Заголовок програми з іменем МахЗ

Label 111;

Опис мітки 111

var a,b,c,max: Real;

Опис змінних дійсного типу

begin

Початок програми

111:write('Введіть три різних числа');

Блок введення аргументів

read(a,b,с) ;

if (a=b) and (a=c) then goto 111;

Якщо числа рівні, перейти на мітку 111 і повторити введення аргументів

if (a>b) and (a>c) then max:=a;

Якщо перше число більше за інші, то воно найбільше

if (b>a) and (b>c) then max:=b;

Якщо друге число більше за інші, то воно найбільше

if (c>a) and (c>b) then max:=c;

Якщо третє число більше за інші, то воно найбільше

write'('Найбільше з них ',max:5:2);

Виведення результатів

end.

Кінець програми