Лекция 9. Матрицы и итерационные циклы (1152912)
Текст из файла
1Воробьева И.А. «Информатика. Язык Питон»Массивы (окончание).Просмотр массива: полностью, по частям, с досрочным выходом. Массивы иИтерационные циклы.6. МАССИВЫ И ИТЕРАЦИОННЫЕ ЦИКЛЫНАПОМИНАНИЕИтерационный цикл – это цикл, в котором заранее не известно числоповторений тела цикла.Параметрический цикл – цикл, в котором заранее известно, сколькоповторений выполнения тела необходимо совершить.Выход из итерационного цикла осуществляется при выполнении заданногоусловия.Цикл с предусловием проверяет условие ДО выполнения тела цикла:1) проверка условия → 2) тело цикла.Цикл с постусловием проверяет условие ПОСЛЕ выполнения цикла:1) шаг цикла → 2)проверка условия..ЦИКЛ С ПРЕДУСЛОВИЕМЦИКЛ С ПОСТУСЛОВИЕМТЕЛО ЦИКЛАПРОВЕРКАУСЛОВИЯНетВЫПОЛНЕНИЯДаПРОВЕРКАУСЛОВИЯНетЗАВЕРШЕНИЯТЕЛО ЦИКЛАДаМожет ни разу не выполнитьсяОдин раз выполнится всегда2Воробьева И.А.
«Информатика. Язык Питон»В языке Python нет специальной команды для реализации цикла спостусловием – ее выполнение всегда можно обеспечить с помощью цикла спредусловием просто гарантировав выполнение первой итерации цикла (иногдаэто бывает необходимо по логике алгоритма).ЦИКЛ С ПРЕДУСЛОВИЕМ в Pythona = 99b = 10i=0while a > b: # ПОКА,# ВЫПОЛНЯТЬa = a-1 # уменьшим на «1»b = b+2 # увеличим на «2»i = i+1# после выполнения циклаprint (‘a стало ≤ b через ’, i, ‘шагов’)ЦИКЛ С ПОСТУСЛОВИЕМОбычноимитируютспомощьюбесконечного цикла и выхода поусловию через оператор break (одно издействительно полезных примененийэтогооператора,которыймырассмотрим подробнее в следующихлекциях):while True: # Бесконечный циклтело_циклаif условие_завершения:break # команда прервет цикл6.1.
Связь между параметрическим и итерационным цикламиЛюбой параметрический цикл можно реализовать с помощьюконструкции «цикла с предусловием» и «цикла с постусловием».Заметим, что нет никакого смысла в простом переписываниипараметрического цикла с помощью итерационного, так каксинтаксическая конструкция for была создана как раз для облегчениячтения кода 1 , однако знать о взаимосвязи полезно. Заменапараметрического цикла for на while возникает в следующих случаях: если нужно изменить шаг параметрического цикла, который жесткорегламентирован в языке программирования (в языке Паскаль, например, возможны только два вида шага – «±1»); если нужно обеспечить досрочный выход из параметрическогоцикла при определенных условиях; если нужно взять под собственный контроль счетчик цикла, бытьуверенным в его значении после цикла, иметь возможность изме1Так называемое понятие «компьютерный сахар».3Воробьева И.А.
«Информатика. Язык Питон»нять его содержимое не только на стандартный шаг приращения, апо какой-то более сложной логике.Замечание 6.1. По последнему пункту напомним, что в языкахпрограммирования, как правило, значения счетчика конструкции forхоть и не запрещено напрямую изменять самостоятельно в теле цикла,однако поведение программного кода после этого никак нерегламентировано и не гарантируется разработчиками языка. Поэтому,вмешательство в счетчик конструкции for считается крайне дурнымтоном. Тоже самое касается и значения счетчика после завершенияцикла for, например в коде:for i in range(5):print (‘Счетчик i используем, но не меняем.
i= ‘, i)Z= i// не определено – Z будет равно: 4 или 5.Замечание 6.2. Досрочный выход из параметрического цикла можнообеспечить специальными операторами, например операторомбезусловного перехода goto (если разработчики языка проявилислабость и добавили этот оператор в язык; Python пока к таким неотносится). Можно скрытыми, что уже не так зазорно, операторамиgoto, такими как break, continue.
Некоторые же, не зная, как правильно«готовить кошек», умудряются использовать даже специальные функциипрерывания исполнения программы, например exit, причемсовершенно «на ровном месте». Однако в последующих лекциях мыобсудим почему не будем использовать такой подход в простейшихпрограммах, где использование break, continue и exit скореесвидетельствует об отсутствии логики у решающего задачу.4Воробьева И.А. «Информатика. Язык Питон»Рассмотрим реализацию обеих конструкций циклов на примерезадачи нахождения индекса последнего положительного элемента водномерном массиве A(n).Таблица 6.1.ПАРАМЕТРИЧЕСКИЙ ЦИКЛЦИКЛ С ПРЕДУСЛОВИЕМвх: A(n)вх: A(n)вх: A(n)Idx = -1i=0Idx = -1i=0; n-1; +1НЕТi<nA[i] > 0НЕТДАНЕТДАIdx = iA[i] > 0ДАIdx = iIdxi = i+1конецконецIdxконец… # ввод n и массива AIdx = -1for i in range (n):if A[i]> 0:Idx = iprint(‘Idx = ’, Idx)……# ввод n и массива AIdx = -1i=0while i < n:if A[i]> 0:Idx = ii += 1print(‘Idx = ’, Idx)…Как видим, простое переписывание параметрического цикла витерационный цикл не дет ничего, кроме усложнения и увеличениякода, однако ценность итерационного цикла в большей гибкости.Перепишем решение задачи (и даже двух), чуть хитрее.5Воробьева И.А.
«Информатика. Язык Питон»ЦИКЛ С ПРЕДУСЛОВИЕМЦИКЛ С ПРЕДУСЛОВИЕМ(ищем номер первогоположительного )(ищем номер последнегоположительного )вх: A(n)вх: A(n)Idx = -1i=0Idx = -1i = n-1i<n or Idx=-1НЕТi ≥0 or Idx=-1ДАДАНЕТНЕТA[i] > 0Idx = iIdx = iа)… # ввод n и массива AIdx = -1i=0while (i < n) or (Idx ==-1):if A[i]> 0:Idx = ii += 1print(‘Idx = ’, Idx)…A[i] > 0ДАДАi = i+1НЕТi = i-1IdxIdxконецконецб)…# ввод n и массива AIdx = -1i = n-1while (i >=0) or (Idx ==-1):if A[i]> 0:Idx = ii -= 1print(‘Idx = ’, Idx)…Добавили всего лишь одно условие проверки в while, аэффективность кода с точки зрения количества операций увеличилась.Действительно, если положительный элемент окажется последним в а)(первым в б)), то количество операций останется таким же, как и в6Воробьева И.А.
«Информатика. Язык Питон»примере таблицы 6.1. Во всех остальных случаях, число шагов длянахождения решения сократится, вплоть до единственной итерации,если положительный элемент окажется первым в а) (последним в б)).Код стал эффективней с точки зрения, так называемой сложностиалгоритма – оценки объема вычислений, зависящих от размера входныхданных.В нашем случае размер входных данных – это длина массива.На самом деле, в науке, называемой теорией сложностиалгоритмов, уменьшение числа шагов вдвое – практическинеразличимо, но при построении алгоритма решения задачи принятовсегда придерживаться оптимального способа, если это не влияет накакие-то иные характеристики в сторону ухудшения.
Дело в том, что естьпонятие эффекта накопления неэффективно написанного кода, поаналогии с эффектом накопления ошибок, что может приводить кразличного рода неожиданностям .Замечание 6.3. Как правило, «иной характеристикой» является объемпамяти (особенно оперативной памяти компьютера), который потребуеталгоритм для своей работы. Вся оптимизация решений задач крутитсявокруг двух основных характеристик: скорости выполнения программыи объема требуемой памяти.Мы рассмотрели использование итерационного цикла длясокращения перебора всех элементов массива. Рассмотрим еще одинпример большей гибкости. Допустим, нам нужно просматриватьэлементы массива с шагом_1 до выполнения какого-то заданногоусловия, после чего выполнить действия над оставшимися элементами,но уже с другим (большим или меньшим) шагом_2.Принеобходимости, мы можем изменять шаг непосредственно в процессепросмотра массива, например в задаче: «если в массиве встретитсяравный нулю элемент с нечетным индексом, подсчитать сумму всехэлементов массива, стоящих после него».
Приведем упрощенныйфрагмент кода решения этой задачи, без альтернативного решения.7Воробьева И.А. «Информатика. Язык Питон»Вопрос: каким оно может быть?# РАЗДЕЛ ПЕРЕМЕННЫХn = 10# размерность массиваi=0# индексstep = 2# шаг индексаA = [0.0]*n# вещественнозначный массив A(n)Sum=0.0# значение искомой суммы элементов# РАЗДЕЛ ОПЕРАТОРОВ… # ввод массива A из n вещественных чиселif n < 2:print(‘Ошибка размерности массива: ’, n) # аномалияelse:# акцентируем инициализацию алгоритма:Sum = 0.0# начальное значение суммыi=1# начальное значение нечетного индексаstep =2# начальное значение шага индексаwhile i < n :if step == 1: # уже нашли нулевой с нечетным индексомSum = Sum + A[i]else: # еще не нашли нулевой с нечетным индексомif A[i] == 0:step = 1i = i + step# вывод результатаprint(‘Sum= {0:5.1f}’.format(Sum))# окончание блока if..elseВопрос: какие ситуации могут привести к альтернативному решению?a) A=[3, -5, 5] Sum = 0 не считалиб) A=[3, -5, 0] Sum = 0 не считалис) A=[3, -5, 0, -10, 10] Sum = 0 значимый результат, считали______________________________________________________________Вопрос: что может служить признаком того, что сумма не считалась?Для ситуаций а) и с) хватило бы значения переменной step, но с учетомситуации б) не обойтись без введения дополнительной переменнойфлажка.
Обычно это логический тип переменных.8Воробьева И.А. «Информатика. Язык Питон»6.2. Досрочный выход из итерационного цикла. Метод флажка«Условие» в инструкциях while может быть как простым, так исложным – это переменные, константы или выражения логическоготипа.При решении задач с досрочным выходом из циклов используютсложное условие контроля счетчика и флага. Флаг – это, как правило,логическая переменная, которая свидетельствует о наличии илиотсутствии искомого признака.Суть метода флажка очень проста: первоначально флаг (flg) устанавливается в значение «условиепока не выполнено» (например, flg =False); условие в цикле while прописывается так, чтобы цикл выполнялся(например, «while not flg» ≡ «while flg == False»); если в процессе поиска в цикле найден искомый признак,флаг устанавливают в противоположное значение (flg=True),т.е.
«условие выполнено», что при следующей проверкеусловия while приведет к прерыванию цикла.Пример использования этого метода рассмотрен в Подзадача_1 (стр.17)Типичные задачи поиска признака сводятся к двум основнымформулировкам:Задача 1. найти хотя бы один элемент, удовлетворяющий условию (вариации: первый, последний элемент);Задача 2.
проверить, что все элементы удовлетворяют условию.Эти формулировки взаимозаменяемы и взаимообратны.Действительно, «проверить, что есть хотя бы один отрицательный(<0) элемент» обратно по смыслу «проверить, что все элементынеотрицательны (≥ 0)».Часто формулировки явно не выделены именно такими фразами,но все равно решение сводится либо к поиску решения задачи 1, либозадачи 2.9Воробьева И.А. «Информатика. Язык Питон»Пример 6.1.
«Проверить, что массив упорядочен по возрастанию» –это, по сути, или найти первую неупорядоченную пару (задача 1) илипроверить, что все элементы упорядочены (задача 2).Какой вопрос по уточнению задачи должен возникнуть2?Пример 6.2. «Если над побочной диагональю матрицы нет элементов,значение которых лежит между числами и » – это, по сути, или найтихотя бы один элемент между числами и (задача 1) или проверить,что все элементы НЕ лежат между числами и (задача 2).Какой вопрос по уточнению задачи должен возникнуть3?Иногда формулировки не удобны, содержат двойные отрицания.Пример 6.3. «Если в матрице НЕТ элементов, значение которыхНЕотрицательны… (т.е.
Характеристики
Тип файла PDF
PDF-формат наиболее широко используется для просмотра любого типа файлов на любом устройстве. В него можно сохранить документ, таблицы, презентацию, текст, чертежи, вычисления, графики и всё остальное, что можно показать на экране любого устройства. Именно его лучше всего использовать для печати.
Например, если Вам нужно распечатать чертёж из автокада, Вы сохраните чертёж на флешку, но будет ли автокад в пункте печати? А если будет, то нужная версия с нужными библиотеками? Именно для этого и нужен формат PDF - в нём точно будет показано верно вне зависимости от того, в какой программе создали PDF-файл и есть ли нужная программа для его просмотра.