Лекция 9. Матрицы и итерационные циклы (1152912), страница 2
Текст из файла (страница 2)
≥ 0)» – это, по сути, найти хотя бы одиннеотрицательный (≥ 0) элемент (задача 1) или проверить, что всеэлементы отрицательны (< 0) (задача 2).Рекомендация. Переформулируйте задачу так, как лично вамудобнее ее решать. Избавляйтесь от отрицаний, особенно двойных. Нобудьте аккуратны, чтобы не совершить ошибку на этом этапе иначебудете сразу решать какую-то другую задачу. Не ту, что была задана.Протестируйте себя на реальном примере, что «новая формулировка»после поиска и установки флага-условия, приводит к тому же результату,что и исходная. Не забывайте, что формулировки «задачи_1» и«задачи_2» – являются взаимообратными.
Это означает, что если взадаче_1 положительный ответ приводит к действию_1, аотрицательный – к действию_2, то в задаче_2 положительный ответприводит к действию_2, а отрицательный – к действию_1.2Вопрос «строго или не строго упорядочены», т.е. если элементы равны – считаем ли мы их упорядоченными илинет.3Вопрос «интервал (y, z) или отрезок [y, z]», т.е. строгое или не строгое будет сравнение.10Воробьева И.А. «Информатика. Язык Питон»Продемонстрируем сказанное для задачи из примера 6.3.ИСХОДНАЯ ЗАДАЧА-«нет ≥ 0»+ДЕЙСТВИЕ 1ДЕЙСТВИЕ 2ЗАДАЧА_1ЗАДАЧА_2 ≡ ИСХ.
ЗАДАЧА«все < 0» ≡«нет ≥ 0»-«есть ≥ 0»+ДЕЙСТВИЕ 2-+ДЕЙСТВИЕ 1ДЕЙСТВИЕ 1ДЕЙСТВИЕ 2Приведем фрагмент кода для задачи_1 и задачи_2 из примера 6.3 сиспользованием флага для досрочного выхода из матрицы.# ОБЩАЯ ЧАСТЬ ДЛЯ ОБЕИХ ФОРМУЛИРОВОКN=M=10# максимальная размерность матрицыn=m=0# размерность матрицыi=j=0# индексыflg = False# флаг выполнения условия поискаA=[0]*Nfor i in range(N): A[i]=[0]*M # целочисленная матрица# РАЗДЕЛ ОПЕРАТОРОВ…# ввод n и m (от 1 до 10), матрицы A из вещественных чисел11Воробьева И.А.
«Информатика. Язык Питон»Задача_1flg = False# считаем, что ПОКА НЕ НАШЛИ элемента « ≥ 0»i= 0# начальное значение индекса строкwhile ( i < n) and not flg :j=0# начальное значение индекса столбцовwhile ( j < m) and not flg :if A[i][ j] >= 0 :flg = True # нашли « ≥ 0» → больше искать смысла нетj +=1i +=1if flg :else:… Действие 2…… Действие 1…Задача_2flg = True# считаем, что ВСЕ элементы отрицательныi= 0# начальное значение индекса строкwhile ( i < n) and flg :j=0# начальное значение индекса столбцовwhile ( j < m) and flg :if A[i][ j] >= 0 :flg = False # НЕ ВСЕ «< 0» → больше искать смысла нетj +=1i +=1if flg :else:… Действие 1…… Действие 2…12Воробьева И.А.
«Информатика. Язык Питон»6.3. Задача с досрочным выходом из поиска в матрице.Пример решенияЗадача Дана целочисленная матрицаПроверить, есть личетные элементы в верхней половине матрицы. Если да, то поменятьместами левую и правую половины матрицы «зеркально». В противномслучае сообщить, что: «Четных элементов нет».Уточнения задачи1 Если нечетное, то как будем считать верхнюю половину? В этом случае будем считать входные данные некорректными – невсякие задачи решаются для любых входных данных.
Об аномалиивыведем сообщение « – должно быть четным».2 Ноль четное число? Да, ноль четное число, по определению, но всегда полезно об этомдополнительно упомянуть в задаче.3 Число столбцов может быть нечетным? может быть равно единице? Да. Если – нечетное число, тогда 1-й столбец меняем местами с столбцом, 2-й с ()-м и т.д., а средний– столбец4 останетсянеизменным (это рассуждения в привычной нумерации от 1 до ). может быть равно единице, тогда матрица внешне не изменится.Уточненная постановка задачиДана целочисленная матрицаПроверить, есть ли четныеэлементы в верхней половине матрицы. Если да, то поменять местамилевую и правую половины матрицы «зеркально». альтернатива: «Четных элементов нет»; аномалия при - нечетном: « – должно быть четным»; число «0» считаем четным;4Средний столбец в матрице из m столбцов (для нечетного m):13Воробьева И.А.
«Информатика. Язык Питон» минимальное число столбцов равно «1»; индексация строк и столбцов начинается с «0» - это означает, чтосредний столбец (при нечетном ) имеет индекс.Данные, которые уже заданы и которые потребуютсяВх.:– максимальное значение строк ,четно– максимальное значение строк ,– матрица из целочисленных элементов, причем значенияэлементов:;Промежуточные:,диапазон:– индекс строк,– индекс столбцов,;;– целая часть от деления числа строк/столбцов на два;flg – флаг проверки условия (flg =True есть четные элементы);Вых.:– измененная матрица из целочисленных элементов, причем значения элементов:;ИЛИ Сообщение-альтернатива, Not_Even: «Четных элементов нет».ИЛИ Сообщение-аномалия, ERR_n: «n – должно быть четным».Примечание.
В алгоритме команда DIV означает «целочисленноеделение». В Python это оператор «//» .14Воробьева И.А. «Информатика. Язык Питон»Блок-схема (алгоритм) решения задачиРасписываем алгоритм нисходящим способом, не углубляясь вподробности подзадач.
Это «нулевой уровень» – каркас взаимодействияподзадач, основные логические связи. Умение выделять подзадачи снеобходимыми им входными/выходными данными – очень важноеумение в решении любых задач, не только в программировании.началоввод n−n – чет. И n > 2+ввод m, A«ERR_n»вывод n, m, AMidi = n DIV 2;Midj = m DIV 2Вх.: Midi, m, AПРОВЕРКА ЭЛЕМЕНТОВНА ЧЕТНОСТЬВых.: flg−flg=TrueВх.: n, Midj, A+ОБМЕН ЭЛЕМЕНТОВМАТРИЦЫВых.: A«Not_Even»вывод Aконец15Воробьева И.А. «Информатика. Язык Питон»Следующее важное умение, не пытаться написать код решения задачи влоб и сразу весь, а написать только то, что указано в блок-схеме«нулевого уровня».
Все, что скрыто в подзадачах, можно спокойнозаменить так называемыми заглушками – имитацией вычисленногорезультата.# РАЗДЕЛ КОНСТАНТN_MAX=M_MAX=10# РАЗДЕЛ ПЕРЕМЕННЫХn=m=0# размерность матрицыi=j=0# индексыflg = False# флаг условия поиска, «четных элементов пока нет»A=[0]*N_MAXfor i in range(N_MAX): A[i]=[0]*M_MAX # целочисленная матрицаMidi= Midj=0# условная середина размерности матрицы# РАЗДЕЛ ОПЕРАТОРОВn = int(input(‘Введите n ’))if (n % 2 <> 0) or (n < 2) or (n > N_MAX) :print(‘n – должно быть четным , >1 и <11’) # Аномалияelse:# ввод m (от 1 до 10), матрицы A (проверки m нет, что плохо)m = int(input(‘Введите m ’))for i in range (n):for j in range (m):A[i][j] = int(input(‘ввод > ’)) # считываем первую строку# вывод n, m и матрицы A проводим ОТДЕЛЬНО!print(‘Размерность матрицы (’, n, ‘, ’ , m, ‘)’ )for i in range (n):for j in range (m):print(A[i][j], end=‘, ’ )# выводим первую строкуprint()# переходим на следующую строку16Воробьева И.А.
«Информатика. Язык Питон»# Вычисление границ для циклов заранее еще один моментнаписания эффективного кода. Сделаем это.Midi = n // 2 # целая часть от деления числа строк на дваMidj = m // 2 # целая часть от деления числа столбцов на два# Первая заглушка: результат ее работы – это флаг flgflg = True# для проверки одной ветки нулевого уровня# flg = False # для проверки другой ветки нулевого уровня# надо будет снять символы комментирования «#»ПОДЗАДАЧА 1if flg:# Вторая заглушка: результат ее работы – это измененная матрицаA[0][0] = - A[0][0] # изменим любой элемент матрицы, просто,# чтобы она измениласьПОДЗАДАЧА 2# вывод результата: измененной матрицы Aprint(‘Размерность матрицы (’, n, ‘, ’ , m, ‘)’ )for i in range (n):for j in range (m):print(A[i][j], end=‘, ’ )# выводим первую строкуprint()# переходим на следующую строкуelse:print(‘Четных элементов нет. ’)# или альтернативы# окончание внешнего блока if..elseЕсли на этом этапе все работает хорошо, только тогда имеет смыслрешать подзадачи.
Раскроем код заглушек. Если пренебречь этойрекомендацией и пытаться всю задачу написать сразу, то этапотладки кода займет гораздо больше времени.!17Воробьева И.А. «Информатика. Язык Питон»# ПРОВЕРКА ВЕРХНЕЙ ПОЛОВИНЫ МАТРИЦЫ НА ЧЕТНОСТЬ ЕЕ ЭЛЕМЕНТОВflg = False# считаем, что ПОКА НЕ НАШЛИ четного элементаi= 0# начальное значение индекса строкwhile ( i < Midi) and not flg :j=0# начальное значение индекса столбцовwhile ( j < m) and not flg :if (A[i][j] % 2) == 0 thenflg= True # нашли четный → больше искать смысла нетj +=1i +=1ПОДЗАДАЧА 1Обратите внимание: инициализация флага и счетчиков происходит не где-то в начале всейпрограммы, а именно там, где решается подзадача; граница Midi просчитана заранее, а не вычисляется КАЖДЫЙ раз наочередном шаге цикла.
Ведь можно было записать и так«while ( i < n // 2) and not flg» это допустимо для матрицы из10-ти элементов, но всегда надо писать эффективное решение для«большой задачи», например, для n=10 000 и больше.# ОБМЕН ЭЛЕМЕНТОВ СТОЛБЦОВ МАТРИЦЫ ОТНОСИТЕЛЬНО СЕРЕДИНЫZ = 0 # вспомогательная переменная для обменаfor i in range (n):for j in range (Midj): # если матрица состоит из одного# столбца, тогда цикл не отработает ни разуZ = A[i][j]A[i][j] = A[i][m-1 -j]A[i][m-1 -j] = ZПОДЗАДАЧА 2.