# Отчет по теме 5


Коломейцев Дмитрий, А-02-23


## Блоки инструкций, управляющие инструкции


### 1-2. Изучение управляющей конструкции if.


Оператор if используется для того, чтобы в программе выбирать разные пути выполнения кода в зависимости от условия. Условие - это логическое выражение, которое принимает значение True или False. После условия идет блок кода с отступом.


```py
porog = 10
rashod1 = 6
rashod2 = 4
if rashod1 >= porog: # Проверяем первое условие
	dohod = 12 # Код выполнится, если условие верно
elif rashod2 == porog: # Проверяем второе условие
	dohod = 0 # Код выполнится, если верно второе условие
else: # Если оба условия неверны
	dohod = 8 # Этот код выполнится во всех остальных случаях
...
dohod
	8
```


В условиях можно проверять несколько выражений сразу, используя операторы and и or:


```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. Простой цикл.


Чтобы создать простой цикл for, нужно задать диапазон чисел, которые будут перебираться:


```py
temperatura = 5
for i in range(3, 18, 3): # i будет принимать значения 3, потом 6, потом 15
	temperatura += i # Каждый раз прибавляем значение i
  
temperatura
	50
```


#### 3.2. Более сложный цикл.


В цикле for можно использовать условия и оператор 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 элементов (цикл остановился по break), а во втором - остался с 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 позволяет добавить блок else, который выполнится только если цикл завершился сам по себе, без использования break. Если использовали break, то else не выполнится. Примеры:


```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)
	
466
# Цикл прошел полностью, поэтому сработал блок else
```


#### 3.4. Работа с символьной строкой внутри цикла.


В Python строки можно перебирать в цикле, как список элементов:


```py
stroka = "Это - автоматизированная система"
stroka1 = ""
for ss in stroka:
	stroka1 += " " + ss # Добавляем пробел перед каждым символом
   
stroka1
	' Э т о   -   а в т о м а т и з и р о в а н н а я   с и с т е м а'
```


#### 3.5. Конструкция list comprehension.


Цикл можно написать коротко в одну строку. Внутри квадратных скобок записано выражение-генератор. Вот пример, где рисуем график синуса:


```py
import math, pylab
sps2 = [math.sin(i * math.pi / 5 + 2) for i in range(100)] # Цикл в одну строку
pylab.plot(list(range(100)), sps2)
	[<matplotlib.lines.Line2D object at 0x000001C7AD29A5D0>]
pylab.title("Синусоидальный сигнал")
	Text(0.5, 1.0, 'Синусоидальный сигнал')
pylab.xlabel("Время")
	Text(0.5, 0, 'Время')
pylab.ylabel("Сигнал")
	Text(0, 0.5, 'Сигнал')
pylab.show()
```


Полученный график:


![alt text](pictures/image1.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, что в Python значит False. Если бы она никогда не стала 0, цикл был бы бесконечным.


#### 4.2. Цикл с символьной строкой.


В 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
	...
	Значение в момент 29 = 0.8956928738431645
	Значение в момент 30 = 0.9051482536448664
	Значение в момент 31 = 0.9137854901178277
pylab.plot(list(range(39)), sps2)
	[<matplotlib.lines.Line2D object at 0x0000000029B6B610>]
pylab.title("Сигнал на выходе")
	Text(0.5, 1.0, 'Сигнал на выходе')
pylab.xlabel("Время")
	Text(0.5, 0, 'Время')
pylab.ylabel("Сигнал")
	Text(0, 0.5, 'Сигнал')
pylab.show()
```


Полученный график:


![alt text](pictures/image2.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): # Проходим по числам от 250 до 300
	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(10):
	if i in [2, 4, 6, 8]: # Если число 2, 3 или 5, пропускаем его
		continue
	print(i)
  
	0
	1
	3
	5
	7
	9
```


### 5. Завершение работы со средой.

Сохранил файлы отчета в своем рабочем каталоге и закончил сеанс работы с IDLE.
