Классы: введение в объектно-ориентированное программирование

Упражнения

Класс “Точка” (Point)

Создайте класс Point, определите для него конструктор, метод __str__, необходимые арифметические операции. У класса Point два поля: x и y.

A: Самая дальняя точка

Программа получает на вход число N, далее координаты N точек. Выведите координаты точки, наиболее удаленной от начала координат.

Реализация класса должна содержать конструктор, метод __str__ для вывода точки, метод dist, который возвращает расстояние от начала координат до точки.

Ввод Вывод
2
1 2
2 3
2 3

B: Центр масс

Выведите координаты центра масс данного множества точек (учтите, что это —два действительных числа).

Для создания точки определите конструктор, который мог бы принимать на вход как два числа, так и строку. Таким образом, точку можно будет создавать как вызовом Point(x, y), так и Point(input()).

Определите операции сложения точек, умножения точки на число, деления точки на число.

Ввод Вывод
2
1 2
2 3
1.5 2.5

C: Диаметр множества

Выведите диаметр данного множества – максимальное расстояние между двумя данными точками.

Для этого удобно определить операцию разности двух точек, возвращающую разность двух радиус-векторов, затем вызывать метод, вычисляющий длину данного радиус-вектора.

Ввод Вывод
3
1 1
1 0
0 0
1.4142135623731

D: Сортировка

Определите для точек операцию сравнения __lt__, сравнивающую точки по значению расстояния от начала координат. Отсортируйте данные точки в порядке возрастания расстояния от начала координат. Точки с одинаковым расстоянием должны идти в том порядке, в котором они были даны.

Ввод Вывод
3
1 0
-1 -1
0 0
0 0
1 0
-1 -1

E: Максимальный периметр

Среди данных точек найдите три точки, образующие треугольник с наибольшим периметром. Выведите данный периметр.

Для нахождения периметра треугольника напишите отдельную функцию Perimeter(A, B, C).

Ввод Вывод
4
0 0
0 1
1 0
1 1
3.41421356237309

F: Максимальная площадь

Среди данных точек найдите три точки, образующие треугольник с наибольшей площадью. Выведите данную площадь.

Для нахождения площади треугольника напишите отдельную функцию Area(A, B, C).

Ввод Вывод
4
0 0
0 1
1 0
1 1
0.5

Класс “Дробь” (Fraction)

Класс Fraction должен иметь два поля: числитель a и знаменатель b. Оба поля должны быть типа int.

Для класса Fraction определите конструктор, который может принимать следующие виды параметров:

У каждой дроби существует единственное каноническое представление. Каноническое представление: это такое представление \(\frac{a}{b}\), что \(b>0\), \( (a, b) = 1\). Класс должен иметь метод reduce, который приводит дробь к каноническому представлению. После каждой операции с дробями (в том числе и в конструкторе) необходимо вызывать метод reduce для сокращения дроби.

Необходимо определить метод __str__, который выводит a/b в каноническом представлении, если же дробь является целым числом, то просто значение этого числа.

G: Сократите дробь

Каждая строка входного файла содержит либо два числа, записанных через пробел или дробную черту, либо одно число. Необходимо считать это число в строку и вызвать конструктор для считанной строки, получив объект класса Fraction. После этого нужно вывести данный объект функцией print

Ввод Вывод
1 2
30/-9
8/4
3
1/2
-10/3
2
3

H: Конструкторы

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

В этой и следующих задачах на проверку нужно сдать только реализацию класса Fraction.

Ввод Вывод
a = Fraction()
b = Fraction(1)
c = Fraction(1, 3)
d = Fraction('14 35')
e = Fraction('-6/2')
f = Fraction(e)
print(a, b, c, d, e, f, sep='\n')
0
1
1/3
2/5
-3
-3

I: Сравнения

Определите методы __lt__, __le__, __gt__, __ge__, __eq__, __ne__. В качестве параметра other может выступать объект одного из трех типов: int, float, Fraction.

Тестирование проводится, как в предыдущей задаче.

J: Умножение

Определите методы умножения __mul__, __rmul__, __imul__ так, чтобы можно было:

Методы типа __imul__, то есть переопределяющие операторы присваивания (*=) должны возвращать self.

K: Деление

Определите методы деления __truediv__, __rtruediv__, __itruediv__.

L: Возведение в степень

Определите операции возведения в степень __pow__, __rpow__ так, чтобы можно было возводить дроби в степень типа int, float, Fraction, числа типа int и float в степень Fraction. Операция возведения Fraction ** int возвращает Fraction, во всех остальных случаях возвращается float.

Определите операцию __ipow__ для возведения дроби в целочисленную степень.

M: Сложение

Определите операции __add__, __iadd__, __radd__.

N: Вычитание

Определите операции __sub__, __isub__, __rsub__.

O: Знаки

Определите операции __pos__, __neg__, __abs__.

P: Преобразование типов

Определите операции __int__ (должна округлять вниз до ближайшего целого), __float__, __round__ (должна возвращать значение типа float, можно использовать функцию round для величины типа float).

Q: Ближайшая аликвотная дробь

По данной дроби, не превосходящей 1, найдите максимальную дробь с числителем, равным 1, не превосходящей данную.

На вход программе подаётся строка вида A/B, где A и B — натуральные числа, десятичная запись которых содержит не более 100 знаков.

Требуется вывести дробь вида 1/С, где \(\frac{1}{C}\) — максимальная дробь с числителем, равным 1, такая что \(\frac{1}{C}\leqslant\frac{A}{B}\).

Ввод Вывод
2/5
1/3
1/4
1/4
23/101
1/5
45/46
1/2

R: Египетские дроби

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

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

На вход программе подаётся строка в формате, описанном в предыдущей задаче. <з>Программа должна вывести выражение — сумму различных аликвотных дробей или одну дробь, если заданная дробь является аликвотной. Значение выведенного выражения должна быть равно данной дроби.

Ввод Вывод
2/5
1/3+1/15
3/7
1/3+1/11+1/231
1/13
1/13
5/121
1/25+1/757+1/763309+1/873960180913+1/1527612795642093418846225