Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Тема 5 програмування нелінійних алгоритмів




Вправи

Питання для роздумів

Як Ви думаєте, чому значення фінансової функції Pmt має від’ємне значення? І чому від’ємні значення аргументів pmt двох інших фінансових функцій? Що відбудеться, якщо зробити ці значення додатніми?

Якщо вважати вираз 1 + 2 + 3 бінарною функцією, то чому рівні значення її аргументів? (Відповідь: 3 і 3.)

А чому рівні значення аргументів бінарної функції 1+ 2 * 3? (Відповідь: 1 і 6).

Нехай префіксний запис арифметичного виразу має такий вигляд: +(*(Mod(a, b), ^ (c,d)), +(a, c)). Як буде виглядати звичайний, інфіксний запис?

У якій послідовності будуть виконуватися операції у виразі 3 * 2 ^ 5 * 8/4? Чому дорівнюватиме результат?

Як Ви думаєте, чи однакові значення функцій, що повертаються, чи ні: Asc ("Visual Basic") Asc ("visual basic")?

Як Ви думаєте, чи однакові значення функцій, що повертаються, чи ні: Asc ("Visual Basic") Asc ("Visual Basic 6.0")?

Як Ви думаєте, чи повернеться вхідний Рядок$ після роботи складної функції LCase (UCase (Рядок$))? (Відповідь: Не завжди.)

Яка довжина ланцюжка, що міститься в полі мітки Label l у результаті роботи кода 4.6? На скільки вона відрізняється від довжини ланцюжка, що поміщається в те ж поле програмою кода 4.7? За допомогою якої функції можна виміряти цю довжину?

Внесіть зміни в код 4.5 так, щоб ввід даних у кожне з текстових полів здійснювався за допомогою Вікна вводу.

Напишіть програму, що вирішує задачу, протилежну розглянутій у прикладі 4.6. У текстове поле вводиться один рядок, що містить дані про прізвище, ім'я і по батькові. У цьому рядку вони розділені пробілами, наприклад: «Кузнєцов Ілля Юхимович». Програма повинна помістити в 3 текстових поля окремо прізвище, окремо ім'я й окремо по батькові. (Вказівка: Використовуйте функції пошуку і виділення підрядка, про які йшла мова в розд. 4.3.)


6.1. Лінійні та нелінійні алгоритми
6.2. Логічні вирази та обчислення їх значень
6.3. Поняття умовного оператора
6.4. Приклади використання умовного оператора при створенні додатків
6.5. Безумовний оператор і безумовний перехід
6.6. Додаткові відомості

Ви прекрасно знаєте, що при вирішенні більшості задач (якщо вони не зовсім прості) часто приходиться вибирати, по якому з декількох шляхів потрібно йти до рішення.

Пам’ятаєте картину художника Віктора Васнєцова «Витязь на розпутті»? Який напис на камені читає витязь? Очевидно, такий, котрий змушує його задуматися над вибором подальшого шляху. При цьому його рішення повинне бути однозначним — він повинен обрати єдиний шлях, відкинувши всі інші.

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

У цій главі Ви довідаєтеся, як програмуються алгоритми, які мають розгалуження — вибір шляху вирішення задачі відповідно до виконання чи невиконанням деякої умови вибору.

Як відзначають класики РОЗГАЛУЖЕННЯ - 1) передача керування за наявності альтернатив; 2) вибір у програмі однієї або декількох послідовностей команд при виконанні деякої умови (В.П. Гондюл, А.Г. Дерев'янко, В.В. Матвєєв, Ю.З. Прохур Короткий тлумачний словник Інформатика та обчислювальна техніка "Либідь" Київ-2000 стор.250).

Для представлення умов вибору в мові Visual Basic існує особливий вид виразів — умовні вирази. У даній главі буде розглянуто визначення умовного виразу та приклади умовних виразів.

Потім будуть розглянуті конструкції мови Visual Basic, у яких використовуються умовні вирази, — умовні оператори. За допомогою саме цих операторів і програмуються розгалуження.

Буде розглянутий і так званий безумовний оператор (чи оператор безумовного переходу), саме визначення якого говорить про те, що ніякого вибору він не передбачає. Але іноді при написанні програм доводиться використовувати і його.

6.1. Лінійні та нелінійні алгоритми

У найпростішому випадку алгоритм складається з однієї чи декількох дій (розпоряджень виконавцю), що повинні бути виконані у строгій послідовності, без всяких умов і в строгій відповідності з тим порядком, у якому записані оператори програми. Такий алгоритм називається лінійним.

Приклад 6.1. Прикладом лінійного алгоритму може служити розглянуте в главі 2 рішення задачі про знаходження площі стін кімнати. У цьому алгоритмі послідовно виконуються наступні розпорядження:

Ввести довжину кімнати, привласнити змінній А введене значення.

Ввести ширину кімнати, привласнити змінній В введене значення.

Ввести висоту кімнати, привласнити змінній H введене значення.

Зробити обчислення за формулою: S= 2 (А + В) H.

Вивести (надрукувати) результат — значення змінної S — площа стін кімнати.

За допомогою лінійних алгоритмів вирішуються найпростіші задачі. У них число дій виконавця в точності дорівнює числу операторів програми. Прикладами таких програм можуть служити коди, наведені в попередніх главах.

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

Алгоритми, у яких послідовність виконання деяких розпоряджень залежить від виконання умов, що перевіряються виконавцем, називаються нелінійними.

Приклад 6.2. Прикладом нелінійного алгоритму може служити розв'язання задачі про переключення світлофора.

Зміст задачі полягає в наступному. На світлофорі горить один із трьох кольорів. Потрібно визначити, який колір повинен запалитися після його переключення. Потім потрібно визначити, який колір повинен запалитися після наступного переключення і т.д.

Нехай для визначеності на самому початку жовтий колір змінюється на червоний. Тоді алгоритм вирішення задачі може бути таким (До імен змінних доданий суфікс (знак $), для того щоб було видно, що ці змінні належать до типу String. (Про суфікси змінних мова йшла в розд. 3.4.)):

Привласнити змінній НовийКолір$ значення «червоний».

Привласнити змінній СтарийКолір$ значення «жовтий».

«Запалити» червоне світло — вивести на екран зображення світлофора із включеним червоним світлом.

Якщо НовийКолір$ має значення «червоний» чи «зелений», то «запалити» жовте світло, привласнити змінній СтарийКолір$ значення НовийКолір$, а змінній НовийКолір$ — значення «жовтий» і перейти до 7-го пункту. У протилежному випадку перейти до наступного, 5-го пункту.

Якщо СтарийКолір$ має значення «червоний», то «запалити» зелене світло, привласнити НовийКолір$ значення «зелений» і перейти до пункту 6. У протилежному випадку «запалити» червоне світло, привласнити НовийКолір$ значення «червоний» і перейти до пункту 6.

Привласнити СтарийКолір$ значення «жовтий».

Перейти до пункту 4.

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

А в наступній главі ми розповімо про більш складні нелінійності — про дії, що неодноразово повторюються.

Hові поняття:

лінійний алгоритм, нелінійний алгоритм.

Питання для роздумів

Які лінійні алгоритми Вам як виконавцю доводиться виконувати протягом дня?

Наведіть приклади нелінійних алгоритмів, що доводиться виконувати при вирішенні математичних задач (рівнянь, нерівностей і т.п.).

6.2. Логічні вирази та обчислення їхніх значень

У главі 4 було дане визначення арифметичного виразу. А тепер познайомимося з визначенням виразу іншого, неарифметичного типу. Це логічний вираз. Їх називають також умовними виразами. У програмуванні такі вирази застосовуються дуже часто. Зокрема, з ними Вам доведеться мати справу при вивченні нелінійних алгоритмів.

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

Проста умова — це два вирази, між якими є знак порівняння. У ролі виразів можуть виступати числа, числові змінні, що мають значення, функції, а також будь-які арифметичні вирази. Зрозуміло, ці вирази можуть бути дуже складними.

Тут Ви можете згадати про операції порівняння, що Ви вивчали на заняттях математики. Але в мові Бейсік, як виявилося, ці операції позначаються іноді не зовсім так, як у математиці (табл. 6.1).

Табл. 6.1
Операція Опис операції
> Більше ніж
> = Більше або дорівнює
< Менше ніж
<= Менше або дорівнює
= Дорівнює
<> Не дорівнює

Проста умова, у залежності від того, виконується вона чи ні, має значення True чи False — Істина або Неправда. (True і False — ключові слова Visual Basic, тому набрані напівжирним шрифтом.)

Наведемо приклади простих умов і їхніх значень.

Приклад 6.3

2.9994 < 2.9995 має значення True;
3.1416 <= 3.1416 має значення True;
1.3 E -18 < 2.3 E -19 має значення False;
-Y^2 > Abs (Y) має значення False (передбачається, що змінна Y має числовий тип.);

А тепер ми можемо познайомити Вас з більш повним визначенням умовного виразу.

Умовний (логічний) вираз — це або проста умова, або складна умова.

Складна умова — це послідовність простих умов чи інших умовних виразів, укладених у круглі дужки, що з'єднані між собою знаками логічних операцій: Andлогічного множення, Orлогічного додавання, Notлогічного заперечення (по-російському відповідно: І, Чи, Ні) і деякими іншими. (And, Or і Not — ключові слова Visual Basic і тому набрані напівжирним шрифтом.)

Як і визначення арифметичного виразу, визначення умовного виразу є рекурсивним. (Якщо Ви забули, що це таке, загляньте до розд. 4.1.)

В окремому випадку (а так буває у більшості випадків!) умовний вираз складається тільки з однієї простої умови і не містить ніяких логічних операцій.

Як і арифметичний вираз, умовний вираз обчислюється, але на відміну від арифметичного виразу, у нього може бути лише одне з двох значень: True чи FalseІстина чи Неправда.

Значення логічного виразу обчислюється за правилами обчислення значень логічних виразів, аналогічних правилам арифметичних дій. Ці правила потрібно просто вивчити, як усі ми колись вчили таблицю множення!

Табл. 6.2
А В A And В
True True True
True False False
False True False
False False False

Табл. 6.2 (таблицю логічного множення) можна запам'ятати за допомогою однієї фрази: «Логічний добуток істинний тільки тоді, коли обидва логічних співмножника істинні».

«ІстинаІІстина є Істина, в інших випадках — Неправда»

 

Табл. 6.3
А В A Or В
True True True
True False True
False True True
False False False

Табл. 6.3 (таблицю логічного додавання) теж можна запам'ятати за допомогою тільки однієї фрази: «Логічна сума помилкова тільки тоді, коли обидва з логічних доданків помилкові».

«Неправда чи Неправда є Неправда, в інших випадках — Істина»

 

Табл. 6.4
А Not A
True False
False True

Табл. 6.4 (таблиця логічного заперечення) ще простіше. Правило логічного заперечення можна сформулювати так: «Логічне заперечення виразу хибне, якщо сам цей вираз істинний, і навпаки».

«Не Істина є Неправда, Не Неправда є Істина»

Приклад 6.4

(X^2 > 0) Or (X^2 = 0) має значення True;

(Y^2>= 0) And (Abs (Z) >= 0) має значення True (Передбачається, що змінні X, Y і Z мають числовий тип);

Not (Len ("abc") > 0) має значення False;

(Len ("abc") < 3) Or (Len ("abc") > 3) має значення False;

(Len (S1+ 52) >= Len (S1)) And (Len (51 + 52) >= Len (S2)) має значення True (передбачається, що змінні S 1 і S 2 мають тип String).

Ви можете запитати, навіщо потрібні такі складні конструкції? Чи не можна обійтися без них?

Дійсно, у «життєвих» (не чисто математичних) задачах умови, як правило, більш прості. Але бувають і виключення.

Приклад 6.5. Розглянемо дещо спрощене юридичне правило:

«Людині призначається пенсія, якщо ця людина чоловік і йому більше 60 років, чи якщо ця людина жінка і їй більше 55 років, чи якщо стаж роботи людини «на шкідливому виробництві» перевищив 25 років».

Спробуємо звести це правило до логічного виразу, істинність якого означає, що дана особа — людина пенсійного віку.

Для цього розглянемо наступні змінні:

Пенсіонер — змінна, значення якої True, якщо людина пенсіонер, і False, якщо людина не пенсіонер;

Стать$ — змінна, значення якої "чоловік" чи "жінка";

Вік! — змінна, значення якої — вік людини;

СтажЗаВислугою! — змінна, значення якої — стаж роботи людини «на шкідливому виробництві» (за вислугою років) (як і в прикладі 6.2, до імені кожної змінної доданий суфікс (знак! чи $) для того, щоб було зрозуміло, до якого типу належить ця змінна. (Нагадаємо, що про суфікси змінних йшла мова в розд. 3.4.)).

Логічне правило можна записати так:

Пенсіонер =
(Стать$ = "чоловік" And Вік! >= 60) Or
(Стать$ = "жінка" And Вік! >= 55) Or
СтажЗаВислугою! >= 25

Ви переконалися, що й у житті іноді доводиться стикатися з досить мудрими логічними умовами.

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

Нові поняття:

проста умова, складна умова, умовний (логічний) вираз, логічні операції, логічне множення, логічне додавання, логічне заперечення.

Питання для роздумів

Як Ви думаєте, чому позначення нерівності в мові Бейсік відрізняється від позначення нерівності у математиці?

Нехай змінна x має тип Single. Для яких значень x вираз x Mod 2 = 0 буде істинним? А вираз Int (x/2) = х/2?

Чи буде відрізнятися логічне множення від звичайного множення, якщо значення True і False замінити на 1 і 0? А логічне додавання?

Як варто змінити знаки порівняння в умовних виразах прикладів 6.3 і 6.4, щоб їхні значення змінилися?

Могли б Ви навести приклади значень змінних, що входять до логічного виразу прикладу 6.5, для яких значення цього виразу було б істинним? Помилковим?

6.3. Поняття умовного оператора

Першим кроком до освоєння нелінійних алгоритмів є вивчення умовного оператора.

У мові Visual Basic є дві форми синтаксису цього оператора: спрощена однорядкова форма і більш складна багаторядкова форма.

Однорядкова форма синтаксису умовного оператора така:

If УмовнийВиразThen Оператор? [Else Onepaтop2 ]

Багаторядкова форма синтаксису більш складна:

IfУмовнийВираз Then Послідовність Операторів 1 [Else ПослідовністьОператорів2 ] End If

Нагадаємо, що напівжирним шрифтом виділяються ключові слова, квадратними дужками — конструкції, що можуть бути відсутніми.

Конструкції Onepamop і ПослідовністъОператорів не мають потреби в роз'ясненні — Ви починаєте поступово поповнювати Ваш запас знань про оператори.

Що таке УмовнийВираз, Ви довідалися в розд. 6.2.

А тепер розповімо про логіку роботи умовного оператора.

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

Розглянемо два випадки: більш простий, коли ключове слово Else відсутнє, і більш складний, коли слово Else присутнє. У першому випадку умовний перехід називається одинарним, у другому — подвійним.

Одинарний умовний перехід. Якщо умовний вираз має істинне значення (докладніше про це ми розповімо в наступному розділі), робиться перехід до виконання операторів, що йдуть за словом Then. Якщо умовний вираз має хибне значення, виконання умовного оператора відразу закінчується. Починають виконуватися оператори програми, що слідують за умовним оператором.

Подвійний умовний перехід. Якщо умовний вираз має істинне значення, робиться перехід до виконання операторів, що стоять після слова Then. Якщо умовний вираз має хибне значення, робиться перехід до виконання операторів, що йдуть за словом Else. Після цього виконання умовного оператора закінчується. Починають виконуватися оператори програми, що йдуть за ним.

Приклад 6.6. Приклад одинарного переходу — алгоритм обчислення модуля (абсолютної величини) деякого числа — значення змінної Число:

Код 6.1
МодульЧисла = Число IfЧисло<0 ThenМодульЧисла = — Число

Приклад 6.7. Приклад подвійного переходу — алгоритм обчислення максимального з двох нерівних чисел — значень змінних Число 1 і Число 2:

Код 6.2
IfЧисло1>Число2ThenМаксЧисло=Число1 Else _МаксЧисло=Число2

Використання однорядкової форми умовного оператора приводить до того, що рядки програми стають дуже довгими, часто вони не містяться на екрані і їх читання вимагає застосування горизонтальної смуги прокручування Вікна програмного коду. Але нагадаємо Вам, що в мові Visual Basic є правило переносу: можна переносити запис оператора на наступний рядок за допомогою знака _ (підкреслення) після пробілу. Тут правило переносу застосоване один раз.

Приклад 6.8. Розглянемо юридичне правило визначення пенсійного віку (див. приклад 6.5 з попереднього розділу).

Спробуємо написати логічний оператор з перевіркою істинності логічного виразу для цього правила.

Неважко переконатися, що наше юридичне правило можна формально записати таким чином:

Код 6.3

Нові поняття:

умовний оператор, однорядкова форма синтаксису, багаторядкова форма синтаксису, умовний перехід, одинарний умовний перехід, подвійний умовний перехід.

Питання для роздумів

Чи можна знаходити максимальне з двох чисел за допомогою одинарного, а не подвійного умовного переходу, як це робиться в прикладі 6.7?

Чи можна знаходити модуль числа за допомогою подвійного, а не одинарного переходу? (Для відповіді використайте приклади 6.6 и 6.7)? А чи не можна зробити це, взагалі не використовуючи умовний оператор? (Відповідь: Можна, за допомогою функції Abs.)

Змогли б Ви записати код для прикладу 6.8 за допомогою одинарного, а не подвійного переходу?

Вправи

Допустимо, Ви хочете помістити на об'єкт (на екранну чи форму на якийсь інший об'єкт, наприклад, у текстове поле) значення змінної Ім'я. Але значення властивості BackColor (Колір фону) цього об'єкта Вам невідоме. Відомо тільки, що воно дорівнює або vbBlack, або vbWhite (колір фону або чорний, або білий). Напишіть фрагмент програми, за допомогою якої в залежності від кольору фону встановлюється колір букв Імені, що поміщається на об'єкт. (Колір букв визначається значенням властивості ForeColor об'єкта.)

У середовищі Visual Basic запрограмуйте додаток «Пенсійний стаж». Користувач вводить свій вік, стать і стаж роботи на шкідливому виробництві (за вислугою років). Додаток повинен видавати результат — пенсійний стаж користувача (якщо він пенсіонер). Будемо називати пенсійним стажем кількість років, що людина знаходиться на пенсії (не плутайте з виробничим стажем чи стажем роботи).

Екранна форма цього додатка може мати вид, показаний на мал. 6.1.

Мал. 6.1. Вікно додатка для визначення пенсійного стажу

Наприклад, якщо жінка має вік 58 років, з яких вона 37 років проробила на шкідливому виробництві, то пенсійний стаж буде визначатися як максимальне з двох чисел (58-55) і (37-25) - тобто буде дорівнювати 12 рокам. А якщо жінці 70 років, з яких вона проробила на шкідливому виробництві, її пенсійний стаж за віком буде перевищувати її пенсійний стаж за вислугою років - дорівнюватиме 15 рокам.

6.4. Приклади використання умовного оператора при створенні додатків

Приклад 6.9. Розглянемо наступну задачу. За прогнозом соціологічних установ за партію П1 з ймовірністю 75% проголосує більшість населення, а за партію П2 з ймовірністю 25%. Якщо переможе партія П1 то кабінет міністрів залишиться без змін. Якщо ж переможе на виборах партія П2 то кабінет міністрів оновиться

Ми хочемо змоделювати цю ситуацію на комп'ютері в такий спосіб: створимо Windows-додаток, вікно якого буде містити два текстових поля і командну кнопку (мал. 6.2).

Мал. 6.2. Вікно додатка, що вирішує задачу про начинку для пирога

Після запуску додатка в його вікні потрібно клацнути командну кнопку. У текстових полях з імовірністю 75 % повинні з'явитися повідомлення: «Партія П1» і «Залишиться старим» — і з ймовірністю 25 % — повідомлення: «Партія П2» і «Зімнеться склад». При бажанні можна натискати на командну кнопку стільки разів, скільки захочеться. І щораз повідомлення повинні з'являтися із зазначеною імовірністю.

Як завжди, будемо створювати проект Visual Basic поетапно: спочатку спроектуємо інтерфейс (екранну форму з усім її вмістом), а потім — складемо алгоритм і напишемо програму рішення даної задачі.

Розробка інтерфейсу. Ввійдемо в середовище Visual Basic 6, скористаємося заготовкою екранної форми і за допомогою стандартного набору інструментів Toolbox розмістимо на ній необхідні об'єкти управління. Зокрема, помістимо на цю форму два текстових поля, над якими встановимо мітки з роз'ясненням того, що буде записуватися в ці текстові поля. Під ними встановимо командну кнопку.

Потім за допомогою Вікна властивостей привласнимо значення деяким властивостям екранної форми та об'єктів на цій формі.

Ряд властивостей (таких, як шрифти і колір фону міток та текстових полів) зараз нас мало цікавить — при складанні програми нам знадобиться лише властивість Name чи ім'я ідентифікатор об'єкта. Привласнимо цій властивості наступні значення:

ПУСК (ім'я командної кнопки);

Text l (ім'я верхнього текстового поля);

Text 2 (ім'я нижнього текстового поля).

Програмування. На цьому етапі насамперед визначимо подію, що буде запускати нашу майбутню програму. Такою подією в даному випадку є натискання (клік) кнопки ПУСК (зрозуміло, за допомогою миші).

У Вікні програмного коду середовища Visual Basic цю подію ми легко знайдемо у списку припустимих подій (усього в цьому списку Ви можете нарахувати 17 різних подій) для об'єкта з ім'ям ПУСК — створеної нами командної кнопки. Подія, що полягає в кліку кнопки, називається Click. A програма (процедура), що запускається при натисненні цієї кнопки, називається ПУСК_Click.

Після вибору нами потрібної події у Вікні програмного коду з'явиться запрошення до запису коду — програми мовою Visual Basic, що розв'язує нашу задачу.

Тепер приступимо до головного — складанню алгоритму і до опису цього алгоритму мовою Visual Basic. (У дійсності ці два етапи часто виконують одночасно — алгоритм відразу записується мовою програмування. Але на початковому етапі навчання програмуванню я Вам не раджу цього робити!)

У даній задачі насамперед необхідно розібратися в тому, як запрограмувати обчислення імовірності якої-небудь події мовою Visual Basic. Мова в даному випадку йде про такі події, що можуть або відбутися, або не відбутися. В особливому розділі математики — теорії ймовірностей, — такі події називаються випадковими. Імовірністю випадкової події називається обмірювана у відсотках (чи частках одиниці) можливість здійснення цієї події.

Для цієї мети в мові Visual Basic існує спеціальна вбудована функція Rnd (від Random — буквально: випадковий (англ.)), значення якої— число, обране випадковим чином з інтервалу між 0 і 1.

Якщо говорити строго, це число не зовсім випадкове — воно береться з дуже довгої послідовності так званих псевдовипадкових чисел. Тому перед використанням функції Rnd у програмі необхідно випадковим чином визначити місце в цій послідовності, починаючи з якої ми будемо вибирати ці числа.

Для цієї мети використовується оператор рандомізації Randomize z, де z — довільне число. Для забезпечення істинної випадковості необхідно, щоб це число при кожному новому запуску програми було різним. Цього ми можемо домогтися, використовуючи вбудований лічильник часу — функцію Timer. Ця функція не має аргументів. Вона повертає поточне значення часу в секундах з точністю 0.01 сек.

Якщо параметр z в оператора Randomize відсутній, Visual Basic за замовчуванням вважає його значенням функції Timer.

Таким чином, ймовірність події, рівну, наприклад, 75 %, можна визначити як імовірність того, що значення функції Rnd менше, ніж 0.75.

А тепер приведемо запис нашої програми (код 6.4):

Код 6.4

У цій програмі ми використовували багаторядкову форму запису умовного оператора.

Можна вирішити ту ж саму задачу і за допомогою однорядкового запису умовного оператора (код. 6.5).

Код 6.5

Нагадаємо Вам одну особливість цього програмного коду. Присутні в ній змінні a$ і b$ мають суфікс $. Це означає, що вони мають тип String (замість суфікса ми могли б скористатися оператором Dim). Суфікс у змінній можна вказати тільки один раз — коли вона з'явилася в записі програми вперше. Саме так і зроблено в даному програмному коді.

Порівняємо різні варіанти коду для задачі про начинку для пирога. Помітимо, що багаторядкова форма умовного оператора (код 6.4), хоч і вимагає наприкінці запису ключового слова End If, явно легше сприймається при читанні, ніж однорядкова форма (код 6.5), і тому їй віддається перевага.

В мові Visual Basic є ще один зручний засіб програмування умовного переходу — вбудована функція IIf.

Її синтаксис такий:

llf (УмовнийВираз, Значення1, Значення2)

Ця функція повертає Значення 1, якщо умовний вираз істинний, і Значення 2, якщо умовний вираз хибний.

Код нашого приклада стає ще простішим:

Код 6.6

Якщо коди 6.4 і 6.5 містили, відповідно, 7 і 6 рядків, то код 6.6 містить всього 4 рядки (перший та останній рядки кожної процедури ми не враховуємо).

Спробуємо відповісти ще на одне питання: чи можна вирішити нашу задачу — створити додаток «Вибори», не використовуючи при цьому ніяких текстових полів? Виявляється, що можна. Результат можна просто надрукувати на екранній формі за допомогою методу Print.

У нашому прикладі результати привласнюються властивості Text двох текстових полів. Але замість цього можна привласнити ці результати двом змінним, наприклад, Рядок 1 і Рядок 2, а потім ці змінні надрукувати:

Код 6.7

Текстові поля при цьому будуть не потрібні (мал. 6.3):

Можна зробити ще простіше — обійтися без змінних Рядок 1 і Рядок 2, а надрукувати результат (значення функції IIf) відразу:

Код 6.8

 

Мал. 6.3. Використання методу Print для видачі результату в задачі про начинку для пирога

У Visual Basic є й інші способи видачі результатів роботи. Можна, наприклад, використовувати об'єкт Мітка на екранній формі і результат привласнювати властивості Caption цього об'єкта. Можна використовувати і спеціальне вікно повідомлень — функцію MsgBox (ця функція була визначена в розд. 4.2.). Наступний приклад демонструє саме такий спосіб видачі результату.

Приклад 6.10. Розглянемо програму, що «грає» з користувачем у наступну гру: комп'ютер «задумує» ціле число (допустимо, одну з п'яти цифр — від 1 до 5); користувач намагається вгадати це число. Якщо йому це вдається, з'являється повідомлення про «успіх» користувача.

При програмуванні насамперед постає питання про те, як «задумати» число. І тут Вас виручить уже знайома Вам функція Rnd.

Але ця функція повертає не ціле число, а дробове з інтервалу від 0 до 1. Для того, щоб одержати випадкове значення N з інтервалу від N 1 до N 2 (N, N 1, N 2 — цілі числа), скористайтеся таким способом:

N = N1 + Int (Rnd * (N2 — N1 + 1)).

(Нагадаємо, що функція Int не округляє значення свого аргументу. Наприклад, Int (0.05) = 0; Int (4.95) = 4.)

У нашому випадку N 1 = 1, N 2 = 5. А значенням змінної N з однаковою імовірністю буде одне з п'яти чисел: 1, 2, 3, 4, 5.

Як звичайно, побудову додатка в середовищі Visual Basic почнемо з проектування екранної форми (інтерфейсу).

Крім Міток для пояснювальних написів, помістимо на екранну форму не одну, як ми робили раніше, а дві Командні кнопки й одне Текстове поле для введення числа. Привласнимо цим об'єктам імена: Командним кнопкам — імена Command l і Command 2; Текстовому полю — ім'я Number.

У силу того, що на екранній формі не одна, а дві командні кнопки, програмний код нашого додатка буде містити опис не однієї, а двох процедур-подій: однієї — для натиснення кнопки СТАРТ 1 (з ім'ям Command l) і іншої — для натиснення кнопки СТАРТ 2 (з ім'ям Command 2).

Розкривши Вікно програмного коду, а в ньому — список Об'єктів, по черзі виділимо в цьому списку два рядки з об'єктами Command l і Command 2. При цьому у вікні з'являться запрошення (заготовки) для двох процедур (мал. 6.4).

Мал. 6.4. Вікно програмного коду із запрошеннями (заготовками) для запису двох процедур

Настав час розібратися з ключовими словами Sub і Private, що стоять у перших рядках цих заготовок.

Слово Sub має стародавнє походження — це скорочення слова subroutineпідпрограма. Так на зорі програмування називали допоміжні процедури, що викликалися основною програмою. У мові Visual Basic так позначаються будь-які процедури.

Слово Private (Priuate— буквально: особистий, приватний (англ.)) вказує на те, що ми маємо справу з так званою локальною процедурою. Локальна процедура доступна тільки всередині даного модуля (нагадаємо (див. розд. 1.7), що програмний модуль — це сукупність процедур, а сукупність модулів — це проект Visual Basic), і не може бути викликана з інших модулів проекту. Якщо замість слова Private використовується слово Public (Public— буквально: загальнодоступний, суспільний (англ.)), це означає, що процедура глобальна, тобто може бути викликана іншими модулями проекту.

Нагадаємо, що за допомогою цих же слів можна оголосити і змінну (використовувати одне з цих слів замість оператора Dim). У цьому випадку змінна буде локальною (Private), тобто доступною процедурам тільки одного даного модуля, чи глобальної (Public), тобто доступною процедурам усіх модулів проекту (подробиці — у розд. 3.4).

Глобальні змінні з'являються в Розділі загальних оголошень (General), що знаходиться перед найпершою процедурою у Вікні програмного коду.

Словами End Sub завершується опис кожної процедури.

Програмний код для нашої задачі наступний:

Код 6.9

На мал. 6.5 приведене вікно додатка для нашої задачі, на яке накладена панель повідомлення з поздоровленням користувача.

Мал. 6.5. Демонстрація роботи додатка «Угадай число»

Працює програма так. Клік першої командної кнопки «змусить» комп'ютер «задумати» число. Клік другої командної кнопки (після введення користувачем свого числа) запустить порівняння цих чисел. Порівняння буде проводитися за допомогою оператора If... Then.... Якщо числа співпадуть, спрацює функція MsgBox, що видасть повідомлення про успіх користувача на панелі повідомлення.

Нові поняття:

Псевдовипадкове число, оператор рандомізації, лічильник часу, локальна (Private) і глобальна (Public) процедури.

Питання для роздумів

Як за допомогою функції IIf записати алгоритм обчислення модуля числа?

Як за допомогою функції IIf записати алгоритм знаходження максимального з двох чисел?

Яка з двох змінних коду 6.9: Number l і Number 2 — локальна, а яка — глобальна і чому?

Як за допомогою функції рандомізації задати випадкове число не між нулем і одиницею, а між 0 і 1001 А як задати ціле випадкове число між 0 і 100?

Як Ви думаєте, чому для створення випадкового цілого числа в інтервалі від N 1 до N 2 некоректним буде такий спосіб: N = N 1 + CInt (Rnd * (N 2 — N 1))? (Функція CInt округляє значення свого аргументу. Наприклад, CInt (0.05) = 0; Clnt (4.95) = 5.) (Питання складне!)

Вправа

У середовищі Visual Basic запрограмуйте додаток «Обсяги двох кімнат». Користувач повинен ввести розміри двох кімнат — їхню довжину, ширину і висоту. Програма повинна не тільки видати їхні обсяги, але і повідомити, яка кімната і на скільки куб. метрів більша.

Рекомендація. Можна запропонувати таку, наприклад, екранну форму, що показана на мал. 6.6.

На екранній формі 2 командні кнопки. Натискання верхньої повинне викликати обчислення обсягів двох кімнат, а натискання нижньої — роботу умовного оператора — порівняння отриманих значень.

Мал. 6.6. Екранна форма для задачі порівняння обсягів двох кімнат.

У залежності від результату цього порівняння в нижньому текстовому полі повинно з'явитися або повідомлення, подібне до показаного на мал. 6.6, або повідомлення: «Ви забули знайти обсяги кімнат, чи ці обсяги однакові».

Вказівка. Значення обсягів кімнат, знайдені за допомогою процедури Command 1 _Click, привласніть двом змінним, котрі будуть використовуватися в процедурі Command2_Click. Не забудьте: оголосити ці змінні необхідно не всередині процедури, а поза нею.

6.5. Безумовний оператор і безумовний перехід

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

Його синтаксис такий:

GoTo Мітка

де GoTo — ключове слово; Мітка — символьний ланцюжок, що може бути поставлений перед яким-небудь оператором програмного коду.

Цей оператор буде виконуватися відразу ж після виконання оператора GoTo. Перехід до цього оператора називається безумовним переходом. (Пояснювати, чому оператор GoTo зветься безумовного, немає необхідності. Ви можете зробити це самі.)

На відміну від імені змінної Мітка може починатися з цифри.

Приклад 6.11. Наступний фрагмент програми крім трьох умовних операторів (If... Then...) містить кілька операторів GoTo.

Код 6.10.

Цей фрагмент програми вирішує наступну задачу. Якщо значення змінних a, b і с можуть бути значеннями довжини сторін трикутника, про це буде видано одне повідомлення, якщо ж не можуть — буде видане інше повідомлення.

Хоча зазначена задача вирішується успішно, не поспішайте брати на озброєння такий стиль програмування задач подібного роду. Більш того, у наш час програмісти надають перевагу взагалі не використовувати оператор GoTo. В другій частині нашого посібника цьому буде дане докладне пояснення.

Однак, іноді оператор GoTo все-таки застосовують. Про використання оператора безумовного переходу буде йти мова в наступній главі.

Hові поняття:

безумовний оператор, безумовний перехід, мітка.

Питання для роздумів

Чи зможете Ви, використовуючи оператор GoTo, привести приклад програми, робота якої не може закінчитися?

А чому робота наступної програми (код 6.11) досить швидко закінчиться?

Код 6.11

Скільки різних чисел встигне надрукувати ця програма? (Для відповіді на питання згадайте, який діапазон можливих значень у чисел типу Byte.)




Поделиться с друзьями:


Дата добавления: 2014-12-23; Просмотров: 1029; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.163 сек.