EfimovaLA 3 недель назад
Родитель a39c073348
Сommit 5be734d43a

@ -1,371 +1,373 @@
# Отчет по теме 6 # Отчет по теме 6
Ефимова Людмила, А-03-23 Ефимова Людмила, А-03-23
## 1. Запустила интерактивную оболочку и создала файл отчета ## 1. Запустила интерактивную оболочку и создала файл отчета
## 2. Вывод данных на экран дисплея ## 2. Вывод данных на экран дисплея
### 2.1. Вывод в командной строке ### 2.1. Вывод в командной строке
Эхо-вывод строки. Нельзя использовать в пользовательских функциях. Эхо-вывод строки. Нельзя использовать в пользовательских функциях.
```py ```py
stroka='Автоматизированная система управления' stroka='Автоматизированная система управления'
stroka stroka
'Автоматизированная система управления' 'Автоматизированная система управления'
``` ```
### 2.2. Вывод с использованием функции print ### 2.2. Вывод с использованием функции print
```py ```py
fff=234.5;gg='Значение температуры = ' fff=234.5;gg='Значение температуры = '
print(gg, fff) #Можно вывести несколько объектов за одно обращение к функции print(gg, fff) #Можно вывести несколько объектов за одно обращение к функции
Значение температуры = 234.5 Значение температуры = 234.5
print(gg, fff, sep='/') # изменили разделитель по умолчанию на / print(gg, fff, sep='/') # изменили разделитель по умолчанию на /
Значение температуры = /234.5 Значение температуры = /234.5
``` ```
После вывода автоматически осуществляется переход на другую строку. Если курсор надо После вывода автоматически осуществляется переход на другую строку. Если курсор надо
оставить в той же строке, то следует использовать еще один аргумент. оставить в той же строке, то следует использовать еще один аргумент.
После end указано какими символами кончается строка После end указано какими символами кончается строка
```py ```py
print(gg, fff,sep='/',end='***'); print('____') print(gg, fff,sep='/',end='***'); print('____')
Значение температуры = /234.5***____ Значение температуры = /234.5***____
``` ```
Оператор вывода может располагаться на нескольких строках с использованием Оператор вывода может располагаться на нескольких строках с использованием
тройных кавычек тройных кавычек
```py ```py
print(""" Здесь может выводиться print(""" Здесь может выводиться
большой текст, большой текст,
занимающий несколько строк""") занимающий несколько строк""")
Здесь может выводиться Здесь может выводиться
большой текст, большой текст,
занимающий несколько строк занимающий несколько строк
print("Здесь может выводиться", print("Здесь может выводиться",
"большой текст,", "большой текст,",
"занимающий несколько строк") "занимающий несколько строк")
Здесь может выводиться большой текст, занимающий несколько строк Здесь может выводиться большой текст, занимающий несколько строк
``` ```
### 2.3. Вывод с использованием метода write объекта sys.stdout. ### 2.3. Вывод с использованием метода write объекта sys.stdout.
stdout представляет собой stdout представляет собой
поток стандартного вывода – объект, в который программы выводят символьное представление данных. поток стандартного вывода – объект, в который программы выводят символьное представление данных.
```py ```py
import sys import sys
sys.stdout.write('Функция write') sys.stdout.write('Функция write')
Функция write13 Функция write13
sys.stdout.write('Функция write\n') # \n перенос на следующую строку sys.stdout.write('Функция write\n') # \n перенос на следующую строку
Функция write Функция write
14 14
``` ```
## 3. Ввод данных с клавиатуры ## 3. Ввод данных с клавиатуры
```py ```py
psw=input('Введите пароль:') psw=input('Введите пароль:')
Введите пароль: 1234 Введите пароль: 1234
psw psw
' 1234' ' 1234'
type(psw) type(psw)
<class 'str'> <class 'str'>
``` ```
Ввод с контролем значения Ввод с контролем значения
```py ```py
while True: while True:
znach=float(input('Задайте коэф.усиления = ')) znach=float(input('Задайте коэф.усиления = '))
if znach<17.5 or znach>23.8: if znach<17.5 or znach>23.8:
print('Ошибка!') print('Ошибка!')
else: else:
break break
Задайте коэф.усиления = 4 Задайте коэф.усиления = 4
Ошибка! Ошибка!
Задайте коэф.усиления = 20 Задайте коэф.усиления = 20
``` ```
Вывод и обработка выражения, подлежащего расчету Вывод и обработка выражения, подлежащего расчету
```py ```py
import math import math
print(eval(input('введите выражение для расчета = '))) print(eval(input('введите выражение для расчета = ')))
введите выражение для расчета = math.log10(23/(1+math.exp(-3.24))) введите выражение для расчета = math.log10(23/(1+math.exp(-3.24)))
1.34504378689765 1.34504378689765
``` ```
## 4. Ввод-вывод данных при работе с файлами ## 4. Ввод-вывод данных при работе с файлами
Работа с файлом требует указания источника данных - полного имени файла с путем доступа к его расположению. Работа с файлом требует указания источника данных - полного имени файла с путем доступа к его расположению.
### 4.1. Функции для работы с путем к файлу ### 4.1. Функции для работы с путем к файлу
```py ```py
os.getcwd () os.getcwd ()
'C:\\Users\\Людмила\\AppData\\Local\\Programs\\Python\\Python313' 'C:\\Users\\Людмила\\AppData\\Local\\Programs\\Python\\Python313'
way = os.getcwd() # сохранили путь в переменную way = os.getcwd() # сохранили путь в переменную
way way
'C:\\Users\\Людмила\\AppData\\Local\\Programs\\Python\\Python313' 'C:\\Users\\Людмила\\AppData\\Local\\Programs\\Python\\Python313'
``` ```
Установили новый рабочий каталог Установили новый рабочий каталог
```py ```py
os.chdir('H:\\study\\ПОАС') os.chdir('H:\\study\\ПОАС')
os.getcwd () os.getcwd ()
'H:\\study\\ПОАС' 'H:\\study\\ПОАС'
``` ```
В модуле os также есть функции, позволяющие удалять и создавать директории. В модуле os также есть функции, позволяющие удалять и создавать директории.
```py ```py
os.listdir() #Возвращает список имен файлов находящихся в рабочей директории os.listdir() #Возвращает список имен файлов находящихся в рабочей директории
['New directory', 'report — копия.odt', 'report3.md', 'report4.md', 'report5.md', 'report6.txt', 'Ris1.png', 'Ris2.png', 'task.md', 'task3.md', 'task4.md', 'Методические указания по ПОАС.pdf', 'репозиторий', 'Тест по модулю 1 ПОАС.docx'] ['New directory', 'report — копия.odt', 'report3.md', 'report4.md', 'report5.md', 'report6.txt', 'Ris1.png', 'Ris2.png', 'task.md', 'task3.md', 'task4.md', 'Методические указания по ПОАС.pdf', 'репозиторий', 'Тест по модулю 1 ПОАС.docx']
os.path.isdir("New directory"); os.path.isdir("test333") # Проверка наличия директории в рабочем каталоге os.path.isdir("New directory"); os.path.isdir("test333") # Проверка наличия директории в рабочем каталоге
True True
False False
os.rmdir('New directory') # Удаление директории os.rmdir('New directory') # Удаление директории
os.listdir() os.listdir()
['report — копия.odt', 'report3.md', 'report4.md', 'report5.md', 'report6.txt', 'Ris1.png', 'Ris2.png', 'task.md', 'task3.md', 'task4.md', 'Методические указания по ПОАС.pdf', 'репозиторий', 'Тест по модулю 1 ПОАС.docx'] ['report — копия.odt', 'report3.md', 'report4.md', 'report5.md', 'report6.txt', 'Ris1.png', 'Ris2.png', 'task.md', 'task3.md', 'task4.md', 'Методические указания по ПОАС.pdf', 'репозиторий', 'Тест по модулю 1 ПОАС.docx']
``` ```
Можно также получить путь к файлу Можно также получить путь к файлу
```py ```py
fil=os.path.abspath("report5.md") fil=os.path.abspath("report5.md")
fil fil
'H:\\study\\ПОАС\\report5.md' 'H:\\study\\ПОАС\\report5.md'
drkt = os.path.dirname(fil) drkt = os.path.dirname(fil)
drkt drkt
'H:\\study\\ПОАС' 'H:\\study\\ПОАС'
name = os.path.basename(fil) # Выделение имени файла name = os.path.basename(fil) # Выделение имени файла
name name
'report5.md' 'report5.md'
directory, fileName = os.path.split(fil) # Разделяет путь к файлу на путь доступа к файлу и его имя (Возвращает кортеж из этих двух составляющих) directory, fileName = os.path.split(fil) # Разделяет путь к файлу на путь доступа к файлу и его имя (Возвращает кортеж из этих двух составляющих)
print(directory);print(fileName) print(directory);print(fileName)
H:\study\ПОАС H:\study\ПОАС
report5.md report5.md
``` ```
Проверка указывает ли путь к нужному файлу Проверка указывает ли путь к нужному файлу
```py ```py
os.path.isfile(fil) # Проверка пути к файлу os.path.isfile(fil) # Проверка пути к файлу
True True
os.path.isfile("test.txt") os.path.isfile("test.txt")
False False
``` ```
### 4.2. Общая схема работы с файлами ### 4.2. Общая схема работы с файлами
Для обмена данными с файлом необходимо выполнить следующие операции: Для обмена данными с файлом необходимо выполнить следующие операции:
 Открытие файла с указанием его имени и цели (чтение, запись, добавление данных); Открытие файла с указанием его имени и цели (чтение, запись, добавление данных);
 Выполнение одной или нескольких операций обмена данными с файлом;
 Закрытие файла. Выполнение одной или нескольких операций обмена данными с файлом;
### 4.3. Открытие файла для записи или чтения данных - функция open Закрытие файла.
При открытии файла необходимо указать имя файлы (с путем, если он не в рабочем каталоге) и цель работы с ним.
fp – это файловый объект, сохраняет ссылку на открываемый файл. ### 4.3. Открытие файла для записи или чтения данных - функция open
При открытии файла необходимо указать имя файлы (с путем, если он не в рабочем каталоге) и цель работы с ним.
w – запись с созданием нового файла или перезапись существующего файла, fp – это файловый объект, сохраняет ссылку на открываемый файл.
w+ - чтение и запись/перезапись файла,
r – только чтение (это значение - по умолчанию), w – запись с созданием нового файла или перезапись существующего файла,
r+ - чтение и/или запись в существующий файл, w+ - чтение и запись/перезапись файла,
a – запись в конец существующего файла или, если его нет, запись с созданием файла, r – только чтение (это значение - по умолчанию),
a+ - то же, что и в «a», но с возможностью чтения из файла. r+ - чтение и/или запись в существующий файл,
a – запись в конец существующего файла или, если его нет, запись с созданием файла,
```py a+ - то же, что и в «a», но с возможностью чтения из файла.
fp=open(file=drkt+'\\zapis1.txt',mode='w') # открыли файл для записи данных
fp=open(drkt+'\\zapis1.txt','w') # имена аргументов можно опустить ```py
fp=open('zapis1.txt','w') # Открытие файла, путь к которому совпадает с рабочим каталогом fp=open(file=drkt+'\\zapis1.txt',mode='w') # открыли файл для записи данных
fp=open(drkt+'\\zapis1.txt','w') # имена аргументов можно опустить
type(fp) fp=open('zapis1.txt','w') # Открытие файла, путь к которому совпадает с рабочим каталогом
<class '_io.TextIOWrapper'>
dir(fp) type(fp)
['_CHUNK_SIZE', '__class__', '__del__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_checkClosed', '_checkReadable', '_checkSeekable', '_checkWritable', '_finalizing', 'buffer', 'close', 'closed', 'detach', 'encoding', 'errors', 'fileno', 'flush', 'isatty', 'line_buffering', 'mode', 'name', 'newlines', 'read', 'readable', 'readline', 'readlines', 'reconfigure', 'seek', 'seekable', 'tell', 'truncate', 'writable', 'write', 'write_through', 'writelines'] <class '_io.TextIOWrapper'>
``` dir(fp)
### 4.4. Закрытие файла ['_CHUNK_SIZE', '__class__', '__del__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_checkClosed', '_checkReadable', '_checkSeekable', '_checkWritable', '_finalizing', 'buffer', 'close', 'closed', 'detach', 'encoding', 'errors', 'fileno', 'flush', 'isatty', 'line_buffering', 'mode', 'name', 'newlines', 'read', 'readable', 'readline', 'readlines', 'reconfigure', 'seek', 'seekable', 'tell', 'truncate', 'writable', 'write', 'write_through', 'writelines']
```py ```
fp.close() ### 4.4. Закрытие файла
``` ```py
fp.close()
### 4.5. Запись информации в файл ```
Можно записать информацию в файл с помощью метода write
### 4.5. Запись информации в файл
```py Можно записать информацию в файл с помощью метода write
sps=list(range(1,13))
sps ```py
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] sps=list(range(1,13))
fp2 = open("zapis3.txt", "w") # запись первых 4 значений и перенос строки sps
fp2.write(str(sps[:4])+'\n') [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
13 fp2 = open("zapis3.txt", "w") # запись первых 4 значений и перенос строки
fp2.write(str(sps[4:8])+'\n') fp2.write(str(sps[:4])+'\n')
13 13
fp2.write(str(sps[8:])+'\n') fp2.write(str(sps[4:8])+'\n')
16 13
fp2.close() fp2.write(str(sps[8:])+'\n')
``` 16
Содержимое файла fp2.close()
```py ```
[1, 2, 3, 4] Содержимое файла
[5, 6, 7, 8] ```py
[9, 10, 11, 12] [1, 2, 3, 4]
``` [5, 6, 7, 8]
Запись данных внутри цикла [9, 10, 11, 12]
```py ```
sps3 = [["Иванов И.", 1], ["Петров П.", 2], ["Сидоров С.", 3]] Запись данных внутри цикла
for i in range(len(sps3)): ```py
stroka4=sps3[i][0]+' '+str(sps3[i][1]) sps3 = [["Иванов И.", 1], ["Петров П.", 2], ["Сидоров С.", 3]]
fp3.write(stroka4) for i in range(len(sps3)):
stroka4=sps3[i][0]+' '+str(sps3[i][1])
11 fp3.write(stroka4)
11
12 11
fp3.close() 11
``` 12
Содержимое файла fp3.close()
```py ```
Иванов И. 1Петров П. 2Сидоров С. 3 Содержимое файла
``` ```py
Запишем иначе Иванов И. 1Петров П. 2Сидоров С. 3
```py ```
gh=open('zapis5.txt','w') Запишем иначе
for r in sps3: ```py
gh.write(r[0]+' '+str(r[1])+'\n') fp3=open('zapis5.txt','w')
for r in sps3:
12 fp3.write(r[0]+' '+str(r[1])+'\n')
12
13 12
for r in sps3: gh.write(r[0]+' '+str(r[1])+'\n') # в одну строку 12
12 13
12 for r in sps3: fp3.write(r[0]+' '+str(r[1])+'\n') # в одну строку
13 12
``` 12
Содержимое файла 13
```py ```
Иванов И. 1 Содержимое файла
Петров П. 2 ```py
Сидоров С. 3 Иванов И. 1
``` Петров П. 2
Сидоров С. 3
### 4.6. Чтение информации из текстового файла внутри цикла. ```
Чтение данных из файла происходит последовательно, начиная с некоторого символа. В качестве примера прочитан ранее созданный файл zapis3.txt:
```py ### 4.6. Чтение информации из текстового файла внутри цикла.
fp=open('zapis3.txt') Чтение данных из файла происходит последовательно, начиная с некоторого символа. В качестве примера прочитан ранее созданный файл zapis3.txt:
for stroka in fp: ```py
stroka=stroka.rstrip('\n') fp=open('zapis3.txt')
stroka=stroka.replace('[','') for stroka in fp:
stroka=stroka.replace(']','') stroka=stroka.rstrip('\n')
sps1=sps1+stroka.split(',') stroka=stroka.replace('[','')
stroka=stroka.replace(']','')
fp.close() sps1=sps1+stroka.split(',')
sps1
['1', ' 2', ' 3', ' 4', '5', ' 6', ' 7', ' 8', '9', ' 10', ' 11', ' 12'] fp.close()
``` sps1
Сделаем чтобы элементы совпадали с исходными ['1', ' 2', ' 3', ' 4', '5', ' 6', ' 7', ' 8', '9', ' 10', ' 11', ' 12']
```
```py Сделаем чтобы элементы совпадали с исходными
for i in range(len(sps1)):
sps1[i] = int(sps1[i]) ```py
sps1 for i in range(len(sps1)):
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] sps1[i] = int(sps1[i])
``` sps1
### 4.7. Чтение информации с помощью метода read [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
Метод read, также как и write, относится к объекту - файловой переменной. ```
### 4.7. Чтение информации с помощью метода read
```py Метод read, также как и write, относится к объекту - файловой переменной.
fp=open('zapis3.txt')
stroka1=fp.read(12) ```py
stroka2=fp.read() fp=open('zapis3.txt')
fp.close() stroka1=fp.read(12)
stroka2 stroka2=fp.read()
'\n[5, 6, 7, 8]\n[9, 10, 11, 12]\n' fp.close()
stroka1 stroka2
'[1, 2, 3, 4]' '\n[5, 6, 7, 8]\n[9, 10, 11, 12]\n'
``` stroka1
### 4.8. Чтение информации с помощью методов readline и readlines '[1, 2, 3, 4]'
```
```py ### 4.8. Чтение информации с помощью методов readline и readlines
fp = open("zapis3.txt")
stroka1 = fp.readline() # Чтение первой строки файла ```py
stroka2 = fp.readline() # Чтение второй строки файла fp = open("zapis3.txt")
fp.close() stroka1 = fp.readline() # Чтение первой строки файла
fp = open("zapis3.txt") stroka2 = fp.readline() # Чтение второй строки файла
stroka3 = fp.readlines() # Чтение всех строк файла fp.close()
fp.close() fp = open("zapis3.txt")
stroka1 stroka3 = fp.readlines() # Чтение всех строк файла
'[1, 2, 3, 4]\n' fp.close()
stroka2 stroka1
'[5, 6, 7, 8]\n' '[1, 2, 3, 4]\n'
stroka3 stroka2
['[1, 2, 3, 4]\n', '[5, 6, 7, 8]\n', '[9, 10, 11, 12]\n'] '[5, 6, 7, 8]\n'
``` stroka3
### 4.9. Ввод-вывод объектов с использованием функций из модуля pickle. ['[1, 2, 3, 4]\n', '[5, 6, 7, 8]\n', '[9, 10, 11, 12]\n']
Для работы с бинарными файлами можно пользоваться функциями из модуля pickle. Примером этого может послужить запись объекта-множества в бинарный файл: ```
```py ### 4.9. Ввод-вывод объектов с использованием функций из модуля pickle.
import pickle Для работы с бинарными файлами можно пользоваться функциями из модуля pickle. Примером этого может послужить запись объекта-множества в бинарный файл:
mnoz1={'pen','book','pen','iPhone','table','book'} #Объект типа «множество» ```py
fp=open('zapis6.mnz','wb') # Бинарный файл – на запись import pickle
pickle.dump(mnoz1,fp) #dump – метод записи объекта в файл mnoz1={'pen','book','pen','iPhone','table','book'} #Объект типа «множество»
fp.close() fp=open('zapis6.mnz','wb') # Бинарный файл – на запись
pickle.dump(mnoz1,fp) #dump – метод записи объекта в файл
fp=open('zapis6.mnz','rb') fp.close()
mnoz2=pickle.load(fp) #load – метод чтения объекта из бинарного файла
fp.close() fp=open('zapis6.mnz','rb')
mnoz1 mnoz2=pickle.load(fp) #load – метод чтения объекта из бинарного файла
{'iPhone', 'pen', 'book', 'table'} fp.close()
mnoz2 mnoz1
{'pen', 'table', 'book', 'iPhone'} {'iPhone', 'pen', 'book', 'table'}
mnoz2 == mnoz1 mnoz2
True {'pen', 'table', 'book', 'iPhone'}
``` mnoz2 == mnoz1
Получение объекта из файла можно осуществить с помощью метода load: True
```
```py Получение объекта из файла можно осуществить с помощью метода load:
fp = open("zapis6.mnz", "rb")
mnoz2 = pickle.load(fp) # Получение объекта из файла ```py
fp.close() fp = open("zapis6.mnz", "rb")
fp = open("zapis7.2ob", "wb") mnoz2 = pickle.load(fp) # Получение объекта из файла
pickle.dump(mnoz1, fp) fp.close()
pickle.dump(sps3, fp) fp = open("zapis7.2ob", "wb")
fp.close() pickle.dump(mnoz1, fp)
fp = open("zapis7.2ob", "rb") pickle.dump(sps3, fp)
obj1 = pickle.load(fp) # Получение объекта, записанного первым fp.close()
obj2 = pickle.load(fp) # Получение объекта, записанного вторым fp = open("zapis7.2ob", "rb")
fp.close() obj1 = pickle.load(fp) # Получение объекта, записанного первым
obj1 obj2 = pickle.load(fp) # Получение объекта, записанного вторым
{'pen', 'table', 'book', 'iPhone'} fp.close()
obj2 obj1
[['Иванов И.', 1], ['Петров П.', 2], ['Сидоров С.', 3]] {'pen', 'table', 'book', 'iPhone'}
``` obj2
## 5. Перенаправление потоков ввода и вывода данных. [['Иванов И.', 1], ['Петров П.', 2], ['Сидоров С.', 3]]
Потоки ввода-вывода можно перенаправлять, например в файл: ```
## 5. Перенаправление потоков ввода и вывода данных.
```py Потоки ввода-вывода можно перенаправлять, например в файл:
import sys
vr_out = sys.stdout # Сохранение текущего потока вывода ```py
fc = open("Stroka.txt", "w") import sys
sys.stdout = fc # Перезапись потока вывода с экрана на файл vr_out = sys.stdout # Сохранение текущего потока вывода
print("Запись строки в файл") fc = open("Stroka.txt", "w")
fc.close() sys.stdout = fc # Перезапись потока вывода с экрана на файл
sys.stdout = vr_out # Возвращение истинного значения потока вывода print("Запись строки в файл")
print("Запись строки на экран") fc.close()
Запись строки на экран sys.stdout = vr_out # Возвращение истинного значения потока вывода
``` print("Запись строки на экран")
Содержимое файла Запись строки на экран
```
```py Содержимое файла
Запись строки в файл
``` ```py
Точно также можно перенаправить поток ввода – sys.stdin – вместо клавиатуры – из файла. Запись строки в файл
```
```py Точно также можно перенаправить поток ввода – sys.stdin – вместо клавиатуры – из файла.
tmp_in = sys.stdin # Сохранение текущего потока ввода
fd = open("Stroka.txt", "r") # Открываем файл для ввода (чтения) ```py
sys.stdin = fd # Перенацеливаем ввод на файл вместо клавиатуры tmp_in = sys.stdin # Сохранение текущего потока ввода
sys.stdin fd = open("Stroka.txt", "r") # Открываем файл для ввода (чтения)
<_io.TextIOWrapper name='Stroka.txt' mode='r' encoding='cp1251'> sys.stdin = fd # Перенацеливаем ввод на файл вместо клавиатуры
while True: sys.stdin
try: <_io.TextIOWrapper name='Stroka.txt' mode='r' encoding='cp1251'>
line = input() # Чтение строки из файла while True:
print(line) try:
except EOFError: line = input() # Чтение строки из файла
break print(line)
except EOFError:
break
Запись строки в файл
fd.close() Запись строки в файл
```
## 6. Завершила работу со средой fd.close()
```
## 6. Завершила работу со средой

Загрузка…
Отмена
Сохранить