🔄 Циклы • 📋 Алгоритмы • ⚡ Оптимизация • 🤖 Практика 7 класс • Технология • 45 минут Учитель: mw285748 • 2025-06-15
🎯 Цель практической работы
💡 Научимся:
Составлять эффективные цепочки команд
Оптимизировать алгоритмы с помощью циклов
Программировать роботов для сложных маршрутов
Отлаживать и улучшать программы
🔄 Практический подход:
1Задача → Анализ → Цикл → Код → Тест → Оптимизация
🧠 Анализ повторяющихся действий
🔍 Поиск паттернов
❌ Неэффективный код:
1robot.forward(50)2robot.turn_right(90)3robot.forward(50)4robot.turn_right(90)5robot.forward(50)6robot.turn_right(90)7robot.forward(50)8robot.turn_right(90)9# 8 строк для квадрата!
✅ Эффективный код:
1foriinrange(4):2robot.forward(50)3robot.turn_right(90)4# 3 строки для квадрата!
📊 Экономия: 62% кода, меньше ошибок, легче изменять
1# Движение до препятствия2whiledistance_sensor.value()>10:3robot.forward()4robot.stop()
3️⃣ Минимум один раз:
1# Поиск линии (обязательно повернуться)2do:3robot.turn_right(10)4whilecolor_sensor.value()!="black"
🔧 Алгоритм оптимизации
Шаги анализа задачи:
Выделить повторяющиеся фрагменты
Определить тип повторения
Выбрать подходящий цикл
Минимизировать операции в теле цикла
Проверить условия выхода
⚠️ Опасности:
Бесконечные циклы
Неточные условия
Избыточные вычисления
🛠️ Практические задания
🟢 Базовый уровень: “Геометрические фигуры”
Задача: Робот рисует правильный многоугольник
1# Параметры2sides=6# количество сторон3side_length=40# длина стороны в см4angle=360/sides# угол поворота56# Алгоритм7foriinrange(sides):8robot.forward(side_length)9robot.turn_right(angle)
🎯 Расширения:
Изменить количество сторон
Разные размеры сторон
Спираль с увеличивающимся радиусом
🟡 Средний уровень: “Змейка с препятствиями”
Задача: Движение зигзагом с обходом препятствий
1rows=4 2columns=5 3 4forrowinrange(rows): 5forcolinrange(columns): 6# Проверка препятствия 7ifdistance_sensor.value()<15: 8robot.obstacle_avoidance() 9else:10robot.forward(30)1112# Переход на следующую строку13ifrow<rows-1:14robot.turn_right(90)15robot.forward(30)16robot.turn_right(90)
Оценка эффективности алгоритмов:
\[T = n \times t_{step} + k \times t_{overhead}\]
где:
n - количество итераций
t_step - время одной итерации
k - количество дополнительных операций
t_overhead - время служебных операций
📊 Сравнение подходов:
1Без циклов: T = 8 × 2с = 16с (квадрат)
2С циклом: T = 4 × 2с + 0.1с = 8.1с
3Выигрыш: 50% времени выполнения
🎯 Оптимизация вложенных циклов
Сложность вложенности:
\[O(n^k) \text{ где k - уровень вложенности}\]
⚠️ Примеры:
Одинарный цикл: O(n) - линейная сложность
Двойной цикл: O(n²) - квадратичная сложность
Тройной цикл: O(n³) - кубическая сложность
💡 Правило: Избегайте глубокой вложенности!
✅ Хорошо:
1# O(n + m) - линейная сложность2forrowinrange(n):3process_row(row)4forcolinrange(m):5process_column(col)
❌ Плохо:
1# O(n * m) - квадратичная сложность2forrowinrange(n):3forcolinrange(m):4process_cell(row,col)
🧪 Отладка и тестирование
🔍 Поиск ошибок в циклах
Типичные проблемы:
1. Бесконечный цикл:
1# ❌ Ошибка: условие никогда не станет ложным 2x=10 3whilex>0: 4robot.forward() 5# x не изменяется! 6 7# ✅ Исправление 8x=10 9whilex>0:10robot.forward()11x-=1# изменяем переменную цикла
2. Неточное условие:
1# ❌ Ошибка: может не найти точно 502whiledistance_sensor.value()!=50:3robot.forward()45# ✅ Исправление: диапазон значений6whileabs(distance_sensor.value()-50)>2:7robot.forward()
🧮 Методы отладки
Пошаговое тестирование:
1defdebug_patrol(): 2print("Начало патрулирования") 3 4fori,checkpointinenumerate(checkpoints): 5print(f"Движение к точке {i}: {checkpoint}") 6robot.move_to(checkpoint) 7print(f"Достигнута точка {i}") 8 9ifsensor_check():10print("Обнаружена аномалия!")11break1213print("Патрулирование завершено")