Научная статья на тему 'РЕШЕНИЕ ЗАДАЧ ЕГЭ ПО ИНФОРМАТИКЕ СРЕДСТВАМИ ЯЗЫКА PYTHON'

РЕШЕНИЕ ЗАДАЧ ЕГЭ ПО ИНФОРМАТИКЕ СРЕДСТВАМИ ЯЗЫКА PYTHON Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
2429
169
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
ЕДИНЫЙ ГОСУДАРСТВЕННЫЙ ЭКЗАМЕН / ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ PYTHON / СРЕДА JUPITER NOTEBOOK / МЕТОДИЧЕСКИЙ ПОДХОД К ЗАДАНИЯМ ЕДИНОГО ГОСУДАРСТВЕННОГО ЭКЗАМЕНА / ПРОГРАММИРОВАНИЕ

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Ильченко Олег Юрьевич, Сырицына Валентина Николаевна, Кадеева Оксана Евгеньевна

Рассматриваются предметные и методические аспекты единого государственного экзамена по информатике. Анализируются особенности решения сложной части заданий единого государственного экзамена по программированию на языке Python, приводятся примеры решения таких заданий.

i Надоели баннеры? Вы всегда можете отключить рекламу.

Похожие темы научных работ по компьютерным и информационным наукам , автор научной работы — Ильченко Олег Юрьевич, Сырицына Валентина Николаевна, Кадеева Оксана Евгеньевна

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

SOLVING THE PROBLEMS OF THE UNIFIED STATE EXAM IN COMPUTER SCIENCE BY MEANS OF THE PYTHON LANGUAGE

Subject and methodological aspects of the unified state examination in informatics are considered. The peculiarities of solving a complex part of the exam tasks in Python programming are analyzed, examples of solving such tasks are given.

Текст научной работы на тему «РЕШЕНИЕ ЗАДАЧ ЕГЭ ПО ИНФОРМАТИКЕ СРЕДСТВАМИ ЯЗЫКА PYTHON»

DOI: 10.18137/RNU.HET.21.11-12.P.042

УДК 371.315.7

Ильченко О.Ю., Сырицына В.Н., Кадеева О.Е.,

Дальневосточный федеральный университет, Школа педагогики

Решение задач ЕГЭ по информатике средствами языка Python

В настоящее время актуальна проблема изучения языков программирования, поскольку на них написано все программное обеспечение компьютера. Их изучение начинается со школьной скамьи на уроках информатики для каждого школьника [3]. В 2021 году экзамен по информатике включал в себя 27 заданий, из них восемь задач направлены на проверку знания обучающимися одного из языков программирования: Pascal, C++, Python. Каждый из языков программирования по-своему интересен и сложен в изучении. Поэтому ученику необходимо сделать выбор и остановиться на изучении одного из них. Для начинающих очень удобен язык Pascal. Но стоит отметить, что этот язык создали в конце прошлого столетия.

Соответственно, в наше время он считается уже устаревшим. Чтобы сдать единый государственный экзамен (далее - ЕГЭ), знания этого языка будет достаточно, но, чтобы в будущем стать востребованным специалистом, одного Pascal будет мало.

Язык Python в рейтинге TIOBE на май 2021 года занимает 2-ое место, обходя Pascal и C++, оставляя выше себя только язык C. Главными плюсами Python специалисты считают простоту, большое количество встроенных библиотек, читабельность и удобство кода, легкий синтаксис, а также большое сообщество программистов-единомышленников, использующих его. Это позволит решить любую проблему на форуме за считанные часы. Для новичков этот язык про-

сто находка. Чтобы начать его изучение, от человека потребуется средний уровень знания английского языка. Поэтому для школьника путь в IT-сферу лучше всего начинать именно с языка программирования Python [7; 8].

Python - язык программирования, который упрощен за счет ориентира не на синтаксис и структуру, как это происходит в C++ или Pascal, а на конкретное решение самой задачи. Не тратится лишнее время на размышления о том, в каком месте поставить операторные скобки и так далее. Существует множество различных программ, редакторов, с помощью которых можно начинать учиться писать код на Python. При установке языка программирования автоматически устанавливается редактор IDLE, но более продуктивными и функциональными при решении задач ЕГЭ по информатике являются такие среды разработки как Py-Charm, SublimeText, Jupiter Notebook. Поэтому при рассмотрении сложных заданий ЕГЭ по программированию мы будем ориентироваться на использование среды разработки Jupiter Notebook. Ее главное преимущество заключается в том, что она объединяет код и выводит текст, математические уравнения, визуализацию в виде единого документа [1].

Программирование - самая сложная часть ЕГЭ по информатике, но при этом самая интересная. Когда теория применяется на практике,

© Ильченко О.Ю., Сырицына В.Н., Кадеева О.Е., 2021

РЕШЕНИЕ ЗАДАЧ ЕГЭ ПО ИНФОРМАТИКЕ СРЕДСТВАМИ ЯЗЫКА PYTHON

КАДЕЕВА ОКСАНА ЕВГЕНЬЕВНА Российская Федерация, город Владивосток

кандидат философских наук, доцент Департамента теории и практики преподавания математики, информатики, естественных наук, Школа педагогики, Дальневосточный федеральный университет. Сфера научных интересов: инновационное творчество преподавателя, интерактивные методы проведения учебных занятий, математическое моделирование и программирование. Автор более 70 опубликованных научных и методических работ. Электронная почта: kadeeva.oe@dvfu.ru

OKSANA E. KADEEVA Vladivostok, Russian Federation

Ph.D. of Philosophical Sciences, Associate Professor at the Department of the Theory and Practice of Teaching Mathematics, Computer Science, Natural Sciences, School of Pedagogics, Far Eastern Federal University. Research interests: innovative creativity of the teacher, interactive methods of conducting training sessions, mathematical modeling and programming. Author of more than 70 published scientific and methodological papers. E-mail address: kadeeva.oe@dvfu.ru

СЫРИЦЫНА ВАЛЕНТИНА НИКОЛАЕВНА Российская Федерация, город Владивосток

старший преподаватель Департамента теории и практики преподавания математики, информатики, естественных наук, Школа педагогики, Дальневосточный федеральный университет. Сфера научных интересов: электронное обучение в высшей школе, инновационная деятельность преподавателя, математическое моделирование и программирование. Автор более 50 опубликованных научных и методических работ. Электронная почта: versia_2000@mail.ru

VALENTINA N. SYRITSYNA Vladivostok, Russian Federation

Senior Lecturer at the Department of the Theory and Practice of Teaching Mathematics, Informatics, Natural Sciences, School of Pedagogy, Far Eastern Federal University. Research interests: e-learning in higher education, teacher innovation, mathematical modeling and programming. Author of more than 50 published scientific and methodological papers. E-mail address: versia_2000@mail.ru

ИЛЬЧЕНКО ОЛЕГ ЮРЬЕВИЧ

Российская Федерация, город Владивосток

студент Школы педагогики, Дальневосточный федеральный университет. Сфера научных интересов: единый государственный экзамен по физике и информатике, математическое моделирование и программирование. Электронная почта: ilchenkoleg01@gmail.com

I OLEG Yu. ILCHENKO

Vladivostok, Russian Federation

Student of the School of Pedagogy, Far Eastern Federal University. Research interests: unified state exam in physics and informatics, mathematical modeling and programming. E-mail address: ilchenkoleg01@gmail.com

Аннотация. Рассматриваются предметные и методические аспекты единого государственного экзамена по информатике. Анализируются особенности решения сложной части заданий единого государственного экзамена по программированию на языке Python, приводятся примеры решения таких заданий.

Ключевые слова: единый государственный экзамен, программирование на языке Python, среда Jupiter Notebook, методический подход к заданиям единого государственного экзамена, программирование.

Abstract. Subject and methodological aspects of the unified state examination in informatics are considered. The peculiarities of solving a complex part of the exam tasks in Python programming are analyzed, examples of solving such tasks are given.

Keywords: unified state exam, Python programming, Jupiter Notebook environment, methodical approach to tasks USE, programming.

это всегда способствует развитию творчества и самостоятельности. Главное для обучающегося - научиться читать программный код, «прогонять» первые итерации цикла у себя в голове, чтобы понимать, как работает программа, как меняются переменные в ней. Понимание работы программы - это залог успешной сдачи экзамена. Задачи 6, 16, 17, 22 ЕГЭ не требуют углубленного знания языка програм-

мирования, в этих программах не содержится много ступеней ветвлений, не нужно работать с файлами. Умение работать со строками, массивами, понимание условного оператора и циклов - это тот багаж знаний, которым должен владеть обучающийся, чтобы успешно справиться с такими задачами. Задания, которые мы рассмотрим в данной статье, требуют от обучающегося знания алгоритмов

сортировки, нескольких языков программирования, высокого уровня владения навыками программирования, развитого логического мышления [2; 4].

Рассмотрим подходы к решению задач ЕГЭ по информатике при помощи языка программирования Python. В качестве примеров взяты задания из официальной демовер-сии ЕГЭ по информатике за 2021 год на сайте Федерального инсти-

тута педагогических измерений (ФИПИ) и пособия К.Ю. Полякова [5; 6].

Задача 6

Тема: Анализ работы программы с циклом.

Требования к обучающимся:

• знать основные конструкции языка Python: объявление переменных; оператор присваивания; оператор вывода; циклы;

• уметь читать программу, выполнять программу; определять переменную, от преобразования которой зависит количество шагов цикла; уметь определять по программе количество требуемых шагов цикла; различать входные и выходные данные.

Пример задачи:

Определите, при каком наибольшем введенном значении переменной $ программа выведет число 64. Для Вашего удобства программа представлена на четырех языках программирования (см. Рисунок 1).

Решение (теоретическое рассуждение):

1. Переменная $ получает свое значение путем ввода пользователем.

2. Далее переменная $ переопределяется. Как было рассмотрено ранее, операция «//» является целочисленным делением, в нашем случае $ нацело делится на число 10.

3. Переменная n получает значение 1.

4. Затем идет цикл While с условием, что переменная $ меньше 51 ($<51). На каждой итерации цикла значение переменной ¿увеличивается на величину 5, а переменная n увеличивается в два раза.

5. На вывод подается переменная n.

По условию задачи, переменная n в конце работы программы имеет значение 64, из этого следует: 64 = 26, для того чтобы получить n = 64, необходимо выполнить тело цикла 6 раз. Максимальное число, при котором цикл выполнится

последний раз — 50. А следующий шаг — 55 — уже не пройдет. Тогда ответ — 55 - 5 • 6 = 25. Так как на первом шаге берется целое от деления на 10, то третью цифру нужно взять максимально возможную — 9. Путем теоретического исследования получили ответ: наибольшее значение переменной s=259.

Решение с помощью программы на Python:

Запустим среду программирования на Python Jupyter Notebook и наберем код программы. Величину переменной s получить можно подбором, но лучше всего найти закономерность, для этого:

1. Вводим сначала 1 - на выводе получаем 2048, затем вводим 100 -на выводе получим 512, исходя из этого, можно увидеть, что при увеличении s значение n уменьшается (см. Рисунок 2).

2. Пробуем увеличить s еще в 2,5 раза, на выходе получаем 64, то есть искомое значение. Но задача состоит в том, чтобы найти наибольшее значение s, поэтому увеличивая вводимое значение на 1, выясним, что при 259 программа выводит значение 64, а при 260 -32 (см. Рисунок 3).

3. Ответ найден. Наибольшее значение переменной $, при котором n = 64, равно 259.

Задача 16

Тема: Рекурсия. Рекурсивные процедуры и функции

Требования к обучающимся:

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

• уметь реализовать рекуррентную функцию на Python^, например,

F(n) = 1 при n? 1

F(n) = n + 1 + F(n-1), при n> 1

На языке программирования это будет выглядеть так (см. Рисунок 4): Пример задачи: Алгоритм вычисления функции F(n) задан следующими соотношениями: F( n) = 1 при n = 1 F(n) = n + F(n-1), если n четно, F(n) = 2-F(n~2), если n> 1 и n нечетно.

Чему равно значение функции F (26)? Решение задачи:

Пусть известно значение n. Построим массив а, так чтобы значение элемента a[n] совпадало со значением F(n). Учитывая, что в Python нумерация элементов массива начинается с нуля, будем использовать фиктивный нулевой элемент. Согласно условию, в первый элемент нужно записать число 1 («F(n) = 1 при n = 1»): а = [0,1], затем перебираем в цикле все значения индексов элементов, начиная с 2 и до n включительно, вычисляя для каждого значение функции. Фактически сначала вычисляется F(2) и записывается в элемент массива а[2], затем находим F(3) и записываем в элемент массива а[3] и так далее (см. Рисунок 5).

Стоит заметить, что вместо рекурсивных вызовов здесь используются уже готовые значения F(n) для меньших значений n, ранее записанные в массив а. Теперь можно построить функцию, которая возвращает значение a[n], и вызвать print(F(26)) (см. Рисунок 6): Получили ответ. Задача решена.

Задача 17 Тема: Перебор целых чисел на заданном отрезке. Проверка делимости

Требования к обучающимся:

• знать основные принципы построения программы на языке программирования;

• уметь использовать простой перебор без оптимизации; уметь пользоваться электронными таблицами.

РЕШЕНИЕ ЗАДАЧ ЕГЭ ПО ИНФОРМАТИКЕ СРЕДСТВАМИ ЯЗЫКА PYTHON

Паскаль Python Алгоритмический язык

vars,n:integer;begm readln(s); s:=sdiv10; n:=1; whiles<51dobegin s:=s+5; n:=n*2end;writeln(n) end. s=int(input()) s=s//10 n=1 whiles<51: s=s+5 n =n,,,,,,,,,,,,,*2 print(n) алгнач целn,s вводs s:=div(s,10)n:=1 нцпокаs<51s:=s+5 n:=n*2 кцвыводп кон

С++

#include <iostream>usingnamespacestd; intmain() {ints,n;cin>>s; s=s/10;n=1; while(s<51){s=s+5;n=n*2;}cout<<n<<endl; return0; }

Рисунок 1. Пример программы с циклом [6]

s = int(inputQ) s = int{input())

S = S // 10 S = 5 // 10

n = 1 n = 1

while s < 51: while s < 51:

5 = 5 + 5 s = s + 5

n = n * 2 n = n * 2

print(n) print(n)

1 100

2048 512

Рисунок 2. Подбор значений

s = int(input()) S = S // 10 n = 1

while s < 51:

s = s + 5 n = n * 2 print(n)

250 64

s = int(input())

S = S // 10 n = 1

while s < 51:

s = s + 5

П = П * 2

print(n)

259 64

s - int(input()) s = s // 10 n = 1

while s < 51:

s = s + 5 л = n * 2 print(n)

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

260 32

Рисунок 3. Решение задачи 6

def F(n):

if n == 1: return 1

if n % 2 — 0:

return n + F(n-l)

else:

return 2 * F(n-2)

Рисунок 4. Рекуррентная функция

for i in range{2., n+1): if i % 2 == 0;

a.append( i + a[i-l] ) else:

a.append( 2*a[i-2] )

def F( п ) :

a = [e, 1]

for i in rarige(2, n+1):

if i % 2 == 0

a.append( i + a[i-l] )

else:

a.append( 2*a[i-2j )

return a[n]

print (F(26) )

4122

Рисунок 5. Начало программы Рисунок 6. Решение задачи

Рассмотрим задачу в общем виде. Пусть необходимо перебрать все целые числа на отрезке [а; Ъ] и определить, для скольких из них выполняется некоторое условие. Общая структура цикла перебора на языке Python записывается так, как показано на Рисунке 7.

Проверка делимости числа n на число x осуществляется при помощи операции взятия остатка от деления n на x: если остаток равен 0, число n делится на x нацело. Данная проверка в Python осуществляется так, как показано на Рисунке 8. Пример задачи: Рассматривается множество целых чисел, принадлежащих числовому отрезку(1016; 7937), которые делятся на 3 и не делятся на 7, 17, 19, 27. Найдите количество таких чисел и максимальное из них. В ответе запишите два целых числа: сначала количество, затем максимальное число. Для выполнения этого задания можно написать программу или воспользоваться редактором электронных таблиц. Решение задачи: Проанализируем условие: интересующие нас числа делятся на 3 и не делятся на такие числа, как 7, 17, 19 и 27 (это будет являться условием проверки). Перебор чисел выгоднее осуществлять в порядке возрастания, так как последнее найденное число будет являть максимальным из перебранного количества. (Это также требуется найти в задаче. В случае, когда требуется найти наименьшее число, перебор начинается в порядке убывания).

Составим программу на Python (см. Рисунок 9):

Решение найдено. 1568 - такое количество чисел удовлетворяет критерию поиска (в условном операторе if), 7935 - максимальное число из количества удовлетворяющих условию чисел. Ответ указан в Рисунке 8.

Задача 22 Тема: Анализ программы, содержащей подпрограммы, циклы и ветвления.

Требования к обучающимся:

• знать операции деления с остатком (%) и целочисленного деления (//);

• уметь выполнять работу операторов присваивания, циклов в языке программирования Python.

Пример задачи:

Ниже на четырех языках программирования записан алгоритм. Получив на вход число x, этот алгоритм печатает два числа: L и M. Укажите наибольшее число x, при вводе которого алгоритм печатает сначала 4, а потом 5 (см. Рисунок 10).

Решение задачи:

Проанализируем программу. Переменная x получает значение путем ввода пользователем. Переменным Q и L присваиваются значения 9 и 0 соответственно. Далее идет цикл While, рассмотрим его (см. Рисунок 11).

Так как переменная L изначально равна нулю, а затем с каждой итерацией в цикле увеличивается на 1, она несет функцию счетчика повторения цикла. На каждой итерации цикла из переменной Q вычитается x до тех пор, пока x не станет меньше Q. Фактически определяется, сколько раз «поместится» Q в x. Из данных рассуждений можно понять, что данный цикл - это операция деления, при этом, как только цикл завершится, переменная L будет нести значение частного, а переменная x -остаток от деления введенного значения Q.

Далее переменная M получает значение переменной x, и если M<L, то значения M и L меняются местами. Это сделано для того, чтобы значения частного и остатка (сначала L, потом M) были выведены на экран в порядке возрастания. Согласно условию задачи, нужно найти наибольшее число, при котором частное и остаток будут равны 4 и 5 соответственно. Чтобы получить наибольшее число, нужно взять как частное наибольшее из двух заданных чисел, то есть 5 (и за остаток взять 4). Так

как делили на 9, то искомое число будет равно 5 x 9 + 4 = 49. Получили ответ: при вводе числа 49 этот алгоритм печатает два числа: 4 и 5. Пробуем запустить программу (см. Рисунок 12).

Логика приведенных выше рассуждений оказалась верной, при вводе пользователем числа 49, выводятся числа 4 и 5.

Если не удалось провести анализ программы, можно найти альтернативное решение. В данном случае найдем подходящее значение перебором (или как говорят программисты «bruteforce» - методом «грубой силы»). Для этого осуществим следующее:

1. Строку, где вводится x, удаляем [x = int (input ())].

2. Введем переменную x0 и основную часть программы заключим в цикл (можно использовать цикл с параметром, если есть уверенность, что максимальное значение точно не больше, например, 500). Результат представлен на Рисунке 13.

Далее строки, в которых выводятся результаты заменяем на проверку нужного нам случая. По условию задачи должны получиться числа 4 и 5, поэтому, если должны быть выведены числа 4 и 5, выводим на экран переменную x0 (см. Рисунок 14).

В итоге получим полностью переделанную программу (см. Рисунок 15).

Если запустить данную программу, она даст результат 41 и 49, что соответствует минимальному и максимальному подходящему числу. В условиях данной задачи ответ будет 49. Задача решена.

Задача 24

Тема: Обработка символьных строк

Требования к обучающимся:

• знать конструкции языка Python; знать несколько способов решения подобных задач;

• уметь читать строку из файла (программно); уметь работать с конструкцией with - as. (см. Рисунок 16).

РЕШЕНИЕ ЗАДАЧ ЕГЭ ПО ИНФОРМАТИКЕ СРЕДСТВАМИ ЯЗЫКА PYTHON

value = в

for л in range (a, b+1): if условие выполнено: value+= 1 print (value)

# переменная, которая запоминает количество чисел

# цикл с параметром, для перебора заданного диапазона

# условный оператор, для отбора значений

# или же уа1ие^а1ие+1

# вывод количества чисел

Рисунок 7. Общая структура перебора

if л % х == 0:

рг1п1:("Делится") else:

print ("Не делится")

#операция «%» - взятие остатка от деления п на х #если п нацело делится на х}получаем ответ

# если п нацело не делится на х, получаем ответ

Рисунок 8. Проверка делимости числа n на число x

value_sum = 0 ^переменная, служащая для записи кол-ва чисел удовлетворяющих условию

value^max = 0 ^переменная, служащая для записи максимального значения числа в диапазоне

for n in range(1016, 7937+1): #цикл с параметром, где способ range задает нужный диапазон

if (п % 3 == 0) and (п % 7 != 0) and <п % 17 != 0) and (п % 19 1= 0) and (п % 27 ]= 0): valuejnax = п

valuersurn += 1 # аналогично, что и vaLue_sum=vaLue_$um+l

print(value_sum, value_max) # вывод переменных, являющихся решением задачи

1568 7935

Рисунок 9. Решение задачи 17

С++ Python

#include <iostream>usingnamespacestd; x=int(input())

Q=9

intmain() L=0

{ whilex>=Q:

intx,L,M,Q;cin>>x; L=L+1

Q=9; x=x-Q

L=0; M=x

while(x>=Q){L=L+1; ifM<L:

x=x-Q; M=L

L=x

M=x; print(L)

if(M<L){M=L; print(M)

L=x;

cout<<L<<endl<<M<<endl;return

Алгоритмический язык Паскаль

алгнач varx,L,M,Q:integer;begin

целх^,М,Ц readln(x);Q:=9;

вводхЦ:=9 L:=0;

L:=0 whilex>=Qdobegin

нцпокаx>=QL:=L+1 L:=L+1;x:=x-Q;

x:=x-Q end;

кц M:=x;

M:=x ifM<Lthenbegin

еслиM<L M:=L;

то L:=x;

M:=LL:=x end;writeln(L);writeln(M);

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

все end.

выводL,нс,M

кон

Рисунок 10. Условие задачи 22

while x >= Q: L = L + 1 x = x - Q

Рисунок 11. Цикл While с условием x>= Q

Рисунок 12. Решение задачи 22

For х0 in rarige(lj501):

# здесь нужно поместить запись основного алгоритма

Рисунок 13. Альтернативное решение задачи 22

if L = 4 and М = S print(x0)

Рисунок 14. Условие вывода переменной x0

for х0 in range(l,500):

X = Х0

Q = 9 L = 0

while х >= Q: L = L + 1 x = x - Q M = x if M < L: M = L L = x

if L == 4 and M == 5 print(x0)

41

_49_

Рисунок 15. Решение задачи 22 перебором

with ореп( "24.txt"г" > as F:

Рисунок 16. Конструкция with-as для чтения файла 24.txt

Аргумент r при вызове функции open записывает ссылку на данный аргумент в файловую переменную F, выполняет тело блока (читает первую строку файла в переменную $) и закрывает (освобождает) файл. Кеад1те() - эта функция считывает строки из данного файла и возвращает их в виде строки.

Пример задачи:

Текстовый файл состоит не более чем из 106 символов X, Y и Z. Определите максимальное количество идущих подряд символов, среди которых каждые два соседних различны. Для выполнения этого задания следует написать программу.

Решение задачи:

Имеется файл, содержащий последовательность символов X, Y, Z. Нужно определить количество идущих подряд символов, «соседи» которых различны [5].

Для начала откроем имеющийся файл (как это сделать, рассмотрено выше). Чтобы считать длину цепочки (количество идущих подряд символов), введем два счетчика, присвоив им значение единицы:

• curLen (от англ. CurrentLength -«Текущая длина») - длина текущей цепочки (которая сейчас обрабатывается);

• maxLen (от англ. MaxLength -«Максимальная длина») - длина наибольшей на данный момент цепочки уже в обработанной части строки.

При помощи цикла с параметром будем «прогонять» текущий документ (см. Рисунок 17).

Метод rnnge задает начало и конец диапазона, в данном случае с первого символа до конца документа (len(s) - считает длину $, которая в себе содержит данные документа, то есть величина длины служит конечной границей диапазона). В тело данного цикла поместим условный оператор if с условием, которое выясняет, отличен ли текущий символ от предыдущего символа (см. Рисунок 18).

Если значение истинно (то есть символы различны), то переменную curLen увеличиваем на единицу и проверяем величины curLen и mnxLen. Если текущая длина станет больше максимальной, то последней присвоится значение текущей. Если символы одинаковые, то переменной CurLen присваиваем значение 1. В конце поставим на вывод переменную mnxLen, именно она запоминала максимальное число идущих подряд символов. Соберем всю программу и запустим (см. Рисунок 19).

Переменная maxLen в ходе выполнения программы получила значение 35. Оно является ответом задачи. То есть количество символов, у каждого из которых разный «сосед», в данном файле равняется 35.

Задача 25 Тема: Обработка целых чисел. Проверка делимости.

Требования к обучающимся:

• знать: конструкции языка Python; несколько способов решения подобных задач;

• уметь: читать строку из файла (программно); создавать собственные программы (10-20 строк) для обработки целочисленной информации; строить информационные модели объектов, систем и процессов в виде алгоритмов.

Пример задачи [6] : Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку (174457; 174505), числа, имеющие ровно два различных натуральных делителя, не считая единицы и самого числа. Для каждого найденного числа запишите эти два делителя в таблицу на экране с новой строки в порядке возрастания произведения этих двух делителей. Делители в строке таблицы также должны следовать в порядке возрастания. Решение задачи: Согласно условию, программа должна найти числа, которые имеют ровно два делителя, при этом сами числа и единицу в расчет брать нельзя. Следуя логике,

можно прийти к выводу, что произведение этих двух делителей должно давать само число (например, число 6 - откидываем 1 и 6 автоматически, остаются его делители - только 2 и 3, а произведение 2 и 3 дает нам само число 6). Так как условие требует записать делители в порядке возрастания, то нужно начинать перебор от меньшего числа к большему на заданном отрезке (это не обязательно, но рационально, так как исключит лишние строки кода).

Будет эффективно использовать более ускоренный перебор делителей, то есть для числа N перебирать только числа от 2 до q = VN (не включая точный квадратный корень, если он существует); все делители - парные, то есть если а -делитель N, то Ъ = N / а - тоже делитель N. Логика данной программы подходит для любого заданного количества делителей. Так как нужно выводить все делители, кроме единицы и самого числа, цикл перебора делителей начинаем с 2 и включаем q = VN Если очередной делитель d -это точный квадратный корень, добавляем в список делителей только один делитель, если нет - то добавляем пару делителей (d, x // d). Запишем полностью всю программу и запустим ее (см. Рисунок 20).

Получили ответ. Делители выведены на экран в порядке возрастания, чего и требовало условие задачи.

Задача 26

Тема: Обработка массива целых чисел из файла. Сортировка.

Требования к обучающимся:

• знать: конструкции языка Python; различные способы решения подобных задач;

• уметь читать данные из файла и понимать, как хранить их в массиве.

В Python, для того чтобы сохранить данные в массиве, используются списки (list).

На Рисунке 21 показано чтение массива данных размера N из списка dota из файла «26.txt» (данные записаны в столбик).

for i in ranged, len(s)):

Рисунок 17. Цикл for для прогонки документа

for i in range(lj len(s)): if si i] != s[i-l]: curLen += 1 if curLen > maxLen: maxLen = curLen

else:

curLen = 1

Рисунок 18. Проверка текущего и предыдущего

with open( "24.txt", "r" ) as F

s = F.readline() maxLen, curLen = 1, 1 for i in range(l, len(s)): if s[i] != s£i-lj: curLen += 1 if curLen > maxLen: maxLen = curLen

eise:

curLen = 1 print( maxLen )

135 I

Рисунок 19. Решение задачи 24

from math import sqrt

divCount =2 # нужное количество делителей

for n in range(174457j 174505+1):

divs = []

q = int(sqrtfn))

for d in range(2.,q-H):

if n % d == 0;

if d == n//d:

divs = divs +■ [d]

else:

divs = divs + [d, n//d]

if len(divs) > divCount: break #если число имеет больше двух делителей оно не будет учитывоться

if len(divs) == divCount:

print( 'divs ) M символ * осуществляет вывод без структурных скобок списка []

3 58153

7 24923

59 2957

13 13421

149 1171

5 34897

211 827

2 87251

Рисунок 20. Решение задачи 25

data = [0]*N

with ореп("2б.txt") as doc: for i in range(N):

data[i] = int(doc.readline())

Рисунок 21. Чтение массива данных размера N из списка data из файла 26.txt

Пример задачи [6] :

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

Входные данные. В первой строке входного файла 26.txt находятся два числа: S - размер свободного места на диске (натуральное число, не превышающее 100 000) и N -количество пользователей (натуральное число, не превышающее 10 000). В следующих N строках находятся значения объемов файлов каждого пользователя (все числа натуральные, не превышающие 100), каждое в отдельной строке. Запишите в ответе два числа: сначала наибольшее число пользователей, чьи файлы могут быть помещены в архив, затем максимальный размер имеющегося файла, который может быть сохранен в архиве, при условии, что сохранены файлы максимально возможного числа пользователей. Пример входного файла: 100 4 80 30 50 40

При таких исходных данных можно сохранить файлы максимум двух пользователей. Возможные объемы этих двух файлов 30 и 40, 30 и 50 или 40 и 50. Наибольший объем файла из перечисленных пар - 50, поэтому ответ для приведенного примера: 2 50

Решение задачи:

Стоит отметить, что Python идеально подходит для решения этой задачи, так как он имеет множество встроенных методов, что значительно сократит код программы, если сравнивать с кодом на Pascal или C++.

1. Для начала нужно прочитать данные из файла; читаем все строки сразу в массив data (см. Рисунок 22).

2. Декодируем два числа из первой строки; первое записываем в переменную S, а второе записываем в переменную с именем «_»; первую строку сразу удаляем (см. Рисунок 23).

3. Преобразуем данные в целые числа и сразу сортируем (см. Рисунок 24).

4. Теперь накапливаем сумму в переменной totcA, пока она остается не больше, чем X (см. Рисунок 25).

5. Как только сумма превысила X, произойдет выход из цикла по оператору brent, а в переменной i останется количество добавленных значений. Выводим его на экран (printi).

6. Вычисляем запас, который мы можем уменьшить с помощью замены одного выбранного значения на другое (см. Рисунок 26).

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

7. Теперь выбираем из массива данных те значения, которые могут быть выбраны: разность между таким значением и наибольшим выбранным элементом data[i] должна быть не больше, чем deltm (см. Рисунок 27).

8. Остается найти второй ответ -максимум из чисел-кандидатов:

(print (max(candгdates)).

9. Приведем полную программу и запустим ее (см. Рисунок 28).

Ответ получен. Задача решена.

Задача 27

Тема: Обработка данных, вводимых из файла в виде последовательности чисел.

Требования к обучающимся: • знать: конструкции языка Python; различные способы реше-

ния подобных задач; основы комбинаторики;

• уметь обрабатывать данные; выводить последовательность чисел из файла. Пример задачи [6] : Имеется набор данных, состоящий из пар положительных целых чисел.

Необходимо выбрать из каждой пары лишь одно число так, чтобы сумма всех выбранных чисел не делилась на 3 и при этом была максимально возможной. Гарантируется, что искомую сумму получить можно. Программа должна напечатать одно число - максимально возможную сумму, соответствующую условиям задачи. Входные данные: Даны два входных файла (файл A и файл B), каждый из которых содержит в первой строке количество пар N (1 < N < 100000). Каждая из следующих N строк содержит два натуральных числа, не превышающих 10 000.

Пример организации исходных данных во входном файле: 6

1 3

5 12

6 9 5 4 3 3 1 1

Для указанных входных данных значением искомой суммы должно быть число 32.

В ответе укажите два числа: сначала значение искомой суммы для файла А, затем для файла B. Решение задачи: В задачах, представленных выше, разобрались, как прочитать данные из файла. В языке Python это будет выглядеть так, как показано на Рисунке 29.

На начальном этапе не будем учитывать требование «чтобы сумма всех выбранных чисел не делилась на 3» и найдем максимальную сумму. Для этого достаточно выбрать из каждой пары максимальное число (см. Рисунок 30).

with ореп("26.txt") as doc data = doc.readlines()

Рисунок 22. Хранение данных в массиве data

S, _ = mapCint, data[9].split()) del d3ta[e]_

Рисунок 23. Код программы

data = sortedClistCmapiintj data}))

Рисунок 24. Сортировка данных

total = e

for ij val in enumerate(data) if total + val > S: break total += val

Рисунок 25. Код программы

delta = S - total

Рисунок 26. Код программы

candidates = [х for х in data

if x-data[i-i] <= delta]

Рисунок 27. Код программы

with open("26.txt") as doc: data = doc.readlines() 5, _ = map(int, dataje].spliti)) del datafe]

data = sortedtlistimapfint., data))) total = 9

for i, val in enumerate(data): if total + val > S: break total += val

print(i)

delta = S total candidates = [x for x in data

if x-data[i 1] <= delta] print(max(candidates))

568 50

Рисунок 28. Решение задачи 26

doc = open( "27.txt" ) N = int{Fin.readline()) for i in range(N):

a, b = map( int, doc.readline(}.split{) )

ft здесь будем робототь с переменными а и b doc.closet)

Рисунок 29. Код программы

s = e

for i in range(N):

a, b = map(int, doc.readline{),split()) s += raax(a., b) print(s)

Рисунок 30. Код программы

Если полученная сумма не делится на 3, то решение задачи найдено. Можно вводить ответ. Если же сумма не делится на 3, то в этом случае нужно заменить число в одной из пар, вместо максимального взять второе, минимальное. При этом, для того чтобы сумма получилась максимальной, нужно выбрать пару, в которой разница между числами минимальная и не делится на 3 (иначе делимость новой суммы на 3 сохранится).

Будем искать значение йМги - минимальную разницу между числами одной из пар, не делимое на 3; тогда при выводе в случае делимости суммы $ на 3 выводим $-йМт, что соответствует замене числа в одной паре (см. Рисунок 31).

Теперь соединим все части и получим полную программу (см. Рисунок 32).

Обработка файла А дает ответ 127127, а обработка файла В -ответ 399762080. Получили от-

вет: 127124 399762080. Задача решена.

На основе приведенных выше примеров заданий на уроке по информатике можно объяснять обучающимся сложные задания. Таким образом, учащиеся научатся не только решать задания из цикла ЕГЭ по информатике, но и анализировать решения задач по программированию, находить логические пути решения таких задач.

dMin = 19061 for i in range{N):

9j b = map{ intj Fin.readline().split() ) s += max( b ) d = abs( ab ) if d % 3 > 0:

dMin = min( dj dMin ) if s 3 1= 6: print{ s ) else:

print( s-dMin )

Рисунок 31. Код программы

doc = open( "27a.txt" ) N = int(doc.readline()) s, dMin = 0, 100S1 for i in range{tJ):

a, b = map(intj doc. readlineQ • split()) s += max(3j b) d = abs(a-b) if d ¡6 3 > 0:

dMin = tninfd, dMin) if s % 3 != 0:

print(s) else:

print(s-dMin)

127127

doc = open( "27b.txt" ) N = int(doc.readline()) s, dMin = 6, 10001 for i in range(N):

a, b = map(int, doc.readline().split()) s += тэх(а, Ь) d = abs(a-b) if d % 3 > 6:

dMin = min(dj dMin) if s % 3 != 0:

print(s) else:

print(s-dMin)

399762680

Рисунок 32. Решение задачи 27

ЛИТЕРАТУРА

1. Бизли Д.М. Python. URL: https://ru.pdfdrive.com/python-Подробный-справочник-e156670585.html (дата обращения 19.01.2021).

2. Кадеева О.Е., Сырицына В.Н., Репш Н.В., Белов А.Н. Краткий обзор качественной составляющей ЕГЭ по информатике в приморском крае // Ученые записки университета им. Лесгафта. СПб. ФГБОУВПО Национальный государственный Университет физической культуры, спорта и здоровья имени П.Ф. Лесгафта. Санкт-Петербург, 2019. № 12(178). С. 128-133.

3. Лейнингем И. Освой самостоятельно Python за 24 часа. URL: https://knigogid.ru/books/966155-osvoy-samostoyatelno-python-za-24-chasa (дата обращения 12.04.2021).

4. Любанович Б. Просто Python, современный стиль программирования. СПб.: Питер, 2016. 280 с.

5. МакГрат М. Программирование на Python для начинающих. М.: Эксмо, 2015. 192 с.

6. Поляков К.Ю. Преподавание, наука и жизнь: ЕГЭ по информатике 2021. URL: https://kpolyakov.spb.ru/school/ege. htm (дата обращения 17.02.2021).

7. Сваруп К. Укус питона. Подробный справочник; пер. с англ. В. Смоляр. URL: https://wombat.org.ua/AByteOfPython/ AByteofPythonRussian-2.02.pdf (дата обращения 12.04.2021).

8. Сузи Р.А. Язык программирования Python: Учебное пособие. М.: БИНОМ. Лаборатория знаний, 2006. 328 с.

REFERENCES

1. Beasley D.M. Python. Available at: https://ru.pdfdrive.com/python-noflpo6HNM-cnpaBO4HMK-e156670585.html (date of the Application: 19.01.2021). (in Russian).

2. Kadeeva O.E., Syritsyna V.N., Repsh N.V., Belov A.N. Kratkij obzor kachestvennoj sostavlyayushchej EGE po informa-tike v primorskom krae [A brief overview of the qualitative component of the exam in informatics in the coastal region]. St. Petersburg. Scientific notes of the university named after Lesgaft. 2019. No. 12(178). P. 128-133. (in Russian).

3. Lainingham I. Osvoy independently Python for 24 hours. Available at: https://knigogid.ru/books/966155-osvoy-samostoyatelno-python-za-24-chasa (date of the Application: 12.04.2021). (in Russian).

4. Lyubanovich B. Prosto Python, sovremennyj stil' programmirovaniya [Just Python, modern programming style]. Saint-Petersburg: Piter, 2016. 280 p. (in Russian).

5. McGrath M. Programmirovanie na Python dlya nachinayushchih [Programming on Python for beginners]. Moscow: Eksmo, 2015. 192 p. (in Russian).

6. Polyakov K.Yu. Prepodavanie, nauka i zhizn': EGE po informatike 2021 [Teaching, Science and Life]. Available at: https:// kpolyakov.spb.ru/school/ege.htm (date of the Application: 17.02.2021). (in Russian).

7. Swarup K. Ukus pitona. Podrobnyj spravochnik [Python bite = A byte of Python. Detailed reference guide]. Available at: https://wombat.org.ua/AByte0fPython/AByteofPythonRussian-2.02.pdf (date of the Application: 12.04.2021). (in Russian).

8. Suzi R.A. Yazyk programmirovaniya Python [Python Programming Language: Tutorial]. Moscow: BINOM. Laboratoriya znanij, 2006. 328 p. (in Russian).

i Надоели баннеры? Вы всегда можете отключить рекламу.