С++
Создайте класс Point
реализующий идею точки на плоскости. Внутренняя реализация класса на ваше усмотрение.
В качестве обязательных членов должны присутствовать:
Конструкторы:
a1
и a2
типа double
и coord_system
типа перечисление состоящее из двух значений: Cartesian
и Polar
. Если третий параметр задан как Cartesian
, то параметры a1
и a2
являются координатами x
и y
декартовой системы координат, если третий параметр задан как Polar
, то a1
и a2
это r
и полярной системы координат соответственно ( везде задаётся в радианах). Параметр coord_system
имеет значение по умолчанию Cartesian
, а a1
и a2
по умолчанию нули.Деструктор. Т.к. класс динамически нечего не создаёт деструктор можно не объявлять.
Операторы ==
и !=
. Сравнивает два объекта класса Point
на равенство/не равенство, при этом не играет роли в какой системе координат задавались координаты точки при создании. Если отклонение по каждой координате не превышает 10-10, то считается что это одна и та же точка.
Оператор <<
. Выводит координаты точки в поток в виде строки в формате: "(X,Y)", где X и Y заменяются на значение координат точки x
и y
в декартовой системе координат.
Оператор >>
. Считывает координаты точки из потока в виде строки в формате: "(X,Y)", где X и Y координаты точки x
и y
в декартовой системе координат.
Методы get_x
и get_y
возвращающие координаты точки в декартовой системе координат;
Методы get_r
и get_phi
возвращающие координаты точки в полярной системе координат;
Методы set_x
и set_y
устанавливающие новое значение соответствующей координаты точки в декартовой системе координат;
Методы set_r
и set_phi
устанавливающие новое значение соответствующей координаты точки в полярной системе координат;
Используйте код представленный ниже и этот файл для проверки правильности реализации класса и операторов. Класс можно описать тут же или подключить как отдельный файл (он пригодится в следующем задании).
const auto PI = 3.141592653589793;
class Point;
// Ваш код здесь
int main() {
std::vector<Point> original;
std::ifstream fin("data.txt");
if (!fin.is_open()) {
std::cout << "Can't open file" << std::endl;
return 1;
} else {
while (!fin.eof()) {
Point p;
fin >> p;
fin.ignore(2); // Точки разделены двумя символами ", "
original.push_back(p);
}
fin.close();
}
std::vector<Point> simulacrum(original);
for (auto& p : simulacrum) {
std::cout << p;
p.set_x(p.get_x() + 10);
p.set_phi(p.get_phi() + 180*PI/180);
p.set_y(-p.get_y());
p.set_x(-p.get_x() - 10);
std::cout << p << std::endl;
}
if (std::equal(original.begin(), original.end(), simulacrum.begin()))
std::cout << "\nIt works!\n";
else
std::cout << "\nIt not works!\n";
}
Python
По аналогии с заданием для С++ реализуйте класс Point
.
В качестве обязательных членов должны присутствовать:
Метод __init__
. Кроме self
должен принимать ещё три параметра: a1
и a2
и coord_system
:
a1
- это строка, то остальные аргументы игнорируются, а сама строка парсится исходя из того, что она в формате: "(X,Y)", где X и Y вещественные координаты точки x
и y
в декартовой системе координат.a1
- это число, то смотрим на аргумент coord_system
. Он может принимать да значения: Cartesian
и Polar
. Если он задан как Cartesian
, то аргументы a1
и a2
являются координатами x
и y
декартовой системы координат, если coord_system
задан как Polar
, то a1
и a2
это r
и полярной системы координат соответственно ( везде задаётся в радианах). По умолчаниюcoord_system
задан как Cartesian
, а a1
и a2
по умолчанию нули.Финализатор. Можно не объявлять.
Операторы ==
(метод __eq__
) и !=
(метод __ne__
). Сравнивает два объекта класса Point
на равенство/не равенство, при этом не играет роли в какой системе координат задавались координаты точки при создании. Если отклонение по каждой координате не превышает 10-10, то считается что это одна и та же точка.
Методы __repr__
и __str__
. Преобразуют объект класса Point
в строку в формате: "(X,Y)", где X и Y заменяются на значение координат точки x
и y
в декартовой системе координат.
Методы get_x
и get_y
возвращающие координаты точки в декартовой системе координат;
Методы get_r
и get_phi
возвращающие координаты точки в полярной системе координат;
Методы set_x
и set_y
устанавливающие новое значение соответствующей координаты точки в декартовой системе координат;
Методы set_r
и set_phi
устанавливающие новое значение соответствующей координаты точки в полярной системе координат;
Используйте код представленный ниже и этот файл для проверки правильности реализации класса и операторов. Класс можно описать тут же или подключить как отдельный файл (он пригодится в следующем задании).
xxxxxxxxxx
import math
import copy
class Point:
pass # Ваш код здесь
with open('data.txt') as fin:
original = [Point(p) for p in fin.readline().split(', ')]
simulacrum = copy.deepcopy(original)
for p in simulacrum:
print(p, end='')
p.set_x(p.get_x() + 10)
p.set_phi(p.get_phi() + 180*math.pi/180)
p.set_y(-p.get_y())
p.set_x(-p.get_x() - 10)
print(p)
print('\nIt works!\n' if simulacrum == original else '\nIt not works!\n')
Формат ввода
Файл с данными в формате: набор Точек разделённые двумя символами: запятая и пробел. Каждая точка задана в ПДСК в формате: открывающая круглая скобка, координата X, запятая, координата Y, закрывающая круглая скобка. Точки образуют фигуру.
Формат вывода
Вывод должен заканчиваться на "It works!", что свидетельствует о том, что класс написан правильно. Если вывод заканчивается на "It not works!", значите в классе есть ошибки.
С++
Создайте класс Vector
реализующий идею вектора на плоскости. Внутренняя реализация класса на ваше усмотрение.
В качестве обязательных членов должны присутствовать:
Конструкторы (НЕ совмещать):
end
- это объект класса Point
(задание 36). Конструктор создаёт вектор направленный из начала координат в точку end
.begin
и end
- это объекты класса Point
. Конструктор создаёт вектор направленный из begin
в end
.Деструктор. Т.к. класс динамически нечего не создаёт можно не объявлять свой деструктор.
Оператор ==
. Сравнивает два объекта класса Vector
на равенство. Точность сравнения 10-10.
Оператор унарный -
. Возвращает новый вектор направление которого противоположно направлению вектора к которому применяется оператор.
Оператор бинарный +
. Левый и правый операнды класса Vector
. Возвращает новый вектор являющийся покомпонентной суммой левого и правого операндов.
Оператор бинарный -
. Левый и правый операнды класса Vector
. Возвращает новый вектор являющийся покомпонентной разностью левого и правого операндов.
Оператор бинарный *
. Левый операнд класса Vector
, правый типа double
. Возвращает новый вектор компоненты которого умножены на правый операнд.
Метод length
. Метод не принимает параметров и возвращает длину вектора;
Оператор бинарный *
. Левый и правый операнды класса Vector
. Возвращает вещественное число вычисляющееся как скалярное произведение векторов-операндов.
Используйте код представленный ниже для проверки правильности реализации класса. Рекомендуется закомментировать все тесты и "открывать" их по одному, по мере выполнения задания.
xxxxxxxxxx
using namespace std;
double sqr(double a);
bool equal(double a, double b, double e = 1E-10);
class Point;
// Класс Point из задания 36
class Vector;
// Ваш код здесь
int main()
{
Vector a(Point(1, 2)), b(Point(-2, 0), Point(-1, 2));
if (a == b && b == a) cout << "Equality test passed\n";
else cout << "Equality test failed\n";
Vector na(Point(-1, -2)), ox(Point(1, 0)), nox(Point(-1, 0)), oy(Point(0, 1)), noy(Point(0, -1));
if (a == -na && na == -a && -ox == nox && -oy == noy) cout << "Invert test passed\n";
else cout << "Invert test failed\n";
if (ox + oy + oy == a && -ox == -a + oy + oy) cout << "Summation test passed\n";
else cout << "Summation test failed\n";
if (-ox + oy == oy - ox && -oy + ox == ox - oy) cout << "Subtraction test passed\n";
else cout << "Subtraction test failed\n";
if (ox * 3 == ox + ox + ox &&
oy * 3 == oy + oy + oy &&
ox * (-3) == -ox - ox - ox &&
oy * (-3) == -oy - oy - oy) cout << "Multiplication by number test passed\n";
else cout << "Multiplication by number test failed\n";
if (equal(ox.length(), 1) &&
equal(oy.length(), 1) &&
equal((ox * 3 + oy * 4).length(), 5)) cout << "Length test passed\n";
else cout << "Length test failed\n";
if (equal(ox*ox, sqr(ox.length())) &&
equal(oy*oy, sqr(oy.length())) &&
equal((ox*3 + oy*4)*(ox*3 + oy*4), sqr((ox*3 + oy*4).length()))) cout << "Multiplication by Vector test passed\n";
else cout << "Multiplication by Vector test failed\n";
}
bool equal(double a, double b, double e) {
if (-e < a - b && a - b < e) return true;
else return false;
}
double sqr(double a) {
return a * a;
}
Python
По аналогии с заданием для С++ реализуйте класс Vector
.
В качестве обязательных членов должны присутствовать:
Метод __init__
. Кроме self
должен принимать ещё два параметра: begin
и end
- экземпляры класса Point
из задания 36:
begin
и end
, то создаётся вектор направленный из begin
в end
.Финализатор. Можно не объявлять.
Метод __eq__
(оператор ==
). Сравнивает два объекта класса Vector
на равенство. Точность сравнения 10-10.
Метод __neg__
(унарный -
). Возвращает новый вектор направление которого противоположно направлению вектора к которому применяется оператор.
Метод __add__
(бинарный +
). Левый и правый операнды класса Vector
. Возвращает новый вектор являющийся покомпонентной суммой левого и правого операндов.
Метод __sub__
(бинарный -
). Левый и правый операнды класса Vector
. Возвращает новый вектор являющийся покомпонентной разностью левого и правого операндов.
Метод __mul__
(бинарный *
). Левый операнд класса Vector
, правый типа double
. Возвращает новый вектор компоненты которого умножены на правый операнд.
Метод length
. Метод не принимает параметров и возвращает длину вектора;
Метод __mul__
(бинарный *
). Левый и правый операнды класса Vector
. Возвращает вещественное число вычисляющееся как скалярное произведение векторов-операндов.
Используйте код представленный ниже для проверки правильности реализации класса. Рекомендуется закомментировать все тесты и "открывать" их по одному, по мере выполнения задания.
xxxxxxxxxx
import math
def equal(a, b, e=1E-10):
if -e < a - b < e: return True
else: return False
class Point:
pass # Класс Point из задания 36
class Vector:
pass # Ваш код здесь
a = Vector(Point(1, 2))
b = Vector(Point(-2, 0), Point(-1, 2))
if a == b and b == a: print('Equality test passed')
else: print('Equality test failed')
na = Vector(Point(-1, -2))
ox = Vector(Point( 1, 0))
nox = Vector(Point(-1, 0))
oy = Vector(Point( 0, 1))
noy = Vector(Point( 0, -1))
if a == -na and na == -a and -ox == nox and -oy == noy: print('Invert test passed')
else: print('Invert test failed')
if ox + oy + oy == a and -ox == -a + oy + oy: print('Summation test passed')
else: print('Summation test failed')
if -ox + oy == oy - ox and -oy + ox == ox - oy: print('Subtraction test passed')
else: print('Subtraction test failed')
if (ox * 3 == ox + ox + ox and
oy * 3 == oy + oy + oy and
ox * (-3) == -ox - ox - ox and
oy * (-3) == -oy - oy - oy): print('Multiplication by number test passed')
else: print('Multiplication by number test failed')
if (equal(ox.length(), 1) and
equal(oy.length(), 1) and
equal((ox * 3 + oy * 4).length(), 5)): print('Length test passed')
else: print('Length test failed')
if (equal(ox*ox, ox.length()**2) and
equal(oy*oy, oy.length()**2) and
equal((ox*3 + oy*4)*(ox*3 + oy*4), (ox*3 + oy*4).length()**2)): print('Multiplication by Vector test passed')
else: print('Multiplication by Vector test failed')
Формат ввода
Ввода нет.
Формат вывода
Все тесты должны быть пройдены (passed
). Если хотя бы один тест не пройден (failed
), то класс реализован не правильно.
С++
Создайте класс Rational
реализующий идею рационального числа. Внутренняя реализация класса на ваше усмотрение.
В качестве обязательных членов должны присутствовать:
Конструкторы:
int
. Конструктор принимает параметр a
и b
и создаёт рациональное число инициализированное . Деструктор. По необходимости.
Статический член класса gcd
принимающий два целых числа и возвращающий наибольший общий делитель.
Оператор ==
. Сравнивает два объекта класса Rational
на равенство.
Оператор бинарный +
. Левый и правый операнды класса Rational
. Возвращает рациональное число являющееся суммой левого и правого операндов.
Оператор бинарный -
. Левый и правый операнды класса Rational
. Возвращает рациональное число являющееся разностью левого и правого операндов.
Оператор бинарный *
. Левый и правый операнды класса Rational
. Возвращает рациональное число являющееся произведением левого и правого операндов.
Оператор бинарный /
. Левый и правый операнды класса Rational
. Возвращает рациональное число являющееся частным левого и правого операндов.
Операторы преобразования к типам:
double
- возвращает вещественное число соответствующее рациональному;bool
- возвращает false
если число равно нулю и true
в остальных случаях;Метод numerator
- возвращающий числитель;
Метод denominator
- возвращающий знаменатель;
Метод isNaN
- возвращающий true
, если число соответствует и false
в противном случае. Обратите внимание NaN, с точки зрения математики - это неопределённое число, то есть любое. Поэтому он не равен ни чему, даже самому себе.
Используйте код представленный ниже для проверки правильности реализации класса.
xxxxxxxxxx
bool equal(double a, double b, double e = 1E-10)
class Rational;
// Ваш код здесь
int main()
{
if (Rational::gcd(91, 65) == 13 &&
Rational::gcd(10, 3) == 1 &&
Rational::gcd(-10, 3) == 1 &&
Rational::gcd(10, -3) == 1 &&
Rational::gcd(-10, -3) == 1 &&
Rational::gcd(30, 10) == 10 &&
Rational::gcd(10, 30) == 10 &&
Rational::gcd(0, 10) == 10 &&
Rational::gcd(10, 0) == 10) std::cout << "gcd test passed\n";
else std::cout << "gcd test failed\n";
if (!Rational(22, 0).isNaN() &&
!Rational(22, 9).isNaN() &&
!Rational(0, 9).isNaN() &&
!Rational(-22, 9).isNaN() &&
!Rational(-22, 0).isNaN() &&
Rational(0, 0).isNaN()
) std::cout << "isNaN test passed\n";
else std::cout << "isNaN test failed\n";
if (Rational(22, 0) == Rational(22, 0) &&
Rational(22, 0) == Rational(9, 0) &&
!(Rational(22, 0) == Rational(22, 9)) &&
!(Rational(22, 0) == Rational(-22, 9)) &&
!(Rational(22, 0) == Rational(-22, 0)) &&
!(Rational(22, 0) == Rational(0, 9)) &&
!(Rational(22, 0) == Rational(0, 0)) &&
Rational(22, 9) == Rational(22, 9) &&
Rational(22, 9) == Rational(-22, -9) &&
Rational(22, 9) == Rational(110, 45) &&
Rational(22, 9) == Rational(-110, -45) &&
!(Rational(22, 9) == Rational(-22, 9)) &&
!(Rational(22, 9) == Rational(22, -9)) &&
!(Rational(22, 9) == Rational(9, 22)) &&
!(Rational(22, 9) == Rational(22, 0)) &&
!(Rational(22, 9) == Rational(-22, 0)) &&
!(Rational(22, 9) == Rational(0, 9)) &&
!(Rational(22, 9) == Rational(0, 0)) &&
Rational(0, 1) == Rational(0, 1) &&
Rational(0, 1) == Rational(0, 9) &&
Rational(0, 1) == Rational(0, -9) &&
!(Rational(0, 1) == Rational(22, 9)) &&
!(Rational(0, 1) == Rational(-22, 9)) &&
!(Rational(0, 1) == Rational(22, 0)) &&
!(Rational(0, 1) == Rational(-22, 0)) &&
!(Rational(0, 1) == Rational(0, 0)) &&
Rational(-22, 9) == Rational(-22, 9) &&
Rational(-22, 9) == Rational(22, -9) &&
Rational(-22, 9) == Rational(-110, 45) &&
Rational(-22, 9) == Rational(110, -45) &&
!(Rational(-22, 9) == Rational(-22, -9)) &&
!(Rational(-22, 9) == Rational(22, 9)) &&
!(Rational(-22, 9) == Rational(9, -22)) &&
!(Rational(-22, 9) == Rational(22, 0)) &&
!(Rational(-22, 9) == Rational(-22, 0)) &&
!(Rational(-22, 9) == Rational(0, 9)) &&
!(Rational(-22, 9) == Rational(0, 0)) &&
Rational(-22, 0) == Rational(-22, 0) &&
Rational(-22, 0) == Rational(-9, 0) &&
!(Rational(-22, 0) == Rational(22, 9)) &&
!(Rational(-22, 0) == Rational(-22, 9)) &&
!(Rational(-22, 0) == Rational(22, 0)) &&
!(Rational(-22, 0) == Rational(0, 9)) &&
!(Rational(-22, 0) == Rational(0, 0)) &&
!(Rational(0, 0) == Rational(0, 0))
) std::cout << "Equality test passed\n";
else std::cout << "Equality test failed\n";
if (Rational(22, 0) + Rational(22, 0) == Rational(22, 0) &&
Rational(22, 9) + Rational(22, 0) == Rational(22, 0) &&
Rational(0, 9) + Rational(22, 0) == Rational(22, 0) &&
Rational(-22, 9) + Rational(22, 0) == Rational(22, 0) &&
(Rational(-22, 0) + Rational(22, 0)).isNaN() &&
Rational(22, 0) + Rational(22, 9) == Rational(22, 0) &&
Rational(22, 9) + Rational(22, 9) == Rational(44, 9) &&
Rational(0, 9) + Rational(22, 9) == Rational(22, 9) &&
Rational(-22, 9) + Rational(22, 9) == Rational(0, 9) &&
Rational(-22, 0) + Rational(22, 9) == Rational(-22, 0) &&
Rational(22, 0) + Rational(0, 1) == Rational(22, 0) &&
Rational(22, 9) + Rational(0, 1) == Rational(22, 9) &&
Rational(0, 9) + Rational(0, 1) == Rational(0, 9) &&
Rational(-22, 9) + Rational(0, 1) == Rational(-22, 9) &&
Rational(-22, 0) + Rational(0, 1) == Rational(-22, 0) &&
Rational(22, 0) + Rational(-22, 9) == Rational(22, 0) &&
Rational(22, 9) + Rational(-22, 9) == Rational(0, 9) &&
Rational(0, 9) + Rational(-22, 9) == Rational(-22, 9) &&
Rational(-22, 9) + Rational(-22, 9) == Rational(-44, 9) &&
Rational(-22, 0) + Rational(-22, 9) == Rational(-22, 0) &&
(Rational(22, 0) + Rational(-22, 0)).isNaN() &&
Rational(22, 9) + Rational(-22, 0) == Rational(-22, 0) &&
Rational(0, 9) + Rational(-22, 0) == Rational(-22, 0) &&
Rational(-22, 9) + Rational(-22, 0) == Rational(-22, 0) &&
Rational(-22, 0) + Rational(-22, 0) == Rational(-22, 0) &&
(Rational(22, 0) + Rational(0, 0)).isNaN() &&
(Rational(22, 9) + Rational(0, 0)).isNaN() &&
(Rational(0, 9) + Rational(0, 0)).isNaN() &&
(Rational(-22, 9) + Rational(0, 0)).isNaN() &&
(Rational(-22, 0) + Rational(0, 0)).isNaN()
) std::cout << "Summation test passed\n";
else std::cout << "Summation test failed\n";
if ((Rational(22, 0) - Rational(22, 0)).isNaN() &&
Rational(22, 9) - Rational(22, 0) == Rational(-22, 0) &&
Rational(0, 9) - Rational(22, 0) == Rational(-22, 0) &&
Rational(-22, 9) - Rational(22, 0) == Rational(-22, 0) &&
Rational(-22, 0) - Rational(22, 0) == Rational(-22, 0) &&
Rational(22, 0) - Rational(22, 9) == Rational(22, 0) &&
Rational(22, 9) - Rational(22, 9) == Rational(0, 9) &&
Rational(0, 9) - Rational(22, 9) == Rational(-22, 9) &&
Rational(-22, 9) - Rational(22, 9) == Rational(-44, 9) &&
Rational(-22, 0) - Rational(22, 9) == Rational(-22, 0) &&
Rational(22, 0) - Rational(0, 1) == Rational(22, 0) &&
Rational(22, 9) - Rational(0, 1) == Rational(22, 9) &&
Rational(0, 9) - Rational(0, 1) == Rational(0, 9) &&
Rational(-22, 9) - Rational(0, 1) == Rational(-22, 9) &&
Rational(-22, 0) - Rational(0, 1) == Rational(-22, 0) &&
Rational(22, 0) - Rational(-22, 9) == Rational(22, 0) &&
Rational(22, 9) - Rational(-22, 9) == Rational(44, 9) &&
Rational(0, 9) - Rational(-22, 9) == Rational(22, 9) &&
Rational(-22, 9) - Rational(-22, 9) == Rational(0, 9) &&
Rational(-22, 0) - Rational(-22, 9) == Rational(-22, 0) &&
Rational(22, 0) - Rational(-22, 0) == Rational(22, 0) &&
Rational(22, 9) - Rational(-22, 0) == Rational(22, 0) &&
Rational(0, 9) - Rational(-22, 0) == Rational(22, 0) &&
Rational(-22, 9) - Rational(-22, 0) == Rational(22, 0) &&
(Rational(-22, 0) - Rational(-22, 0)).isNaN() &&
(Rational(22, 0) - Rational(0, 0)).isNaN() &&
(Rational(22, 9) - Rational(0, 0)).isNaN() &&
(Rational(0, 9) - Rational(0, 0)).isNaN() &&
(Rational(-22, 9) - Rational(0, 0)).isNaN() &&
(Rational(-22, 0) - Rational(0, 0)).isNaN()
) std::cout << "Subtraction test passed\n";
else std::cout << "Subtraction test failed\n";
if (Rational(22, 0) * Rational(22, 0) == Rational(22, 0) &&
Rational(22, 9) * Rational(22, 0) == Rational(22, 0) &&
(Rational(0, 9) * Rational(22, 0)).isNaN() &&
Rational(-22, 9) * Rational(22, 0) == Rational(-22, 0) &&
Rational(-22, 0) * Rational(22, 0) == Rational(-22, 0) &&
Rational(22, 0) * Rational(22, 9) == Rational(22, 0) &&
Rational(22, 9) * Rational(22, 9) == Rational(22*22, 9*9) &&
Rational(0, 9) * Rational(22, 9) == Rational(0, 9) &&
Rational(-22, 9) * Rational(22, 9) == Rational(-22*22, 9*9) &&
Rational(-22, 0) * Rational(22, 9) == Rational(-22, 0) &&
(Rational(22, 0) * Rational(0, 1)).isNaN() &&
Rational(22, 9) * Rational(0, 1) == Rational(0, 9) &&
Rational(0, 9) * Rational(0, 1) == Rational(0, 9) &&
Rational(-22, 9) * Rational(0, 1) == Rational(0, 9) &&
(Rational(-22, 0) * Rational(0, 1)).isNaN() &&
Rational(22, 0) * Rational(-22, 9) == Rational(-22, 0) &&
Rational(22, 9) * Rational(-22, 9) == Rational(-22*22, 9*9) &&
Rational(0, 9) * Rational(-22, 9) == Rational(0, 9) &&
Rational(-22, 9) * Rational(-22, 9) == Rational(22*22, 9*9) &&
Rational(-22, 0) * Rational(-22, 9) == Rational(22, 0) &&
Rational(22, 0) * Rational(-22, 0) == Rational(-22, 0) &&
Rational(22, 9) * Rational(-22, 0) == Rational(-22, 0) &&
(Rational(0, 9) * Rational(-22, 0)).isNaN() &&
Rational(-22, 9) * Rational(-22, 0) == Rational(22, 0) &&
Rational(-22, 0) * Rational(-22, 0) == Rational(22, 0) &&
(Rational(22, 0) * Rational(0, 0)).isNaN() &&
(Rational(22, 9) * Rational(0, 0)).isNaN() &&
(Rational(0, 9) * Rational(0, 0)).isNaN() &&
(Rational(-22, 9) * Rational(0, 0)).isNaN() &&
(Rational(-22, 0) * Rational(0, 0)).isNaN()
) std::cout << "Multiplication test passed\n";
else std::cout << "Multiplication test failed\n";
if ((Rational(22, 0) / Rational(22, 0)).isNaN() &&
Rational(22, 9) / Rational(22, 0) == Rational(0, 9) &&
Rational(0, 9) / Rational(22, 0) == Rational(0, 9) &&
Rational(-22, 9) / Rational(22, 0) == Rational(0, 9) &&
(Rational(-22, 0) / Rational(22, 0)).isNaN() &&
Rational(22, 0) / Rational(22, 9) == Rational(22, 0) &&
Rational(22, 9) / Rational(22, 9) == Rational(9, 9) &&
Rational(0, 9) / Rational(22, 9) == Rational(0, 9) &&
Rational(-22, 9) / Rational(22, 9) == Rational(-9, 9) &&
Rational(-22, 0) / Rational(22, 9) == Rational(-22, 0) &&
Rational(22, 0) / Rational(0, 1) == Rational(22, 0) &&
Rational(22, 9) / Rational(0, 1) == Rational(22, 0) &&
(Rational(0, 9) / Rational(0, 1)).isNaN() &&
Rational(-22, 9) / Rational(0, 1) == Rational(-22, 0) &&
Rational(-22, 0) / Rational(0, 1) == Rational(-22, 0) &&
Rational(22, 0) / Rational(-22, 9) == Rational(-22, 0) &&
Rational(22, 9) / Rational(-22, 9) == Rational(-9, 9) &&
Rational(0, 9) / Rational(-22, 9) == Rational(0, 9) &&
Rational(-22, 9) / Rational(-22, 9) == Rational(9, 9) &&
Rational(-22, 0) / Rational(-22, 9) == Rational(22, 0) &&
(Rational(22, 0) / Rational(-22, 0)).isNaN() &&
Rational(22, 9) / Rational(-22, 0) == Rational(0, 9) &&
Rational(0, 9) / Rational(-22, 0) == Rational(0, 9) &&
Rational(-22, 9) / Rational(-22, 0) == Rational(0, 9) &&
(Rational(-22, 0) / Rational(-22, 0)).isNaN() &&
(Rational(22, 0) / Rational(0, 0)).isNaN() &&
(Rational(22, 9) / Rational(0, 0)).isNaN() &&
(Rational(0, 9) / Rational(0, 0)).isNaN() &&
(Rational(-22, 9) / Rational(0, 0)).isNaN() &&
(Rational(-22, 0) / Rational(0, 0)).isNaN()
) std::cout << "Division test passed\n";
else std::cout << "Division test failed\n";
if (equal(Rational(-22, -9), 22/9.0) &&
equal(Rational(-9, -9), 1) &&
equal(Rational(-6, -9), 6/9.0) &&
equal(Rational(0, -9), 0) &&
equal(Rational(6, -9), -6/9.0) &&
equal(Rational(9, -9), -1) &&
equal(Rational(22, -9), -22/9.0) &&
std::isinf((double)Rational(-9, 0)) &&
std::isnan((double)Rational(0, 0)) &&
std::isinf((double)Rational(9, 0)) &&
equal(Rational(-22, 9), -22/9.0) &&
equal(Rational(-9, 9), -1) &&
equal(Rational(-6, 9), -6/9.0) &&
equal(Rational(0, 9), 0) &&
equal(Rational(6, 9), 6/9.0) &&
equal(Rational(9, 9), 1) &&
equal(Rational(22, 9), 22/9.0)) std::cout << "Conversion to double test passed\n";
else std::cout << "Conversion to double test failed\n";
if (Rational(-22, -9) &&
Rational(-9, -9) &&
Rational(-6, -9) &&
!Rational(0, -9) &&
Rational(6, -9) &&
Rational(9, -9) &&
Rational(22, -9) &&
Rational(-9, 0) &&
Rational(0, 0) &&
Rational(9, 0) &&
Rational(-22, 9) &&
Rational(-9, 9) &&
Rational(-6, 9) &&
!Rational(0, 9) &&
Rational(6, 9) &&
Rational(9, 9) &&
Rational(22, 9)) std::cout << "Conversion to bool test passed\n";
else std::cout << "Conversion to bool test failed\n";
}
bool equal(double a, double b, double e) {
if (-e < a - b && a - b < e) return true;
else return false;
}
Python
По аналогии с заданием для С++ реализуйте класс Rational
.
В качестве обязательных членов должны присутствовать:
Метод __init__
. Кроме self
должен принимать ещё два параметра: numerator
и denominator
- целые числа:
numerator
. То создаётся рациональное число инициализированное . Финализатор. По необходимости.
Статический метод gcd
принимающий два целых числа и возвращающий наибольший общий делитель.
Метод __eq__
(оператор ==
). Сравнивает два объекта класса Rational
на равенство.
Метод __add__
(бинарный +
). Левый и правый операнды класса Rational
. Возвращает рациональное число являющееся суммой левого и правого операндов.
Метод __sub__
(бинарный -
). Левый и правый операнды класса Rational
. Возвращает рациональное число являющееся разностью левого и правого операндов.
Метод __mul__
(оператор *
). Левый и правый операнды класса Rational
. Возвращает рациональное число являющееся произведением левого и правого операндов.
Метод __truediv__
(оператор /
). Левый и правый операнды класса Rational
. Возвращает рациональное число являющееся частным левого и правого операндов.
Операторы преобразования к типам:
__float__
- возвращает вещественное число соответствующее рациональному;__bool__
- возвращает false
если число равно нулю и true
в остальных случаях;Метод numerator
- возвращающий числитель;
Метод denominator
- возвращающий знаменатель;
Метод isNaN
- возвращающий True
, если число соответствует и False
в противном случае. Обратите внимание NaN, с точки зрения математики - это неопределённое число, то есть любое. Поэтому он не равен ни чему, даже самому себе.
Используйте код представленный ниже для проверки правильности реализации класса:
xxxxxxxxxx
import math
class Rational:
pass # Ваш код здесь
def equal(a, b, e=1E-10):
if -e < a - b < e: return True
else: return False
if (Rational.gcd(91, 65) == 13 and
Rational.gcd(10, 3) == 1 and
Rational.gcd(-10, 3) == 1 and
Rational.gcd(10, -3) == 1 and
Rational.gcd(-10, -3) == 1 and
Rational.gcd(30, 10) == 10 and
Rational.gcd(10, 30) == 10 and
Rational.gcd(0, 10) == 10 and
Rational.gcd(10, 0) == 10
): print('gcd test passed')
else: print('gcd test failed')
if (not Rational(22, 0).isNaN() and
not Rational(22, 9).isNaN() and
not Rational(0, 9).isNaN() and
not Rational(-22, 9).isNaN() and
not Rational(-22, 0).isNaN() and
Rational(0, 0).isNaN()
): print('isNaN test passed')
else: print('isNaN test failed')
if (Rational(22, 0) == Rational(22, 0) and
Rational(22, 0) == Rational(9, 0) and
not(Rational(22, 0) == Rational(22, 9)) and
not(Rational(22, 0) == Rational(-22, 9)) and
not(Rational(22, 0) == Rational(-22, 0)) and
not(Rational(22, 0) == Rational(0, 9)) and
not(Rational(22, 0) == Rational(0, 0)) and
Rational(22, 9) == Rational(22, 9) and
Rational(22, 9) == Rational(-22, -9) and
Rational(22, 9) == Rational(110, 45) and
Rational(22, 9) == Rational(-110, -45) and
not(Rational(22, 9) == Rational(-22, 9)) and
not(Rational(22, 9) == Rational(22, -9)) and
not(Rational(22, 9) == Rational(9, 22)) and
not(Rational(22, 9) == Rational(22, 0)) and
not(Rational(22, 9) == Rational(-22, 0)) and
not(Rational(22, 9) == Rational(0, 9)) and
not(Rational(22, 9) == Rational(0, 0)) and
Rational(0, 1) == Rational(0, 1) and
Rational(0, 1) == Rational(0, 9) and
Rational(0, 1) == Rational(0, -9) and
not(Rational(0, 1) == Rational(22, 9)) and
not(Rational(0, 1) == Rational(-22, 9)) and
not(Rational(0, 1) == Rational(22, 0)) and
not(Rational(0, 1) == Rational(-22, 0)) and
not(Rational(0, 1) == Rational(0, 0)) and
Rational(-22, 9) == Rational(-22, 9) and
Rational(-22, 9) == Rational(22, -9) and
Rational(-22, 9) == Rational(-110, 45) and
Rational(-22, 9) == Rational(110, -45) and
not(Rational(-22, 9) == Rational(-22, -9)) and
not(Rational(-22, 9) == Rational(22, 9)) and
not(Rational(-22, 9) == Rational(9, -22)) and
not(Rational(-22, 9) == Rational(22, 0)) and
not(Rational(-22, 9) == Rational(-22, 0)) and
not(Rational(-22, 9) == Rational(0, 9)) and
not(Rational(-22, 9) == Rational(0, 0)) and
Rational(-22, 0) == Rational(-22, 0) and
Rational(-22, 0) == Rational(-9, 0) and
not(Rational(-22, 0) == Rational(22, 9)) and
not(Rational(-22, 0) == Rational(-22, 9)) and
not(Rational(-22, 0) == Rational(22, 0)) and
not(Rational(-22, 0) == Rational(0, 9)) and
not(Rational(-22, 0) == Rational(0, 0)) and
not(Rational(0, 0) == Rational(0, 0))
): print('Equality test passed')
else: print('Equality test failed')
if (Rational(22, 0) + Rational(22, 0) == Rational(22, 0) and
Rational(22, 9) + Rational(22, 0) == Rational(22, 0) and
Rational(0, 9) + Rational(22, 0) == Rational(22, 0) and
Rational(-22, 9) + Rational(22, 0) == Rational(22, 0) and
(Rational(-22, 0) + Rational(22, 0)).isNaN() and
Rational(22, 0) + Rational(22, 9) == Rational(22, 0) and
Rational(22, 9) + Rational(22, 9) == Rational(44, 9) and
Rational(0, 9) + Rational(22, 9) == Rational(22, 9) and
Rational(-22, 9) + Rational(22, 9) == Rational(0, 9) and
Rational(-22, 0) + Rational(22, 9) == Rational(-22, 0) and
Rational(22, 0) + Rational(0, 1) == Rational(22, 0) and
Rational(22, 9) + Rational(0, 1) == Rational(22, 9) and
Rational(0, 9) + Rational(0, 1) == Rational(0, 9) and
Rational(-22, 9) + Rational(0, 1) == Rational(-22, 9) and
Rational(-22, 0) + Rational(0, 1) == Rational(-22, 0) and
Rational(22, 0) + Rational(-22, 9) == Rational(22, 0) and
Rational(22, 9) + Rational(-22, 9) == Rational(0, 9) and
Rational(0, 9) + Rational(-22, 9) == Rational(-22, 9) and
Rational(-22, 9) + Rational(-22, 9) == Rational(-44, 9) and
Rational(-22, 0) + Rational(-22, 9) == Rational(-22, 0) and
(Rational(22, 0) + Rational(-22, 0)).isNaN() and
Rational(22, 9) + Rational(-22, 0) == Rational(-22, 0) and
Rational(0, 9) + Rational(-22, 0) == Rational(-22, 0) and
Rational(-22, 9) + Rational(-22, 0) == Rational(-22, 0) and
Rational(-22, 0) + Rational(-22, 0) == Rational(-22, 0) and
(Rational(22, 0) + Rational(0, 0)).isNaN() and
(Rational(22, 9) + Rational(0, 0)).isNaN() and
(Rational(0, 9) + Rational(0, 0)).isNaN() and
(Rational(-22, 9) + Rational(0, 0)).isNaN() and
(Rational(-22, 0) + Rational(0, 0)).isNaN()
): print('Summation test passed')
else: print('Summation test failed')
if ((Rational(22, 0) - Rational(22, 0)).isNaN() and
Rational(22, 9) - Rational(22, 0) == Rational(-22, 0) and
Rational(0, 9) - Rational(22, 0) == Rational(-22, 0) and
Rational(-22, 9) - Rational(22, 0) == Rational(-22, 0) and
Rational(-22, 0) - Rational(22, 0) == Rational(-22, 0) and
Rational(22, 0) - Rational(22, 9) == Rational(22, 0) and
Rational(22, 9) - Rational(22, 9) == Rational(0, 9) and
Rational(0, 9) - Rational(22, 9) == Rational(-22, 9) and
Rational(-22, 9) - Rational(22, 9) == Rational(-44, 9) and
Rational(-22, 0) - Rational(22, 9) == Rational(-22, 0) and
Rational(22, 0) - Rational(0, 1) == Rational(22, 0) and
Rational(22, 9) - Rational(0, 1) == Rational(22, 9) and
Rational(0, 9) - Rational(0, 1) == Rational(0, 9) and
Rational(-22, 9) - Rational(0, 1) == Rational(-22, 9) and
Rational(-22, 0) - Rational(0, 1) == Rational(-22, 0) and
Rational(22, 0) - Rational(-22, 9) == Rational(22, 0) and
Rational(22, 9) - Rational(-22, 9) == Rational(44, 9) and
Rational(0, 9) - Rational(-22, 9) == Rational(22, 9) and
Rational(-22, 9) - Rational(-22, 9) == Rational(0, 9) and
Rational(-22, 0) - Rational(-22, 9) == Rational(-22, 0) and
Rational(22, 0) - Rational(-22, 0) == Rational(22, 0) and
Rational(22, 9) - Rational(-22, 0) == Rational(22, 0) and
Rational(0, 9) - Rational(-22, 0) == Rational(22, 0) and
Rational(-22, 9) - Rational(-22, 0) == Rational(22, 0) and
(Rational(-22, 0) - Rational(-22, 0)).isNaN() and
(Rational(22, 0) - Rational(0, 0)).isNaN() and
(Rational(22, 9) - Rational(0, 0)).isNaN() and
(Rational(0, 9) - Rational(0, 0)).isNaN() and
(Rational(-22, 9) - Rational(0, 0)).isNaN() and
(Rational(-22, 0) - Rational(0, 0)).isNaN()
): print('Subtraction test passed')
else: print('Subtraction test failed')
if (Rational(22, 0) * Rational(22, 0) == Rational(22, 0) and
Rational(22, 9) * Rational(22, 0) == Rational(22, 0) and
(Rational(0, 9) * Rational(22, 0)).isNaN() and
Rational(-22, 9) * Rational(22, 0) == Rational(-22, 0) and
Rational(-22, 0) * Rational(22, 0) == Rational(-22, 0) and
Rational(22, 0) * Rational(22, 9) == Rational(22, 0) and
Rational(22, 9) * Rational(22, 9) == Rational(22*22, 9*9) and
Rational(0, 9) * Rational(22, 9) == Rational(0, 9) and
Rational(-22, 9) * Rational(22, 9) == Rational(-22*22, 9*9) and
Rational(-22, 0) * Rational(22, 9) == Rational(-22, 0) and
(Rational(22, 0) * Rational(0, 1)).isNaN() and
Rational(22, 9) * Rational(0, 1) == Rational(0, 9) and
Rational(0, 9) * Rational(0, 1) == Rational(0, 9) and
Rational(-22, 9) * Rational(0, 1) == Rational(0, 9) and
(Rational(-22, 0) * Rational(0, 1)).isNaN() and
Rational(22, 0) * Rational(-22, 9) == Rational(-22, 0) and
Rational(22, 9) * Rational(-22, 9) == Rational(-22*22, 9*9) and
Rational(0, 9) * Rational(-22, 9) == Rational(0, 9) and
Rational(-22, 9) * Rational(-22, 9) == Rational(22*22, 9*9) and
Rational(-22, 0) * Rational(-22, 9) == Rational(22, 0) and
Rational(22, 0) * Rational(-22, 0) == Rational(-22, 0) and
Rational(22, 9) * Rational(-22, 0) == Rational(-22, 0) and
(Rational(0, 9) * Rational(-22, 0)).isNaN() and
Rational(-22, 9) * Rational(-22, 0) == Rational(22, 0) and
Rational(-22, 0) * Rational(-22, 0) == Rational(22, 0) and
(Rational(22, 0) * Rational(0, 0)).isNaN() and
(Rational(22, 9) * Rational(0, 0)).isNaN() and
(Rational(0, 9) * Rational(0, 0)).isNaN() and
(Rational(-22, 9) * Rational(0, 0)).isNaN() and
(Rational(-22, 0) * Rational(0, 0)).isNaN()
): print('Multiplication test passed')
else: print('Multiplication test failed')
if ((Rational(22, 0) / Rational(22, 0)).isNaN() and
Rational(22, 9) / Rational(22, 0) == Rational(0, 9) and
Rational(0, 9) / Rational(22, 0) == Rational(0, 9) and
Rational(-22, 9) / Rational(22, 0) == Rational(0, 9) and
(Rational(-22, 0) / Rational(22, 0)).isNaN() and
Rational(22, 0) / Rational(22, 9) == Rational(22, 0) and
Rational(22, 9) / Rational(22, 9) == Rational(9, 9) and
Rational(0, 9) / Rational(22, 9) == Rational(0, 9) and
Rational(-22, 9) / Rational(22, 9) == Rational(-9, 9) and
Rational(-22, 0) / Rational(22, 9) == Rational(-22, 0) and
Rational(22, 0) / Rational(0, 1) == Rational(22, 0) and
Rational(22, 9) / Rational(0, 1) == Rational(22, 0) and
(Rational(0, 9) / Rational(0, 1)).isNaN() and
Rational(-22, 9) / Rational(0, 1) == Rational(-22, 0) and
Rational(-22, 0) / Rational(0, 1) == Rational(-22, 0) and
Rational(22, 0) / Rational(-22, 9) == Rational(-22, 0) and
Rational(22, 9) / Rational(-22, 9) == Rational(-9, 9) and
Rational(0, 9) / Rational(-22, 9) == Rational(0, 9) and
Rational(-22, 9) / Rational(-22, 9) == Rational(9, 9) and
Rational(-22, 0) / Rational(-22, 9) == Rational(22, 0) and
(Rational(22, 0) / Rational(-22, 0)).isNaN() and
Rational(22, 9) / Rational(-22, 0) == Rational(0, 9) and
Rational(0, 9) / Rational(-22, 0) == Rational(0, 9) and
Rational(-22, 9) / Rational(-22, 0) == Rational(0, 9) and
(Rational(-22, 0) / Rational(-22, 0)).isNaN() and
(Rational(22, 0) / Rational(0, 0)).isNaN() and
(Rational(22, 9) / Rational(0, 0)).isNaN() and
(Rational(0, 9) / Rational(0, 0)).isNaN() and
(Rational(-22, 9) / Rational(0, 0)).isNaN() and
(Rational(-22, 0) / Rational(0, 0)).isNaN()
): print('Division test passed')
else: print('Division test failed')
if (equal(float(Rational(-22, -9)), 22/9.0) and
equal(float(Rational(-9, -9)), 1) and
equal(float(Rational(-6, -9)), 6/9.0) and
equal(float(Rational(0, -9)), 0) and
equal(float(Rational(6, -9)), -6/9.0) and
equal(float(Rational(9, -9)), -1) and
equal(float(Rational(22, -9)), -22/9.0) and
math.isinf(float(Rational(-9, 0))) and
math.isnan(float(Rational(0, 0))) and
math.isinf(float(Rational(9, 0))) and
equal(float(Rational(-22, 9)), -22/9.0) and
equal(float(Rational(-9, 9)), -1) and
equal(float(Rational(-6, 9)), -6/9.0) and
equal(float(Rational(0, 9)), 0) and
equal(float(Rational(6, 9)), 6/9.0) and
equal(float(Rational(9, 9)), 1) and
equal(float(Rational(22, 9)), 22/9.0)
): print('Conversion to double test passed')
else: print('Conversion to double test failed')
if (bool(Rational(-22, -9)) and
bool(Rational(-9, -9)) and
bool(Rational(-6, -9)) and
not bool(Rational(0, -9)) and
bool(Rational(6, -9)) and
bool(Rational(9, -9)) and
bool(Rational(22, -9)) and
bool(Rational(-9, 0)) and
bool(Rational(0, 0)) and
bool(Rational(9, 0)) and
bool(Rational(-22, 9)) and
bool(Rational(-9, 9)) and
bool(Rational(-6, 9)) and
not bool(Rational(0, 9)) and
bool(Rational(6, 9)) and
bool(Rational(9, 9)) and
bool(Rational(22, 9))
): print('Conversion to bool test passed')
else: print('Conversion to bool test failed')
Формат ввода
Ввода нет.
Формат вывода
Все тесты должны быть пройдены (passed
). Если хотя бы один тест не пройден (failed
), то класс реализован не правильно.