diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000000..240dbffa60 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,59 @@ +# This is a basic workflow to help you get started with Actions + +name: CI + +# Controls when the workflow will run +on: + # Triggers the workflow on push or pull request events but only for the "main" branch + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + # This workflow contains a single job called "build" + linux-build: + # The type of runner that the job will run on + runs-on: ubuntu-latest + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + + # Runs a set of commands using the runners shell + - name: checkout + uses: actions/checkout@v3 + - name: python_install + uses: actions/setup-python@v3 + with: + python-version: 3.9 + - name: run_unittests + run: | + python -m unittest "square_test.py" + python -m unittest "rectangle_test.py" + python -m unittest "circle_test.py" + python -m unittest "triangle_test.py" + + windows-build: + # The type of runner that the job will run on + runs-on: windows-latest + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + + # Runs a set of commands using the runners shell + - name: checkout + uses: actions/checkout@v3 + - name: python_install + uses: actions/setup-python@v3 + with: + python-version: 3.9 + - name: Run our tests + run: | + python.exe -m unittest "square_test.py" + python.exe -m unittest "rectangle_test.py" + python.exe -m unittest "circle_test.py" + python.exe -m unittest "triangle_test.py" diff --git a/circle.py b/circle.py index c3eb8647c9..5b09b95c9f 100644 --- a/circle.py +++ b/circle.py @@ -1,10 +1,34 @@ import math - def area(r): + """ + Вычисляет площадь круга по заданному радиусу. + + Параметры: + r (float): Радиус круга. + + Возвращает: + float: Площадь круга. + + Пример вызова: + >>> area(5) + 78.53981633974483 + """ return math.pi * r * r def perimeter(r): - return 2 * math.pi * r + """ + Вычисляет длину окружности (периметр круга) по заданному радиусу. + + Параметры: + r (float): Радиус круга. + Возвращает: + float: Длина окружности. + + Пример вызова: + >>> perimeter(5) + 31.41592653589793 + """ + return 2 * math.pi * r diff --git a/docs/README.md b/docs/README.md index 63f8727939..3b5771bbf3 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,10 +1,187 @@ -# 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 +# **Geometric Lib Documentation** +## **Общее описание решения** +Данный проект включает в себя функции для вычисления площади и периметра различных геометрических фигур: круга, прямоугольника, квадрата и треугольника. Каждая функция принимает параметры, соответствующие размерам фигуры, и возвращает рассчитанное значение площади или периметра. Для выполнения вычислений используются базовые математические операции, а также константа `pi` из библиотеки `math`. + +## Описание функций с примерами вызова + +## Функции для работы с окружностью +circle.py + +### Функция `perimeter(r)` + +### Вычисляет длину окружности (периметр круга) по заданному радиусу `r`. + +**Параметры:** + +`r (float)`: Радиус круга. + +**Возвращает:** + +`float`: Длина окружности. + +#### Пример вызова функции `perimeter(r)` +```python +- Вызов функции: `perimeter(5)` +- Результат: `31.41592653589793` +``` + + +### Функция `area(r)` + +**Вычисляет площадь круга по заданному радиусу`r`.** + +**Параметры:** + +`r (float)`: Радиус круга. + +**Возвращает:** +`float`: Площадь круга. + +#### Пример вызова функции `perimeter(r)` +```python +- Вызов функции: `area(5)` +- Результат: `78.53981633974483` +``` + +## Функции для работы с прямоугольником +**rectangle.py** + +## Функция `area(a, b)` + +**Вычисляет площадь прямоугольника по его ширине и высоте.** + +**Параметры:** + +`a (float)`: Ширина прямоугольника. + +`b (float)`: Высота прямоугольника. + +**Возвращает:** + +`float`: Площадь прямоугольника. + +### Пример вызова функции `area(a, b)` +```python +- Вызов функции: `area(4, 5)` +- Результат: `20` +``` + +## Функция `perimeter(a, b)` + +**Вычисляет периметр прямоугольника по его ширине и высоте.** + +**Параметры:** + +`a (float)`: Ширина прямоугольника. + +`b (float)`: Высота прямоугольника. + +**Возвращает:** + +`float`: Периметр прямоугольника. + +### Пример вызова функции `perimeter(a, b)` +```python +- Вызов функции: `perimeter(4, 5)` +- Результат: `18` +``` + +## **Функции для работы с квадратом** + +## Функция `area(a)` + +**Вычисляет площадь квадрата по длине его стороны.** + +**Параметры:** + +`a (float)`: Длина стороны квадрата. + +**Возвращает:** + +`float`: Площадь квадрата. + +### Пример вызова функции `perimeter(a, b)` +```python +- Вызов функции: `area(4)` +- Результат: `16` +``` + +## Функция `perimeter(a)` + +**Вычисляет периметр квадрата по длине его стороны.** + +**Параметры:** + +`a (float)`: Длина стороны квадрата. + +**Возвращает:** + +`float`: Периметр квадрата. + +### Пример вызова функции `perimeter(a)` +```python +- Вызов функции: `perimeter(4)` +- Результат: `16` +``` + +## **Функции для работы с треугольником** + +## Функция `area(a, h)` + +**Вычисляет площадь треугольника по основанию и высоте.** + +**Параметры:** + +`a (float)`: Основание треугольника. + +`h (float)`: Высота треугольника. + +**Возвращает:** + +`float`: Площадь треугольника. + +### Пример вызова функции `perimeter(a)` +```python +- Вызов функции: `area(5, 10)` +- Результат: `25.0` +``` + +## Функция perimeter(a, b, c) + +**Вычисляет периметр треугольника по его сторонам.** + +**Параметры:** + +`a (float)`: Длина первой стороны. + +`b (float)`: Длина второй стороны. + +`c (float)`: Длина третьей стороны. + +**Возвращает:** + +`float`: Периметр треугольника. + +### Пример вызова функции `perimeter(a, b, c)` +```python +- Вызов функции: `perimeter(3, 4, 5)` +- Результат: `12` +``` + +## История изменения проекта + +**Коммит:** `8ba9aeb3cea847b63a91ac378a2a6db758682460` + +Описание: Добавлены модули c `circle.py` и `square.py` с функциями для круга и квадрата. + +**Коммит:** `d078c8d9ee6155f3cb0e577d28d337b791de28e2` + +Описание: Добавлен новый модуль rectangle.py, содержащий функции `area(a, b)` и `perimeter(a,b)` для вычисления площади и периметра прямоугольника. + +**Коммит:** [`4be26fff814f09748e99e0b3bd4e8d8d22c6bf8b`](https://github.com/kondratevakk/geometric_lib/commit/4be26fff814f09748e99e0b3bd4e8d8d22c6bf8b) + +**Описание:** Добавлен новый модуль `triangle.py`, включающий функции `area(a, h)` для вычисления площади треугольника и `perimeter(a, b, c)` для расчета его периметра. + +**Коммит:** [`0766f59b3ea85db664c6673421c5122d75b3323b`](https://github.com/kondratevakk/geometric_lib/commit/0766f59b3ea85db664c6673421c5122d75b3323b) + +**Описание:** В модуле `rectangle.py` исправлена формула вычисления периметра в функции `perimeter(a, b)`. Ранее периметр рассчитывался как `a + b`, теперь исправлено на `2 * (a + b)`. diff --git a/docs/circle_test.py b/docs/circle_test.py new file mode 100644 index 0000000000..f73979f0c7 --- /dev/null +++ b/docs/circle_test.py @@ -0,0 +1,72 @@ +import unittest +import math +from circle import area, perimeter + +''' +Test for Circle +''' + + +class CircleTestCase(unittest.TestCase): + def test_zero_side(self): + res_area = area(0) + res_perimeter = perimeter(0) + self.assertEqual(res_area, 0) + self.assertEqual(res_perimeter, 0) + + def test_valid_side(self): + res_area = area(3) + res_perimeter = perimeter(3) + self.assertEqual(res_area, 9 * math.pi) + self.assertEqual(res_perimeter, 6 * math.pi) + + def test_valid_side2(self): + res_area = area(5) + res_perimeter = perimeter(5) + self.assertEqual(res_area, 25 * math.pi) + self.assertEqual(res_perimeter, 10 * math.pi) + + def test_invalid_side_area(self): + res_area = area("tr") + res_perimeter = perimeter(2) + self.assertEqual(res_area, 0) + self.assertEqual(res_perimeter, 4 * math.pi) + + def test_invalid_side_perimeter(self): + res_area = area(6) + res_perimeter = perimeter("y") + self.assertEqual(res_area, 36 * math.pi) + self.assertEqual(res_perimeter, 0) + + def test_invalid_side_both(self): + res_area = area("r") + res_perimeter = perimeter("r") + self.assertEqual(res_area, 0) + self.assertEqual(res_perimeter, 0) + + def test_negative_side_area(self): + res_area = area(-2) + res_perimeter = perimeter(3) + self.assertEqual(res_area, 0) + self.assertEqual(res_perimeter, 6 * math.pi) + + def test_int_string_side_area(self): + res_area = area("3") + res_perimeter = perimeter(3) + self.assertEqual(res_area, 9 * math.pi) + self.assertEqual(res_perimeter, 6 * math.pi) + + def test_negative_side_perimeter(self): + res_area = area(2) + res_perimeter = perimeter(-6) + self.assertEqual(res_area, 4 * math.pi) + self.assertEqual(res_perimeter, 0) + + def test_int_string_side_perimeter(self): + res_area = area(3) + res_perimeter = perimeter("4") + self.assertEqual(res_area, 9 * math.pi) + self.assertEqual(res_perimeter, 8 * math.pi) + +# if __name__ == '__main__': +# unittest.main() diff --git a/docs/rectangle_test.py b/docs/rectangle_test.py new file mode 100644 index 0000000000..1fc9111bfc --- /dev/null +++ b/docs/rectangle_test.py @@ -0,0 +1,71 @@ +import unittest +from rectangle import area, perimeter + +''' +Test for Rectangle +''' + + +class RectangleTestCase(unittest.TestCase): + def test_zero_side(self): + res_area = area(0, 0) + res_perimeter = perimeter(0, 0) + self.assertEqual(res_area, 0) + self.assertEqual(res_perimeter, 0) + + def test_valid_side(self): + res_area = area(3, 4) + res_perimeter = perimeter(3, 4) + self.assertEqual(res_area, 12) + self.assertEqual(res_perimeter, 14) + + def test_valid_side2(self): + res_area = area(5, 6) + res_perimeter = perimeter(5, 9) + self.assertEqual(res_area, 30) + self.assertEqual(res_perimeter, 28) + + def test_invalid_side_area(self): + res_area = area("tr", 7) + res_perimeter = perimeter(2, 3) + self.assertEqual(res_area, 0) + self.assertEqual(res_perimeter, 10) + + def test_invalid_side_perimeter(self): + res_area = area(6, 10) + res_perimeter = perimeter(6, "y") + self.assertEqual(res_area, 60) + self.assertEqual(res_perimeter, 0) + + def test_invalid_side_both(self): + res_area = area("a", "b") + res_perimeter = perimeter("a", "b") + self.assertEqual(res_area, 0) + self.assertEqual(res_perimeter, 0) + + def test_negative_side_area(self): + res_area = area(-2, 3) + res_perimeter = perimeter(3, 4) + self.assertEqual(res_area, 0) + self.assertEqual(res_perimeter, 14) + + def test_int_string_side_area(self): + res_area = area("3", 4) + res_perimeter = perimeter(3, 4) + self.assertEqual(res_area, 12) + self.assertEqual(res_perimeter, 14) + + def test_negative_side_perimeter(self): + res_area = area(2, 3) + res_perimeter = perimeter(3, -6) + self.assertEqual(res_area, 6) + self.assertEqual(res_perimeter, 0) + + def test_int_string_side_perimeter(self): + res_area = area(3, 4) + res_perimeter = perimeter(3, "4") + self.assertEqual(res_area, 12) + self.assertEqual(res_perimeter, 14) + +# if __name__ == '__main__': +# unittest.main() diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 0000000000..fccfb9356e --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,4 @@ +pytest==7.4.0 +numpy>=1.23.0 +requests==2.31.0 +flask>=2.0.0,<3.0.0 diff --git a/docs/square_test.py b/docs/square_test.py new file mode 100644 index 0000000000..c005317cfa --- /dev/null +++ b/docs/square_test.py @@ -0,0 +1,62 @@ +import unittest +from square import area, perimeter + +''' +Test for square +''' + + +class SquareTestCase(unittest.TestCase): + def test_zero_side(self): + res_area = area(0) + res_perimeter = perimeter(0) + self.assertEqual(res_area, 0) + self.assertEqual(res_perimeter, 0) + + def test_valid_side(self): + res_area = area(3) + res_perimeter = perimeter(3) + self.assertEqual(res_area, 9) + self.assertEqual(res_perimeter, 12) + + def test_valid_side2(self): + res_area = area(5) + res_perimeter = perimeter(5) + self.assertEqual(res_area, 25) + self.assertEqual(res_perimeter, 20) + + def test_invalid_side(self): + res_area = area("6r") + res_perimeter = perimeter("6r") + self.assertEqual(res_area, 0) + self.assertEqual(res_perimeter, 0) + + def test_negative_side_area(self): + res_area = area(-2) + res_perimeter = perimeter(3) + self.assertEqual(res_area, 0) + self.assertEqual(res_perimeter, 12) + + def test_int_string_side_area(self): + res_area = area("3") + res_perimeter = perimeter(3) + self.assertEqual(res_area, 9) + self.assertEqual(res_perimeter, 12) + + def test_negative_side_perimeter(self): + res_area = area(2) + res_perimeter = perimeter(-6) + self.assertEqual(res_area, 4) + self.assertEqual(res_perimeter, 0) + + def test_int_string_side_perimeter(self): + res_area = area(4) + res_perimeter = perimeter("4") + self.assertEqual(res_area, 16) + self.assertEqual(res_perimeter, 16) + + + + +# if name == 'main': +# unittest.main() diff --git "a/docs/triangle_test\302\240.py" "b/docs/triangle_test\302\240.py" new file mode 100644 index 0000000000..48196db782 --- /dev/null +++ "b/docs/triangle_test\302\240.py" @@ -0,0 +1,71 @@ +import unittest +from triangle import area, perimeter + +''' +Test for Triangle +''' + + +class TriangleTestCase(unittest.TestCase): + def test_zero_side(self): + res_area = area(0, 0) + res_perimeter = perimeter(0, 0, 0) + self.assertEqual(res_area, 0) + self.assertEqual(res_perimeter, 0) + + def test_valid_side(self): + res_area = area(3, 4) + res_perimeter = perimeter(3, 4, 5) + self.assertEqual(res_area, 6) + self.assertEqual(res_perimeter, 12) + + def test_valid_side2(self): + res_area = area(5, 6) + res_perimeter = perimeter(5, 6, 9) + self.assertEqual(res_area, 15) + self.assertEqual(res_perimeter, 20) + + def test_invalid_side_area(self): + res_area = area("tr", 7) + res_perimeter = perimeter(2, 3, 4) + self.assertEqual(res_area, 0) + self.assertEqual(res_perimeter, 9) + + def test_invalid_side_perimeter(self): + res_area = area(6, 10) + res_perimeter = perimeter(6, "y", 8) + self.assertEqual(res_area, 30) + self.assertEqual(res_perimeter, 0) + + def test_invalid_side_both(self): + res_area = area("a", "b") + res_perimeter = perimeter("a", "b", "c") + self.assertEqual(res_area, 0) + self.assertEqual(res_perimeter, 0) + + def test_negative_side_area(self): + res_area = area(-2, 3) + res_perimeter = perimeter(3, 4, 6) + self.assertEqual(res_area, 0) + self.assertEqual(res_perimeter, 13) + + def test_int_string_side_area(self): + res_area = area("3", 4) + res_perimeter = perimeter(3, 4, 5) + self.assertEqual(res_area, 6) + self.assertEqual(res_perimeter, 12) + + def test_negative_side_perimeter(self): + res_area = area(2, 3) + res_perimeter = perimeter(3, 4, -6) + self.assertEqual(res_area, 3) + self.assertEqual(res_perimeter, 0) + + def test_int_string_side_perimeter(self): + res_area = area(3, 4) + res_perimeter = perimeter(3, "4", 5) + self.assertEqual(res_area, 6) + self.assertEqual(res_perimeter, 12) + +# if __name__ == '__main__': +# unittest.main() diff --git a/rectangle.py b/rectangle.py new file mode 100644 index 0000000000..b26546af64 --- /dev/null +++ b/rectangle.py @@ -0,0 +1,33 @@ +def area(a, b): + """ + Вычисляет площадь прямоугольника по его ширине и высоте. + + Параметры: + a (float): Ширина прямоугольника. + b (float): Высота прямоугольника. + + Возвращает: + float: Площадь прямоугольника. + + Пример вызова: + >>> area(4, 5) + 20 + """ + return a * b + +def perimeter(a, b): +""" + Вычисляет периметр прямоугольника по его ширине и высоте. + + Параметры: + a (float): Ширина прямоугольника. + b (float): Высота прямоугольника. + + Возвращает: + float: Периметр прямоугольника. + + Пример вызова: + >>> perimeter(4, 5) + 18 + """ + return (a + b)*2 diff --git a/square.py b/square.py index 0f98724205..dba3ddb1fd 100644 --- a/square.py +++ b/square.py @@ -1,7 +1,32 @@ - def area(a): + """ + Вычисляет площадь квадрата по заданной длине его стороны. + + Параметры: + a (float): Длина стороны квадрата. + + Возвращает: + float: Площадь квадрата. + + Пример вызова: + >>> area(4) + 16 + """ return a * a def perimeter(a): + """ + Вычисляет периметр квадрата по заданной длине его стороны. + + Параметры: + a (float): Длина стороны квадрата. + + Возвращает: + float: Периметр квадрата. + + Пример вызова: + >>> perimeter(4) + 16 + """ return 4 * a diff --git a/triangle.py b/triangle.py new file mode 100644 index 0000000000..6a68209317 --- /dev/null +++ b/triangle.py @@ -0,0 +1,35 @@ +def area(a, h): + """ + Вычисляет площадь треугольника по основанию и высоте. + + Параметры: + a (float): Длина основания треугольника. + h (float): Высота треугольника. + + Возвращает: + float: Площадь треугольника. + + Пример вызова: + >>> area(5, 10) + 25.0 + """ + return a * h / 2 + + +def perimeter(a, b, c): + """ + Вычисляет периметр треугольника по длине его сторон. + + Параметры: + a (float): Длина первой стороны треугольника. + b (float): Длина второй стороны треугольника. + c (float): Длина третьей стороны треугольника. + + Возвращает: + float: Периметр треугольника. + + Пример вызова: + >>> perimeter(3, 4, 5) + 12 + """ + return a + b + c