ПЗ №2. Алгоритмы обработки данных на основе алгоритмической конструкции «Повторение»

Хорошевич Павел Александрович

Повторение: шаблоны ветвления

«Инструкция под защитой»

if <условие>:
    <блок инструкций>

«Альтернатива»

if <условие>:
    <блок инструкций 1>
else:
    <блок инструкций 2>

«Каскад решений»

if <условие 1>:
    <блок инструкций 1>
elif <условие 2>:
    <блок инструкций 2>
else:
    <действие по умолчанию>

Шаблон «Обход последовательности»

Когда использовать: нужно выполнить одно и то же действие для каждого элемента последовательности - списка, строки или диапазона чисел.

Роль переменной цикла - «Обходчик»: переменная, которая систематически проходит по заранее определённой последовательности значений, принимая их по одному.

Псевдокод:

for <обходчик> in <последовательность>:
    <действие с обходчиком>

Пример: Вывести пройденный путь каждую секунду при равноускоренном движении (\(v_0=5\ м/c\), \(a=2\ м/c^2\)).

Анализ условия:

  • Ввод: v0 = 5, a = 2 (константы); обходчик t принимает значения 0, 1, …, 10
  • Вывод: значение пути s для каждого момента времени
  • Формула: \(s=v_0t+\frac{at^2}{2}\)

Дизайн алгоритма: для каждого целого значения времени от 0 до 10 включительно вычислить путь и вывести результат.

v0 = 5   # начальная скорость, м/с
a = 2    # ускорение, м/с²

for t in range(11):           # обходчик t: 0, 1, 2, ..., 10
    s = v0 * t + a * t ** 2 / 2
    print(f"t = {t} с,  s = {s} м")

✍🏻 Задание № 1

Дан список результатов измерения напряжения на резисторе: [3.2, 4.7, 2.1, 5.0, 3.8]. Сопротивление резистора R = 10 Ом. Используя закон Ома, выведите силу тока для каждого измерения.

  1. Анализ условия.
  2. Тестовые данные.
  3. Дизайн алгоритма.

Шаблоны «Подсчёт» и «Накопление»

Роль «Счётчик»: переменная, фиксирующая количество наступления некоторого события. Изменяется на фиксированный шаг (+1).

Инициализация: count = 0

Роль «Аккумулятор»: переменная, которая накапливает итоговое значение - сумму, произведение или символы строки.

Инициализация:

  • для суммы: total = 0
  • для произведения: product = 1
  • для строки: result = ""

Пример: Дан список температур за неделю. Подсчитать количество дней с отрицательной температурой и сумму модулей отрицательных значений температур.

Анализ условия:

  • Ввод: temps - список значений float
  • Вывод: количество дней (int), сумма (float)
  • Переменные: count - счётчик, summa - аккумулятор
temps = [5, -2, 0, -5, 3, 1, -1]

count = 0      # счётчик
summa = 0.0  # аккумулятор

for t in temps:
    if t < 0:
        count += 1
        summa += abs(t)

print(f"Дней с отрицательной температурой: {count}")
print(f"Сумма модулей отрицательных температур: {summa} C")

✍🏻 Задание № 2

Дан список среднесуточных температур за неделю: [5, -2, 0, -5, 3, 1, -1]. Вычислите среднюю температуру за неделю. Сформируйте строку из положительных значений, разделённых точкой с запятой.

  1. Анализ условия.
  2. Тестовые данные.
  3. Дизайн алгоритма.

Шаблон «Поиск min/max»

Когда использовать: нужно найти наибольшее или наименьшее значение в наборе данных.

Роль «Хранитель наилучшего значения»: переменная, которая на каждом шаге хранит наилучшее из просмотренных значений и обновляется при нахождении более подходящего элемента.

Переменная должна быть инициализирована первым элементом последовательности, а не произвольным числом.

Пример: Найти наибольшую массу среди планет Солнечной системы.

masses = [3.30e23, 4.87e24, 5.97e24, 6.42e23]  # массы планет, кг

max_mass = masses[0]   # Хранитель наилучшего значения: первый элемент списка

for m in masses:
    if m > max_mass:
        max_mass = m   # обновление при нахождении более подходящего значения

print(f"Наибольшая масса: {max_mass} кг")

✍🏻 Задание № 3

На школьных соревнованиях ученики прыгали в длину. Дан список результатов в сантиметрах: [190, 210, 205, 180, 220]. Найдите лучший результат и количество учеников, которые прыгнули дальше 200 см.

  1. Анализ условия.
  2. Тестовые данные.
  3. Дизайн алгоритма.

Шаблон «Линейный поиск с флагом»

Когда использовать: нужно ответить на вопрос вида «содержит ли последовательность хотя бы один элемент, удовлетворяющий условию?» или «все ли элементы удовлетворяют условию?».

Роль «Однонаправленный флаг»: логическая переменная, инициализируется значением False. Может изменить значение на True, но не обратно. Проверяется после завершения цикла.

Псевдокод:

флаг = False

for <обходчик> in <последовательность>:
    if <условие на обходчик>:
        флаг = True       # только в одну сторону: False -> True

if флаг:
    <вывод: найдено>
else:
    <вывод: не найдено>

Пример: В ходе эксперимента зафиксированы показания датчика. Определить, содержит ли последовательность хотя бы одно аномальное значение, превышающее пороговую величину.

Анализ условия:

  • Ввод: data - список значений; line - порог аномалии
  • Вывод: сообщение о наличии или отсутствии аномалии
  • Ключевая переменная: anomaly_found - однонаправленный флаг
data = [1.2, 0.8, 3.5, 1.1, 0.9]
line = 3.0

anomaly_found = False   # флаг: «аномалий не обнаружено»

for r in data:
    if r > line:
        anomaly_found = True   # флаг изменяется только в одну сторону

if anomaly_found:
    print("Обнаружена аномалия в показаниях датчика")
else:
    print("Все показания в норме")

Оптимизация: как только найден первый подходящий элемент, обход последовательности можно остановить. Инструкция break обеспечивает досрочный выход из цикла.

for r in data:
    if r > line:
        anomaly_found = True
        break # обход прерывается

✍🏻 Задание № 4

Дан список отметок студента: [4, 7, 8, 7, 10, 6]. Определить:

  1. Есть ли хотя бы одна отметка 10?
  2. Есть ли хотя бы одна неудовлетворительная отметка (ниже 4)?
  1. Анализ условия.
  2. Тестовые данные.
  3. Дизайн алгоритма.

Шаблон «Цикл с выходом»

Когда использовать: обрабатываются данные, поступающие до появления специального признака остановки (часового). Количество итераций заранее неизвестно.

Роль «Хранитель последнего значения»: переменная, хранящая последнее введённое значение для проверки или последующей обработки.

while True:
    <считать значение>           # хранитель последнего значения
    if <признак остановки>:
        break                    # выход из цикла
    <обработать значение>

Пример: Студент вводит результаты химического опыта (масса осадка в граммах). Сбор данных прекращается при вводе отрицательного числа. Подсчитать общую массу вещества и количество измерений.

Анализ условия:

  • Ввод: произвольное количество значений; отрицательное число - часовой
  • Вывод: количество измерений и суммарная масса
  • Ключевые переменные: value - хранитель последнего значения, total - аккумулятор, count - счётчик
total = 0.0   # аккумулятор
count = 0     # счётчик

while True:
    value = float(input("Масса осадка (< 0 - завершить): "))  # держатель
    if value < 0:                 # признак остановки
        break
    total += value
    count += 1

print(f"Измерений: {count},  общая масса: {total:.2f} г")

✍🏻 Задание № 5

Программа считывает целые числа до тех пор, пока не будет введён ноль (ноль - признак остановки, в обработку не входит). Найти сумму введённых чисел и наибольшее из них.

  1. Анализ условия.
  2. Тестовые данные (в том числе граничный случай: вводится только ноль).
  3. Дизайн алгоритма.

Шаблон «Ввод с проверкой»

Когда использовать: вводимое значение должно удовлетворять ограничению (быть положительным, входить в допустимый диапазон и т. д.). При нарушении ограничения запрос повторяется.

Это частный случай «Цикла с выходом из середины»: роль признака остановки выполняет выполнение ограничения, а не специальное значение.

Псевдокод:

while True:
    <считать значение>
    if <значение корректно>:
        break
    <вывести сообщение об ошибке>

Пример: Запросить значение сопротивления в омах. Значение должно быть строго положительным.

while True:
    r = float(input("Введите сопротивление (Ом): "))
    if r > 0:
        break
    print("Ошибка: сопротивление должно быть больше нуля.")

print(f"Сопротивление принято: {r} Ом")

✍🏻 Задание № 6

Напишите программу, которая запрашивает отметку - целое число от 1 до 10 включительно. Ввод значений повторяется до тех пор, пока введённое значение не окажется в допустимом диапазоне.

  1. Анализ условия.
  2. Тестовые данные (включая граничные значения 1 и 10).
  3. Дизайн алгоритма.

Распознавание шаблонов

✍🏻 Задание № 7

Задача Шаблоны Переменные
Найти самого высокого ученика в классе Поиск min/max Хранитель наилучшего значения
Вычислить общую стоимость всех товаров в корзине Накопление Аккумулятор
Проверить, есть ли в списке хотя бы одна оценка «5» Линейный поиск с флагом Однонаправленный флаг
Вывести таблицу умножения на 7 Обход последовательности Обходчик
Определить, все ли измерения укладываются в допустимый диапазон Линейный поиск с флагом Однонаправленный флаг
Считывать показания термометра до ввода слова «стоп» Цикл с выходом Хранитель последнего значения

primer.py

primer.py