diff --git a/circle.py b/circle.py index c3eb8647c9..0b3b4a23cf 100644 --- a/circle.py +++ b/circle.py @@ -2,9 +2,16 @@ def area(r): + if not isinstance(r, (int, float)): + raise TypeError("Value must be number") + if r < 0: + raise ValueError("Value must be positive") return math.pi * r * r def perimeter(r): + if not isinstance(r, (int, float)): + raise TypeError("Value must be number") + if r < 0: + raise ValueError("Value must be positive") return 2 * math.pi * r - diff --git a/docs/README.md b/docs/README.md index 63f8727939..ea4c4eaba7 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,10 +1,80 @@ +# Документация +## Общее описание решения +- Для выполнения решения, к каждой функции в каждом файле,были добавлены комментарии как выполняется функция. +- После внесения изменений был выполнен: + ```bash + git add +- Добавлены комментарии ко всем функциям внесенным изменениям: + ```bash + git commit -m "Добавлены комментарии ко всем функциям" +- Создана новая ветка: + ```bash + git checkout -b lab_2_documentation +- Изменения были отправлены на удаленный репозиторий: + ```bash + git push origin lab_2_documentation +- Отправил pull request + +## Описание каждой функции с примерами вызова +## Условия значений +- Неотрицательные (иначе выдаётся ошибка ValueError) +- Значение должно быть числовым (иначе выдаётся ошибка TypeError) +- Значение должно подаваться (не None) +1. **Файл** ```circle.py``` +- **Функция** ```area(r)```: + - **Формула**: ```π * r²``` + - **Описание**: Вычисляет площадь круга по заданному радиусу ```r```. + - **Пример вызова**: ```area(5)``` вернёт приблизительно ```78.54```. +- **Функция** ```perimeter(r)```: + - **Формула**: ```2 * π * R``` + - **Описание**: Вычисляет периметр (длину окружности) круга по заданному радиусу ```r```. + - **Пример вызова**: ```perimeter(5)``` вернёт приблизительно ```31.42```. + +2. **Файл** ```square.py``` +- **Функция** ```area(a)```: + - **Формула**: ```a²``` + - **Описание**: Вычисляет площадь квадрата со стороной ```a```. + - **Пример вызова**: ```area(10)``` вернёт ```100```. +- **Функция** ```perimeter(a)```: + - **Формула**: ```4 * a``` + - **Описание**: Вычисляет периметр квадрата со стороной ```a```. + - **Пример вызова**: ```perimeter(5)``` вернёт ```20```. + +3. **Файл** ```triangle.py``` +- **Функция** ```area(a, h)```: + - **Формула**: ```a * h / 2``` + - **Описание**: Вычисляет площадь треугольника с основанием ```a``` и высотой ```h```. + - **Пример вызова**: ```area(10, 3)``` вернёт ```15```. +- **Функция** ```perimeter(a, b, c)```: + - **Формула**: ```a + b + c``` + - **Описание**: Вычисляет периметр треугольника со сторонами ```a```, ```b``` и ```c```. + - **Пример вызова**: ```perimeter(1, 2, 3)``` вернёт ```6```. + +4. **Файл** ```rectangle.py``` +- **Функция** ```area(a, b)```: + - **Формула**: ```a * b``` + - **Описание**: Вычисляет площадь прямоугольника со сторонами ```a``` и ```b```. + - **Пример вызова**: ```area(4, 5)``` вернёт ```20```. +- **Функция** ```perimeter(a, b)```: + - **Формула**: ```2 * a + 2 * b``` + - **Описание**: Вычисляет периметр прямоугольника со сторонами ```a``` и ```b```. + - **Пример вызова**: ```perimeter(4, 5)``` вернёт ```18```. + +## История изменения проекта с хешами комитов (кроме последней записи) + - commit [8ba9aeb3cea847b63a91ac378a2a6db758682460](https://github.com/takuya-q/geometric_lib/commit/8ba9aeb3cea847b63a91ac378a2a6db758682460) "L-03: Circle and square" added в ветке ```main``` + - commit [d078c8d9ee6155f3cb0e577d28d337b791de28e2](https://github.com/takuya-q/geometric_lib/commit/d078c8d9ee6155f3cb0e577d28d337b791de28e2) "L-03: Docs added" в ветке ```main``` + - commit [e5aebfbae2319571d847e584ce4e16cb77abf9c3](https://github.com/takuya-q/geometric_lib/commit/e5aebfbae2319571d847e584ce4e16cb77abf9c3) "Добавлен файл площадь и периметр Прямоугольника" в ветке ```new_features_466846``` + - commit [2948d3e67c535af4d544e379057a159ad3d38e10](https://github.com/takuya-q/geometric_lib/commit/2948d3e67c535af4d544e379057a159ad3d38e10) "Добавлен файл с периметром и площадью Треугольника" в ветке ```new_features_466846``` + - commit [e9eba38bb06e9f494dccf4d8f2e3d929cd929a81](https://github.com/takuya-q/geometric_lib/commit/e9eba38bb06e9f494dccf4d8f2e3d929cd929a81) "Изменена формула периметра Прямоуголька в rectangle.py" в ветке ```new_features_466846``` + - commit [7ac30db8653568216a3eaa1f208faf8a771af5ab](https://github.com/takuya-q/geometric_lib/commit/7ac30db8653568216a3eaa1f208faf8a771af5ab) "Добавлены комментарии ко всем функциям во всех файлах" в ветке ```new_features_466846``` # Math formulas ## Area - Circle: S = πR² - Rectangle: S = ab - Square: S = a² - +- Triangle: S = a*h/2 ## Perimeter - Circle: P = 2πR - Rectangle: P = 2a + 2b -- Square: P = 4a \ No newline at end of file +- Square: P = 4a +- Triangle: P = a + b + c diff --git a/rectangle.py b/rectangle.py new file mode 100644 index 0000000000..8067fdb404 --- /dev/null +++ b/rectangle.py @@ -0,0 +1,15 @@ + +def area(a, b): + if not isinstance(a, (int, float)) or not isinstance(b, (int, float)): + raise TypeError("Values must be numbers") + if a < 0 or b < 0: + raise ValueError("Values must be positive") + return a * b + + +def perimeter(a, b): + if not isinstance(a, (int, float)) or not isinstance(b, (int, float)): + raise TypeError("Values must be numbers") + if a < 0 or b < 0: + raise ValueError("Values must be positive") + return 2 * a + 2 * b \ No newline at end of file diff --git a/square.py b/square.py index 0f98724205..88df8bf36f 100644 --- a/square.py +++ b/square.py @@ -1,7 +1,14 @@ - def area(a): + if not isinstance(a, (int, float)): + raise TypeError("Value must be number") + if a < 0: + raise ValueError("Value must be positive") return a * a def perimeter(a): + if not isinstance(a, (int, float)): + raise TypeError("Value must be number") + if a < 0: + raise ValueError("Value must be positive") return 4 * a diff --git a/test_circle.py b/test_circle.py new file mode 100644 index 0000000000..062d8f2294 --- /dev/null +++ b/test_circle.py @@ -0,0 +1,44 @@ +import circle +import unittest + + +class CircleTestCase(unittest.TestCase): + def test_area_zero(self): + res = circle.area(0) + self.assertEqual(res, 0) + + def test_area_negative(self): + with self.assertRaises(ValueError): + circle.area(-10) + + def test_area_str_input(self): + with self.assertRaises(TypeError): + circle.area("a") + + def test_area_none_value(self): + with self.assertRaises(TypeError): + circle.area(None) + + def test_area_big_value(self): + res = circle.area(10**10) + self.assertEqual(res, 0) + + def test_area_small_velue(self): + res = circle.area(10 ** - 10) + self.assertEqual(res, 0) + + def test_perimeter_zero(self): + res = circle.perimeter(0) + self.assertEqual(res, 0) + + def test_perimeter_negative(self): + with self.assertRaises(ValueError): + circle.perimeter(-10) + + def test_perimeter_str_input(self): + with self.assertRaises(TypeError): + circle.perimeter("a") + + def test_perimeter_none_value(self): + with self.assertRaises(TypeError): + circle.perimeter(None) \ No newline at end of file diff --git a/test_rectangle.py b/test_rectangle.py new file mode 100644 index 0000000000..ad266c715f --- /dev/null +++ b/test_rectangle.py @@ -0,0 +1,56 @@ +import rectangle +import unittest + + +class RectangleTestCase(unittest.TestCase): + def test_area_zero(self): + res = rectangle.area(10, 0) + self.assertEqual(res, 0) + + def test_area_square(self): + res = rectangle.area(10, 10) + self.assertEqual(res, 100) + + def test_area_negative(self): + with self.assertRaises(ValueError): + rectangle.area(-10, 0) + + def test_area_str_input(self): + with self.assertRaises(TypeError): + rectangle.area("a", 10) + + def test_area_none_value(self): + with self.assertRaises(TypeError): + rectangle.area(None, 10) + with self.assertRaises(TypeError): + rectangle.area(10, None) + + def test_area_big_value(self): + res = rectangle.area(10**10, 10**5) + self.assertEqual(res, 0) + + def test_area_small_velue(self): + res = rectangle.area(10 ** - 10, 10 ** 5) + self.assertEqual(res, 0) + + def test_perimeter_zero(self): + res = rectangle.perimeter(10, 0) + self.assertEqual(res, 20) + + def test_perimeter_square(self): + res = rectangle.perimeter(10, 10) + self.assertEqual(res, 40) + + def test_perimeter_negative(self): + with self.assertRaises(ValueError): + rectangle.perimeter(-10, 0) + + def test_perimeter_str_input(self): + with self.assertRaises(TypeError): + rectangle.perimeter("a", 0) + + def test_perimeter_none_value(self): + with self.assertRaises(TypeError): + rectangle.perimeter(None, 10) + with self.assertRaises(TypeError): + rectangle.perimeter(10, None) diff --git a/test_square.py b/test_square.py new file mode 100644 index 0000000000..97c35c52c8 --- /dev/null +++ b/test_square.py @@ -0,0 +1,44 @@ +import square +import unittest + + +class SquareTestCase(unittest.TestCase): + def test_area_zero_int(self): + res = square.area(0) + self.assertEqual(res, 0) + + def test_area_negative(self): + with self.assertRaises(ValueError): + square.area(-10) + + def test_area_str_input(self): + with self.assertRaises(TypeError): + square.area("a") + + def test_area_none_value(self): + with self.assertRaises(TypeError): + square.area(None) + + def test_area_big_value(self): + res = square.area(10**10) + self.assertEqual(res, 0) + + def test_area_small_velue(self): + res = square.area(10 ** - 10) + self.assertEqual(res, 0) + + def test_perimeter_zero(self): + res = square.perimeter(0) + self.assertEqual(res, 0) + + def test_perimeter_negative(self): + with self.assertRaises(ValueError): + square.perimeter(-10) + + def test_perimeter_str_input(self): + with self.assertRaises(TypeError): + square.perimeter("a") + + def test_perimeter_none_value(self): + with self.assertRaises(TypeError): + square.perimeter(None) diff --git a/test_triangle.py b/test_triangle.py new file mode 100644 index 0000000000..e2c010310e --- /dev/null +++ b/test_triangle.py @@ -0,0 +1,74 @@ +import triangle +import unittest + + +class TriangleTestCase(unittest.TestCase): + def test_area_zero_int(self): + res = triangle.area(10, 0) + self.assertEqual(res, 0) + + def test_area_zero_float(self): + res = triangle.area(10.6, 0) + self.assertEqual(res, 0) + + def test_area_negative(self): + with self.assertRaises(ValueError): + triangle.area(-10, 10) + with self.assertRaises(ValueError): + triangle.area(10, -10) + + def test_area_str_input(self): + with self.assertRaises(TypeError): + triangle.area("a", 10) + with self.assertRaises(TypeError): + triangle.area(10, "a") + + def test_area_negative(self): + with self.assertRaises(ValueError): + triangle.perimeter(-10, 10, 10) + + def test_area_none_value(self): + with self.assertRaises(TypeError): + triangle.area(None, 10) + with self.assertRaises(TypeError): + triangle.area(10, None) + + def test_area_big_value(self): + res = triangle.area(10**10, 10**5) + self.assertEqual(res, 0) + + def test_area_small_velue(self): + res = triangle.area(10 ** - 10, 10 ** 5) + self.assertEqual(res, 0) + + def test_perimeter_zero_int(self): + res = triangle.perimeter(10, 0, 20) + self.assertEqual(res, 30) + + def test_perimeter_zero_float(self): + res = triangle.perimeter(10.5, 0, 10.5) + self.assertEqual(res, 21) + + def test_perimeter_equilateral_int(self): + res = triangle.perimeter(10, 10, 10) + self.assertEqual(res, 30) + + def test_perimeter_equilateral_float(self): + res = triangle.perimeter(10.5, 10.5, 10.5) + self.assertEqual(res, 31.5) + + def test_perimetr_str_input(self): + with self.assertRaises(TypeError): + triangle.perimeter("a", 50, 50) + with self.assertRaises(TypeError): + triangle.perimeter(50, "a", 50) + with self.assertRaises(TypeError): + triangle.perimeter(50, 50, "a") + + def test_perimeter_none_value(self): + with self.assertRaises(TypeError): + triangle.perimeter(None, 10, 50) + with self.assertRaises(TypeError): + triangle.perimeter(10, None, 50) + with self.assertRaises(TypeError): + triangle.perimeter(10, 10, None) diff --git a/triangle.py b/triangle.py new file mode 100644 index 0000000000..108dab7eac --- /dev/null +++ b/triangle.py @@ -0,0 +1,14 @@ +def area(a, h): + if not isinstance(a, (int, float)) or not isinstance(h, (int, float)): + raise TypeError("Values must be numbers") + if a < 0 or h < 0: + raise ValueError("Values must be positive") + return a * h / 2 + + +def perimeter(a, b, c): + if not isinstance(a, (int, float)) or not isinstance(b, (int, float) or not isinstance(c, (int, float))): + raise TypeError("Values must be numbers") + if a < 0 or b < 0 or c < 0: + raise ValueError("Values must be positive") + return a + b + c \ No newline at end of file