Урок 51-52. Опрацювання одновимірних масивів: пошук елемента з найбільшим, найменшим значенням
Тематичний урок «Матриця балансу: від теорії масивів до інженерних рішень»
Тематичний урок «Матриця балансу: від теорії масивів до інженерних рішень»
«Уявіть, що ви розробляєте систему керування розумним будинком. Ваш масив даних — це показники температури з 10 датчиків у різних кімнатах за кожну годину.
Інженерна задача №1: Знайти найгарячішу точку в будинку (max), щоб увімкнути там кондиціонер.
Інженерна задача №2: Знайти найхолоднішу точку (min), щоб активувати підігрів підлоги. Програма, яку ми напишемо сьогодні, — це основа для логіки справжнього робота-кліматконтроля!»
Увага! Під час роботи з комп'ютером дотримуйтеся правил безпеки та санітарно-гігієнічних норм.
Повторіть правила безпечної роботи за комп’ютером.
Завантажте і встановіть: Середовище програмування Лазарус (для тих, хто не завантажив)
Уявіть, що ви керуєте енергосистемою району. Масив даних містить показники напруги на десяти трансформаторних підстанціях. Через нерівномірне споживання на одній ділянці виникла небезпечна перенапруга (max), а на іншій — критичний дефіцит (min). Щоб уникнути аварії, вам потрібно миттєво знайти ці дві точки та «обміняти» їхні показники (переспрямувати енергію).
Для економії обчислювальних ресурсів ми знайдемо обидві проблемні станції за один цикл перевірки:
Точка відліку: Спочатку ми не знаємо ситуацію в мережі, тому вважаємо показники найпершої підстанції (індекс 0) одночасно і найбільшими, і найменшими. Записуємо її номер у змінні для зберігання координат «проблемних» зон (nmax = 0, nmin = 0).
Сканування мережі. Послідовно перевіряємо кожну наступну підстанцію в масиві:
Пошук піку. Якщо напруга поточної станції вища за ту, яку ми вважали максимальною — ми оновлюємо свій запис: тепер цей показник стає новим максимумом, а номер цієї станції — новим nmax.
Пошук просідання. Якщо ж напруга не більша за максимум, ми перевіряємо: а чи не менша вона за наш поточний мінімум? Якщо так — фіксуємо новий мінімальний показник та оновлюємо номер станції в nmin.
Виправлення ситуації. Після завершення одного повного проходу мережею у нас на руках будуть точні «адреси» (індекси) двох критичних точок. Використовуючи ці номери, ми виконуємо операцію обміну значеннями, стабілізуючи систему.
Procedure TForm1.Button1Click(Sender: TObject);
var a: array [0..9] of real; i, nmax, nmin: integer; max, min: real;
begin
for i := 0 to 9 do a[i] := StrToFloat(Memo1.Lines[i-1]);
max := a[0]; nmax := 0; // значення першого елемента вважаємо найбільшим
min := a[0]; nmin := 0; // значення першого елемента вважаємо найменшим
for i := 1 to 9 do
if a[i] > max // порівняння значення чергового елемента з найбільшим на цей момент
then begin
max := a[i]; // замінюємо значення найбільшого елемента
nmax := i; // замінюємо номер найбільшого елемента
end
else if a[i] < min // порівняння значення чергового елемента з найменшим на цей момент
then begin
min := a[i]; // замінюємо значення найменшого елемента
nmin := i; // замінюємо номер найменшого елемента
end;
a[nmax] := min; a[nmin] := max; // обмін значеннями найбільшого і найменшого елементів
for i := 0 to 9 do Memo2.Lines.Append(FloatToStr(a[i])); // виведення значень елементів масиву з переставленими найбільшим і найменшим значеннями
end;
Збережіть усі файли та скриншоти.
Завантажте їх у розділ Ваші роботи на платформі Google ClassRoom.
Інженерний лайфхак: "Економія пам'яті"
«В інженерії часто важливо не просто знайти число (наприклад, 99 градусів), а знати, де саме воно знаходиться (номер датчика або індекс елемента). Саме тому в нашому коді ми використовуємо змінні nmax та nmin. Якщо ви знаєте індекс (адресу), ви можете миттєво звернутися до пристрою, що вийшов з ладу, не перевіряючи всю систему заново. Це економить енергію батареї в космічних супутниках та марсоходах!»
"Інформатика, 9 клас" (Й.Я. Ривкінд та їнші):
Прочитайте та розберіть теоретичний матеріал пункту 5.2 (стор. 248-257), вправи 3, 4 (стор. 254).
Контекст: В системах автопілота автомобілів масив даних може містити відстані до об'єктів навколо (від лідарів або радарів). Подумайте: Якщо масив dist[10] зберігає відстань до десяти перешкод попереду, то яке значення (min чи max) має знайти алгоритм, щоб терміново натиснути на гальма?
Додайте коментар: як би ви змінили назву змінних, щоб цей код став частиною системи безпеки авто?
Модернізуйте свій код: нехай програма не просто міняє місцями значення, а обчислює різницю між max та min. В метеорології це називається амплітудою температур. Висока амплітуда може свідчити про несправність датчика або про різку зміну погоди (штормове попередження).
Додайте умову: якщо max - min > 50, вивести повідомлення: "Увага! Перевірте справність обладнання!"
Контекст: Ви розробляєте систему моніторингу для нового мосту. Масив stress_test[20] містить дані про тиск на різні опори мосту.
Завдання. Використайте свій алгоритм, щоб знайти опору з найменшим навантаженням (min) та найбільшим (max).
Доповнення: Після обміну значень (імітації перерозподілу ваги), додайте перевірку: якщо максимальне навантаження перевищує критичну норму (наприклад, 1000 тонн), програма має вивести попередження: "🚨 Увага! Ризик деформації опори №..." (вказати номер nmax).
Питання для роздумів: Чому важливо знати саме номер опори, а не тільки величину тиску?
Контекст: Ви обслуговуєте мережу водосховищ. Масив water_level[12] показує рівень води в метрах у 12-ти різних точках.
Завдання. Знайдіть найглибшу та наймілкішу точки.
Доповнення: Обчисліть середнє значення між max та min (середній критичний рівень). Виведіть його на екран.
Логічний виклик: Як зміниться робота вашої програми, якщо всі датчики покажуть однаковий рівень води? Чи спрацює ваша умова перевірки if?