дотщд. Ялдыгин В. Б., 2021 03. 11. 2021 Как работать над пособием Основные правила
Скачать 1.41 Mb.
|
if a % 2 != 0: summa += a a = int(input()) Сумма нечетных чисел =', summa) Задание. На вход программы поступает неизвестное количество чисел целых, ввод заканчивается нулём. Найти количество чисел, которые делятся на 3. kol = 0 a = int(input()) while a != 0: if a % 3 == 0: kol += 1 a = int(input()) Количество чисел, которые делятся на 3:', kol) Базовое задание (формулировка 2). Напишите программу, которая определяет сумму чисел в последовательности. Программа получает на вход количество чисел в последовательности, а затем сами числа. Решение (разбор решения ниже. summa = 0 N = int(input()) for i in range(0, N): a = int(input()) summa += a Сумма чисел =', summa) Предположим, введено следующее 3 4 2 -1 Будет выведено Сумма чисел = 5 37 © Ялдыгин В.Б., 2021 03.11.2021 В данном случае программа, как ив базовом задании 1, работает с числами 4 2 -1. Но числа вводятся по-другому: вначале вводится количество чисел (3), а затем сами числа (4 2 -1). Когда программа получила все 3 числа, она сразу вывела ответ. Разберем, как работает программа. 1) Как ив прошлый разв переменную summa изначально присваивается 0, а в конце значение переменной будет выведено summa = 0 Сумма чисел =', summa) 2) Далее считывается количество чисел (оно будет указано впервой строке summa = 0 N = int(input()) Сумма чисел =', summa) 3) Далее добавляется цикл for. Нужно считать N чисел. Чтобы выполнить какое-то действие N раз, чаще всего используют конструкцию for i in range(0, N) или for i in переменная может называться по-другому, но имя i используется достаточно часто. Как рассматривается в разделе Цикл for», при этом I будет пробегать от 0 до N-1 (N значений, и тело цикла выполнится также N раз, что нами нужно. В цикле нужно прочитать N значений и прибавить к сумме summa = 0 N = int(input()) for i in range(0, N): a = int(input()) summa += a Сумма чисел =', summa) Рассмотрим следующее задание. Напишите программу, которая определяет в последовательности количество чисел, которые делятся на 3. Программа получает на вход количество чисел в последовательности, а затем сами числа. Решение. kol = 0 N = int(input()) for i in range(0, N): a = int(input()) if a % 3 == 0: kol += 1 Количество чисел, которые делятся на 3:', kol) TODO. В будущем здесь планируется описать поиск минимума и максимума. 38 © Ялдыгин В.Б., 2021 03.11.2021 Множество (set) Весть специальный класс – множество (set). Множество чем-то похоже на список (list) (а список – это то, что во многих других языках программирования называется массивом, но множество не содержит одинаковые элементы (если попробовать добавить одинаковый элемент, он не будет добавлен. Рассмотрим пример a = [] # Создаем пустой список a.append('A') # В список добавляется методом append() a.append('B') a.append('A') print(a) # Выведет ['A', 'B', 'A'] b = set() # Создаем пустое множество b.add('A') # В множество добавляется методом add() b.add('B') b.add('A') print(b) # Выведет {'A', 'B'}, то есть дубликат не добавился Помимо того, что множество можно вывести функцией print(), можно напечатать количество элементов во множестве print(len(b)) Функция len названа сокращенно от английского слова length – длина. Также можно выполнить перебор элементов множества (для примера выведем их на экран for i in b: print(i) Также можно удалить элемент множества (команда remove): b.remove('A') Теперь множество b содержит только элемент 'B'. Также можно проверить, принадлежит ли элемент множеству if 'B' in b: Множество b содержит элемент B') else: Множество b не содержит элемент B') 39 © Ялдыгин В.Б., 2021 03.11.2021 Сортировка (пузырьковая сортировка) # Смысл переменной i – сколько элементов к настоящему моменту всплыло и их сравнивать больше не надо # Переменная j пробегает по первым элементам пар, в которых нужно сравнивать (не включая элементы, которые сравнивать не надо) # Для примера пусть N = 5 for i in range(N-1): # i от 0 до 3 for j in range(N-i-1): if a[j] > a[j+1]: a[j], a[j+1] = a[j+1], a[j] # i = 0, j от 0 до 3, пары 0 и 1, 1 и 2, 2 и 3, 3 и 4 # i = 1, j от 0 до 2, пары 0 и 1, 1 и 2, 2 и 3 # i = 3, j от 0 до 0, пара 0 и 1 Пример. Пусть имеется список [6, 12, 4, 3, 8]. 1. За первую итерацию внешнего цикла число 12 переместится вконец. Для этого потребуется 4 сравнения во внутреннем цикле 6 > 12? Нет 12 > 4? Да. Меняем местами 12 > 3? Да. Меняем местами 12 > 8? Да. Меняем местами Результат [6, 4, 3, 8, 12] Вконец списка всплыл максимальный элемент (сортировка называется пузырьковой, т.к. максимальный элемент всплывает вконец списка. Далее последний элемент уже не рассматриваем, в сравнениях он больше не участвует 2. За вторую итерацию внешнего цикла число 8 переместиться на предпоследнее место. Для этого потребуется 3 сравнения 6 > 4? Да. Меняем местами 6 > 3? Да. Меняем местами 6 > 8? Нет Результат [4, 3, 6, 8, 12] На предпоследнее место всплыл максимальный элемент из оставшихся. Далее не рассматриваем уже 2 элемента последний и предпоследний 3. На третьей итерации внешнего цикла исключаются два последних элемента. Количество итераций внутреннего цикла равно двум 4 > 3? Да. Меняем местами 40 © Ялдыгин В.Б., 2021 03.11.2021 4 > 6? Нет Результат [3, 4, 6, 8, 12] 4. На четвертой итерации внешнего цикла осталось сравнить только первые два элемента, поэтому количество итераций внутреннего равно единице 3 > 4? Нет Результат [3, 4, 6, 8, 12] Программа для тестирования пузырьковой сортировки from random import randint N = 10 a = [] for i in range(N): a.append(randint(1, 99)) print(a) for i in range(N-1): for j in range(N-i-1): if a[j] > a[j+1]: a[j], a[j+1] = a[j+1], a[j] print(a) Весть метода сортировки − a.sort() – сортирует на месте (меняется сам список a) − b=sorted(a) – a не меняется, отсортированный список присваивается b Подробное описание сортировки Решение заданий Общая информация По тем или иным причинам для некоторых заданий из демонстрационных вариантов формулировки заданий могут быть «косметически» изменены. Кроме того, тексты заданий и ответов приведены только на языке Python. Для многих заданий существует несколько способов решения. В этом файле я привожу тот способ, который считаю самым удобным. Тем не менее, изучение других подходов также полезно (если вы достаточно понимаете способ, который описан здесь если вам описанный здесь способ непонятен, лучше всего разберитесь с ним, при необходимости спросите у меня. Знание других способов улучшает ваше понимание задачи и добавляет в ваш арсенал альтернативные способы, а это может помочь, если задание на 41 © Ялдыгин В.Б., 2021 03.11.2021 экзамене окажется сложнее, чем в демонстрационном варианте (такое периодически случается. Разбор каждого из заданий разными способами есть на сайте К.Ю. Полякова на странице https://kpolyakov.spb.ru/school/ege.htm . Иногда информации по заданиям даже слишком много (и иногда рассматриваются неактуальные задания, поэтому вы можете решить что-то отфильтровать. В любом случае ресурс очень полезный, и многие из тех, кто написал ЕГЭ успешно, используют его. По каждому из рассмотренных ниже заданий на указанной странице есть дополнительные сведения, задания и их решения. Если вам хорошо понятен материал, написанный мною, полезно зайти на страницу и прочитать, что написано у Полякова. С другой стороны, материал ниже – это непросто копия / выдержка / конспект из Полякова (хотя сайтом Полякова я и сам пользуюсь, а мое представление о том, как эффективнее всего решать задания (хотя в целом подходы, конечно, похожи. Несколько разя сам отправлял предложения Полякову, ион включал их в материалы на своем сайте. Особенно важно просматривать материалы на сайте Полякова по заданиям, вызывающим сложность. Напоминаю, что для краткости вместо фраз вида откройте IDLE или PyCharm» используется фраза вида откройте IDE» (IDE означает интегрированная среда разработки. При решении некоторых заданий требуется открыть IDE и скопировать туда текст программы из задания. После копирования обязательно проверяйте, что программа скопировалась правильно Сверяйте то, что отображается в IDE, стем, что указано в задании. Иногда при копировании пропадают отступы, из-за этого программа не запускается или, что еще хуже, запускается, но работает неправильно. Если отступы не пропали, а стали меньше (табуляции заменились на пробелы, можно оставить так для Python нет разницы, большие отступы или маленькие, а можно заменить пробелы на табуляции, чтобы было нагляднее, – решайте сами, какой вариант вы предпочитаете. Задания разбираются от простых к сложным. При разборе следующих заданий используются знания и умения, которые были получены при изучении предыдущих заданий. Первые задания разбираются максимально подробно, последующие уже не столь подробно, поскольку мы опираемся на то, что вы узнали при изучении предыдущих заданий. В связи с этим очень рекомендую изучать материал последовательно и не пропускать задания. Материал по каждому заданию старайтесь как можно лучше понять и запомнить. Регулярно повторяйте материал (конкретные рекомендации есть в самом начале в разделе Основные правила. Про уровень сложности задания (базовый, повышенный или высокий) и примерное время выполнения подробнее написано в разделе Общая информация об экзамене и заданиях. В некоторых случаях по шагам показано, как создается нужная программа. На каждом следующем шаге то, что удаляется / заменяется, зачеркнуто, а то, что добавляется / чем заменяется, выделено жирным шрифтом. 42 © Ялдыгин В.Б., 2021 03.11.2021 Задание 6 Базовый уровень сложности, примерное время выполнения – 4 минуты. Данное задание достаточно простое и к тому же описано максимально подробно. Нужно максимально освоить выполнение данного задания. Если хоть что-то неясно, выясняйте, экспериментируйте с программами сами в IDE (IDLE / PyCharm), задавайте вопросы итак далее, но научитесь решать это задание, поймите полностью, запомните и регулярно повторяйте (собственно, как и для всех заданий базового уровня сложности. 2022-6 Задание. Определите, при каком наибольшем введённом значении переменной s программа выведет число 64. s = int(input()) s = s // 10 n = 1 while s < 51: s = s + 5 n = n * 2 print(n) Решение. Есть несколько вариантов решения. Различные варианты решения есть на сайте Полякова. Перечислим основные − Автоматический перебор с помощью программы (лучший способ. − Ручной перебор с помощью программы. − Теоретическое решение. − Решение в Excel. Дальше будет описан лучший способ – автоматический перебор с помощью программы. Его обязательно нужно понять Он будет использован ив другом задании. Но при объяснении вначале будет описан ручной перебор с помощью программы – его важно понять, чтобы дальше понять и автоматический перебор. Ручной перебор с помощью программы Неоптимальный способно важен для дальнейшего понимания. Программа получает значение s, находит n и выводит его. При разных s иногда выводятся разные n, а иногда одинаковые n. При каких-то s получится n=64, и именно такие s нас интересуют. Из этих s нужно найти наибольшее. − Откройте IDE (IDLE / PyCharm). − Скопируйте программу в IDE и убедитесь, что она скопировалась правильно (при необходимости исправьте текст, обычно отступы. − Запустите программу. При запуске программа запросит число s. 43 © Ялдыгин В.Б., 2021 03.11.2021 Введем, например, 1 (то есть s=1). Будет выведено 2048 (то есть n=2048), а надо 64. Значит, s=1 не подходит. Введем 2 (s=2), будет выведено 2048 (n=2048), значит, s=2 не подходит. Введем s=3, будет выведено n=2048, значит, s=3 тоже не подходит. Попробуем ускорить процесс. Введем s не по порядку, а, например, s=100. Будет выведено n=512 – уже ближе к 64. (Получается, чем больше s, тем меньше n). Значит, нужно взять s еще больше. Введем s=500, будет выведено n=2 – слишком мало, значит, взяли слишком большое s. Пока s должно быть больше 100, но меньше 500). Продолжим пробовать разные s. Результат я для удобства оформил в таблице. Ввели Получили Вывод s=1 n=2048 n>64, значит, нужно взять s больше 1 (s>1). s=2 n=2048 n>64, значит, нужно взять s больше 2 (s>2). s=3 n=2048 n>64, значит, нужно взять s больше 3 (s>3). s=100 n=512 n>64, значит, нужно взять s больше 100 (s>100). s=500 n=2 n<64, значит, нужно взять s меньше 500 (s<500). s=300 n=32 n<64, значит, нужно взять s меньше 300 (s<300). s=200 n=128 n>64, значит, нужно взять s больше 200 (s>200). s=250 n=64 n=64, значит, мы нашли первое подходящее число s (250). Другие подходящие s, при которых получится n=64, должны иметь значения поблизости. Нам из них нужно наибольшее значение s, поэтому мы не будем смотреть значения s меньше 250 (ведь даже если получится n=64, нам все равно эти s ненужны. Будем перебирать s, которые больше 250 (как мы выяснили, они должны быть меньше 300). s=275 n=32 n<64, значит, нужно взять s меньше 275 (s<275). s=260 n=32 n<64, значит, нужно взять s меньше 260 (s<260). s=255 n=64 n=64, значит, мы нашли еще одно подходящее число s (255). Наверное, подходят и все значения от 250 до 255, нонам сейчас это неважно, ведь нам нужно максимальное значение s. Пока максимальное найденное значение s=255. Попробуем значения больше (как мы помним, должно быть s<260). s=257 n=64 n=64, значит, мы нашли еще одно подходящее число s (257). Теперь максимальное найденное значение s=257. Попробуем найти еще значения. s=258 n=64 n=64, значит, мы нашли еще одно подходящее число s (258). Теперь максимальное найденное значение s=258. Попробуем найти еще значения. s=259 n=64 n=64, значит, мы нашли еще одно подходящее число s (259). Теперь максимальное найденное значение 44 © Ялдыгин В.Б., 2021 03.11.2021 s=259. Пробовать значения больше нет смысла, так как, как мы помним, s=260 уже не подходит. Ответ 259. Автоматический перебор с помощью программы Перебирать значения вручную долго, к тому же есть риск ошибиться. Пусть значения s перебирает Python, а немы. Так как Python делает это быстро, пусть он перебирает значения не выборочно, а подряд, от 1 до какого-то достаточно большого числа, скажем, до 1.000. Напоминаю в математике группы по 3 цифры выделяют точками, в Python вместо них используются знаки подчеркивания. Например, число 1.000.000 в Python можно записать как 1000000 (менее наглядно) или 1_000_000 (более наглядно. Кроме того, цикл for в Python перебирает числа с первого до второго числа, не включая второе число, например, for i in range (1,10) переберет все числа от 1 доне включая 10, то есть от 1 до 9. Соответственно, чтобы перебирались все числа от 1 до 1.000, в range вторым числом нужно указать число на 1 больше (1.001): for i in range (1,1_001) . В этом случае i будет перебирать значения от 1 доне включая 1.001, то есть от 1 до 1.000, что нами требуется. − Откройте IDE (IDLE / PyCharm). − Скопируйте программу в IDE и убедитесь, что она скопировалась правильно (при необходимости исправьте текст, обычно необходимо исправить отступы подробная информация в разделе Решение заданий > Общая информация. − Поскольку вся текущая программа будет находиться внутри цикла for, сместите всю текущую программу вправо на одну табуляцию. Для этого выделите весь текст программы и нажмите клавишу Tab на клавиатуре. На данный момент программа выглядит так (все, что сделали – скопировали весь текст программы и сместили вправо s = int(input()) s = s // 10 n = 1 while s < 51: s = s + 5 n = n * 2 print(n) Теперь добавим первой строкой цикл for, в котором переменная i будет пробегать от 1 до 1.000 (добавленная строка выделена жирным шрифтом for i in range(1, 1_001): s = int(input()) s = s // 10 45 © Ялдыгин В.Б., 2021 03.11.2021 n = 1 while s < 51: s = s + 5 n = n * 2 print(n) Цикл добавлен, но переменная s по-прежнему получает значение с клавиатуры (то есть если запустить данную программу, нам нужно будет тысячу значений. Нужно поменять строку s = int(input()) на s = i. В результате нам не понадобится вводить числа с клавиатуры, а они будут браться из переменной i. То есть вначале переменная s будет равна 1, затем 2 итак далее до 1.000. Получится такая программа заменена вторая строка, прежнее значение строки зачеркнуто, новое значение строки выделено жирным for i in range(1, 1_001): s = int(input()) s = i s = s // 10 n = 1 while s < 51: s = s + 5 n = n * 2 print(n) Запустите программу. Будет выведен столбец значений Как видно, первым было выведено значение 2048 (значит, когда s было равно 1, результат был 2.048). Затем s было стало 2, но результат все еще был 2.048. Если промотать вниз, видно, что в какой-то момент времени результат стал 1024, затем 512, 46 © Ялдыгин В.Б., 2021 03.11.2021 256, 128, 64, 32, 16, 8, 4, 2, 1. Нас интересует, при каких s получился результат 64, нов столбце выведены только результаты. Изменим программу, чтобы она выводила не только n, но и исходное s, при котором данное n получилось. Обратите внимание, что выводить через print(s, n) смысла нет, так как будет выведено измененное s (в программе s меняется, например, командой s = s + 5). Поэтому нужно выводить не s, а i (в i находится значение, которое в самом начале присваивается переменной s). Получится такая программа (изменена последняя строка, прежнее значение строки зачеркнуто, новое значение строки выделено жирным for i in range(1, 1_001): s = i s = s // 10 n = 1 while s < 51: s = s + 5 n = n * 2 print(n) print(i, n) Запустите программу. Теперь программа выводит в каждой строке исходное значение s хотя формально выводится i, но, как написано выше, по сути, это и есть значение s) и получившееся значение n. Вот часть того, что выводит программа На картинке показана часть экрана. Значение n=64 выводится при значениях s от 210 до 259. В качестве ответа нужно указать максимальное значение s, при котором получается n=64. Соответствующая строка отмечена красной стрелкой, в ней s=259. Это и есть ответ 259. Если бы требовалось указать минимальное значение, при котором получается n=64, ответ был бы 210. Ответ получен, но очень важно научиться вносить еще несколько изменений в программу (это полезно и для данного задания, и для других, поэтому обязательно изучите материал по заданию 6 до конца. 47 © Ялдыгин В.Б., 2021 03.11.2021 Сейчас выводятся все s и n, из-за пришлось перемотать то, что вывела программа, до нужной строки. Изменим программу, добавив проверку, чтобы значения выводились только тогда, когда получается n=64. Обратите внимание, что в Python при проверке на равенство указывается двойной знак равенства (==)! for i in range(1, 1_001): s = i s = s // 10 n = 1 while s < 51: s = s + 5 n = n * 2 print(i, n) |