Программирование – самый большой и самый сложный блок в экзамене по информатике, он насчитывает целых 8 заданий: №6, 16, 17, 22, 24, 25, 26, 27.
Для решения каждого из этих заданий требуются знания как минимум одного из четырех представленных в экзамене языков – Паскаль, C++, Python или Алгоритмический язык. Разумный выбор языка программирования для решения заданий экзамена – немаловажная вещь, т.к. простота и удобство языка во многом будут определять скорость и качество решения, не говоря уже о правильности написания собственных программ (только в заданиях №6 и 22 требуется проанализировать написанную программу, в остальных задания блока – написать свою программу). На курсе Maximum изучение программирования ведется на языке Python, как на одном из самых простых, и в то же время самых востребованных современных высокоуровневых языков. Подробное изложение основ программирования в целом, и в частности на Python, дается на уроках «Введение в программирование», тогда как цель данного раздела теории – лишь тезисно, в виде конспекта, перечислить основные языковые конструкции.
Переменные и типы данных
Переменная имеет имя и тип, который указывает на то, что хранится в этой переменной. Поскольку компьютерные программы – это, в первую очередь, средства обработки информации, то и хранить в программах можно лишь информацию в определенном виде (типе) – это могут быть числа, текстовые символы, логические значения и т.д. Полный список типов данных приведен в таблице:
Название | Допустимые значения | Обозначе-ние |
---|---|---|
Целочисленный | -32 768… 32 768 | int |
Вещественный | -9,2*1018… 9,2*1018 | float |
Символьный | Любые символы | char |
Строковый | Последовательность символов длинной менее 255 | str |
Логический | True и False | bool |
Имена переменных не могут быть абсолютно любыми – в каждом языке программирования указываются свои правила выбора имен переменных. Для Python это следующие правила:
Первый символ: a-z, A-Z, _
Второй и далее символ: a-z, A-Z, _, 0-9
Нельзя: знаки препинания и другие спец символы (@, $, %)
Нельзя использовать служебные слова (например, «and» – это служебное слово)
Переменные, отличающиеся регистром хоть одной из букв – разные переменные.
Пускай надо создать переменную, назвать ее «num» и присвоить ей значение 3. Для этого в коде Python достаточно написать строку:
В этом случае переменная num будет иметь тип целое число. Теперь предположим, что надо переменной num присвоить значение "hello". Для этого напишем:
Если значение – строка, то ее надо писать строго в кавычках (можно одинарных или двойных). Обратите внимание, неважно – создаете ли вы переменную, или переопределяете значение существующей – синтаксис (правила написания) всегда один и тот же:
Стоит отметить, что переменная – не единственная конструкция-хранилище в языках программирования. Для экзамена понадобится еще один тип хранилища – массив, но знакомство с ним выходит за рамки данного раздела (ему будет посвящена отдельная тема).
Ввод и вывод данных на экран
Языки программирования должны уметь взаимодействовать с пользователем – иначе они будут бесполезны. Для реальных задач придумано огромное количество каналов взаимодействия, основанных на построении интерфейса (того, что видит пользователь). Со всеми ними вы познакомитесь, когда будете учиться в ВУЗе. Что касается ЕГЭ, то программы в нем с этой точки зрения крайне просты – достаточно знать лишь две базовых команды – ввод информации пользователем (команда input()) и вывод на предполагаемый экран (команда print()).
У команды print есть параметр end, который показывает строку, которую следует поставить после всех объектов.
– после вывода переменной а произойдёт переход на новую строку.
По умолчанию именно переход к новой строке стоит в параметре end.
Математические операции
В Python (как, впрочем, и во всех остальных языках) поддерживаются все стандартные математические операции:
Операция | Символ |
---|---|
Сложение | + |
Вычитание | – |
Деление | / |
Умножение | * |
Возведение в степень | ** |
Целая часть от деления | // |
Остаток от деления | % |
Поговорим дополнительно про операции // и %.
Операция целочисленного деления (//) позволяет при делении одного числа на другое получить исключительно целое число, отсюда и название операции, отбрасывая дробную часть полученного результата. Рассмотрим простой пример – нам нужно разделить 5 на 2. Используя простое деление (/), мы получим:
5 / 2 = 2.5 - дробная часть имеется.
Если же мы воспользуемся операцией //, то получим:
5 // 2 = 2 – дробная часть исчезла.
На нашем курсе часто будет встречаться целочисленное деление, поэтому важно усвоить принципы его работы.
Теперь поговорим про операцию нахождения остатка от деления (%) – самую неоднозначную операцию из таблицы выше, потому что обычно в математике мы не так часто ей пользуемся. Данная операция неразрывно связана с операцией целочисленного деления (//). Возьмем пример, рассмотренный выше, – 5 разделить на 2.
В результате мы получаем 2 и 1 в остатке. Если 2 – это результат целочисленного деления (5 // 2), то 1 – это как раз остаток от деления (5 % 2). Данная операция, как и операция //, будет часто встречаться в заданиях на программирование, иногда они будут встречаться вместо, о таких заданиях мы поговорим на соответствующих уроках.
Условный оператор
Для описания условий в программировании используется логический оператор
ЕСЛИ –ТО – ИНАЧЕ
который еще называется условным оператором. Это конструкция, которая описывает условие, и что делать, если условие выполняется, или не выполняется (отсюда и фрагмент ИНАЧЕ). На Python синтаксис условного оператора выглядит следующим образом:
Условий внутри одного оператора может быть несколько, в таком случае они проверяются последовательно и выполняются команды для того условия, которое первым окажется истинным:
Для проверки всех возможных условий используются операторы сравнения:
Символ | Смысл | Пример |
---|---|---|
> | больше | a > 5 |
< | меньше | a < 8 |
>= | больше или равно | a >= 7 |
<= | меньше или равно | a <= 9 |
== | равно | a == b |
!= | не равно | a != b |
and | конъюнкция | a > 5 and b < 5 |
or | дизъюнкция | a > 5 or b < 5 |
not | логическое отрицание | a > 5 and not(b < 5) |
Пускай нам надо написать программу, которая считает, хватит ли пользователю денег на Rolls-Royce (в вымышленной стране Rolls-Royce стоит 100 единиц). Программа будет выглядеть следующим образом:
Цикл while (ПОКА)
Смысл циклов заключается в том, что они повторяют определенный набор действий. При этом при каждом повторении что-то может меняться. В случае с циклом ПОКА набор команд повторяется, ПОКА что-то происходит (или пока что-то не произойдет):
ПОКА условие
действия, которые повторяются, пока условие верно
Синтаксис цикла ПОКА в Python прост. Командное слово для цикла – while, а команды цикла записываются на отступе от строки, инициализирующей цикл.
В данном примере значение переменной i будет печататься всякий раз, пока она не станет больше 10-ти. Последняя строка в цикле – i +=1 – отвечает за постепенный рост величины переменной. Если бы этой строки не было, цикл выполнялся бы бесконечно – это означало бы программную ошибку (и, очевидно, ошибку на экзамене).
Цикл for (ДЛЯ)
Второй цикл, который очень часто встречается в заданиях ЕГЭ – это цикл ДЛЯ. Его отличие от ПОКА проще показать на примере:
«пишу реферат, пока не напишу до конца»
«пишу реферат с 8-ми до 10-ти»
Прекращение цикла ПОКА – это логическое условие («написал весь реферат»), а у цикла ДЛЯ задаются четкие границы. Обычно эти границы задаются с помощью переменной, которая меняет свое значение с некоторым шагом, и определенное значение является условием для выхода:
ДЛЯ i = 1, 2, 3, …, n
действия, который надо повторить n раз
В данном случае переменная i будет автоматически менять свое значение каждый раз, увеличиваясь на единицу (это внутреннее свойство и смысл цикла ДЛЯ). Такая переменная называется итерационной, т.к. она определяет итерации цикла. На Python синтаксис цикла ДЛЯ выглядит следующим образом:
Конструкция for i in range() заслуживает особого внимания. С помощью функции range() в Python можно задавать диапазон значений, которые будет принимать любая численная переменная с некоторым шагом. Эту конструкцию можно использовать как для создания наборов таких значений, так и для генерации итерационной переменной. Последнее ее применение наиболее эффективно и будет крайне полезным практически во всех заданиях на программирование в ЕГЭ. У функции range всего может быть три аргумента: начало, конец, шаг. Чаще всего используются только два – тогда она обозначают начало и конец с шагом 1: range(m, n). При этом при перечислении значений начало всегда ВКЛЮЧАЕТСЯ, а конец – ИСКЛЮЧАЕТСЯ из набора.
Пускай нам надо написать программу, которая будет считать факториал введенного числа. Факториал в математике – операция, определяемая только для натуральных чисел; факториал равен произведению всех натуральных чисел, предшествующих заданному. Например, факториал числа 4 равен 1*2*3*4 = 24, а факториал числа 7 равен 1*2*3*4*5*6*7 = 5040. Программа будет выглядеть следующим образом:
Поиск минимального/максимального значения
В заданиях ЕГЭ на программирование нередко встречается код, который находит максимальное значение среди всех чисел, которые были введены с клавиатуры, или минимальную цифру числа, и другие подобные задания.
Пусть у нас есть последовательность чисел. И нужно в ней найти минимальный элемент или
максимальный элемент. Основная идея заключается в следующем. Мы можем перебрать последовательно все числа, и при этом сравнивать элементы между собой для того, чтобы понять, какой из них минимальный/максимальный. Для перебора всех значений будем использовать цикл.
Этот алгоритм можно реализовать как циклом while, так и циклом for. А для сравнения внутри цикла будем использовать еще и условие if. Посмотрим на примере, как это можно сделать.
Пример. Пусть у нас есть n чисел, каждое из которых находится в промежутке от 1 до 100, и нужно среди них найти максимальное.
Для начала запустим цикл for и начнем в нем считывать наши числа:
Если мы будем в цикле записывать последовательно числа в переменную а, то на каждой итерации
будет обрабатываться новое введенное число.
Для того, чтобы потом вывести максимум, нужно задать для него переменную. Давайте назовем ее
m. Пусть в начале m = 0. Если внутри цикла мы натыкаемся на то число, которое больше m, то оно
становится претендентом на звание максимального:
И теперь мы его запишем вместо старого значения m.
А в конце выведем наш максимум
В итоге получим вот такую программу:
Обратите внимание на одну важную деталь. Если бы в начале инициализировали переменную m со значением, равным 100, то наша программа в любом случае вывела бы 100, даже если бы не вводили это число с клавиатуры. Получается, если надо найти максимальное значение, то начальное значение переменной для хранения максимума должны быть очень маленькое, а точнее – меньше минимального возможного. Такое число называется контрзначение.
Ниже представлен общий вид алгоритма для поиска максимального значения:
Отметим, что если нам нужно искать не минимальное, а максимальное значение, то первым делом придется поменять условие в цикле. В прошлый раз логика былая такая – если мы нашли a, которое больше текущего найденного максимума, то мы сохраняли значение переменной a в максимум. В этот раз нам нужно как можно более маленькое число. Поэтому наш if будет выглядеть так:
Но еще одна важная деталь, которая поменяется — это контрзначение. Ведь теперь, если мы будем брать его очень маленьким, то оно всегда будет меньше вообще любого члена последовательности, а значит, минимум будет находиться неправильно. По аналогии, возьмем его очень большим, а потом будем постепенно уменьшать.
Ниже представлен общий вид алгоритма для поиска минимального значения: