Приветствую всех, кто идёт дальше с нами. Мы продолжает уникальный марафон по курсу ликбеза в информатике.
На предыдущих уроках рассмотрены фундаментальные основы информатики. Данные темы очень важны для целостного понимания информатики как предмета, науки и вообще сферы деятельности. Но информатика не "вещь в себе", она создана для нас с вами и поэтому должна нам помогать. Одним из самых потребляемых ресурсов информатики являются программы. Пользователи смартфонов особенно ощутили это в последнее время, когда телефон практически заменил компьютер, благодаря мощной прикладной программной базе на все случаи жизни: банковские операции, транспортные и маршрутные карты, сервисные средства, сканы и переводчики, конверторы файлов, мультимедийные редакторы и ещё немало всего интересного и полезного. Сложней найти то, чего ещё не придумали для смартфонов. Многие сферы жизни отражены в портативном устройстве: образование, спорт, финансы, связь, путешествия, медицина, бизнес, развлечения… и жизнь не стоит на месте. Параметры смартфонов скоро превзойдут компьютерные возможности и по памяти и по быстродействию., а режим ПК на смартфоне - функция, которая позволяет мобильному устройству работать как полноценный компьютер. И всё это во многом обязано программному обеспечению.
Так вот, давайте разбираться, что такое программа и как она создаётся, а затем создадим свои первые программы по довольно непростой теме кодирования . Сегодняшний урок своего рода лёгкий старт в одну из самых обширных тем информатики – алгоритмику.
Понятно, что каждая программа по сути представляет какой-то алгоритм и выполняет определённую цель - функцию и имеет какую-то исходную информационную базу – (контент). Чтобы получить результат надо выполнить определённые действия по обработке данных.
Так образом, алгоритм – базовое понятие темы алгоритмика – определяется всегда целью, исходными данными и последовательностью определённых дискретных (конечных) операций (команд) исполнителя.
На стартовых уроках https://dzen.ru/a/Zzv4nlnwrVvoul6M мы разбирались с понятиями формализация и моделирование, где представлен алгоритм как модель имитации процесса анализа информации. В алгоритмике алгоритм - это модель деятельности исполнителя. Могут быть разные исполнители: непосредственного интерактивного управления и программного управления. В первом случае это банкоматы, автоматы, разного рода интерактивные справочные системы. Программное управление представляет собой автоматическое выполнение целевых задач: расчёт зарплаты, статотчётность, расчёт смет и т.д. Но в любом случае исполнитель всегда будет иметь некую среду, в которой будет доступен для пользователя. Т.е. алгоритм создаётся для конкретной среды и в конкретной среде. Это операционная система и приложение в ней.
Т.о. алгоритм представляет собой в ПК программу, написанную на формальном языке программирования для определённой среды исполнения.
В зависимости от среды все программы можно условно представить как системные и прикладные (текстовые, графические, мультимедийные, программные редакторы).
Языки программирования имеют набор команд и синтаксис, которые позволяют формализовать целевые задачи алгоритма. Существуют машинные языки низкого уровня и языки высокого уровня. В программировании, чем проще язык, тем выше его уровень. Одним из таких языков является Python.
Python отпраздновал своё 33-летие в 2024 году и заслуженно завоевал популярность благодаря простому классическому универсальному синтаксису и огромному внешнему интерфейсу с большим набором библиотек.
На этом уроке рассмотрим некоторые уникальные возможности Python. В качестве базы для программирования возьмём тему, на которой мы остановились на нашем курсе – кодирование с заданием №8 ЕГЭ.
Практикум №4
Конечно для старта в Python это задание немного сложновато, но мы привыкли “брать быка за рога” и для нас нет ничего сложного, что не стало бы простым и понятным. Все задания данного номера ЕГЭ представляют собой некий перебор возможных комбинаций чисел или букв в поиске количества вариантов (кодировок), удовлетворяющих определенным условиям. Есть довольно простые задания, которые можно решить с помощью формулы комбинаторики, но в основном с 2024 года задание предполагает программное решение, так как содержит довольно большой диапазон вариантов кодирования и усложнённые условия выбора. Так как длительность ЕГЭ составляет 4 часа и включает 27 заданий, то в среднем на задание приходится всего 8 мин., поэтому ручные варианты затратных во времени решений переводим на программные. Но для сравнения приведу также ручные варианты.
Задание 1. ЕГЭ 11 класс.
· Все шестибуквенные слова, составленные из букв Р, Е, П, Л, И, К, А записаны в алфавитном порядке и пронумерованы.
Вот начало списка:
· АААААА
· АААААЕ
· АААААИ
· АААААК
· АААААЛ
· АААААП
· АААААР
· ……..
Определите в списке количество слов с чётными номерами, которые не начинаются с буквы К и при этом содержат в своей записи не менее двух букв И.
Решение: данное задание ручным методом за 8 и более мин. решить практически невозможно, поэтому пишем программу. Вариантов программ может быть несколько, но чем короче код, тем эффективнее во времени процесс, поэтому берём самый короткий способ. Если речь идёт о вариантах перебора и комбинаторике, то лучше всего использовать специальную библиотеку в Python, которая формирует массивы всех возможных вариантов - комбинаций слов. Это библиотека - itertools (средства итерации).
1. В первой строке кода импортируем эту библиотеку с модулем – функцией product. Далее, в 3 строке, в скобках указываем параметры функции- product; задаём набор исходных символов в виде строки в кавычках и количество букв в слове при помощи переменной repeat. Т.е. данная процедура сформирует все массивы - комбинации (массив – тип данных в Python, представляющий собой группу элементов, объединённых одним именем). Нам нужно все эти массивы (комбинации) перебрать в цикле (for), проанализировать на условие задания и посчитать кол-во подходящих.
2. Для выполнения циклических операций в Python используется два вида операторов: for и while. Поскольку процедура product формирует определённое кол-во элементов комбинаций, то используем оператор цикла for (цикл по количеству). Переменной s присваиваем (3 строка) каждую комбинацию-массив.
3. В строке 2 задаём счётчик с нуля k=0 и нумерацию слов с нуля для списка кодирования.
4. Затем в теле цикла: 4-6 строки с использованием условного оператора (if) выбираем необходимые для подсчёта слова. В данном случае нужно подсчитать чётные по номеру слова, т.е. те, которые в списке кодирования будут стоять на чётном месте.
· Внимательно! Запомните: если в условии учитывается порядок размещения слов , то в параметрах product необходимо задать ту последовательность букв, которая задаётся при кодировании. В данном случае ‘АЕИКЛПР’, а не ‘РЕПЛИКА’.
· Четные позиции находим при проверке n –номера слова-комбинации на кратность двум. Внимание: n для подсчёта номера начинается не с 0 (как при индексации), а с 1,так как это порядковый номер (4 строка). Чётное число – это число, которое при делении на 2 в остатке даёт 0. В Python остаточное деление % , а целочисленное //, обычное деление /; неравенство !=; равенство ==, присвоение =
· Слова, не начинающиеся на К, находим при проверке нулевого по индексу элемента массива s. s[o] – так задаётся элемент массива; в Python нумерация элементов массива начинается с нуля.
· Слова, содержащие не менее двух букв И, находим при помощи метода count (на метод указывает точка принадлежности к строке или массиву, как в нашем случае. Не менее – значит больше и равно.
· Поскольку все условия должны быть соблюдены, связываем их логическим словом and (и) в условном операторе if. (5 строка).
· Результат выдаём функцией print(k), где k – значение счётчика.
Сокращённые команды n+=1 k+=1 заменяют n=n+1 k=k+1.
Такой подробный разбор одной из типовых задач ЕГЭ сразу охватил целый ряд базовых команд Python.
Также надо отметить особенности в оформлении программы на Python. Подчинённые операторы выделяются отступами-табуляторами вправо. Каждый оператор заканчивается двоеточием. Все библиотеки и процедуры указываются в начале программы. Для демонстрации кодов я использую удобную среду интерпретатора Wing 101/9, созданную разработчиками Python для программирования.
Задание 2. ЕГЭ 11 класс.
· Определите количество пятизначных чисел, записанных в восьмеричной системе счисления, в записи которых ровно две цифры 4, и при этом никакая нечётная цифра не стоит рядом с цифрой 4.
Решение: данное задание ручным методом за 8 и более мин. решить также невозможно, как и предыдущее, поэтому пишем программу.
· Вначале также импортируем библиотеку itertools и задаём счётчик k c нуля.
· Восьмеричное число содержит все базовые цифры от нуля до 7, значит строка выбора в параметрах product будет '01234567'. Пятизначные числа в условии указывают на repeat =5.
· Цикл for перебирает все комбинации в массивы с именем переменной s.
· До пятой строки программы всё должно быть уже понятно по аналогии с предыдущей программой. Теперь разберём с вами новый метод join. Это уникальный метод Python, который объединяет элементы массива в строку. В синтаксисе метода join указывается в скобках соединительный символ (включая пробел) перед точкой, а в качестве параметра указывается диапазон элементов, объединённых в строку. В данном случае диапазон - это весь массив s – комбинация цифр пятизначного числа.
· А теперь рассмотрим, как выполнить в программе проверку условия отсутствия нечётных чисел рядом с цифрой 4. Для начала в строке 3 зададим массив no, в который поместим все возможные комбинации, когда 4 имеет соседство с нечётными цифрами. Затем в пятой строке массив s переведём в строку при помощи оператора join. Теперь вместо вот такого представлении: ‘2’,’3’,’0’,’5’,’1’(например) получим ‘23051’. Потом в полученной строке надо проверить наличие, точнее отсутствие, всех комбинаций массива no (строка 3).
Самым уникальным оператором Python является генератор массивов, который представляет собой короткую запись цикла for c отбором по условию (строка 6). Генератор всегда задаётся в квадратных скобках, Первый элемент n указывает на то, что выбирается in сам объект из исходного массива no (n for n in no); затем указывается условие отбора – if. В нашем случае мы выбираем те элементы массива no, которые нашлись в нашей текущей строке s_.
· Т.е. массив vib будет состоять из тех элементов массива no, которые есть в строке s_. Если хоть один элемент попадёт в массив vib, такая комбинация – число нам не подходит. Поэтому кол-во элементов массива vib должно быть равно нулю. Для определения длины строки или количества элементов массива используется функция len(vib)
· И наконец, в строке 7 объединяем все условия проверки полученной комбинации числа s_. Внимание! Очень часто в подобных заданиях допускают ошибку. Не забывайте, что нам нужно посчитать числа, а не строки, как в первой задаче. А числа с нуля не начинаются, поэтому исключаем их при помощи проверки начального значения строки s_[0]!=’0’. Остальные условия вам уже должны быть понятны.
Данный тип задания добавил ещё пару очень важных фишек Python: join – метод и генератор массивов.
Вот такой уникальный язык Python, который благодаря нашим практикам, станет для вас незаменимым в программировании.
Задание №8 ЕГЭ очень объёмно для подачи его одним уроком, поэтому проведём на следующем уроке 9 практикум №5, где рассмотрим усложнённые типы задач.
А сейчас, как обещала, приведу ручной вариант для задачи, которую быстрее можно решить, зная формулы комбинаторики. Кто дружен с математикой (комбинаторика – раздел математики), тот может обойтись без кода.
Задание 3. ЕГЭ 11 класс.
· Ученик составляет слова, переставляя буквы из слова “ ИДИЛЛИЯ” . Словом считается любая допустимая последовательность букв, не обязательно осмысленная. Сколько существует различных слов, которые может написать ученик?
· Решение: ручной быстрый вариант с учетом знания формулы комбинаторики на размещение. Если у нас есть определённое кол-во позиций и букв, то мы можем на этих позициях разместить n! факториал комбинаций из n элементов.
В данном случае у нас 7 позиций, т.е. если бы буквы были все различны, то кол-во комбинаций равно 7!, но у нас в слове ИДИЛЛИЯ есть повторы И -3 раза, Л-2 раза. По формуле размещения и по логике вещей мы должны исключить повторы, разделив на факториалы повторов общее кол-во комбинаций, так как перестановки одинаковых букв дадут те же слова. Поэтому получаем: 7!/ 3!*2!=420.
Кто не помнит, как представляется факториал, запоминаем 7!=1*2*3*4*5*6*7 . 3!=1*2*3* 2!=1*2 .Вот такое быстрое решение. Но если кто-то сомневается в формулах комбинаторики, которые особенно трудно даются почему-то, то Python поможет.
Домашнее задание; надо будет решить это задание (выше) на Python.
На этом урок 8 закончен. Спасибо всем, кто не сошёл с колёс и дальше марафонит с нами ликбез. До следующих встреч в школе Дзен!
Поздравляю всех с Новым 2025 годом! Желаю правильного выбора и успехов во всём!