# Отчет по теме 5 Степанов Артём, А-02-23 ## Блоки инструкций, управляющие инструкции ### 1. Установка рабочего каталога. Создание рабочего протокола. В оболочке IDLE установил актуальный рабочий каталог, а затем в нём создал рабочий протокол. ![Скриншот созданного рабочего протокола](pictures/figure0.png) ### 2. Изучение управляющей конструкции __if__. Управляющая конструкция __if__ позволяет реализовать ветвление по определенному условию. Само условие задается в виде логического выражения, которое должно принимать значение True или False. После условия следует соответствующий ему блок инструкций с отступом по всем строкам блока. ```py >>> porog = 10 >>> rashod1 = 6 >>> rashod2 = 4 >>> if rashod1 >= porog: # Условие 1 ... dohod = 12 # Блок инструкций, выполняющийся в случае истинности условия 1 ... elif rashod2 == porog: # Условие 2 ... dohod = 0 # Блок инструкций, выполняющийся в случае истинности условия 2 ... else: # Оператор else - иначе ... dohod = 8 # Блок инструкций, выполняющийся в случае ложности условий 1 и 2 ... >>> dohod 8 ``` В условиях можно использовать несколько логических выражений, связанных логическими операторами: ```py >>> if rashod1 >= 3 and rashod2 == 4: ... dohod = rashod1 ... if rashod2 == porog or rashod1 < rashod2: ... dohod = porog ... >>> dohod 6 ``` Ветвления также могут быть множественными: ```py >>> if porog == 3: ... dohod = 1 ... elif porog == 4: ... dohod = 2 ... elif porog == 4: ... dohod = 3 ... else: ... dohod = 0 ... >>> dohod 0 ``` Условные инструкции могут записываться в одну строку: ```py >>> dohod = 2 if porog >= 4 else 0 >>> dohod 2 ``` Запись инструкция в одну строку может быть представлена и в таком виде: ```py >>> if porog >= 5 : rashod1 = 6; rashod2 = 0 ... >>> rashod1 6 >>> rashod2 0 ``` ### 3. Изучение управляющей конструкции __for__. Цикл по перечислению, описываемы с помощью управляющей конструкции __for__, позволяет произвести перебор / перечисление определенных свойств / элементов определенного до начала цикла итерируемых объектов. #### 3.1. Простой цикл. Для реализации простого цикла по перечислению достаточно задать определенный диапазон (возможно с определенным шагом) изменения объекта-переменной цикла: ```py >>> temperatura = 5 >>> for i in range(3, 18, 3): # i = 3 -> i = 6 -> ... -> i = 15 ... temperatura += i # 5 + 3 -> 8 + 6 -> ... -> 35 + 15 ... >>> temperatura 50 ``` #### 3.2. Более сложный цикл. Внутри цикла можно использовать различные условия, а также прерывать его выполнение с помощью оператора __break__: ```py >>> sps = [2, 15, 14, 8] >>> for k in sps: ... if len(sps) <= 10 : sps.append(sps[0]) ... else: break # Прерывание цикла ... >>> sps [2, 15, 14, 8, 2, 2, 2, 2, 2, 2, 2] ``` Различие между предыдущим примером и последущим заключается в итерируемом объекте: в первом случае это список, изменяемый во время работы цикла, а во втором - его неизменяемая копия. Поэтому в первом примере на выходе получился список с 11 элементами (удовлетворяет условию прерывания цикла), а во втором - с 8 элементами (цикл просто прошелся по 4 возможным элементам копии списка и добавил соответственно 4 новых элемента). ```py >>> sps = [2, 15, 14, 8] >>> for k in sps[:]: ... if len(sps) <= 10 : sps.append(sps[0]) ... else: break ... >>> sps [2, 15, 14, 8, 2, 2, 2, 2] ``` #### 3.3. Конструкция __for - else__. Конструкция __for - else__ позволяет реализовать обычный цикл-перечисление с дополнительным условием, которое выполнится только в том случае, если работа цикла завершится самостоятельно (не в случае применения оператора break). Пример такого цикла представлен ниже: ```py >>> import random as rn >>> sps5 = [] >>> for i in range(10): ... sps5.append(rn.randint(1, 100)) ... ss = sum(sps5) ... if ss > 500: break ... else: ... print(ss) ... >>> # Ничего не вывелость, т.к. сработал оператор break >>> sps5 = [] >>> for i in range(10): ... sps5.append(rn.randint(1, 100)) ... ss = sum(sps5) ... if ss > 500: break ... else: ... print(ss) ... 439 # Цикл завершился самостоятельно, поэтому сработало дополнительное условие >>> ``` #### 3.4. Работа с символьной строкой внутри цикла. Так как строки в Python являются итерируемыми объектами, то их можно использовать внутри циклов: ```py >>> stroka = "Это - автоматизированная система" >>> stroka1 = "" >>> for ss in stroka: ... stroka1 += " " + ss # К каждому символу исходной строки добавлется пробел слева ... >>> stroka1 ' Э т о - а в т о м а т и з и р о в а н н а я с и с т е м а' ``` #### 3.5. Запись цикла в строке. Цикл можно записать в строку. Такая запись представлена ниже на примере создания графика синусоидального сигнала: ```py >>> import math, pylab >>> sps2 = [math.sin(i * math.pi / 5 + 2) for i in range(100)] # Запись цикла в строку >>> pylab.plot(list(range(100)), sps2) [] >>> pylab.title("Синусоидальный сигнал") Text(0.5, 1.0, 'Синусоидальный сигнал') >>> pylab.xlabel("Время") Text(0.5, 0, 'Время') >>> pylab.ylabel("Сигнал") Text(0, 0.5, 'Сигнал') >>> pylab.show() ``` Полученный график: ![Созданный график](pictures/figure1.png) ### 4. Изучение управляющей конструкции __while__. Цикл, выполняющийся пока определенное условие истинно, реализуется с помощью конструкции __while__. В данном цикле нужно учесть возможность его прерывания, иначе, при постоянно истинном условии выполнения, цикл станет бесконечным, что приведет к большим проблемам в работе программы. #### 4.1. Цикл со счетчиком. Самый обычный вариант цикла __while__ реализуется с помощью счетчика, значение которого постоянно проверяется при каждой новой итерации цикла: ```py >>> rashod = 300 >>> while rashod: ... print("Расход =", rashod) ... rashod -= 50 ... Расход = 300 Расход = 250 Расход = 200 Расход = 150 Расход = 100 Расход = 50 ``` Цикл в данном примере остановил свою работу, так как на 7 итерации значение переменной rashod достигло 0, что интерпретируется как значение False. Если бы данная переменная никогда не прнинимала значение 0, то получился бы бесконечный цикл. #### 4.2. Цикл с символьной строкой. Как и в цикле __for__, в цикле __while__ можно использовать символьные строки в качестве объекта, задающего условие прерывание цикла: ```py >>> import math, pylab >>> stroka = "Расчет процесса в объекте регулирования" >>> i = 0 >>> sps2 = [] >>> while i < len(stroka): ... r = 1 - 2 / (1 + math.exp(0.1 * i)) ... sps2.append(r) ... print("Значение в момент", i, "=", r) ... i += 1 ... Значение в момент 0 = 0.0 Значение в момент 1 = 0.049958374957880025 Значение в момент 2 = 0.09966799462495568 Значение в момент 3 = 0.14888503362331795 ... Значение в момент 37 = 0.9517459571646616 Значение в момент 38 = 0.9562374581277391 >>> pylab.plot(list(range(39)), sps2) [] >>> pylab.title("Сигнал на выходе") Text(0.5, 1.0, 'Сигнал на выходе') >>> pylab.xlabel("Время") Text(0.5, 0, 'Время') >>> pylab.ylabel("Сигнал") Text(0, 0.5, 'Сигнал') >>> pylab.show() ``` Полученный график: ![График сигнала на выходе инерционного звена](pictures/figure2.png) #### 4.3. Выполнение сложного алгоритма с помощью цикла. С помощью циклов можно реализовывать различные алгоритмы. Так, например, в примере ниже показан алгоритм проверки заданного числа на то, является ли оно простым. ```py >>> chislo = 267 >>> kandidat = chislo // 2 >>> while kandidat > 1: ... if chislo % kandidat == 0: ... print(chislo, "имеет делитель", kandidat) ... break ... kandidat -=1 ... else: ... print(chislo, "является простым") ... 267 имеет делитель 89 >>> ``` Данный алгоритм можно переработать для проверки некоторого диапазона чисел: ```py >>> prost = [] # Список для записи в него простых чисел >>> for num in range(250, 301): # Цикл, задающий диапазон рассматривыаемых значений ... kandidat = num // 2 ... while kandidat > 1: ... if num % kandidat == 0: ... print(num, "имеет делитель", kandidat) ... break ... kandidat -= 1 ... else: ... prost.append(num) ... print(num, "является простым") ... 250 имеет делитель 125 251 является простым 252 имеет делитель 126 ... 299 имеет делитель 23 300 имеет делитель 150 >>> prost # Отображение списка простых чисел после работы алгоритма [251, 257, 263, 269, 271, 277, 281, 283, 293] ``` #### 4.4. Инструкция __continue__. Инструкция __continue__ позволяет завершить выполнение текущей итерации цикла и перейти к следующей: ```py >>> for i in range(7): ... if i in [2, 3, 5]: # Если число равно 2, 3 или 5, то сразу же начинается новая итерация ... continue ... print(i) ... 0 1 4 6 7 >>> ``` ### 5. Завершение работы со средой. Сохранил файлы отчета в своем рабочем каталоге и закончил сеанс работы с IDLE.