Практическая работа анализ программ и решение задач 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 является, по сути, неизменяемым списком.

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

Во многих случаях кортежи работают быстрее списков, поэтому если вы не планируете изменять последовательность, то лучше использовать именно их. Неизменяемые объекты (и все объекты в них, если это, например, кортеж) могут быть ключами словаря (должны иметь метод 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), которая будет принимать строки и возвращать другую версию строки, в которой все буквы будут удваиваться.

Читайте также:
Какое число будет выведено на экран после выполнения этого фрагмента программы print 1 end

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