аа. Документ Microsoft Word. Лабораторная работа ооп." , "cell type" "code", "execution count"
Скачать 44.82 Kb.
|
"collapsed": 'true' }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "(2, 3)\n6 4\n" ] } ], "source": [ "class Pair():\n", " def __init__(self, a, b):\n", " self.a = a\n", " self.b = b\n", " \n", " def set_a(self, a):\n", " self.a = a\n", " \n", " def set_b(self, b):\n", " self.b = b\n", "\n", " def print(self):\n", " print(f'({self.a}, {self.b})')\n", " \n", " def sum(self):\n", " return self.a + self.b\n", " \n", " def max(self):\n", " return self.a if self.a > self.b else self.b\n", " \n", "p = Pair(2, 3)\n", "p.print()\n", "p.set_a(4)\n", "p.set_b(2)\n", "print(p.sum(), p.max())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Задание №2. " ] }, { "cell_type": "markdown", "metadata": { "collapsed": 'true' }, "source": [ "Составить описание класса многочленов от одной переменной, задаваемых степенью многочлена и массивом коэффициентов. Предусмотреть методы для вычисления значения многочлена для заданного аргумента, операции сложения, вычитания и умножения многочленов с получением нового объекта-многочлена, вывод на экран описания многочлена." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": 'true' }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "57\n28\n3*x^0 + 5*x^1 + 8*x^2 \n-1*x^0 + -1*x^1 + -2*x^2 \n3*x^0 + 8*x^1 + 16*x^2 + 13*x^3 + 8*x^4 \n" ] } ], "source": [ "class Polynom():\n", " def __init__(self, coef):\n", " self.coef = coef\n", "\n", " def f(self, x):\n", " y = 0\n", " for i in range(len(self.coef)):\n", " y += (x ** i) * self.coef[i]\n", " \n", " return y\n", " \n", " def __add__(self, other):\n", " polynom = []\n", " for i in range(max(len(other.coef), len(self.coef))):\n", " if i >= len(self.coef):\n", " polynom.append(other.coef[i])\n", " elif i >= len(other.coef):\n", " polynom.append(self.coef[i])\n", " else:\n", " polynom.append(self.coef[i] + other.coef[i])\n", " \n", " return Polynom(polynom)\n", "\n", " def __sub__(self, other):\n", " polynom = []\n", " for i in range(max(len(other.coef), len(self.coef))):\n", " if i >= len(self.coef):\n", " polynom.append(other.coef[i])\n", " elif i >= len(other.coef):\n", " polynom.append(self.coef[i])\n", " else:\n", " polynom.append(self.coef[i] - other.coef[i])\n", "\n", " return Polynom(polynom)\n", " \n", " def __mul__(self, other):\n", " polynom = []\n", " for i in range(len(self.coef)):\n", " for j in range(len(other.coef)):\n", " if i + j == len(polynom):\n", " polynom.append(0)\n", " \n", " polynom[i + j] += self.coef[i] + other.coef[j]\n", " \n", " return Polynom(polynom)\n", "\n", " def print(self):\n", " for i in range(len(self.coef)):\n", " print(f'{self.coef[i]}*x^{i}', end=' ')\n", " if i + 1 < len(self.coef):\n", " print('+', end=' ')\n", " \n", " print()\n", "\n", "a = Polynom([1, 2, 3])\n", "b = Polynom([2, 3, 5])\n", "print(a.f(4))\n", "print(b.f(2))\n", "c = a + b\n", "d = a - b\n", "e = a * b\n", "c.print()\n", "d.print()\n", "e.print()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Задание №3\n", "\n", "Составить описание класса для вектора, заданного координатами его концов в трехмерном пространстве. Обеспечить операции сложения и вычитания векторов с получением нового вектора (суммы или разности), вычисления скалярного произведения двух векторов, длины вектора, косинуса угла между векторами." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "(2, 3, 4)\n(6, 4, 4)\n40 0.0019796380090497737 8.246211251235321\n" ] } ], "source": [ "class Point3D():\n", " def __init__(self, x, y, z):\n", " self.x = x\n", " self.y = y\n", " self.z = z\n", " \n", " def __add__(self, other):\n", " return Point3D(self.x + other.x, self.y + other.y, self.z + other.z)\n", " \n", " def __sub__(self, other):\n", " return Point3D(self.x - other.x, self.y - other.y, self.z - other.z)\n", " \n", " def scalar(self, other):\n", " return self.x * other.x + self.y * other.y + self.z * other.z\n", " \n", " def cos(self, other):\n", " return self.scalar(other) / ((self.x ** 2 + other.x ** 2) * (self.y ** 2 + other.y ** 2) * (self.z ** 2 + other.z ** 2))\n", " \n", " def length(self):\n", " return (self.x ** 2 + self.y ** 2 + self.z ** 2) ** 0.5\n", "\n", " def print(self):\n", " print(f'({self.x}, {self.y}, {self.z})')\n", "\n", "p1 = Point3D(2, 3, 4)\n", "p2 = Point3D(4, 1, 0)\n", "p1.print()\n", "p3 = p1 + p2\n", "p3.print()\n", "print(p3.scalar(p1), p3.cos(p2), p3.length())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Задание №4 Поезда.\n", "\n", "Создайте структуру с именем train, содержащую поля: название пунктов отправления и назначения, время отправления и прибытия. Перегрузить операцию сложения - два поезда можно сложить, если пунк назначения первого совпадает с пунктом отправления второго и время прибытия первого раньше чем отправление второго." ] }, { "cell_type": "code", "execution_count": ‘null’ "metadata": { "collapsed": 'true' }, "outputs": [], "source": [ "class Train():\n", " def __init__(self, start_name, finish_name, start_time, finish_time):\n", " self.start_name = start_name\n", " self.finish_name = finish_name\n", " self.start_time = start_time\n", " self.finish_time = finish_time\n", "\n", " def __add__(self, other):\n", " if self.finish_name == other.start_name and self.finish_time < other.start_time:\n", " return Train(self.start_name, other.finish_name, self.start_time, other.finish_time)\n", "\n", " def __str__(self):\n", " return f'{self.start_name} - {self.start_time}\\n{self.finish_name} - {self.finish_time}'\n", "\n", "t1 = Train(\"New-York\", \"London\", 10, 13)\n", "t2 = Train(\"London\", \"Moscow\", 14, 16)\n", "print(t1 + t2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Домашнее задание (дополнительное):" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Обобщённое число.\n", "\n", "Создайте класс обобщающий понятие комплексных, двойных и дуальных чисел. И на его основе создайте классы этих чисел.\n", "\n", "Такие числа объеденены одной формой записи:\n", "\n", "$$ c = a + ib $$\n", "\n", "где c - обобщённое число (комплексное, двойное или дуальное), a и b - вещественные числа, i - некоммутирующий символ.\n", "\n", "Именно из-за наличия символа i число c не просто сумма a и b. Такие числа можно представлять как вектор на плоскости (a,b).\n", "\n", "А символ i обладает следующим свойством:\n", "\n", "- для комплексных чисел\n", "\n", "$$ i^2 = -1 $$\n", "\n", "- для двойных чисел\n", "\n", "$$ i^2 = 1 $$\n", "\n", "- для дуальных чисел\n", "\n", "$$ i^2 = 0 $$\n", "\n", "Перегрузить для них базовые операции: сложения, вычитания, умножения и деления.\n", "\n", "Например, операция умножения для таких чисел имеет вид:\n", "\n", "$$ (a_1+b_1i)\\cdot (a_2+b_2i)=a_1a_2+b_1a_2i+a_1b_2i+b_1b_2i^{2}=(a_1a_2+b_1b_2i^{2})+(b_1a_2+a_1b_2)i. $$" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": 'true' }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "(4, 6)\n(-2, -2)\n(11, 10)\n(0.44, 0.08)\n(18, 30)\n(0.25, 1.125)\n" ] } ], "source": [ "class Complex():\n", " def __init__(self, a, b):\n", " self.a = a\n", " self.b = b\n", " \n", " def __add__(self, other):\n", " return Complex(self.a + other.a, self.b + other.b)\n", " \n", " def __sub__(self, other):\n", " return Complex(self.a - other.a, self.b - other.b)\n", " \n", " def __mul__(self, other):\n", " return Complex(\n", " self.a * other.a + self.b * other.b * self.i2(), \n", " self.b * other.a + self.a * other.b\n", " )\n", "\n", " def __truediv__(self, other):\n", " return Complex(\n", " (self.a * other.a + self.b * other.b) / (other.a ** 2 + other.b ** 2),\n", " (other.a * self.b - self.a * other.b) / (other.a ** 2 + other.b ** 2),\n", " )\n", "\n", " def __str__(self):\n", " return f'({self.a}, {self.b})'\n", "\n", " def i2(self):\n", " return 1\n", " \n", "class HyperComplex(Complex):\n", " def i2(self):\n", " return 0\n", "\n", "class DoubleComplex(Complex):\n", " def i2(self):\n", " return 1\n", "\n", "c1 = Complex(1, 2)\n", "c2 = Complex(3, 4)\n", "print(c1 + c2)\n", "print(c1 - c2)\n", "print(c1 * c2)\n", "print(c1 / c2)\n", "\n", "h1 = HyperComplex(3, 4)\n", "h2 = HyperComplex(6, 2)\n", "print(h1 * h2)\n", "\n", "d1 = DoubleComplex(2, 9)\n", "d2 = DoubleComplex(8, 0)\n", "print(d1 / d2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Формула.\n", "\n", "Напишите класс \"Формула\" для создания символьной записи формулы и её вычисления. Класс должен содержать атрибуты: \n", "- список операций производимых над переменной \"x\", \n", "- метод для вывода всех операторов и вывода определённого оператора по его номеру,\n", "- метод для составления формулы как строки скомпанованной из заданных операторов, \n", "- метод для изменения оператора,\n", "- метод для подстановки значения x и вычисления значения формулы (например, с помощью функции eval() :-) )." ] }, { "cell_type": "code", "execution_count": ‘null’ "metadata": { "collapsed": 'true' }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Больше формул!\n", "\n", "Определите для объектов класса \"Формула\" алгебраические операции: +, -, *, /." ] }, { "cell_type": "code", "execution_count": ‘null’ "metadata": { "collapsed": 'true' }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "name": "python3", "display_name": "Python 3.9.1 64-bit", "metadata": { "interpreter": { "hash": "8377707fed0120780b1c61ac6aab1c2a77aa53075184a7428b97980d2a12d859" } } }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.1-final" } }, "nbformat": 4, "nbformat_minor": 2 } |