diff --git a/.github/workflows/CICD.yml b/.github/workflows/CICD.yml new file mode 100644 index 0000000000..e0c7e88ad2 --- /dev/null +++ b/.github/workflows/CICD.yml @@ -0,0 +1,46 @@ +name: CI - Run Unit Test + +on: + push: + branches: [ "No5" ] + pull_request: + branches: [ "No5" ] + workflow_dispatch: + +jobs: + build: + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest, windows-latest] + + steps: + - name: Check out Repository + uses: actions/checkout@v4 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + + - name: Display Python version + run: python -c "import sys; print(sys.version)" + + - name: Set up Python + uses: actions/setup-python@v4.7.1 + with: + python-version: 3.8 + + - name: Run My Step + id: myStep + run: echo "::set-output name=myOutput::some value" + + - name: Set Output Variable + run: echo "myOutput=${{ steps.myStep.outputs.myOutput }}" >> $GITHUB_ENV + + - name: Install Dependencies + run: | + echo "There are no dependencies!" + - name: Run Unit Tests + run: | + python -m unittest discover -s ./tests -p "test_*.py" diff --git a/.github/workflows/cicd.yml b/.github/workflows/cicd.yml new file mode 100644 index 0000000000..9df935b650 --- /dev/null +++ b/.github/workflows/cicd.yml @@ -0,0 +1,46 @@ +name: CICD - Run Unit Test + +on: + push: + branches: [ "No5" ] + pull_request: + branches: [ "No5" ] + workflow_dispatch: + +jobs: + build: + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest, windows-latest] + + steps: + - name: Check out Repository + uses: actions/checkout@v4 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + + - name: Display Python version + run: python -c "import sys; print(sys.version)" + + - name: Set up Python + uses: actions/setup-python@v4.7.1 + with: + python-version: 3.8 + + - name: Run My Step + id: myStep + run: echo "::set-output name=myOutput::some value" + + - name: Set Output Variable + run: echo "myOutput=${{ steps.myStep.outputs.myOutput }}" >> $GITHUB_ENV + + - name: Install Dependencies + run: | + echo "There are no dependencies!" + - name: Run Unit Tests + run: | + python -m unittest discover -s ./tests -p "test_*.py" diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000000..13566b81b0 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/geometric_lib.iml b/.idea/geometric_lib.iml new file mode 100644 index 0000000000..bc2cd87409 --- /dev/null +++ b/.idea/geometric_lib.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000000..a6218fed0a --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000000..5c0675083d --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000000..35eb1ddfbb --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/__pycache__/circle.cpython-311.pyc b/__pycache__/circle.cpython-311.pyc new file mode 100644 index 0000000000..08884eeaf4 Binary files /dev/null and b/__pycache__/circle.cpython-311.pyc differ diff --git a/__pycache__/rectangle.cpython-311.pyc b/__pycache__/rectangle.cpython-311.pyc new file mode 100644 index 0000000000..562dde634f Binary files /dev/null and b/__pycache__/rectangle.cpython-311.pyc differ diff --git a/__pycache__/square.cpython-311.pyc b/__pycache__/square.cpython-311.pyc new file mode 100644 index 0000000000..cba2eaf32a Binary files /dev/null and b/__pycache__/square.cpython-311.pyc differ diff --git a/__pycache__/test_circle.cpython-311.pyc b/__pycache__/test_circle.cpython-311.pyc new file mode 100644 index 0000000000..c946a719b7 Binary files /dev/null and b/__pycache__/test_circle.cpython-311.pyc differ diff --git a/__pycache__/test_rectangle.cpython-311.pyc b/__pycache__/test_rectangle.cpython-311.pyc new file mode 100644 index 0000000000..9dde91c426 Binary files /dev/null and b/__pycache__/test_rectangle.cpython-311.pyc differ diff --git a/__pycache__/test_square.cpython-311.pyc b/__pycache__/test_square.cpython-311.pyc new file mode 100644 index 0000000000..aa603b3a1f Binary files /dev/null and b/__pycache__/test_square.cpython-311.pyc differ diff --git a/__pycache__/test_triangle.cpython-311.pyc b/__pycache__/test_triangle.cpython-311.pyc new file mode 100644 index 0000000000..a4f348b915 Binary files /dev/null and b/__pycache__/test_triangle.cpython-311.pyc differ diff --git a/__pycache__/triangle.cpython-311.pyc b/__pycache__/triangle.cpython-311.pyc new file mode 100644 index 0000000000..7e2da569ae Binary files /dev/null and b/__pycache__/triangle.cpython-311.pyc differ diff --git a/circle.py b/circle.py index c3eb8647c9..9ca241719b 100644 --- a/circle.py +++ b/circle.py @@ -1,10 +1,34 @@ import math - +'''Подключит библиотеку math''' def area(r): + ''' + Принимает число r (радиус круга), возвращает площадь круга + + Example: + Input: 4 + Output: 50.26548245743669 + + ''' + # Проверка на корректность ввода + if not isinstance(r, (int, float)) or r < 0 or r > 10**10: + return "wrong input" + + return math.pi * r * r def perimeter(r): + ''' + Принимает число r (радиус круга), возвращает периметр круга + + Example: + Input: 4 + Output: 25.132741228718345 + + ''' + # Проверка на корректность ввода + if not isinstance(r, (int, float)) or r < 0 or r > 10**10: + return "wrong input" + return 2 * math.pi * r - diff --git a/docs/README.md b/docs/README.md index 63f8727939..b1b7afe5b6 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,3 +1,4 @@ + # Math formulas ## Area - Circle: S = πR² @@ -7,4 +8,134 @@ ## Perimeter - Circle: P = 2πR - Rectangle: P = 2a + 2b -- Square: P = 4a \ No newline at end of file +- Square: P = 4a +# Oбщее описание решения: +**Geometric Library** - библиотека Python, предназначенная для расчета ключевых геометрических характеристик простейших фигур: круга, квадрата, прямоугольника и треугольника. С её помощью можно вычислять площадь и периметр (или длину окружности) данных фигур, что делает её удобным инструментом для решения геометрических задач в различных приложениях, включая учебные проекты. + +Основные возможности библиотеки: + +- Вычисление площади и периметра квадрата. +- Вычисление площади и длины окружности круга. +- Вычисление площади и периметра прямоугольника. +- Вычисление площади и периметра треугольника. + +# ** Oписание каждой функции с примерами вызова** +## **Rectangle** +``` +def area(a, b): + '''Принимает число a и b (длина и ширина прямоугольника), возвращает площадь прямоугольника''' + return a * b + +def perimeter(a, b): + '''Принимает число a и b (длина и ширина прямоугольника), возвращает периметр прямоугольника''' + return (a + b)*2 +``` +_Example:_ +_Input: `5,6`_ +_Output: `30 22`_ + + +## **Triangle** +``` +def area(a, h): + '''Принимает число a, h (основание и высота треугольника) возвращает площадь треугольника''' + return a * h / 2 +def perimeter(a, b, c): + '''Принимает число a, b, c (стороны треугольника), возвращает периметр треугольника''' + return a + b + c +``` +_Example:_ +_Input: `1,2` `1,2,3`_ +_Output: `1 6`_ + + +## **Square** +``` +def area(a): + '''Принимает число a (сторона квадрата), возвращает площадь квадрата''' + return a * a + +def perimeter(a): + '''Принимает число a (сторона квадрата), возвращает периметр квадрата''' + return 4 * a +``` +_Example:_ +_Input: `3`_ +_Output: `9 12`_ + +## **Circle** +``` +import math + '''Подключит библиотеку math''' + +def area(r): + '''Принимает число r (радиус круга), возвращает площадь круга''' + return math.pi * r * r + + +def perimeter(r): + '''Принимает число r (радиус круга), возвращает периметр круга''' + return 2 * math.pi * r +``` +_Example:_ +_Input: `4`_ +_Output: `50.24 25.12`_ + +# История изменения проекта с хешами комитов + +- _**commit 4f6015fb35ea095d4e57523ffc2b4c987bb1a035**_ +``` +Author: Hoang Ngoc Dat <407880@niuitmo.ru> +Date: Thu Oct 3 12:43:35 2024 +0300 + + Update Readme.md file +``` + +- _**commit 7e6c710e085053112323b22d896087f3639a9102**_ +``` +Author: Hoang Ngoc Dat <407880@niuitmo.ru> +Date: Thu Oct 3 12:19:51 2024 +0300 + + Add more to explain +``` + +- _**commit 746c3a18de806c396070b8a71e764e69c3d7176d**_ +``` +Author: Hoang Ngoc Dat <407880@niuitmo.ru> +Date: Thu Oct 3 11:43:35 2024 +0300 + + Add comment to circle.py +``` + +- _**commit c5c3db2f82030561f4f7669a87429941126d3a35**_ +``` +Author: Hoang Ngoc Dat <407880@niuitmo.ru> +Date: Thu Oct 3 11:42:59 2024 +0300 + + Add comment to square.py +``` + +- _**commit c5c3db2f82030561f4f7669a87429941126d3a35**_ +``` +Author: Hoang Ngoc Dat <407880@niuitmo.ru> +Date: Thu Oct 3 11:42:10 2024 +0300 + + Add comment to triangle.py +``` + +- _**commit 0be759905089e1944aea66b89b7f6fb212466629**_ +``` +Author: Hoang Ngoc Dat <407880@niuitmo.ru> +Date: Thu Oct 3 11:41:42 2024 +0300 + + Add comment to rectangle.py +``` + + + + + + + + + diff --git a/rectangle.py b/rectangle.py new file mode 100644 index 0000000000..c1de7e5bf3 --- /dev/null +++ b/rectangle.py @@ -0,0 +1,33 @@ + +def area(a, b): + ''' + Принимает число a и b (длина и ширина прямоугольника), возвращает площадь прямоугольника + + Example: + Input: 5 6 + Output: 30 + + ''' + # Проверка на корректность ввода + if not isinstance(a, (int, float)) or not isinstance(b, (int, float)) or a < 0 or b < 0 or a > 10**10 or b > 10**10: + return "wrong input" + + return a * b + +def perimeter(a, b): + ''' + Принимает число a и b (длина и ширина прямоугольника), возвращает периметр прямоугольника + + Example: + Input: 5 6 + Output: 22 + + ''' + + # Проверка на корректность ввода + if not isinstance(a, (int, float)) or not isinstance(b, (int, float)) or a < 0 or b < 0 or a > 10**10 or b > 10**10: + return "wrong input" + + return (a + b)*2 + + \ No newline at end of file diff --git a/square.py b/square.py index 0f98724205..8a92d52151 100644 --- a/square.py +++ b/square.py @@ -1,7 +1,31 @@ - def area(a): + ''' + Принимает число a (сторона квадрата), возвращает площадь квадрата + + Example: + Input: 3 + Output: 9 + + ''' + + # Проверка на корректность ввода + if not isinstance(a, (int, float)) or a < 0 or a > 10**10: + return "wrong input" + return a * a - def perimeter(a): + ''' + Принимает число a (сторона квадрата), возвращает периметр квадрата + + Example: + Input: 3 + Output: 12 + + ''' + + # Проверка на корректность ввода + if not isinstance(a, (int, float)) or a < 0 or a > 10**10: + return "wrong input" + return 4 * a diff --git a/tests/test_circle.py b/tests/test_circle.py new file mode 100644 index 0000000000..851bb3b3dc --- /dev/null +++ b/tests/test_circle.py @@ -0,0 +1,75 @@ +import circle +import unittest + +class CircleTestCase(unittest.TestCase): + # Проверяет, когда радиус равен 0 + def test_zero_mul(self): + assert circle.area(0) == 0 + + # Проверяет, когда радиус равен 10 + def test_one_mul(self): + assert circle.area(10) == 314.1592653589793 + + # Проверяет, является ли радиус действительным числом + def test_two_mul(self): + assert circle.area(67.636) == 14371.619275936122 + + # Проверяет, когда окружность с радиусом равна 0 + def test_three_mul(self): + assert circle.perimeter(0) == 0 + + # Проверяет, когда окружность равен 10 + def test_four_mul(self): + assert circle.perimeter(10) == 62.83185307179586 + + # Проверяет, является ли окружность действительным числом + def test_five_mul(self): + assert circle.perimeter(67.636) == 424.96952143639845 + + # Проверяет, когда радиус отрицательный + def test_six_mul(self): + assert circle.area(10) != 40 + + # Проверяет, когда окружность отрицательный + def test_seven_mul(self): + assert circle.perimeter(10) != 30 + + # когда есть отрицательный фронт + def test_eight_mul(self): + res = circle.area(-10) + self.assertEqual(res, "wrong input") + + def test_nine_mul(self): + res = circle.perimeter(-10) + self.assertEqual(res, "wrong input") + + # Проверяет, являются ли радиус символами + def test_ten_mul(self): + res = circle.area('a') + self.assertEqual(res, "wrong input") + + def test_eleven_mul(self): + res = circle.perimeter('a') + self.assertEqual(res, "wrong input") + + # Проверяет, являются ли радиус строкой + def test_twelve_mul(self): + res = circle.area('abcdef') + self.assertEqual(res, "wrong input") + + def test_thirteen_mul(self): + res = circle.perimeter('abcdef') + self.assertEqual(res, "wrong input") + + # Проверяет, является ли радиус слишком большим числом + def test_fourteen_mul(self): + res = circle.area(10000000000000000000000000) + self.assertEqual(res, "wrong input") + + def test_fiveteen_mul(self): + res = circle.perimeter(10000000000000000000000000) + self.assertEqual(res, "wrong input") + +if __name__ == '__main__': + unittest.main() + diff --git a/tests/test_rectangle.py b/tests/test_rectangle.py new file mode 100644 index 0000000000..5b6afee771 --- /dev/null +++ b/tests/test_rectangle.py @@ -0,0 +1,61 @@ +import rectangle +import unittest + +class RectangleTestCase(unittest.TestCase): + # Проверяет, когда стороны равны 0 + def test_zero_mul(self): + assert rectangle.area(0,15) == 0 + # Проверяет, когда стороны равны 10 + def test_one_mul(self): + assert rectangle.area(10,10) == 100 + # Проверяет, являются ли стороны действительным числом + def test_two_mul(self): + assert rectangle.area(65.5, 4.5) == 294.75 + # Проверяет, когда периметр равен 0 + def test_three_mul(self): + assert rectangle.perimeter(0,0) == 0 + # Проверяет, когда стороны равны 10 + def test_four_mul(self): + assert rectangle.perimeter(10, 45) == 110 + # Проверяет, являются ли стороны действительным числом + def test_five_mul(self): + assert rectangle.perimeter(67.636, 42.364) == 220 + + # Проверяет правильное значение для площади + def test_six_mul(self): + assert rectangle.area(7,8) != 55 + + # Проверяет правильное значение для периметра + def test_seven_mul(self): + assert rectangle.perimeter(10, 54) != 132 + + # когда есть отрицательный фронт + def test_eight_mul(self): + self.assertEqual(rectangle.area(-8, 7), "wrong input") + + def test_nine_mul(self): + self.assertEqual(rectangle.perimeter(-5, 4), "wrong input") + + # когда есть ребро, которое является символом + def test_ten_mul(self): + self.assertEqual(rectangle.area('n', 8), "wrong input") + + def test_eleven_mul(self): + self.assertEqual(rectangle.perimeter('n', 8), "wrong input") + + # когда есть край, представляющий строку + def test_twelve_mul(self): + self.assertEqual(rectangle.area('abcdef', 12), "wrong input") + + def test_thirteen_mul(self): + self.assertEqual(rectangle.perimeter('abcdef', 12), "wrong input") + + # когда стороны слишком большим числом + def test_fourteen_mul(self): + self.assertEqual(rectangle.area(10000000000000000000000000, 9), "wrong input") + + def test_fiveteen_mul(self): + self.assertEqual(rectangle.perimeter(10000000000000000000000000, 9), "wrong input") + +if __name__ == '__main__': + unittest.main() \ No newline at end of file diff --git a/tests/test_square.py b/tests/test_square.py new file mode 100644 index 0000000000..0116603622 --- /dev/null +++ b/tests/test_square.py @@ -0,0 +1,66 @@ +import square +import unittest + +class SquareTestCase(unittest.TestCase): + # Проверяет, когда сторона равна 0 + def test_zero_mul(self): + self.assertEqual(square.area(0), 0) + + # Проверяет, когда сторона равна 10 + def test_one_mul(self): + self.assertEqual(square.area(10), 100) + + # Проверяет, является ли сторона действительным числом + def test_two_mul(self): + self.assertEqual(square.area(8.5), 72.25) + + # Проверяет, когда периметр равен 0 + def test_three_mul(self): + self.assertEqual(square.perimeter(0), 0) + + # Проверяет, когда сторона равна 10 + def test_four_mul(self): + self.assertEqual(square.perimeter(10), 40) + + # Проверяет, является ли сторона действительным числом + def test_five_mul(self): + self.assertEqual(square.perimeter(2.25), 9) + + # Проверяет правильное значение для площади + def test_six_mul(self): + self.assertNotEqual(square.area(10), 40) + + # Проверяет правильное значение для периметра + def test_seven_mul(self): + self.assertNotEqual(square.perimeter(10), 30) + + # Проверяет площадь квадрата, когда сторона отрицательная + def test_eight_mul(self): + self.assertEqual(square.area(-5), "wrong input") + + def test_nine_mul(self): + self.assertEqual(square.perimeter(-5), "wrong input") + + # Проверяет площадь квадрата, когда сторона является символом + def test_ten_mul(self): + self.assertEqual(square.area('a'), "wrong input") + + def test_eleven_mul(self): + self.assertEqual(square.perimeter('a'), "wrong input") + + # Проверяет площадь квадрата, когда сторона является строкой + def test_twelve_mul(self): + self.assertEqual(square.area("string"), "wrong input") + + def test_thirteen_mul(self): + self.assertEqual(square.perimeter("string"), "wrong input") + + # Проверяет, когда сторона слишком большим числом + def test_fourteen_mul(self): + self.assertEqual(square.area(100000000000000000000), "wrong input") + + def test_fiveteen_mul(self): + self.assertEqual(square.perimeter(100000000000000000000), "wrong input") + +if __name__ == '__main__': + unittest.main() \ No newline at end of file diff --git a/tests/test_triangle.py b/tests/test_triangle.py new file mode 100644 index 0000000000..2b6382c975 --- /dev/null +++ b/tests/test_triangle.py @@ -0,0 +1,66 @@ +import triangle +import unittest + +class TriangleTestCase(unittest.TestCase): + # Проверяет, когда стороны равны 0 + def test_zero_mul(self): + self.assertEqual(triangle.area(7, 8), 28) + + # Проверяет, когда стороны равны 10 + def test_one_mul(self): + self.assertEqual(triangle.area(10, 10), 50) + + # Проверяет, являются ли стороны действительным числом + def test_two_mul(self): + self.assertEqual(triangle.area(7.5, 3.5), 13.125) + + # Проверяет, когда периметр равен 0 + def test_three_mul(self): + self.assertEqual(triangle.perimeter(0, 0, 0), 0) + + # Проверяет, когда стороны равны 10 + def test_four_mul(self): + self.assertEqual(triangle.perimeter(10, 6, 8), 24) + + # Проверяет, являются ли стороны действительным числом + def test_five_mul(self): + self.assertEqual(triangle.perimeter(34.23, 42.34, 23.43), 100) + + # Проверяет правильное значение для площади + def test_six_mul(self): + self.assertNotEqual(triangle.area(10, 10), 40) + + # Проверяет правильное значение для периметра + def test_seven_mul(self): + self.assertNotEqual(triangle.perimeter(10, 6, 8), 30) + + # Проверяет площадь треугольника, когда стороны отрицательные + def test_eight_mul(self): + self.assertEqual(triangle.area(-5, 10), "wrong input") + + def test_nine_mul(self): + self.assertEqual(triangle.perimeter(-5, 10, 15), "wrong input") + + # Проверяет площадь квадрата, когда сторона является символом + def test_ten_mul(self): + self.assertEqual(triangle.area('a', 3), "wrong input") + + def test_eleven_mul(self): + self.assertEqual(triangle.perimeter('a', 3, 4), "wrong input") + + # Проверяет периметр квадрата, когда сторона является символом + def test_twelve_mul(self): + self.assertEqual(triangle.area(4, "string"), "wrong input") + + def test_thirteen_mul(self): + self.assertEqual(triangle.perimeter(4, "string", 5), "wrong input") + + # Проверяет, когда сторона слишком большим числом + def test_fourteen_mul(self): + self.assertEqual(triangle.area(10**15, 3), "wrong input") + + def test_fiveteen_mul(self): + self.assertEqual(triangle.perimeter(10**15, 3, 4), "wrong input") + +if __name__ == '__main__': + unittest.main() \ No newline at end of file diff --git a/triangle.py b/triangle.py new file mode 100644 index 0000000000..64433a1426 --- /dev/null +++ b/triangle.py @@ -0,0 +1,32 @@ +def area(a, h): + + ''' + Принимает число a, h (основание и высота треугольника) возвращает площадь треугольника + + Example: + Input: 1 2 + Output: 1 + + ''' + + # Проверка на корректность ввода + if not isinstance(a, (int, float)) or not isinstance(h, (int, float)) or a < 0 or h < 0 or a > 10**10 or h > 10**10: + return "wrong input" + + return a * h / 2 +def perimeter(a, b, c): + ''' + Принимает число a, b, c (стороны треугольника), возвращает периметр треугольника + + Example: + Input: 1 2 3 + Output: 6 + + ''' + + # Проверка на корректность ввода + if not isinstance(a, (int, float)) or not isinstance(b, (int, float)) or not isinstance(c, (int, float)) or a < 0 or b < 0 or c < 0 or a > 10**10 or b > 10**10 or c > 10**10: + return "wrong input" + + + return a + b + c