# Тема 5. Блоки инструкций, управляющие инструкции ## 2. Изучите ветвление по условию – управляющая инструкция if. Общее правило написания: if <условие>: <отступы><Блок инструкций, выполняемый, если условие истинно> [elif <условие2>: <отступы><Блок инструкций2, выполняемый, если условие2 истинно> ] [else: < отступы><Блок инструкций3, выполняемый, если условие ложно> ] ```py porog=4 rashod1=7 rashod2=11 if rashod1>=porog: dohod=12 elif rashod2==porog: dohod=0 else: dohod=-8 dohod 12 del dohod if rashod1>=3 and rashod2==4: dohod=rashod1 if rashod2==porog or rashod1", line 1, in dohod NameError: name 'dohod' is not defined if porog==3: dohod=1 elif porog==4: dohod=2 elif porog==5: dohod=3 else: dohod=0 dohod 2 ``` ```py del dohod dohod=2 if porog>=4 else 0 dohod 2 if porog>=5 : rashod1=6; rashod2=0 rashod1 7 rashod2 11 ``` ## 3.Цикл по перечислению – управляющая инструкция for. Общее правило написания: for <Объект-переменная цикла> in <объект>: <отступы><Блок инструкций 1 – тело цикла> [else: < отступы ><Блок инструкций 2 – если в цикле не сработал break>] ### 3.1. ```py temperatura=5 for i in range(3,18,3): temperatura+=i temperatura 50 ``` ### 3.2. #### 3.2.1. ```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] ``` #### 3.2.2. ```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] #Отличие: Во втором случае используется sps[:] - это создает копию списка для итерации. ``` ### 3.3. Пример: создание списка с 10 целыми случайными числами из диапазона от 1 до 100. При этом, если сумма чисел не превышает 500, эта сумма должна быть отображена на экране. ```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) 369 sps5=[] for i in range(10): sps5.append(rn.randint(1,100)) ss=sum(sps5) if ss>500: break else: print(ss) 438 sps5=[] for i in range(10): sps5.append(rn.randint(1,100)) ss=sum(sps5) if ss>500: break else: print(ss) 495 #Возможные сценарии: #Сумма НЕ превысила 500 за 10 итераций → цикл завершается естественно → выполняется else → выводится сумма #Сумма превысила 500 на какой-то итерации → срабатывает break → цикл прерывается → else НЕ выполняется ``` ### 3.4. ```py stroka='Это – автоматизированная система' stroka1="" for ss in stroka: stroka1+=" "+ss stroka1 ' Э т о – а в т о м а т и з и р о в а н н а я с и с т е м а' ``` ### 3.5. ```py import math sps2=[math.sin(i*math.pi/5+2) for i in range(100)] import pylab pylab.plot(sps2) [] pylab.title('Синусоидальный сигнал') Text(0.5, 1.0, 'Синусоидальный сигнал') pylab.xlabel('Отсчеты') Text(0.5, 0, 'Отсчеты') pylab.ylabel('Амплитуда') Text(0, 0.5, 'Амплитуда') pylab.show() ``` ![alt text]({CB8B8C9B-3DFE-45B6-85B7-10ABD03573AA}.png) ## 4. Цикл «пока истинно условие» – управляющая инструкция while. Общее правило написания: # while <Условие>: # <отступы><Блок инструкций 1 – тело цикла> # [else: # <отступы><Блок инструкций 2 – если в цикле не сработал break>] ### 4.1. Цикл со счетчиком. ```py rashod=300 while rashod: print("Расход=",rashod) rashod-=50 Расход= 300 Расход= 250 Расход= 200 Расход= 150 Расход= 100 Расход= 50 # Цикл завершился, потому что условие while rashod: стало ложным (False), когда значение переменной rashod достигло 0. ``` ### 4.2. Пример с символьной строкой ```py import math stroka = 'Расчет процесса в объекте регулирования' i = 0 sps2 = [] time_points = [] # Создадим список для моментов времени while i < len(stroka): r = 1 - 2 / (1 + math.exp(0.1 * i)) sps2.append(r) time_points.append(i) # Запоминаем момент времени print('Значение в момент', i, "=", r) i += 1 Значение в момент 0 = 0.0 Значение в момент 1 = 0.049958374957880025 Значение в момент 2 = 0.09966799462495568 Значение в момент 3 = 0.14888503362331795 Значение в момент 4 = 0.197375320224904 Значение в момент 5 = 0.2449186624037092 Значение в момент 6 = 0.2913126124515909 Значение в момент 7 = 0.3363755443363322 Значение в момент 8 = 0.3799489622552249 Значение в момент 9 = 0.421899005250008 Значение в момент 10 = 0.4621171572600098 Значение в момент 11 = 0.5005202111902354 Значение в момент 12 = 0.5370495669980353 Значение в момент 13 = 0.5716699660851172 Значение в момент 14 = 0.6043677771171636 Значение в момент 15 = 0.6351489523872873 Значение в момент 16 = 0.6640367702678489 Значение в момент 17 = 0.6910694698329307 Значение в момент 18 = 0.7162978701990245 Значение в момент 19 = 0.7397830512740043 Значение в момент 20 = 0.7615941559557649 Значение в момент 21 = 0.7818063576087741 Значение в момент 22 = 0.8004990217606297 Значение в момент 23 = 0.8177540779702878 Значение в момент 24 = 0.8336546070121553 Значение в момент 25 = 0.8482836399575129 Значение в момент 26 = 0.8617231593133063 Значение в момент 27 = 0.874053287886007 Значение в момент 28 = 0.8853516482022625 Значение в момент 29 = 0.8956928738431645 Значение в момент 30 = 0.9051482536448664 Значение в момент 31 = 0.9137854901178277 Значение в момент 32 = 0.9216685544064713 Значение в момент 33 = 0.9288576214547277 Значение в момент 34 = 0.935409070603099 Значение в момент 35 = 0.9413755384972874 Значение в момент 36 = 0.9468060128462683 Значение в момент 37 = 0.9517459571646616 Значение в момент 38 = 0.9562374581277391 import matplotlib.pyplot as plt plt.plot(time_points, sps2, 'b-', marker='o', linewidth=2, markersize=4, label='Выходной сигнал инерционного звена') [] plt.title('Сигнал на выходе инерционного звена\n(Переходная характеристика)') Text(0.5, 1.0, 'Сигнал на выходе инерционного звена\n(Переходная характеристика)') plt.xlabel('Время, i (дискр. отсчеты)') Text(0.5, 0, 'Время, i (дискр. отсчеты)') plt.ylabel('Значение сигнала, r(i)') Text(0, 0.5, 'Значение сигнала, r(i)') plt.grid(True, which='major', linestyle='--', linewidth=0.5) plt.legend() plt.show() ``` ![alt text]({82E82C36-9007-4A55-9244-B2D65C9C50FB}.png) ### 4.3. Определение, является ли число простым (делится только на самого себя или 1). ```py chislo=267 #Проверяемое число kandidat =chislo // 2 # Для значений chislo > 1 while kandidat > 1: if chislo%kandidat == 0: # Остаток от деления print(chislo, ' имеет множитель ', kandidat) break # else выполняться не будет kandidat -= 1 else: # При завершении цикла без break print(chislo, ' является простым!') 267 имеет множитель 89 ``` ```py # Проверка простых чисел в диапазоне от 250 до 300 for chislo in range(250, 301): if chislo < 2: # Числа меньше 2 не являются простыми continue # Проверяем делители от 2 до квадратного корня из числа (оптимизация) #Если число составное, то у него есть хотя бы один делитель, не превышающий его квадратного корня. Поэтому достаточно проверять делители только до √n, так как больший делитель автоматически подразумевает существование меньшего парного делителя. kandidat = int(chislo ** 0.5) + 1 is_prime = True while kandidat > 1: if chislo % kandidat == 0: # Найден делитель, число не простое is_prime = False break kandidat -= 1 if is_prime: print(chislo, 'является простым!') 251 является простым! 257 является простым! 263 является простым! 269 является простым! 271 является простым! 277 является простым! 281 является простым! 283 является простым! 293 является простым! ```