3 причины, по которым стоит выполнять задание 15.2:
-
Задание шаблонное. Достаточно знать и понимать шаблон, чтобы за 5 минут настроить его для решения поставленной задачи.
-
Задание короткое. Обычно, программа для решения задачи 15.2 занимает не более 8 строк на Python, а чаще — еще меньше.
-
Простота оценивания. Если программа прошла определенное количество тестов при проверке задания — вы получите максимальный балл. Даже если программа имеет недостатки, которые тесты не выявили.
Таким образом, небольшая подготовка и чуть большая тренировка при решении задач позволяют выполнить 15 задание за минимальное время на максимальный балл.
Итак, рассмотрим основные типы заданий. Найдем основные признаки в тексте задачи:
-
Программа получает на вход натуральные числа, количество введённых чисел неизвестно, последовательность чисел заканчивается числом 0 (0 – признак окончания ввода, не входит в последовательность).
-
Программа получает на вход количество чисел в последовательности, а затем сами числа.
Таким образом, у нас появляются два основных шаблона алгоритма:
-
Количество чисел неизвестно, определенное число (обычно, 0) является признаком конца последовательности
-
Количество чисел вводится на этапе выполнения программы и строго определено.
|
Количество чисел неизвестно |
Количество чисел вводится в программе |
|
a=int(input()) [первоначальная инициализация дополнительных данных] while a!=0: [обработка значения] a=int(input())
[вывод результатов] |
n=int(input()) [первоначальная инициализация дополнительных данных] for i in range(n): a=int(input()) [обработка значения]
[вывод результатов] |
В данных примерах использованы общепринятые в математике обозначения, которых я рекомендую придерживаться в дальнейшем.
n — этой буквой в математике обычно обозначается количество чего-либо. В данном случае, это количество чисел, которые нам надо ввести.
a — этой буквой в математике обозначаются элементы арифметических последовательностей. То есть, в нашем случае, это как раз те самые числа, которые мы должны вводить и обрабатывать.
Далее, вы видите три блока:
-
Первоначальная инициализация дополнительных данных.
-
Обработка значения
-
Вывод результатов
Что мы напишем в этих блоках напрямую зависит от того, что нам надо вывести в качестве результата. И тут у нас есть несколько типовых обработок:
-
Нахождение количества элементов последовательности, удовлетворяющих критериям
-
Нахождение суммы элементов последовательности, удовлетворяющих критериям
-
Нахождение минимального значения элементов последовательности, удовлетворяющих критериям.
-
Нахождение максимального значения элементов последовательности, удовлетворяющих критериям.
-
Нахождение среднего арифметического значения элементов последовательности, удовлетворяющих критериям.
Если вдруг вспомню или обнаружу еще какие-то типы заданий — обязательно допишу.
Начнем по порядку.
1. Нахождение количества элементов последовательности, удовлетворяющих критериям.
Для того, чтобы мы могли найти количество элементов последовательности, нам нужна переменная, в которой мы это количество будем хранить. Далее мы будем следовать правилу: переменную суммы инициализируем нулем, переменную произведения — единицей. Это правило должно выполнятся всегда, если нам не сообщают что-то другого в условии задачи. Количество значений — это сумма, так как мы будем каждый раз прибавлять единичку, когда будем находить нужное значение.
Итак, блок инициализации:
c=0
Буквой c в информатике обычно обозначается количество чего-либо, которое не задается, а подсчитывается.
Блок обработки:
if [критерий] :
c+=1
Блок вывода результатов:
print(c)
2. Нахождение суммы элементов последовательности, удовлетворяющих критериям/
Для нахождения суммы элементов, нам нужна переменная, в которой мы будем накапливать сумму. Обычно, ее обозначают буквой s.
Блок инициализации:
s=0
Блок обработки:
if [критерий] :
s+=a
Блок вывода результатов:
print(s)
3. Нахождение минимального значения элементов последовательности, удовлетворяющих критериям.
При нахождении минимального или максимального значения, необходимо руководствоваться следующими правилами:
при нахождении минимального значения, переменную инициализируем невероятно большим значением (значение невероятности читаем в условии);
при нахождении максимального значения, переменную инициализируем минимально возможным или невероятно минимальным значением (тоже, нужно читать условие).
Минимальное значение будем обозначать именем mina.
Блок инициализации:
mina=30001
Обычно, в задачах, значения чисел не превышают 30 000, следовательно число 30 001 будет невероятно большим.
Блок обработки:
if [критерий] :
mina=min(mina,a)
Блок вывода результатов:
print(mina)
4. Нахождение максимального значения элементов последовательности, удовлетворяющих критериям.
Максимальное значение будем обозначать именем maxa.
Блок инициализации:
maxa=-30001
Если в задаче сказано, что, значения чисел по модулю не превышают 30 000, следовательно возможно присутствие отрицательных чисел. Тогда число -30 001 будет невероятно маленьким. Иначе можно использовать значение 0, но перед этим надо внимательно прочитать условие.
Блок обработки:
if [критерий] :
maxa=max(maxa,a)
Блок вывода результатов:
print(maxa)
5. Нахождение среднего арифметического значения элементов последовательности, удовлетворяющих критериям.
Это задание является комбинацией 1 и 2 варианта заданий, так как нам надо найти и количество, и сумму. Заодно, это задание демонстрирует, как мы можем комбинировать различные варианты, если вдруг такое вылезет в условии.
Итак, блок инициализации:
c=0
s=0
Блок обработки:
if [критерий] :
c+=1
s+=a
Блок вывода результатов:
print(s/c)
В последнем случае, нужно быть очень осторожным, так как у нас операция деления. Нужно очень внимательно читать условие, что там написано. Если вы не найдете упоминания, что в последовательности гарантированно есть числа, удовлетворяющие условию, то необходимо произвести проверку, является ли c нулем.
if c==0:
[читаем условие, что в этом случае надо сделать]
else:
print(s/c)
Критерии.
Это часть условия, в которой рассказывается, какие именно числа мы ищем. И тут можно воспользоваться следующим справочником:
|
№ п/п |
Выражение на языке Python |
Как читать по-русски |
|
1 |
a%b==0 |
Число а делится на число b (число a кратно числу b) |
|
2 |
a%10==b |
Десятичная запись числа a заканчивается на цифру b |
|
2.1 |
a%q==b |
Как возможный вариант, запись числа a в системе счисления с основанием q заканчивается на b (остаток от деления a на q равен b) |
|
3 |
a>9 and a<100 |
Сложное условие, говорит, что a — двузначное число |
|
3.1 |
a>99 and a<1000 |
То же самое, только a — трехзначное число. |
|
3.2 |
a in range(100,1000) |
То же, что и предыдущий пример, только для «истинных питонистов». |
|
4 |
a%2==1 |
a — нечетное число |
|
4.1 |
a%2==0 |
Внезапно, a — четное число. |
|
5 |
abs(a) |
Модуль (абсолютное значение) числа a. |
Это далеко не весь перечень возможных вариантов, но и этого должно хватить для многих задач.
Ну а теперь, смотрим, как это применить:
Задача 1.
Напишите программу, которая в последовательности натуральных чисел определяет количество чисел, кратных 6 и оканчивающихся на 8. Программа получает на вход количество чисел в последовательности, а затем сами числа.
Количество чисел не превышает 1000. Введённые числа по модулю не превышают 30 000.
Программа должна вывести одно число: количество чисел, кратных 6 и оканчивающихся на 8.
Итак, я выделил самое главное в программе. Что здесь особенного: в программе упоминается последовательность натуральных чисел. Вспомним, что натуральными называются числа, используемые для счета предметов. Это целые положительные числа. Но при этом, в условии есть упоминание, что « числа по модулю не превышают...», то есть как бы намекают нам, что числа могут быть и отрицательные. Что это? Разработчики «торопились и допустили ошибку», как когда-то было популярно писать в одном из заданий, или хотят вас запутать? Не знаю, но мы всегда знаем, как можно себя подстраховать.
Итак:
Рассматриваем вариант:
Количество чисел вводится в программе
программа должна вывести количество чисел,
критерий: кратных 6 и оканчивающихся на 8
собираем программу:
n=int(input())
c=0
for i in range(n):
a=int(input())
if abs(a)%6==0 and abs(a)%10==8:
c+=1
print(c)
Рассмотрим другой вариант задания:
Напишите программу, которая в последовательности натуральных чисел находит среднее арифметическое двузначных чисел или сообщает, что таких чисел нет (выводит «NO»). Программа получает на вход натуральные числа,
количество введённых чисел неизвестно, последовательность чисел заканчивается числом 0 (0 – признак окончания ввода, не входит в последовательность).
Количество чисел не превышает 100. Введённые числа не превышают 300.
Программа должна вывести среднее арифметическое двузначных чисел или вывести «NO», если таких чисел нет. Значение выводить с точностью до десятых.
Хитрое задание.
С одной стороны, разработчики страхуют вас от ошибки деления на 0 — просят вывести строку «NO», если чисел, удовлетворяющих критерию не найдем. С другой стороны, требуют вывести значение с точностью до десятых. Для этого придется применить маленький трюк:
print("{:.1f}".format(s/c))
Здесь мы используем форматный вывод. Этой строкой мы говорим, что нам нужно вывести после запятой 1 символ, то есть как раз, точность до десятых.
Рассматриваем вариант:
Количество чисел неизвестно (оканчивается нулем)
Программа должна вывести среднее арифметическое чисел
критерий: двузначные числа
собираем программу:
a=int(input())
s=0
c=0
while a!=0:
if a>9 and a<100:
s+=a
c+=1
a=int(input())
if c==0:
print(«NO»)
else:
print("{:.1f}".format(s/c))