ООП_на_Python_Учебное пособие_var5a. Учебнометодическое пособие по дисциплине Введение в компьютерные технологии Москва Физический факультет мгу имени М. В. Ломоносова 2022
Скачать 59.5 Kb.
|
class Body: def __init__(self, mass, position, velocity): # конструктор self.mass = mass # масса self.position = position # радиус вектор положения в пространстве self.velocity = velocity # вектор скорости def update(self, force, dt): # "Обновление положения и скорости под действием силы force" self.velocity += force * dt / self.mass self.position += self.velocity * dt Функция gravity_force принимает на вход два небесных тела (экземпляра класса Body) и возвращает вектор силы, с которой первое тело притягивает второе. def gravity_force(A, B): r_AB = B.position - A.position return - G*A.mass*B.mass*r_AB / (r_AB.norm() ** 3) 41 Класс ThreeBodyProblem инкапслурует в себе три небесных тела, которых принимает в конструкторе. Метод do_step вычисляет силы, действующие на каждое из тел, методом compute_forces и обновляет положения и скорости этих тел. Метод compute_trajectories вычисляет и возвращает траектории движения всех трех тел на интервале времени ??0, ??????. class ThreeBodyProblem: def __init__(self, body1, body2, body3): self.body1 = body1 self.body2 = body2 self.body3 = body3 def compute_forces(self): # вычисление сил попарного взаимодействия F_12 = gravity_force(self.body1, self.body2) F_13 = gravity_force(self.body1, self.body3) F_23 = gravity_force(self.body2, self.body3) # противоположные силы F_21, F_31, F_32 = -F_12, -F_13, -F_23 # возвращаем кортеж результирующих сил return F_21 + F_31, F_32 + F_12, F_13 + F_23 def do_step(self, dt): # сделать шаг по времени F_1, F_2, F_3 = self.compute_forces() # рассчет силы self.body1.update(F_1, dt) self.body2.update(F_2, dt) self.body3.update(F_3, dt) def get_positions(self): return [self.body1.position, self.body2.position, self.body3.position] def compute_trajectories(self, dt, t_final): t = 0 # инициализации времени trajectories = [self.get_positions()] # начальные положений while t < t_final: self.do_step(dt) # шаг по времени trajectories.append(self.get_positions()) # обновленные положения t += dt # приращение времени return trajectories 42 21. Задания для самостоятельного решения (1) Класс Vector3D Экземляр класса задается тройкой координат в трехмерном пространстве (x,y,z). Обязательно должны быть реализованы методы: – приведение вектора к строке с выводом кооржинат (метод __str __), – сложение векторов оператором `+` (метод __add__), – вычитание векторов оператором `-` (метод __sub__), – скалярное произведение оператором `*` (метод __mul__), – умножение и деление на скаляр операторами `*` и `/` (метод __mul__ и __truediv__), – векторное произведение оператором `@` (метод __matmul__), – вычисление длинны вектора методом `norm`. Пример v1 = Vector3D(4, 1, 2) print(v1) v2 = Vector3D() v2.read() v3 = Vector3D(1, 2, 3) v4 = v1 + v2 print(v4) a = v4 * v3 print(a) v4 = v1 * 10 print(v4) v4 = v1 @ v3 print(v4) (2) Класс «Прямоугольный треугольник» Класс содержит два действительных числа – стороны треугольника. и включает следующие методы: − увеличение/уменьшение размера стороны на заданное количество процентов; − вычисление радиуса описанной окружности, − вычисление периметра, − определение значений углов. (3) Класс «Одномерный масив» TArray Класс содержит поле для задания количества элементов и поле для хранения элементов массива. Методы: – конструктор без параметров, конструктор с параметрами ,конструктор копирования, – ввод и вывод даных, – поиск максимального и минимального элементов, – сортировка массива, – поиск суммы элементов – перегрузка оператора + (добавление элемента) – перегрузка оператора * умножение элементов массива на число (4) Класс «Автобус». Класс содержит свойства: – speed (скорость), –capacity (максимальное количество пассажиров), – maxSpeed (максимальная скорость), – passengers (список имен пассажиров), – hasEmptySeats (наличие свободных мест), 43 – seats (словарь мест в автобусе); методы: – посадка и высадка одного или нескольких пассажиров, – увеличение и уменьшение скорости на заданное значение. – операции "in", "+=" и "−=" (посадка и высадка пассажира(ов) с заданной фамилией) (5) Класс «Снежинки» Snow Класс содержит целое число - количество снежинок. Класс включает методы перегрузки арифметических операторов сложения, вычитания, умножения и деления. Код этих методов должен выполнять увеличение или уменьшение количества снежинок на число n или в n раз. Класс также включает метод makeSnow(), который принимает сам объект и число снежинок в ряду, а возвращает строку вида "*****\n*****\n*****…", где количество снежинок между '\n' равно переданному аргументу, а количество рядов вычисляется, исходя из общего количества снежинок. (6) Класс «Снежинка» (SnowFlake) При инициализации класс принимает целое нечетное число – сторону квадрата, в который вписана снежинка. Методы: – thaw() – таять, при этом на каждом шаге пропадают крайние звездочки со всех сторон; параметр показывает, сколько шагов прошло. – freeze(n) – намораживаться, при этом сторона квадрата, в который вписана снежинка, увеличивается на 2 * n, одновременно добавляются звездочки в нужных местах, чтобы правило соблюдалось. – thicken() – утолщаться, ко всем линиям звездочек с двух сторон добавляются параллельные (если перед этим снежинка таяла, то теперь звездочки восстанавливаются). – show() – показывать (рисуется снежинка в виде квадратной матрицы со звездочками и дефисами в пустых местах). (7) Класс «Robot» Класс инициализируется начальными координатами – положением Робота на плоскости, обе координаты заключены в пределах от 0 до 100. Робот может передвигаться на одну клетку вверх (N), вниз (S), вправо (E), влево (W). Выйти за границы плоскости Робот не может. Метод move() принимает строку – последовательность команд перемещения робота, каждая буква строки соответствует перемещению на единичный интервал в направлении, указанном буквой. Метод возвращает список координат – конечное положение Робота после перемещения. Метод path() вызывается без аргументов и возвращает список координат точек, по которым перемещался Робот при последнем вызове метода move. Если метод не вызывался, возвращает список с начальным положением Робота. (8) Класс «Темы» (Themes) Экземпляру класса при инициализации передается аргумент – список тем для разговора. Класс реализует методы: – add_theme(value) – добавить тему в конец; – shift_one() – сдвинуть темы на одну вправо (последняя становится первой, остальные сдвигаются); – reverse_order() – поменять порядок тем на обратный; 44 – get_themes() – возвращает список тем; – get_first() – возвращает первую тему. Пример 1 Ввод: tl = Themes(['weather', 'rain']) tl.add_theme('warm') print(tl.get_themes()) tl.shift_one() print(tl.get_first()) Вывод: ('weather', 'rain', 'warm') warm Пример 2 Ввод: tl = Themes(['sun', 'feeding']) tl.add_theme('cool') tl.shift_one() print(tl.get_first()) tl.reverse_order() print(tl.get_themes()) Вывод: cool ('feeding', 'sun', 'cool') (9) Класс «ПчёлоСлон» (BeeElephant) Экземпляр класса инициализируется двумя целыми числами: первое относится к пчеле, второе – к слону. Класс реализует следующие методы: – fly() – может летать – возвращает True, если часть пчелы не меньше части слона, иначе False; – trumpet() – трубить – если часть слона не меньше части пчелы, возвращает строку: “tu-tu-doo-doo!”, иначе “wzzzzz”. – eat(meal, value) – есть – может есть только нектар (nectar) или траву (grass). Если съедает нектар, то из части слона вычитается количество съеденного, пчеле добавляется, иначе наоборот: у пчелы вычитается, а слону добавляется. Не может увеличиться выше 100 и уменьшиться меньше 0; – get_parts() – возвращает список из значений: [часть пчелы, часть слона]. Пример 1 Ввод: be = BeeElephant(3, 2) print(be.fly()) print(be.trumpet()) be.eat('grass', 4) print(be.get_parts()) Вывод: True wzzzzz (0, 6) Пример 2 Ввод: be = BeeElephant(13, 87) print(be.fly()) print(be.trumpet()) be.eat('nectar', 90) print(be.trumpet()) print(be.get_parts()) Вывод: 45 False tu-tu-doo-doo! wzzzzz (100, 0) (10) Класс «Разговор» (Talking) Экземпляр класса инициализируется с аргументом name – именем котенка. Класс реализует методы: – to_answer() – ответить: котенок через один раз отвечает да или нет, начинает с да. Метод возвращает “moore-moore”, если да, “meow-meow”, если нет. Одновременно увеличивается количество соответствующих ответов; – number_yes() – количество ответов да; – number_no() – количество ответов нет. Пример 1 Ввод: tk = Talking('Pussy') print(tk.to_answer()) print(tk.to_answer()) print(tk.to_answer()) print(f'{tk.name} says "yes" {tk.number_yes()} times, "no" {tk.number_no()} times') Вывод: moore-moore meow-meow moore-moore Pussy says "yes" 2 times, "no" 1 times Пример 2 Ввод: tk = Talking('Pussy') tk1 = Talking('Barsik') print(tk.to_answer()) print(tk1.to_answer()) print(tk1.to_answer()) print(tk1.to_answer()) print(f'{tk.name} says "yes" {tk.number_yes()} times, "no" {tk.number_no()} times') print(f'{tk1.name} says "yes" {tk1.number_yes()} times, "no" {tk1.number_no()} times') Вывод: moore-moore moore-moore meow-meow moore-moore Pussy says "yes" 1 times, "no" 0 times Barsik says "yes" 2 times, "no" 1 times (11) Класс «Воздушный Замок» (AirCastle) Экземпляр класса инициализируется с аргументами: – высота; – количество составляющих облаков; – цвет. Класс должен реализовывать методы: – change_height(value) – изменить высоту на value, может уменьшаться только до нуля; – сложить с числом, добавляется n облаков к замку, одновременно увеличивается высоту на n // 5; – экземпляр класса можно вызвать с аргументом – целым числом, означающим 46 прозрачность облаков; метод возвращает значение видимости замка, рассчитанное по формуле: высота // прозрачность * количество облаков; __str__ – возвращает строковое представление в виде: “The AirCastle at an altitude of <высота> meters is <цвет> with <количество облаков> clouds”. – экземпляры можно сравнивать: сначала по количеству облаков, затем по высоте, затем по цвету по алфавиту; для этого нужно реализовать методы сравнения: >, <, >=, <=, ==, !=. (12) Класс Добрый Ифрит (GoodIfrit) Экземпляр класса инициализируется с аргументами: высота, имя, доброта. Класс должен реализовывать функциональность – change_goodness(value) – менять доброту на указанную величину; не может стать отрицательной, в этом случае становится равной 0; – к экземпляру класса можно прибавить число: (gi1 = gi + number), создается новый экземпляр с высотой, большей на величину number, остальные характеристики те же; – экземпляр класса можно вызвать с аргументом, возвращается значение: аргумент * доброта // высота __str__() – возвращает строку вида: “Good Ifrit <имя>, height <высота>, goodness <доброта>” – экземпляры можно сравнивать между собой: сначала по доброте, затем по высоте, затем по имени по алфавиту; для этого нужно реализовать методы сравнения: <, >, <=, >=, ==, !=. Ввод: gi = GoodIfrit(80, "Hazrul", 3) gi.change_goodness(4) print(gi) gi1 = gi + 15 print(gi1) print(gi(31)) Вывод: Good Ifrit Hazrul, height 80, goodness 7 Good Ifrit Hazrul, height 95, goodness 7 2 Ввод: gi = GoodIfrit(80, "Hazrul", 3) gi1 = GoodIfrit(80, "Dalziel", 1) print(gi < gi1) gi1.change_goodness(2) print(gi > gi1) print(gi, gi1, sep='\n') Вывод: False True Good Ifrit Hazrul, height 80, goodness 3 Good Ifrit Dalziel, height 80, goodness 3 (13) Класс «Волшебник» (Wizard) Экземпляр класса при инициализации принимает аргументы: – имя; – рейтинг; – на какой возраст выглядит. Класс должен обеспечивать функциональность: – change_rating(value) – изменять рейтинг на значение value; не может стать больше 100 и меньше 1, изменяется только до достижения экстремального значения; при увеличении 47 рейтинга уменьшается возраст на abs(value) // 10, но только до 18, дальше не уменьшается; при уменьшении рейтинга возраст соответственно увеличивается; – к экземпляру класса можно прибавить строку: (wd += string), значение рейтинга увеличивается на ее длину, а возраст, соответственно, уменьшается на длину // 10, условия изменения такие же; – экземпляр класса можно вызвать с аргументом-числом; возвращает значение: (аргумент - возраст) * рейтинг; __str__() – возвращает строку: “Wizard имени по алфавиту; для этого нужно реализовать методы сравнения: <, >, <=, >=, ==, !=. (14) Класс «Сотрудник компании» Worker Экземпляр класса при инициализации принимает аргументы: имя, должность и стаж работы сотрудника, метод print_info() выводит информацию о сотруднике в формате: «Имя: Василий Должность: Системный администратор Стаж: 3 года» При выводе стажа нужно учитывать, что «года» должно заменяться на «лет» или «год» в зависимости от числа. worker1 = Worker("Алексей", "Программист", 17) worker1.print_info() print() worker2 = Worker("Анна", "Маркетолог", 2) worker2.print_info() print() worker3 = Worker("Дмитрий", "Аналитик", 1) worker3.print_info() print() (15) Класс Post Класс описывает публикацию от пользователя в сети: – никнейм пользователя, – время публикации, – количество лайков, – текст сообщения, – список комментариев. Конструктор класса получает автора, устанавливает время, зануляет количество ругательств, а для комментариев создает списочный массив. Добавить метод, позволяющий поставить лайк сообщению. (16) Классы «Товар» и «Склад» Класс «Товар»содержит следующие закрытые поля: – название товара, – название магазина в котором продается товар – стоимость товара в рублях Класс «Склад» содержит закрытый массив товаров. Обеспечить следующие возможности: – вывод информации о товаре по номеру с помощью индекса – вывод информации о товаре, название которого введено с клавиатуры – сортировку товаров по названию магазина, по наименованию и цене; – перегруженную операцию сложения товаров, выполняющую сложение их цен. 48 (17) Классы «Клиент»(Client) и «Банк» (Bank) Класс «Клиент» содержит поля: код клиента, ФИО, дата открытия вклада, размер вклада, процент по вкладу. Класс «Банк» (class Bank) содержит поле clientBase представляющем собой список клиентов и методами: – addClient(client) — принимает обьект клиента и помещает его в base. – showByMoney(money) — принимает количество денег и выводит информацию о всех клиентах у которых размер вклада больше – showByCode(cod) — принимает код и выводит всю информацию клиенте с данным кодом. – showByProc(proc) — принимает процент и выводит информацию о всех клиентах у которых процент по вкладу больше данного. (18) Класс «Автомобиль» и дочерний класс «Автобус» Экземпляр класса имеет координаты своего положения и угол, описывающий направление движения. Он может быть изначально поставлен в любую точку с любым направлением (конструктор), может проехать в выбранном направлении определённое расстояние и может повернуть, то есть изменить текущее направление на любое другое Реализуйте класс автомобиля, а также класс, который будет описывать автобус. Кроме того, что имеется у автомобиля, у автобуса должны быть поля, содержащие число пассажиров и количество полученных денег, изначально равные нулю. Также должны быть методы «войти» и «выйти», изменяющие число пассажиров. Наконец, метод move должен быть переопределён, чтобы увеличивать количество денег в соответствии с количеством пассажиров и пройденным расстоянием. (19) Классы «ПЕРСОНА», «АБИТУРИЕНТ», «СТУДЕНТ», «ПРЕПОДАВАТЕЛЬ» Класс ПЕРСОНА, экземпляр класса инициализируется аргументами фамилия, дата рождения и содержит методы, позволяющие вывести информацию о персоне, а также определить ее возраст. Дочерние классы: АБИТУРИЕНТ (фамилия, дата рождения, факультет), СТУДЕНТ(фамилия, дата рождения, факультет, курс), ПРЕПОДАВАТЕЛЬ (фамилия, дата рождения, факультет, должность, стаж), содержат свои методы вывода информации. Создайте список из n персон, выведите полную информацию из базы, а также организуйте поиск персон, чей возраст попадает в заданный диапазон. 49 22. Литература • Бизли Д., Python, подробный справочник, 4-е издание, 2010. • Марк Лутц, Изучаем Python, Т. 1, 5-е издание, 2019. • Марк Лутц, Изучаем Python, Т. 2, 5-е издание, 2020. • Марк Лутц, Программирование на Python, 4-е издание, I том, 2011. • Марк Саммерфилд, Программирование на Python 3. Подробное руководство, 2009. • Майкл Доусон. Программируем на Python. 3-е издание, 2014. • Swaroop Chitlur, A Byte of Python, 2020. • Сайты: • http://python.org/ Официальный сайт • http://python.ru/ • http://python.su/ • http://programarcadegames.com Доходчиво описан язык на основе аркадных игр. • http://younglinux.info/ Основы программирования на Python. Курс по информатике, ООП, tkinter, алгоритмы, решение задач. • http://pythonworld.ru/karta-sajta Язык программирования Python 3 для начинающих и чайников. • http://aliev.me/runestone/ Решение проблем c использованием алгоритмов и структур данных • https://www.programiz.com/python-programming очень полезный ресурс для начинающих, все очень разжевано и с примерами, но на английском языке. • https://www.youtube.com/channel/UCMcC_43zGHttf9bY-xJOTwA хороший YouTube канал для начинающих изучать Python. • Онлайн IDE/VM • http://runnable.com/new/Python • https://koding.com/IDE • https://c9.io/ • Ресурсы о популярных дополнениях IPython - улучшенная интерактивная оболочка • Домашняя страница: http://ipython.org/ • Быстрый старт - Introducing IPython • Распечатай и положи на рабочий стол - IPython Quick Reference • Полная официальная документация matplotlib - построение графиков в различных форматах в стиле, навеянном MATLAB • Домашняя страница: http://matplotlib.org/ • Официальная документация • Огромный каталог примеров • Глава в книге The Architecture of Open Source Applications от создателей matplotlib numpy - библиотека для научных расчётов • Домашняя страница: http://www.numpy.org/ • Пособие для начинающих • Полная официальная документация https://docs.python.org/3/py-modindex.html - перечень модулей с описанием функций. |