diff --git a/TEMA5/figure0.png b/TEMA5/figure0.png new file mode 100644 index 0000000..1a46fa8 Binary files /dev/null and b/TEMA5/figure0.png differ diff --git a/TEMA5/figure1.png b/TEMA5/figure1.png new file mode 100644 index 0000000..f7d6b88 Binary files /dev/null and b/TEMA5/figure1.png differ diff --git a/TEMA5/report.md b/TEMA5/report.md new file mode 100644 index 0000000..c10136c --- /dev/null +++ b/TEMA5/report.md @@ -0,0 +1,377 @@ +# Отчет по теме 5 + + +## 1. Запуск интерактивной оболочки IDLE. + +## 2. Ветвление по условию – управляющая инструкция if. + +- Операции определения значения dohod: +``` +>>>porog = 5 +>>>rashod1 = 8 +>>>rashod2 = 6 +>>>if rashod1 >= porog: + dohod = 12 + +if rashod1 >= porog: + dohod = 12 +elif rashod2 == porog: + dohod = 0 +else: + dohod = 8 + +>>>print(dohod) +# Выполним операцию для двух случаев +>>>rashod2 = 4 +>>>if rashod1 >= 3 and rashod2 == 4: + dohod = rashod1 + if rashod2 == porog or rashod1 < rashod2: + dohod = porog +>>>print(dohod) +8 # Выполнилось одно условие +>>>porog = 4 +>>>if rashod1 >= 3 and rashod2 == 4: + dohod = rashod1 + if rashod2 == porog or rashod1 < rashod2: + dohod = porog +>>>print(dohod) +4 # Выполнились оба условия +``` +- Операция с множественным ветвлением линий потока: +``` +>>>if porog == 3: # Не подходит + dohod = 1 +elif porog == 4: # Подходит + dohod = 2 +elif porog == 5: # Игнорируется + dohod = 3 +else: # Игнорируется + dohod = 0 +>>>print(dohod) +2 +``` + +- Инструкции, записывающиеся в одну строку в операторе присваивания. +<Объект>=<значение 1> if <условие> else <значение 2> + +``` +>>>dohod = 2 if porog >- 4 else 0 +>>>print(dohod) +2 +>>>if porog >= 5: rashod1 = 6; rashod2 = 0 # porog = 4 +>>>print(rashod1) +8 +>>>print(rashod2) +4 +>>>porog = 6 +>>>if porog >= 5: rashod1 = 6; rashod2 = 0 +>>>print(rashod1) +6 +>>>print(rashod2) +0 +``` + +## 3. Цикл по перечислению – управляющая инструкция for. +Общее правило написания: +for <Объект-переменная цикла> in <объект>: +<отступы><Блок инструкций 1 – тело цикла> +[else: +< отступы ><Блок инструкций 2 – если в цикле не сработал break>] + + +### 3.1. Простой цикл. +Выполняем цикл, который проходится по значениям от 3 до 18(не включительно) с шагом 3 и суммирует их в переменную temperatura. + +``` +>>>temperatura = 5 +>>>for i in range(3, 18, 3): + temperatura += i + +>>>temperatura +50 +``` +### 3.2. Более сложный цикл. + +``` +>>>sps = [2, 15, 14, 18] +>>>for k in sps: + if len(sps) <= 10: sps.append(sps[0]) + else: break +>>>sps +[2, 15, 14, 18, 2, 2, 2, 2, 2, 2, 2] +``` + +Как видно, в конец цикла добавляется двойка до тех пор, пока длина не превысит 10. Важно +понимать, что sps - это и объект, по которому проходит k, и объект, изменяющийся +внутри цикла. То есть k будет двигаться по циклу бесконечно, и выполнение останавливается +именно из-за условия if - else. +(При этом else в данном случае относится к if, а не к for (это можно понять не только по +смыслу, но и по табуляции) + +``` +>>>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 +- Изменение оригинала: Внутри цикла изменяется оригинальный список sps +- Количество итераций фиксировано: Определяется длиной изначальной копии + +### 3.3. : Cоздание списка с 10 целыми случайными числами из диапазона от 1 до 100. При этом, если сумма чисел не превышает 500, эта сумма должна быть отображена на экране. + +``` +>>>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) +# Программа ничего не вывела +>>>ss +512 +>>>sps5 +[47, 92, 92, 54, 52, 78, 67, 30] +``` +После того, как прошло девять итераций, сумма элементов списка уже была больше 500, поэтому +цикл закончился из-за if, а не из-за окончания диапазона range(10). + +Попробуем обнулить список и выполнить ту же программу еще раз: +``` +>>>sps5 = [] +>>>for i in range(10): + sps5.append(rn.randint(1, 100)) + ss = sum(sps5) + if ss > 500: break +else: + print(ss) +419 +``` +В этот раз программа вывела ответ, следовательно сработал else и break не сработал. + +### 3.4. Пример с символьной строкой +``` +>>>stroka='Это – автоматизированная система' +>>>stroka1 = " " +>>>for ss in stroka: + stroka1 += " " + ss +>>>print(stroka1) + Э т о – а в т о м а т и з и р о в а н н а я с и с т е м а +``` +Переменная stroka содержит исходную строку: "Это – автоматизированная система". +Переменная stroka1 инициализируется как пустая строка. +В цикле for происходит перебор каждого символа ss из строки stroka. +На каждой итерации к stroka1 добавляется пробел и текущий символ ss. +После обработки всех символов в stroka1 формируется новая строка, где каждый символ исходной строки разделён пробелом. + + +### 3.5. Запись цикла в строке. +Пример: создание списка с синусоидальным сигналом. +``` +>>>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] +>>>import pylab +>>>pylab.plot(sps2, label = 'Синусоидальный сигнал', color = 'red') +[] +>>>pylab.show() +``` +![График](figure0.png) + +## 4. Цикл «пока истинно условие» – управляющая инструкция while. +Общее правило написания: +while <Условие>: +<отступы><Блок инструкций 1 – тело цикла> +[else: +<отступы><Блок инструкций 2 – если в цикле не сработал break>] + +### 4.1. Цикл со счетчиком. +``` +>>>rashod = 300 +>>>while rashod: + print("Расход=", rashod) + rashod -= 50 +Расход= 300 +Расход= 250 +Расход= 200 +Расход= 150 +Расход= 100 +Расход= 50 +``` +Цикл завершился из-за того, что расход стал равен 0, а 0 в свою очередь воспринимается как False. + + +### 4.2. Пример с символьной строкой. +``` +>>>import math +>>>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 +Значение в момент 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 +>>>pylab.plot(sps2, label = 'Сигнал на выходе инерционного звена', color = 'red') +[] +>>>pylab.show() +``` +![График](figure1.png) + +### 4.3. Определение, является ли число простым (делится только на самого себя или 1). +``` +>>>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 +``` +Программа работает так: переменная kandidat отвечает за потенциальный делитель заданного +числа. Изначально мы задаем половину от заданного числа, потому что у числа не может быть +делителя большего, чем половина от него. Далее мы последовательно уменьшаем потенциальный +множитель, каждый раз проверяя, получилось ли поделить без остатка. Если получилось, то +число непростое, и цикл можно прекращать досрочно. Если цикл отработал до конца, не +прервавшись, то число простое. + +Дополним программу так, чтобы выявить все простые числа в диапазоне от 250 до 300. +``` +>>>for i in range(250, 301): + chislo = i + kandidat = chislo // 2 + while kandidat > 1: + if chislo % kandidat == 0: + print(chislo, 'имеет множитель', kandidat) + break + kandidat -= 1 + else: + print(chislo, 'является простым!') +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 +``` +Здесь просто добавляется for для перебора значений. + +### 4.4. Инструкция continue +Инструкция continue, которая не вызывает завершения цикла, но завершает его текущий виток и обеспечивает переход к следующему витку. +``` +>>>x = [rn.randint(-25, 40) for i in range (20)] +>>>x +[35, 21, -14, 21, -15, 1, -9, -7, -15, 2, 32, 11, 38, 32, -13, -21, 31, -10, -20, 15] +>>>for y in x: + if y < 0: continue + print(y, ">0") +else: print("stop") +35 >0 +21 >0 +21 >0 +1 >0 +2 >0 +32 >0 +11 >0 +38 >0 +32 >0 +31 >0 +15 >0 +stop +``` + +## 5. Завершение сеанса в среде IDLE \ No newline at end of file