From 13cc4d3748f3bf2c579a51c812f12c4f58aa8a1f Mon Sep 17 00:00:00 2001 From: Tsvetkova Tatyana Date: Sun, 26 Oct 2025 23:52:22 +0300 Subject: [PATCH] Lab5 --- TEMA5/Lab5.md | 419 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 419 insertions(+) create mode 100644 TEMA5/Lab5.md diff --git a/TEMA5/Lab5.md b/TEMA5/Lab5.md new file mode 100644 index 0000000..27fd687 --- /dev/null +++ b/TEMA5/Lab5.md @@ -0,0 +1,419 @@ +### Отчет тема 5 +## Пункт 2. Изучите ветвление по условию – управляющая инструкция if. +Общий вид выглядит так: + +```py +if <условие>: +<отступы> <Блок инструкций, выполняемый, если условие истинно> + [elif <условие2>: +<отступы><Блок инструкций2, выполняемый, если условие2 истинно> +] +[else: +< отступы><Блок инструкций3, выполняемый, если условие ложно> +] +``` +Причем elif и else вместе или по отдельности могут отсуствовать. + +Пример +```py +>>> prog=4 +>>> rashod1 = 8 +>>> rashod2 = 5 +>>> if rashod1 >= prog: +... dohod=12 +... elif rashod2==prog: +... dohod=0 +... else: +... dohod=8 +... +>>> dohod +12 +``` +Посмотрим другой цикл +```py +>>> rashod2 = 4 +>>> porog = 4 +>>> if rashod1>=3 and rashod2==4: +... dohod=rashod1 +... if rashod2==porog or rashod1>> dohod +4 +``` +И ещё одна операция с множественным ветвлением линий потока: +```py +>>> if porog==3: +... dohod=1 +... elif porog==4: +... dohod=2 +... elif porog==5: +... dohod=3 +... else: +... dohod=0 +... +>>> dohod +2 +``` +Еще одна форма записи условных управляющих инструкций - тернарный оператор (от лат. "тройной"): +<Объект> = <значение 1> if <условие> else <значение 2> +или ещё: +```py +if <условие>: <инструкция1>[;<инструкция2>….] +``` +```py +>>> dohod=2 if porog>=4 else 0 +>>> dohod +2 +``` +Если в блоке инструкций всего одна строка, можно записать всё в одну строку: +```py +>>> porog = 2 +>>> if porog >= 5 : rashod1 = 6; rashod2 = 0 +... +>>> rashod1 +8 +>>> rashod2 +4 +``` +Тк условие не было выполнено рассмотрим другой пример +```py +>>> porog = 7 +>>> if porog >= 5 : rashod1 = 6; rashod2 = 0 +... +>>> rashod1 +6 +>>> rashod2 +0 +``` +## Пункт 3. Цикл по перечислению (for) + +Общее правило написания: +```py +for <Объект-переменная цикла> in <объект>: +<отступы><Блок инструкций 1 – тело цикла> +[else: +< отступы ><Блок инструкций 2 – если в цикле не сработал break>] +``` +Здесь <объект> - любой определенный до начала цикла объект из классов строка, список, кортеж, множество, словарь. <Объект-переменная цикла> - объект, в качестве значений которого пооче-редно будут задаваться элементы объекта, которые могут быть объектами любого типа. <Блок инструкций 1 – тело цикла> - совокупность инструкций, которая может содержать или не содер-жать инструкцию break, вызывающую досрочное завершение цикла при некоторых условиях. Блок инструкций 1 обычно выполняется многократно по мере того, как объект-переменная цикла принимает значения из сложного объекта. Если в цикле имеется необязательная часть: else и Блок инструкций 2, то он будет выполняться перед завершением цикла только в том случае, если при выполнении цикла не было его прерывания по инструкции break. +Если Блоке инструкций 1 или в Блоке инструкций 2 только одна инструкция, то её можно запи-сывать без отступов сразу за двоеточием. + +##3.1. Простой цикл. +```py +>>> temperatura=5 +>>> for i in range(3,18,3): +... temperatura+=i +... +>>> temperatura +50 +## 3.2. Более сложный цикл +>>> 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] +``` +Как видно, в конец цикла добавляется двойка до тех пор, пока длина не превысит 10. Важно +понимать, что sps - это и объект, по которому проходит k, и объект, изменяющийся +внутри цикла. То есть k будет двигаться по циклу бесконечно, и выполнение останавливается +именно из-за условия if - else. +(При этом else в данном случае относится к if, а не к for (это можно понять не только по +смыслу, но и по табуляции) + +Рассмотрим другой вариант: +```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[:] создает полную копию +исходного списка (грубо говоря, срез от начала до конца включительно). +Теперь список, по которому пробегается k, и список, изменяющийся внутри цикла - это объекты, +имеющие разные адреса. Это можно проверить: +```py +>>> id(sps) +1684034116672 +>>> id(sps[:]) +1684069134400 +``` +Следовательно, else не успеет сработать, потому что итерируемый в управляющей инструкции +объект окажется короче и завершит цикл раньше +## Пункт 3.3 +```py +>>> sps5=[] +>>> for i in range(10): +... sps5.append(rn.randint(1,100)) +... ss=sum(sps5) +... if ss>500: break +... else: +... print(ss) +... +``` +Программа ничего не вывела. Посмотрим, почему именно: +```py +>>> sps5 +[89, 38, 86, 57, 21, 44, 43, 32, 13, 88] +>>> ss +511 +>>> sps5 = [] +>>> for i in range(10): +... sps5.append(rn.randint(1,100)) +... ss = sum(sps5) +... else: +... print(ss) +... +517 +>>> sps5 +[11, 75, 48, 46, 3, 67, 78, 92, 63, 34] +``` +В этот раз программа вывела ответ самостоятельно, потому что сработал else, потому что +за все десять итераций цикла так и не успел выполниться break по условию if. + +## Пункт 3.4. Пример с символьной строкой +```py +>>> stroka='Это - автоматизированная система' +>>> stroka1="" +>>> for ss in stroka: +... stroka1+=" "+ss +... +>>> stroka +'Это - автоматизированная система' +>>> stroka1 +' Э т о - а в т о м а т и з и р о в а н н а я с и с т е м а' +``` +Переменная ss проходит по всему строковому объекту, на каждой итерации принимая значение +одного знака. Этот знак с предшествующим пробелом дописывается в конец другой, изначально +пустой строки. Цикл закончится, когда закончится исходная строка. + +## 3.5. Запись цикла в строке. Пример: создание списка с синусоидальным сигналом. +```py +>>> import math +>>> sps2=[math.sin(i*math.pi/5+2) for i in range(100)] +>>> sps2 +[0.9092974268256817, 0.49103209793281005, -0.11479080280322804, -0.6767675184643197, -0.9802420445539634, -0.9092974268256817, -0.49103209793281016, 0.11479080280322791, 0.6767675184643196, 0.9802420445539634, 0.9092974268256818, 0.4910320979328103, -0.1147908028032278, -0.6767675184643196, -0.9802420445539632, -0.9092974268256818, -0.4910320979328104, 0.11479080280322768, 0.6767675184643195, 0.9802420445539632, 0.9092974268256819, 0.4910320979328105, -0.11479080280322579, -0.6767675184643194, -0.9802420445539632, -0.9092974268256819, -0.4910320979328106, 0.11479080280322743, 0.6767675184643193, 0.9802420445539632, 0.909297426825682, 0.49103209793281066, -0.1147908028032273, -0.6767675184643192, -0.9802420445539632, -0.909297426825682, -0.4910320979328108, 0.11479080280322719, 0.6767675184643192, 0.9802420445539631, 0.9092974268256822, 0.491032097932814, -0.11479080280322707, -0.676767518464319, -0.9802420445539625, -0.9092974268256822, -0.491032097932811, 0.11479080280323047, 0.6767675184643189, 0.9802420445539625, 0.9092974268256822, 0.4910320979328142, -0.11479080280322682, -0.6767675184643215, -0.9802420445539631, -0.9092974268256808, -0.4910320979328112, 0.11479080280322317, 0.6767675184643187, 0.9802420445539624, 0.9092974268256823, 0.4910320979328082, -0.11479080280322658, -0.6767675184643213, -0.980242044553963, -0.9092974268256838, -0.49103209793281144, 0.11479080280322293, 0.6767675184643186, 0.9802420445539637, 0.9092974268256824, 0.49103209793280844, -0.11479080280322633, -0.6767675184643158, -0.980242044553963, -0.9092974268256839, -0.49103209793281166, 0.11479080280322974, 0.6767675184643184, 0.9802420445539637, 0.9092974268256825, 0.4910320979328149, -0.11479080280321903, -0.6767675184643209, -0.9802420445539629, -0.909297426825681, -0.4910320979328119, 0.11479080280322244, 0.6767675184643129, 0.9802420445539636, 0.9092974268256826, 0.49103209793281505, -0.11479080280322584, -0.6767675184643155, -0.9802420445539644, -0.9092974268256812, -0.49103209793281205, 0.1147908028032222, 0.6767675184643127, 0.980242044553965] +``` +Эту синусоиду можно отобразить на графике: +```py +>>> import pylab +>>> pylab.plot(sps2, label='Синусоидальный сигнал', color = 'green') +[] +>>> pylab.show() +``` +График прикреплен отдельным файлом Figure_1.png +## Пункт 4. Цикл "пока истинно условие" (while) + +Общий вид: +```py +while <Условие>: +<отступы><Блок инструкций 1 – тело цикла> +[else: +<отступы><Блок инструкций 2 – если в цикле не сработал break>] +``` +break и else работают аналогично предыдущему случаю. +## 4.1. Цикл со счетчиком. +```py +>>> rashod=300 +>>> while rashod: +... print("Расход=",rashod) +... rashod-=50 +... +Расход= 300 +Расход= 250 +Расход= 200 +Расход= 150 +Расход= 100 +Расход= 50 +``` +Как именно произошло завершение цикла? Нужно вспомнить, что все числа, кроме нуля, при +конвертации в логический тип данных имеют логическое значение True: +```py +>>> bool(50) +True +``` + +И только нуль имеет значение False: +```py +>>> bool(0) +False +``` +Сравниваемая в управляющей инструкции переменная уменьшается в самом цикле, поэтому, когда +строка со сравнением обнаружит 0, то воспримет это как False, и действия по выводу +и уменьшению числа выполняться больше не будут. +## Пункт 4.2. Пример с символьной строкой +```py +>>> import math +>>> stroka='Расчет процесса в объекте регулирования' +>>> i=0 +>>> sps2=[] +>>> while i>> pylab.show() +``` +График прикреплен файлом Figure_2.png +## Пункт 4.3. Определение, является ли число простым (делится только на самого себя или 1). +```py +>>> chislo = 267 +>>> kandidat = chislo // 2 +>>> while kandidat > 1: + if chislo % kandidat == 0: + print(chislo, ' имеет множитель ', kandidat) + break + kandidat -= 1 +else: + print(chislo, ' является простым!') + + +267 имеет множитель 89 +``` + +Программа работает так: переменная kandidat отвечает за потенциальный делитель заданного +числа. Изначально мы задаем половину от заданного числа, потому что у числа не может быть +делителя большего, чем половина от него. Далее мы последовательно уменьшаем потенциальный +множитель, каждый раз проверяя, получилось ли поделить без остатка. Если получилось, то +число непростое, и цикл можно прекращать досрочно. Если цикл отработал до конца, не +прервавшись, то число простое. + +Дополниим программу так, чтобы она проверяла все числа от 250 до 300. +```py +>>> chislo = [x for x in range (250, 301)] +>>> for now in chislo: + kandidat = now // 2 + while kandidat > 1: + if now % kandidat == 0: + print(now, ' имеет множитель ', kandidat) + break + kandidat -= 1 + else: #ОБЯЗАТЕЛЬНО относится не к if и не к for, а к while + print(now, " является простым!") + + +250 имеет множитель 125 +251 является простым! +252 имеет множитель 126 +253 имеет множитель 23 +254 имеет множитель 127 +255 имеет множитель 85 +256 имеет множитель 128 +257 является простым! +258 имеет множитель 129 +259 имеет множитель 37 +260 имеет множитель 130 +261 имеет множитель 87 +262 имеет множитель 131 +263 является простым! +264 имеет множитель 132 +265 имеет множитель 53 +266 имеет множитель 133 +267 имеет множитель 89 +268 имеет множитель 134 +269 является простым! +270 имеет множитель 135 +271 является простым! +272 имеет множитель 136 +273 имеет множитель 91 +274 имеет множитель 137 +275 имеет множитель 55 +276 имеет множитель 138 +277 является простым! +278 имеет множитель 139 +279 имеет множитель 93 +280 имеет множитель 140 +281 является простым! +282 имеет множитель 141 +283 является простым! +284 имеет множитель 142 +285 имеет множитель 95 +286 имеет множитель 143 +287 имеет множитель 41 +288 имеет множитель 144 +289 имеет множитель 17 +290 имеет множитель 145 +291 имеет множитель 97 +292 имеет множитель 146 +293 является простым! +294 имеет множитель 147 +295 имеет множитель 59 +296 имеет множитель 148 +297 имеет множитель 99 +298 имеет множитель 149 +299 имеет множитель 23 +300 имеет множитель 150 +``` +## Пункт 4.4. Инструкция continue. + +Она используется, когда надо при определенном условии не завершить весь цикл, а завершить +только текущую итерацию. + +Пример (вывести только нечетные числа): +```py +>>> n=[1,2,3,4,5,6,7,8,9,10] +>>> for k in n: +... if k%2==0: +... continue +... print(k) +... +1 +3 +5 +7 +9 +``` +