diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000..092423f3af Binary files /dev/null and b/.DS_Store differ diff --git a/circle.py b/circle.py index c3eb8647c9..50f0572be3 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): - return 2 * math.pi * 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 \ No newline at end of file diff --git a/docs/README.md b/docs/README.md index 63f8727939..7f66ec5c5c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,10 +1,186 @@ -# Math formulas -## Area -- Circle: S = πR² -- Rectangle: S = ab -- Square: S = a² - -## Perimeter -- Circle: P = 2πR -- Rectangle: P = 2a + 2b -- Square: P = 4a \ No newline at end of file +# Библиотека для работы с различными фигурами + +## Общее описание + +Библиотека предназначена для работы с основными геометрическими фигурами. Она включает в себя **четыре основных файла**: circle.py, rectangle.py, square.py, triangle.py, в каждом из которых реализованы две функции: вычисление площади и периметра фигуры. + +## Основные файлы библиотеки, их функции с примерами вызовов + +### circle.py + +**ссылка на circle.py** + +[circle.py](../circle.py) + +#### Площадь окружности +Функция **принимает вещественное число** (*радиус окружности*) в качестве аргумента и **возвращает площадь окружности**, которая вычисляется по формуле: +``` +S = πR² +``` + +**Пример вызова:** +```python +area(3.0) +``` + +**Вывод:** +``` +28.27433 +``` + +#### Периметр окружности +Функция **принимает вещественное число** (*радиус окружности*) в качестве аргумента и **возвращает периметр окружности**, который вычисляется по формуле: +``` +P = 2πR +``` + +**Пример вызова:** +```python +perimeter(3.0) +``` + +**Вывод:** +``` +18.84955 +``` + +### rectangle.py + +**ссылка на rectangle.py** + + +[rectangle.py](../rectangle.py) + + + +#### Площадь прямоугольника +Функция **принимает вещественные числа** (*стороны прямоугольника*) в качестве аргументов и **возвращает площадь прямоугольника**, которая вычисляется по формуле: +``` +S = ab +``` + +**Пример вызова:** +```python +area(3.0, 5.0) +``` + +**Вывод:** +``` +15.0 +``` + +#### Периметр прямоугольника +Функция **принимает вещественные числа** (*стороны прямоугольника*) в качестве аргументов и **возвращает периметр прямоугольника**, который вычисляется по формуле: +``` +P = 2a + 2b +``` + +**Пример вызова:** +```python +perimeter(3.0, 5.0) +``` + +**Вывод:** +``` +16.0 +``` + +### square.py + +**ссылка на square.py** + +[square.py](../square.py) + +#### Площадь квадрата +Функция **принимает вещественное число** (*сторона квадрата*) в качестве аргумента и **возвращает площадь квадрата**, которая вычисляется по формуле: +``` +S = a² +``` + +**Пример вызова:** +```python +area(5.0) +``` + +**Вывод:** +``` +25.0 +``` + +#### Периметр квадрата +Функция **принимает вещественное число** (*сторона квадрата*) в качестве аргумента и **возвращает периметр квадрата**, который вычисляется по формуле: +``` +P = 4a +``` + +**Пример вызова:** +```python +perimeter(5.0) +``` + +**Вывод:** +``` +20.0 +``` + +### triangle.py + +**ссылка на triangle.py** + +[triangle.py](../triangle.py) + +#### Площадь треугольника +Функция **принимает вещественные числа** (*сторона треугольника и высота, падающая на эту сторону*) в качестве аргументов и **возвращает площадь треугольника**, которая вычисляется по формуле: +``` +S = ah/2 +``` + +**Пример вызова:** +```python +area(4.0, 6.0) +``` + +**Вывод:** +``` +12.0 +``` + +#### Периметр треугольника +Функция **принимает вещественные числа** (*стороны треугольника*) в качестве аргументов, проверяет треугольник на существование: +``` +a + b > c +a + c > b +b + c > a +``` + +и **возвращает периметр треугольника**, который вычисляется по формуле: +``` +P = a + b + c +``` + +**Примеры вызова:** +```python +perimeter(3.0, 4.0, 5.0) +``` + +```python +perimeter(100.0, 3.0, 5.0) +``` + +**Выводы:** +``` +12.0 +``` + +``` +-1.0 +``` +# История изменения проекта с хешами комитов + +**commit 0d23ced79ed9ef7dd923df4978d65985e877509e** + +Добавлена документация + +**commit 8ba9aeb3cea847b63a91ac378a2a6db758682460** + +Внесены финальные изменения в документации \ No newline at end of file diff --git a/docs/geometric_lib/rectangle.py b/docs/geometric_lib/rectangle.py new file mode 100644 index 0000000000..e69de29bb2 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..7db6b73984 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): - return 4 * 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 \ No newline at end of file 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..0c09532ad6 --- /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) \ No newline at end of file diff --git a/test_square.py b/test_square.py new file mode 100644 index 0000000000..39917986a3 --- /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) \ No newline at end of file diff --git a/test_triangle.py b/test_triangle.py new file mode 100644 index 0000000000..e063e896fc --- /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) \ No newline at end of file diff --git a/triangle.py b/triangle.py new file mode 100644 index 0000000000..e063e896fc --- /dev/null +++ b/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) \ No newline at end of file