Практическая работа анализ программ и решение задач python

Информатика 8-9 класс Начала программирования Python Босова

Глава 1. Начала программирования

1.1 Общие сведения о языке программирования Python

1.2 Организация ввода и вывода данных

1.3 Программирование линейных алгоритмов

1.4 Программирование разветвляющихся алгоритмов

1.5 Программирование циклических алгоритмов

Глава 2. Алгоритмизация и программирование

2.1 Одномерные массивы целых чисел

2.2 Запись вспомогательных алгоритмов на языке Python

Тестовые задания для самоконтроля за курс 8 класса

Практические работы

Информатика — сложный предмет, который не всем удаётся постичь в должной мере. В нашем случае ещё сложнее, где нам с нуля необходимо изучить язык программирования Python (Питон). Данный язык программирования был разработан в 1991 году нидерландским программистом Гвидо Ван Россум.

Пайтон — это язык программирования высокого уровня для решения широкого круга задач, который постоянно совершенствуется. Учебник по Информатике разделён на 2 главы: начала программирования ; алгоритмизация и программирование.

if для робота яндекс учебник

В первой главе вами будут изучены общие сведения о ЯП Python, научитесь организовывать ввод и вывод данных, программировать линейные, разветвляющиеся и циклические алгоритмы. ГДЗ по информатике будет вашим помощником в решении задач с программами на Python, которые вам не под силу решить. Рекомендуем вам написать программу самим, а затем сверить с нашим решением.

Чтобы проверить программу, вам понадобится скачать Python последней версии на официальном сайте и запустить IDLE Shell. В работе программы могут быть незначительные ошибки, от которых никто не застрахован. В таком случае прочтите заново часть параграфа и попробуйте найти ошибку. Если вы не хотите ничего скачивать, для вас уже существуют ресурсы для запуска и отладки программ на питоне(например: https://pythontutor.com/visualize.html#mode=edit). Не забывайте сообщать нам о возможных ошибках в заданиях, ведь мы тоже можем им совершить.

Нашли ошибку? Напишите нам

Источник: 5urokov.ru

Практическая работа анализ программ и решение задач python

XI Международный конкурс научно-исследовательских и творческих работ учащихся

Старт в науке

  • Главная
  • Список секций
  • Информатика
  • РЕШЕНИЕ ЗАДАЧ НА ЯЗЫКЕ ПРОГРАММИРОВАНИЯ PYTHON (ПАЙТОН)

РЕШЕНИЕ ЗАДАЧ НА ЯЗЫКЕ ПРОГРАММИРОВАНИЯ PYTHON (ПАЙТОН)

Ватьков А.С. 1

1 Муниципальное общеобразовательное учреждение “Тверской лицей”

Наумова А.И. 1

1 Муниципальное общеобразовательное учреждение “Тверской лицей”

Автор работы награжден дипломом победителя II степени

Текст работы размещён без изображений и формул.
Полная версия работы доступна во вкладке «Файлы работы» в формате PDF

Введение В данной работе представлен материал о высокоуровневом языке программирования Python (Пайтон). Тема достаточно актуальная и представляет повышенный интерес для учащихся профильных классов. Цель данной работы заключается в том, чтобы получить дополнительные знания по этой теме.

Задача состоит в том, чтобы подобрать соответствующий материал с последующей систематизацией, обобщением и иллюстрацией текста. Работа состоит из двух частей: теоретической (даны история языка, описание типов и структур данных, возможности, стандартная библиотека) и практической (приведён пример разработки алгоритма и двух вариантов программы (скрипта) с последующей обработкой данных на компьютере).

Основная часть Общие сведения о языке программирования Python (Пайтон) § 1. История языка Пайтон Р азработка языка Python (Пайтон) была начата в конце 1980-х годов сотрудником голландского института CWI Гвидо ванн Россумом . Гвидо начал писать Python на досуге, позаимствовав некоторые наработки для языка ABC ( Гвидо участвовал в разработке этого языка, ориентированного на обучение программированию).

В феврале 1991 года Гвидо опубликовал исходный текст. Наличие дружелюбного, отзывчивого сообщества пользователей считается, наряду с дизайнерской интуицией Гвидо , одним из факторов успеха Python. Развитие языка происходит согласно чётко регламентированному процессу создания, обсуждения, отбора и реализации документов PEP (англ. Python Enhancement Proposal) — предложений по развитию Python.

3 декабря 2008 года после длительного тестирования, вышла первая версия Python 3000 (или Python 3.0, также используется сокращение Py3k). В Python 3000 устранены многие недостатки архитектуры с максимально возможным (но не полным) сохранением совместимости со старыми версиями Python. На сегодня поддерживается одна ветка развития (Python 3.x), поддержка ветки Python 2.x закончилась в апреле 2020 года [1].

§ 2. Типы и структура данных Python поддерживает динамическую типизацию, то есть тип переменной определяется только во время исполнения. Поэтому вместо “присваивания значения переменной” лучше говорить о “связывании значения с некоторым именем”.

В Python имеются встроенные типы: булевый, строка, Unicode -строка, целое число произвольной точности, число с плавающей запятой, комплексное число и некоторые другие. Из коллекций в Python встроены: список, кортеж (неизменяемый список), словарь, множество и другие. Все значения являются объектами, в том числе функции, методы, модули, классы.

Добавить новый тип можно либо написав класс (class), либо определив новый тип в модуле расширения (например, написанном на языке C). Система классов поддерживает наследование (одиночное и множественное) и метапрограммирование. Возможно наследование от большинства встроенных типов и типов расширений.

Все объекты делятся на изменяемые и неизменяемые: списки, словари и множества являются изменяемыми, а все остальные — неизменяемыми (например, при изменении строки фактически создаётся новая, а при изменении списка — только меняются ссылки в нём). Кортеж в Python является, по сути, неизменяемым списком.

Читайте также:
Программы посудомоечной машины индезит dsg 0517

Во многих случаях кортежи работают быстрее списков, поэтому если вы не планируете изменять последовательность, то лучше использовать именно их. Неизменяемые объекты (и все объекты в них, если это, например, кортеж) могут быть ключами словаря (должны иметь метод hash) [1].

§ 3. Возможности для объектно-ориентированного программирования Дизайн языка Python построен вокруг объектно-ориентированной модели программирования. Реализация ООП в Python является элегантной, мощной и хорошо продуманной, но вместе с тем достаточно специфической по сравнению с другими объектно-ориентированными языками [1].

§ 4. Стандартная библиотека Богатая стандартная библиотека является одной из привлекательных сторон Python. Здесь имеются средства для работы со многими сетевыми и форматами Интернета, например, модули для написания HTTP -серверов и клиентов, для разбора и создания почтовых сообщений, для работы с XML и т. п. Набор модулей для работы с операционной системой позволяет писать кросс-платформенные приложения.

Существуют модули для работы с регулярными выражениями, текстовыми кодировками, мультимедийными форматами, криптографическими протоколами, архивами, сериализации данных, поддержка юнит-тестирования и др [1]. Практическая часть Разработка программ с использованием управляющих конструкций (ветвление, цикл) на примере сортировки Джона фон Неймана (процедура слияния двух отсортированных массивов) § 1. Словесное описание алгоритма Для более быстрой сортировки массивов в 1945 году Джон фон Нейман предложил алгоритм, основанный на процедуре слияния двух заранее отсортированных массивов. Предположим, что есть два отсортированных массива A и B , размеры которых соответственно Na и Nb и мы хотим объединить их элементы в один отсортированный массив C размером Na + Nb . Для этого будем на каждом шаге сравнивать два первых (ещё не использованных) элемента массивов A и B , добавляя в конец массива C наименьший из них. Так продолжается до тех пор, пока один из массивов не закончиться, тогда оставшийся “хвост” второго массива просто добавляется в конец массива C (он ведь уже отсортирован!). Пример такого слияния показан на рис. 1.

A B C
6 34 67 82 98 44 55 78 6
34 67 82 98 44 55 78 6 34
67 82 98 44 55 78 6 34 44
67 82 98 55 78 6 34 44 55
67 82 98 78 6 34 44 55 67
82 98 78 6 34 44 55 67 78
82 98 6 34 44 55 67 78 82 98

Рис.1. Сортировка слиянием Фоном выделены элементы, которые добавляются в массив C на очередном шаге. Шаги 1-6 – это добавление в массив C наименьшего из первых двух элементов массивов A и B , а шаг 7 – дописывание в конец массива C с “хвоста” массива A (ведь массив B уже добавлен в массив C ) [2]. § 2. Составление программы (скрипта) Рассмотрим два варианта решения данной задачи: 1. Количество элементов одного массива не соответствует количеству элементов второго массива ( N = 5, M = 3); заполнить массивы с клавиатуры; 2. Количество элементов одного массива соответствует количеству элементов второго массива ( N = 8); заполнить массивы случайными числами из отрезка [100, 150] с использованием функции randint , которая импортируется из модуля random . 1. Исходный модуль программы: #Сортировка Джона фон Неймана (процедура слияния) #Количество элементов исходных массивов N и M #Заполнение массивов с клавиатуры print(» Заполнить два целочисленных массива, отсортировать их по возрастанию,») print(«сформировать третий массив с последующей его сортировкой по возрастанию») print() print(«Введите количество элементов для массива A:») N = i nt (i nput ()) print(«Введите количество элементов для массива B:») M = i nt (i nput ()) print(«Заполнение массива(списка) A целыми числами») A = [ int ( input ()) for i in range (N)] print(«Заполнение массива(списка) B целыми числами») B = [ int ( input ()) for i in range (M)] #Сортировка массива A (Метод Подстановки) for i in range (N): for j in range (N-1): if A[i] < A[j]: # условиесортировки A[i], A[j] = A[j], A[i] # поменятьэлементы print ( » Отсортированныймассив A:» ) for i in range (N): print (A[i], «» , end = «» ) # построчныйвыводмассива A print () #Сортировка массива B (Метод Подстановки) for i in range (M): for j in range (M-1): if B[i] < B[j]: #условие сортировки B [ i ], B [ j ] = B [ j ], B [ i ] #поменять элементы print ( » Отсортированныймассив B:» ) for i in range (M): print(B[i], «», end = «») #построчный вывод массива B C = [] #объявить маcсив C i = j = 0 #инициализация параметров циклаprint() #формирование и сортировка массива C слиянием while ((i < N) and (j < M)):if A[i] #условие отбора C.append(A[i]) #запись в конец массива C i += 1 else: C.append(B[j]) #запись в конец массива C j += 1 C = C + A[i:] #добавить в массив C оставшуюся часть A i = 0 #инициализация параметра цикла i print(«Отсортированный массив C:») for i in range (N+M): print(C[i], «», end = «») #построчный вывод массива C print () print («Программа завершена») 2. Исходный модуль программы: #Сортировка Джона фон Неймана #(процедура слияния двух отсортированных массивов) from random import randint print(» Заполнить два целочисленных массива, отсортировать их по возрастанию,») print(«сформироваить третий массив с последующей его сортировкой по возрастанию») print() print(«Введите количество элементов для каждого массива:») N = int(in pu t()) print(«Заполнение массива(списка) A целыми числами») A = [ randint(100, 150) for x in range (N)] print(A) #вывод на экран выбранных элементов массива A print(«Заполнение массива(списка) B целыми числами») B = [ randint(100, 150) for x in range (N)] print(B) #вывод на экран выбранных элементов массива B #Сортировка массива A (Метод Подстановки) for i in range (N): for j in range (N-1): if A[i] < A[j]: # условиесортировки A[i], A[j] = A[j], A[i] # поменятьэлементы print ( » Отсортированныймассив A:» ) for i in range (N): print (A[i], «» , end = «» ) # построчныйвыводмассива A print () #Сортировка массива B (Метод Подстановки) for i in range (N): for j in range (N-1): if B[i] < B[j]: #условие сортировки B[i], B[j] = B[j], B[i] #поменять элементы print ( » Отсортированныймассив B:» ) for i in range (N): print(B[i], «», end = «») #построчный вывод массива B C = [] #объявить маcсив C i = j = 0 #инициализация параметров цикла while print() #формирование и сортировка массива C #слиянием массива A и массива B while ((i < N) and (j < N)):if A[i] #условие отбора C.append(A[i]) #запись в конец массива C i += 1 else: C.append(B[j]) #запись в конец массива C j += 1 C = C + A[i:] #добавить в массив C оставшуюся часть A i = 0 #инициализация параметра цикла i print(«Отсортированный массив C:») for i in range (N*2): print(C[i], «», end = «») #построчный вывод массива C print() print(«Программа завершена») § 3. Подготовка тестовых примеров Тестовый пример №1:

Читайте также:
Программа для проверки планшета на ошибки через компьютер
Количество элементов для массива A 5
Количество элементов для массива B 3
Числовые значения элементов массива A 6 34 67 82 98
Числовые значения элементов массива B 78 44 55
Отсортированный массив A
6 34 67 82 98
Отсортированный массив B
44 55 78
Сформированный и отсортированный массив C
6 34 44 55 67 78 82 98

Тестовый пример №2: Количество элементов каждого из двух массивов равно 8. § 4. Компьютерный эксперимент Войти в программную среду Пайтон, выполнив команды File – New File . В текстовом редакторе набрать исходный модуль программы (§ 2). Запустить программу на выполнение, выполнив команды: Run – Run Module ( F 5).

В появившемся окне сохранить модуль, указав имя программы и место сохранения: Ввести исходные данные и получить результат (§ 3). Выполнение программы по тесту №1: Выполнение программы по тесту № 2: § 5. Анализ выполнения программы Сортировка слиянием использует следующие этапы: Задача разбивается на несколько подзадач меньшего размера.

Эти подзадачи решаются с помощью рекурсивных вызовов того же (или другого) алгоритма. Решения подзадач объединяются, и получается решение исходной задачи. Сортировка слиянием применима для данных с последовательным доступом . Этот алгоритм можно использовать в системах с параллельными процессорами с общей памятью, которые работают одновременно и делят работу между собой.

Главный недостаток состоит в том, что нужен дополнительный массив того же размера, что и исходный (массив C ) [2] . З аключение Язык Python (Пайтон) – это профессиональный язык программирования, который активно используется в таких компаниях, как Яндекс и Google . На нём разрабатываются сайты и веб-сервисы, он применяется для составления небольших программ, расширяющих возможности других программ [2]. Python (Пайтон) – современный развивающийся язык, изучение которого начинается в профильных классах общеобразовательных учреждений на примере использования его основных конструкций, что достаточно наглядно показано в данной работе.

Список использованных источников и литературы Python — Википедия — https://ru.wikipedia.org/wiki/Python Информатика. Базовый и углублённый уровни: учебник для 10 класса, часть 2 / К.Ю. Поляков, Е.А. Еремин. – М.: БИНОМ. Лаборатория знаний, 2019.

Программное обеспечение Операционная система Windows Текстовый процессор MS Word Среда программирования Python – 3.8.0

Просмотров работы: 823

Старт в науке

XI Международный конкурс научно-исследовательских и творческих работ учащихся

Источник: school-science.ru

20 практических заданий с рекурсией в Python. Python практика.

20 практических заданий с рекурсией в Python. Python практика.

В этой статье мы предложим практические задания для самостоятельного решения на Python. Практика написания кода – лучший способ, прокачать свои навыки.

https://t.me/python_job_interview – в нашем канале еще больше полезных практических задач.

# 10 Простых заданий + 10 сложных заданий

Простые задания

1) Факториал

Напишите рекурсивную функцию factorial(n), которая будет принимать положительное целое число n и возвращать факториал от этого числа (1 x 2 x 3 x … x n).

factorial(1) # 1 factorial(2) # 2 factorial(3) # 6 factorial(4) # 24 factorial(5) # 120 factorial(6) # 720 factorial(7) # 5040 factorial(8) # 40320

2) Суммирование

Напишите рекурсивную функцию summation(n), которая будет принимать положительное целое число n и возвращать сумму чисел от 1 до n.

summation(1) # 1 summation(2) # 3 summation(3) # 6 summation(4) # 10 summation(5) # 15 summation(6) # 21 summation(7) # 28 summation(8) # 36

3) Сумма нечётных чисел

Напишите рекурсивную функцию sum_odd(lis), которая будет принимать список из целых чисел и возвращать сумму только нечётных чисел из списка.

sum_odd([1,2,3,4]) # 4 sum_odd([1,2,3,4,5]) # 9 sum_odd([1,2,4,6,8]) # 1 sum_odd([]) # 0 sum_odd([2,4,6,8]) # 0

4) Сумма нечётных чисел и вычитание чётных чисел

Напишите рекурсивную функцию sum_sub(list), которая будет принимать список целых чисел. Эта функция будет суммировать все нечётные числа и вычитать все чётные числа. В конце она будет возвращать получившееся значение.

sum_sub([1,2,3,4]) # -2 sum_sub([1,2,3,4,5]) # 3 sum_sub([1,3,5]) # 9 sum_sub([2,4,6]) # -12 sum_sub([99,10,10]) # 79

5) Слова-палиндромы

Слова-палиндромы — это строки, которые одинаково читаются с обеих сторон. Например: «aba», «abba», «abcba», «aaa», «ababa» и так далее.

Напишите функцию is_palindrome(string), которая будет принимать строку и возвращать «True», если строка является палиндромом, и «False» во всех других случаях.

is_palindrome(‘aba’) # True is_palindrome(‘abba’) # True is_palindrome(‘abcba’) # True is_palindrome(‘abc’) # False is_palindrome(‘abbb’) # False is_palindrome(‘abab’) # False

6) Палиндромы, игнорирующие пробелы

Напишите функцию is_pal(string), которая будет принимать строку и возвращать «True», если строка — палиндром (при этом игнорируя все пробелы), и «False» во всех других случаях.

is_pal(‘aba’) # True is_pal(‘ab a’) # True is_pal(‘ a z a’) # True is_pal(‘ab a b’) # False is_pal(‘a a ba’) # False is_pal(‘a z a a’) # False

7) Удаление гласных букв

Напишите функцию remove_vowels(string), которая будет принимать строку и возвращать только согласные буквы.

remove_vowels(‘apple’) # ppl remove_vowels(‘orange’) # rng remove_vowels(‘pear’) # pr remove_vowels(‘pineapple’) # pnppl remove_vowels(‘durian’) # drn remove_vowels(‘banana’) # bnn

8) Удвоенные буквы

Напишите функцию double(string), которая будет принимать строки и возвращать другую версию строки, в которой все буквы будут удваиваться.

Читайте также:
Программа которая автоматически меняет язык на клавиатуре

double(‘apple’) # aappppllee double(‘orange’) # oorraannggee double(‘pear’) # ppeeaarr double(‘abc’) # aabbcc double(‘zz’) # zzzz

9) Треугольник Паскаля

Треугольник Паскаля выглядит так:

20 практических заданий с рекурсией в Python. Python практика.

Напишите функцию pascal(n), которая будет принимать положительные целые числа n и возвращать n-ую строку треугольника Паскаля.

10) Число Фибоначчи

Напишите рекурсивную функцию fib(n), которая будет принимать положительное целое число n и возвращать n-ое число Фибоначчи.

Числа Фибоначчи — это серия чисел, которая начинается с 0 и 1. Каждое последующее число будет являться суммой двух предыдущих чисел.

fib(1) # 0 fib(2) # 1 fib(3) # 1 fib(4) # 2 fib(5) # 3 fib(6) # 5 fib(7) # 8 fib(8) # 13 fib(9) # 21 fib(10) # 34

Менее выполнимые задания

11) Генерация перестановок

Напишите рекурсивную функцию permutations(list, length), которая будет принимать список с его элементами и целочисленную длину, и возвращать все возможные перестановки относительно длины внутри списка.

permutations([1,2,3], 2) # [(1,2), (1,3), (2,3), (2,1), (3,1), (3,2)] permutations([1,2,3,4], 2) # [(1,2), (1,3), (1,4), (2,1), (2,3), (2,4), # (3,1), (3,2), (3,4), (4,1), (4,2), (4,3)]

Вы не должны пользоваться встроенными функциями, потому что это жульничество.

12) Генерация комбинаций

Напишите рекурсивную функцию combinations(list, length), которая будет принимать список с его элементами и целочисленную длину, и возвращать все возможные комбинации длины внутри списка.

Combinations([1,2,3], 2) # [(1,2), (1,3), (2,3)] permutations([1,2,3,4], 2) # [(1,2), (1,3), (1,4), (2,3), (2,4), (3,4)]

13) Поиск в глубину с использованием рекурсии

У вас есть словарь, который представляет из себя сеть друзей.

Напишите рекурсивную функцию, которая будет принимать id человека и находить всех его друзей, друзей их друзей и так далее.

friends(1) # [1,2,3,4] friends(2) # [1,2,3,4] friends(3) # [1,2,3,4] friends(4) # [1,2,3,4] friends(5) # [5,6,7] friends(6) # [5,6,7] friends(7) # [5,6,7]

14) Проверка наличия выхода в лабиринте

Вам дам список строк, который представляет из себя лабиринт.

maze = [ ‘S—-‘, ‘##—‘, ‘—##’, ‘—-X’ ]

s означает стартовую позицию (откуда игрок начинает);

x означает финиш (цель прохождения лабиринта);

– означает свободный путь, по которому может осуществлять движение игрок;

# означает стену, через которую игрок не может пройти.

Игрок может двигаться только на 1 шаг за один раз;

Игрок может двигаться только в 4 направлениях: вверх, вниз, влево, вправо.

Лабиринт проходим, если игрок может пройти до x из s. Напишите рекурсивную функцию, которая будет принимать лабиринт и возвращать «True», если он проходим, и «False» в любом другом случае.

15) Прохождение лабиринта

Используя точно такой же лабиринт, как и в задании 14, напишите рекурсивную функцию, которая будет возвращать решение лабиринта, позволяющее игроку добраться до финиша.

maze = [ ‘S—-‘, ‘##—‘, ‘—##’, ‘—-X’ ] solve(maze) # [‘right’, ‘right’, ‘down’, ‘down’, ‘down’, ‘right’, ‘right’]

Это не обязательно должно быть короткое решение — любое возможное решение. Если лабиринт невозможно пройти, просто верните [].

16) Поиск VideoID

Вам дан неупорядоченный словарь, содержащий в себе несколько вложенных структур данных. Некоторые из них (независимо от вложенности) содержать ключ VideoID.

data = < «type»: «video», «videoID»: «vid001», «links»: [ , < «type»:»video», «videoID»:»vid003″, «links»: [ , , ] >, , < «type»:»video», «videoID»:»vid007″, «links»: [ ] > ]> ]>, ] >

Напишите рекурсивную функцию, целью которой будет извлечение всех значений с ключом «VideoID».

output = [ , , , , , , , , , ]

17) Конвертирование множеств в списки во вложенной структуре данных

Вам дана неупорядоченная структура данных, которая содержит в себе списки, множества и словари.

d = , [1,2,3], ], ‘b’: [ [1,2,3], < 1: , 2: , 3: > ]>

Вы желаете конвертировать эту структуру данных в строку JSON, но множества не могут быть конвертированы в JSON. Напишите рекурсивную функцию, которая будет конвертировать все множества из этой структуры данных в списки.

output = ], ‘b’: [ [1,2,3], < 1: [1,2,3,4], 2: [1,2,3,4], 3: [1,2,3,4] >]>

18) Наименьшее количество монет

Напишите рекурсивную функцию, которая будет принимать 1) значение 2) список монет и возвращать наименьшее количество монет, которые в сумме составляют значение.

coins(10, [2, 5]) # # 2 $5 coins make up $10 # 5 $2 coins also make up $10 # we chose 2 coins over 5 coins because fewer coins. coins(8, [2, 5]) # # 4 $2 coins make up $8. This is the only solution coins(11, [1,2,3]) # # 3 $3 coins + 1 $2 coin make up $11 coins(11, [2,4]) # <> # no solution

19) Рекурсия os.walk без использования функции os.walk.

Вам дана вложенная папка с вещами.

baseFolder |- folderA |- folderAA |- 1.txt |- folderAB |- folderAC |- 2.txt |- folderB |- folderBA |- 3.txt |- folderBAA |- 4.txt |- 5.txt |- folderBAB |- folderBAC |- 6.txt |- folderBB |- folderC |- 7.txt |- folderCA |- folderCB

Без использования встроенной функции os.walk, напишите рекурсивную функцию, которая будет принимать путь к главной папке и подсчитывать количество подпапок + общее количество файлов.

output =

20) Ханойская башня

Цель этой игры — переместить все кольца из А в С.

1. Вы можете двигать только одно кольцо за раз;

2. Большое кольцо не может находиться выше маленького.

Напишите рекурсивную функцию hanoi(n), которая будет принимать целочисленное число n, являющееся количеством колец, и выводить шаги для перемещения всех колец пирамиды от А до С.

hanoi(1) # A to C hanoi(2) # A to B # A to C # B to C hanoi(3) # A to C # A to B # C to B # A to C # B to A # B to C # A to C

Заключение!

Надеюсь, что это было непросто!

Несколько финальных слов

Если эта статья оказалась полезной для вас, вы могли бы оказать мне поддержку (поставить лайк, поделиться ею с друзьями, )!

Источник: uproger.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru