четвер, 28 квітня 2016 р.

Калькулятор у Scratch або готуємось до 8 класу

По гарячим слідам продовжуємо "клікати" кнопки, але цього разу вже з користю. А точніше "пишемо" справжній калькулятор.
Створимо заготовку для нашого калькулятора додавши кілька готових кнопок з попереднього посту. А як бути з екраном на якому будуть відображатися наші дії? Ті хто вже зрозумів, що являє собою поняття "змінна" звернув увагу, що при створенні змінної Scratch відображає її на екрані. Ось цим ми і скористаємось створивши змінну ТАБЛО. Малюємо кнопки, додаємо до них скрипти "клікання" і отримаємо наступну "форму" з кнопками.


Як працює калькулятор?

Щоб наш калькулятор працював як справжній варто поспостерігати за оригіналом скажімо у Windows.
Насправді начебто проста річ, виявляється не такою вже й простою. Чому? Давайте подивимось на декілька випадків.

Випадок №1 (простий)
Щоб обчислити вираз 1+2 нам потрібно виконати наступний алгоритм:

  1. Натиснути "Цифра 1";
  2. Натиснути "Кнопку+";
  3. Натиснути "Цифра 2";
  4. Натиснути "Кнопку=".

Як може працювати така схема? Коли ми натиснули "Цифра1" на нашомуо екрані, а це змінна ТАБЛО повинна з'явитись цифра 1. Це значить, що скрипт для  "Кнопки1" матиме вигляд
Аналогічний скрипт може мати "Кнопка2".

Коли ми натискаємо "Кнопка+" і у нас "нічого" не відбувається, але коли ми натискаємо "Цифра 2" на нашому табло замість цифри 1 повинна з'явитися і вона звичайно ж з'явиться цифра 2. Але найцікавіше відбувається тоді коли ми натискаємо "Кнопку=". При цьому на екрані з'являється відповідь 3.

Звичайно, що найбанальнішою, але неправильною відповіддю може бути скрипт для "Кнопки=" що має вигляд:

Чому неправильною? А якщо б у мене замість двох кнопок були усі 10. А якби мені потрібно було обчислити суму не 1+2, а наприклад 7+4 чи 9+8 і тд.

Я веду до того, що кнопка "Дорівнює" повинна реагувати саме на ті цифри, кнопки яких ми натискали. Давайте подумаємо як це зробити.

Для початку пригадаємо, що наш екран - це змінна або як її ще можна називати комірка пам'яті у якій можна зберігати якісь значення. Ця змінна має ім'я ТАБЛО і тоді коли ми натискаємо "Цифру1" ця змінна набуває значення 1. Коли ми натискаємо "Цифру 2" (після "Кнопки+") змінна набуває значення 2. І що найголовніше змінна ТАБЛО "забуває" те число (1) яке ми вводили першим!

Отже ми повинні перш ніж відобразити на ТАБЛО друге число запам'ятати перше! Запам'ятати ми зможемо у ще одній змінній. Створимо ще одну змінну. Назвемо її коротко (програмісти люди ліниві ;-) ) - буквою А. Великою буквою А.

Чому ВЕЛИКОЮ? Принципової необхідності немає, але Scratch як і більшість справжніх мов програмування є регістрозалежним. Тобто одночасно можуть існовати змінна "А" і змінна "а". До таких справжніх мов належать С++, Python та інші. Але є мови у яких Змінна "А" і змінна "а" це одна і та ж комірка пам'яті. До таких мов належить Pascal, BASIC.

Отже повертаючись до нашого алгоритму ще раз зазначимо, що змінна "А" нам потрібна для того, щоб запам'ятати перше число. Коли потрібно це зробити? Є мабуть два варіанти, але ми візьмемо той у якому будемо "запам'ятовувати" перше число тоді, коли натиснемо "Кнопку+".

Маємо наступний скирпт

Тепер нам залишилось подумати, що повинна робити "Кнопка=". Маю надію, що всі вже здогадались. Оскільки перше число ми запам'ятали у змінній "А", а друге число є на нашому ТАБЛО, а це теж змінна. Нам залишилось лише додати їх і результат знову записати до ТАБЛО.

Виглядає це так:

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


PS. Можливо для кращого розуміння останні дії можна виконати по іншому. Створити змінну В. і у скрипті для кнопки Дорівнює написати наступне:


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

Ну ось і підійшов до кінця наш Випадок №1 (простий).
Я не публікую тут готовий проект. Адже справжній калькулятор працює трішки інакше. 
У наступному пості поговоримо про приклади 121+221.