LabVIEW: вгадуємо число діленням навпіл 1


Давненько я вже нічого не писав сюди. Не було про що, аж ось один дописувач виручив і підкинув нескладну, наче, задачку на e-mail. Суть задачки зводиться до вгадування задуманого користувачем числа методом ділення навпіл. “Користувач загадує число в межах від 0 до 200 і потрібно створити інструмент, який методом поділу на 2 буде відгадувати це число.”

Нічого складного, здається, але є ще приписка: “інтерфейс задали таким” і далі йде скріншот наступного плану:

LabVIEW: вгадуємо число діленням навпіл

LabVIEW: вгадуємо число діленням навпіл

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

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

Підпрограма для ділення відрізка навпіл

Підпрограма для ділення відрізка навпіл

Тут все очевидно і пояснень не потребує. Переходимо до основної частини програми, насамперед до її UI, яке я трохи “облагородив”, але не став придумувати нічого нового – хай залишається практично як є:

Інтерфейс програми для вгадування чисел

Інтерфейс програми для вгадування чисел

Переходимо до самої програми. Як я вже згадував, тут використовується обробка подій (events), тому з самих кнопок дані не знімаються, а відстежується сам факт натискання (value change) і далі керування передається у відповідний обробник – стан структури event.

Програма для відгадування чисел

Програма для відгадування чисел

Оскільки у нас тут рекурсія, то у нагоді стане інформація зі статей про доступ до даних попередньої ітерації циклу, а саме я використав зсувні регістри (Shift Registers), які передають результати роботи програми між ітераціями.

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

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

Почитайте ще оце:


Залиште коментар

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

Думка на тему “LabVIEW: вгадуємо число діленням навпіл