Як програма "рахує" гроші? Вона не бачить весь масив одразу, як ми. Вона бачить одну цифру за раз.
Ініціалізація (Обнулення каси): Перед початком перевірки ми створюємо змінну Total_Expenses. Важливо присвоїти їй значення 0. Якщо цього не зробити, у змінній може залишитися "сміття" з попередніх обчислень.
Ітерація (Конвеєр): Цикл for працює як конвеєрна стрічка. Він підносить нам кожну транзакцію по черзі.
Селекція (Фільтр): Оператор if — це наш контролер. Він запитує: "Чи є це число меншим за нуль?".
Якщо так — ми додаємо його до суми та тиснемо на кнопку лічильника.
Якщо ні — ми просто пропускаємо його далі.
Увага! Під час роботи з комп'ютером дотримуйтеся правил безпеки та санітарно-гігієнічних норм.
Повторіть правила безпечної роботи за комп’ютером.
Завантажте і встановіть: Середовище програмування Лазарус (для тих, хто не завантажив)
Контекст: Бухгалтерська програма вивантажила список усіх фінансових операцій магазину за зміну у вигляді текстового стовпця. У цьому списку додатні числа — це прибуток (продажі), а від’ємні — це витрати (закупівля товару, оплата комунальних послуг, повернення коштів покупцям).
Ваша роль: Розробити модуль "Аналітик витрат", який допоможе керівнику зрозуміти структуру збитків.
Імпорт даних: Зчитайте з текстового поля (списку операцій) усі числа (їх не більше 20) і збережіть їх у масив Усі_Транзакції.
Фільтрація збитків: Сформуйте окремий масив Тільки_Витрати, куди потраплять лише від’ємні значення з першого списку.
Звітність:
Виведіть список усіх знайдених витрат у друге текстове поле для перевірки.
Обчисліть середній чек витрат (середнє арифметичне значень другого масиву).
Виведіть результат у поле "Середні витрати за зміну".
Відкрийте вікно середовища Lazarus. Завантажте документ.
Розмістіть на формі:
два багаторядкових текстових поля заввишки 400 і з вертикальною смугою прокручування;
два написи: над першим багаторядковим текстовим полем з текстом Елементи (Усі_Транзакції) і над другим – з текстом Від’ємні елементи (Тільки_Витрати);
текстове поле з написом біля нього Середнє арифметичне (Середні витрати за зміну);
кнопку з текстом Виконати.
Створіть обробник події Click для кнопки і введіть у нього такий текст:
var a, b: array [0..19] of real; s, m: real; n, i, k: integer;
begin
n := Memo1.Lines.Count; // визначення кількості заповнених рядків багаторядкового текстового поля, тобто кількість чисел у ньому
for i := 0 to n - 1 do
a[i] := StrToFloat(Memo1.Lines[i]); // формування одновимірного масиву a з n чисел
s := 0; // початкове значення суми від’ємних елементів
k := 0; // початкове значення кількості від’ємних елементів
Тепер будемо переглядати послідовно всі елементи масиву a. І якщо знайдемо елемент з від’ємним значенням, збільшимо кількість таких елементів (k), включимо цей елемент до другого масиву (b) і додамо його значення до суми від’ємних значень (s).
Кількість елементів у масиві b заздалегідь невідома. Але вона точно не більше за 20. Тому в рядку var оголосимо одновимірний масив b максимально можливої кількості елементів (20) з номерами від 0 до 19.
Додайте до процедури такий текст:
for i := 0 to n - 1 do
if a[i] < 0 then begin
k := k + 1; // збільшуємо кількість від’ємних елементів
b[k-1] := a[i]; // включаємо знайдене від’ємне значення до масиву b під номером k-1 (оскільки номери масиву починаються з 0, то номер останнього елемента на 1 менше ніж кількість елементів)
s := s + a[i]; // додаємо від’ємне значення до суми
end;
Під час обчислення середнього арифметичного від’ємних значень потрібно врахувати, що в масиві a елементів з від’ємними значеннями може й не бути. У такому разі й у масиві b не буде жодного елемента, і це також потрібно врахувати під час його виведення.
Додайте до процедури такий текст:
Memo2.Clear; // очищення другого багаторядкового поля
if k = 0 then Memo2.Lines.Append(‘Значень, менших від 0, немає’)
else for i := 0 to k-1 do Memo2.Lines.Append(FloatToStr(b[i])); // виведення у друге багаторядкове поле повідомлення 1 або k елементів масиву b
if k = 0 then Edit1.Text := ‘Значень, менших від 0, немає’
else begin
m := s/k; // обчислення середнього арифметичного від’ємних значень
Edit1.Text := FloatToStr(m); // виведення середнього арифметичного від’ємних значень
end;
end;
Запустіть проєкт на виконання.
Уведіть у перше багаторядкове поле числа: 3,4; –7; 0; –13; 8,75; –23; 15. Виберіть кнопку Виконати. Проаналізуйте отриманий результат.
Видаліть числа з першого багаторядкового поля і введіть інші: –16; 98; –43; 45; 0; 45; –1; 29; –2,67; 55. Виберіть кнопку Виконати. Проаналізуйте отриманий результат.
Видаліть числа з першого багаторядкового поля і введіть інші: 16; 98,28; 45; 0; 45; 1; 29; 2,67; 55; 0. Виберіть кнопку Виконати. Проаналізуйте отриманий результат.
Уведіть свій набір чисел до першого багаторядкового поля. Виберіть кнопку Виконати. Проаналізуйте отримані результати.
Зробіть скриншот виконаного завдання та надішліть його вчителю.
Закрийте вікно виконання проєкту.
Закрийте вікно середовища Lazarus.
Збережіть усі файли та скриншоти.
Завантажте їх у розділ Ваші роботи на платформі Google ClassRoom.
Це критичний блок для майбутніх розробників. Уявіть, що за зміну не було жодної витрати.
Ваш лічильник кількості (count) залишиться рівним 0.
Коли програма дійде до рядка Average = Total / count, комп'ютер спробує поділити на нуль.
Результат: Програма аварійно завершиться (крашнеться), і бухгалтер не зможе подати звіт.
Інженерне рішення: Завжди додавайте перевірку перед фінальним розрахунком:
"Якщо кількість витрат > 0, тоді обчислюй середнє. Інакше — виведи повідомлення: Витрати відсутні".
"Інформатика, 9 клас" (Й.Я. Ривкінд та їнші):
Прочитайте та розберіть теоретичний матеріал пункту 5.2 (стор. 243-248), вправи 1, 2 (стор. 254).
Дайте усні відповіді на усні питання 1-3 (стор. 254).
Спробуйте відповісти на питання як системний аналітик:
Масштабованість: Що зміниться у вашому коді, якщо кількість транзакцій зросте з 20 до 200 000? (Підказка: чи витримає тип даних Integer таку велику кількість?)
Точність: Чому для фінансових розрахунків ми використовуємо дійсні числа (real / float), а не цілі (integer)?
Логіка: Як змінити умову, щоб знайти середній прибуток, але тільки для чеків, сума яких перевищує 1000 грн (VIP-клієнти)?