Различия между версиями 14 и 15
Версия 14 от 2021-11-11 16:04:12
Размер: 4828
Редактор: FrBrGeorge
Комментарий:
Версия 15 от 2021-12-01 03:36:35
Размер: 4803
Редактор: alryaz
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 2: Строка 2:

{{{#!wiki caution
Строка 3: Строка 5:
}}}
Строка 9: Строка 13:
 * <!> Задача_1. Написать классы для комплексного числа, умеющие сравнивать на "меньше" и умножать.
  * написать класс `OrderedComplex` - наследник `complex`, добавляющий операцию сравнения "<" (метод `__lt__(self,other)`)
 * <!> '''Задача_1:'''
  *
Написать классы для комплексного числа, умеющие сравнивать на "меньше" и умножать.
  * написать класс `OrderedComplex` - наследник `complex`, добавляющий операцию сравнения "<" (метод `__lt__(self,other)`)
Строка 12: Строка 17:
  * написать класс `OrderedComplexMul` - наследник `OrderedComplex`, добавляющий операцию скалярного произведения "@" (метод `__matmul__(self,other)`)   * написать класс `OrderedComplexMul` - наследник `OrderedComplex`, добавляющий операцию скалярного произведения "@" (метод `__matmul__(self,other)`)
Строка 16: Строка 21:
   * Ввод:
   {{{
  '''Input:'''
  {{{
Строка 20: Строка 25:
  }}}
   * Вывод:
  {{{
  }}}
  '''Output:'''
  {{{
Строка 24: Строка 29:
  }}}   }}}
Строка 27: Строка 33:
 * <!> Задача_2. Написать программу, которая заставляет человека вводить координаты вершин треугольника в формате `(x1, y1), (x2, y2), (x3, y3)`, до тех пор, пока это не окажутся координаты вершин треугольника в указанном формате, а потом выводит его площадь с точностью до сотой. Если формат ввода неправильный, программа вместо площади выводит «`Invalid input`», а если формат условно правильный, но площадь его нулевая или вычислить её нельзя, потому что введены вообще не числа — «`Not a triangle`».  * <!> '''Задача_2:'''
  *
Написать программу, которая заставляет человека вводить координаты вершин треугольника в формате `(x1, y1), (x2, y2), (x3, y3)`, до тех пор, пока это не окажутся координаты вершин треугольника в указанном формате, а потом выводит его площадь с точностью до сотой.
   *
Если формат ввода неправильный, программа вместо площади выводит «`Invalid input`», а если формат условно правильный, но площадь его нулевая или вычислить её нельзя, потому что введены вообще не числа — «`Not a triangle`».
Строка 39: Строка 47:
  * Пример работы (ввод и вывод строго перемежаются для удобства понимания диалога):
{{{
  '''Input:'''
  {{{
Строка 42: Строка 50:
1,2,3,4,5,6
(1,1), (2,2), (11,11)
(1,2), (4,5), (9,8)
}}}
  '''Output:'''
  {{{
Строка 43: Строка 57:
1,2,3,4,5,6
Строка 45: Строка 58:
(1,1), (2,2), (11,11)
Строка 47: Строка 59:
(1,2), (4,5), (9,8)
Строка 50: Строка 61:
Строка 51: Строка 63:
Доделать '''TODO''' {{{#!wiki caution
'''TODO''' доделать
}}}

11.11 Наследование и исключения

TODO чуть побольше тем (есть минут десять)

Перегрузка операций

  • Пример с __add__/__radd__

Наследование

  • Попробуем унаследоваться от str и добавить туда унарный - (который будет переворачивать строку)

    • {i} В чём проблема?

  • Как эта проблема решена в collections.UserString (см. тут)

  • <!> Задача_1:

    • Написать классы для комплексного числа, умеющие сравнивать на "меньше" и умножать.
      • написать класс OrderedComplex - наследник complex, добавляющий операцию сравнения "<" (метод __lt__(self,other))

        • логика сравнения: (x,y)<(u,v) <=> (x<u and y<v)

      • написать класс OrderedComplexMul - наследник OrderedComplex, добавляющий операцию скалярного произведения "@" (метод __matmul__(self,other))

        • логика операции: (x,y)@(u,v)=x·u+y·v

    • Не требуется выполнять преобразование всех родительских методов к дочернему типу
    • Поскольку это задача типа написать «класс/функцию», тесты для неё — это куски кода для обоих классов

      Input:

      A, B = OrderedComplex(1, -5), OrderedComplexMul(10, 15)
      print(A<B, B@B)

      Output:

      True 325.0

Исключения

  • {i} Программа, которая заставляет человека вводить число до тех пор, пока он не введёт число

  • <!> Задача_2:

    • Написать программу, которая заставляет человека вводить координаты вершин треугольника в формате (x1, y1), (x2, y2), (x3, y3), до тех пор, пока это не окажутся координаты вершин треугольника в указанном формате, а потом выводит его площадь с точностью до сотой.

      • Если формат ввода неправильный, программа вместо площади выводит «Invalid input», а если формат условно правильный, но площадь его нулевая или вычислить её нельзя, потому что введены вообще не числа — «Not a triangle».

    • Диагностика ввода и расчет площади производится в функции triangleSquare, которая:

      • получает на вход входную строку программы
      • преобразует строку в координаты вершин: (x1, y1), (x2, y2), (x3, y3) = eval(inStr)

      • при преобразовании ловит все исключения, и при любом перехваченном исключении формирует исключение InvalidInput (этот класс нужно определить)

      • если ввод корректен, выполняет проверку на то, что координаты - корректны для треугольника; в случае некорректности формирует исключение BadTriangle (этот класс нужно определить)

      • если координаты корректны, то вычисляет и возвращает площадь
    • При вызове функции triangleSquare в основном коде программы ловятся исключения InvalidInput и BadTriangle, и в блоках их обработки выдается соответствующая диагностика

    • Вывод площади выполняется в блоке else

    • Написать тесты:
      • на неправильный формат
      • на не-треугольник

      Input:

      asdf
      1,2,3,4,5,6
      (1,1), (2,2), (11,11)
      (1,2), (4,5), (9,8)

      Output:

      Invalid input
      Invalid input
      Not a triangle
      3.00

Д/З

TODO доделать

LecturesCMC/PythonIntro2021/Prac/08_Inheritance_Exceptions (последним исправлял пользователь alryaz 2021-12-01 03:36:35)