From 9f6ced63114aa544348dbe01eb42a3d56a0c680e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B5=D1=80=D0=BE=D0=BD=D0=B8=D0=BA=D0=B0=20=D0=96?= =?UTF-8?q?=D1=83=D1=80=D0=B0=D0=B2=D0=BA=D0=BE=D0=B2=D0=B0?= Date: Wed, 23 Oct 2024 10:54:01 +0300 Subject: [PATCH 1/5] Added new file rectangle.py --- rectangle.py | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 rectangle.py diff --git a/rectangle.py b/rectangle.py new file mode 100644 index 0000000000..8e706bb292 --- /dev/null +++ b/rectangle.py @@ -0,0 +1,7 @@ + +def area(a): + return a * b + + +def perimeter(a): + return a + b From 84200abd3b24e61ad9a7796d09e37d01ecb55046 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B5=D1=80=D0=BE=D0=BD=D0=B8=D0=BA=D0=B0=20=D0=96?= =?UTF-8?q?=D1=83=D1=80=D0=B0=D0=B2=D0=BA=D0=BE=D0=B2=D0=B0?= Date: Wed, 23 Oct 2024 11:04:03 +0300 Subject: [PATCH 2/5] Added new file triangle.py --- triangle.py | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 triangle.py diff --git a/triangle.py b/triangle.py new file mode 100644 index 0000000000..8871838cd1 --- /dev/null +++ b/triangle.py @@ -0,0 +1,5 @@ +def area(a, h): + return a * h / 2 + +def perimeter(a, b, c): + return a + b + c From c9e17362bcd6a21469ecbe60c66634495017a895 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B5=D1=80=D0=BE=D0=BD=D0=B8=D0=BA=D0=B0=20=D0=96?= =?UTF-8?q?=D1=83=D1=80=D0=B0=D0=B2=D0=BA=D0=BE=D0=B2=D0=B0?= Date: Wed, 23 Oct 2024 11:13:50 +0300 Subject: [PATCH 3/5] Fixed error in rectangle.py perimeter --- rectangle.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rectangle.py b/rectangle.py index 8e706bb292..44ce24a8f5 100644 --- a/rectangle.py +++ b/rectangle.py @@ -4,4 +4,4 @@ def area(a): def perimeter(a): - return a + b + return a + b + c + d From 4011bb8a1b0847061dc59f83eca486d44c896423 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B5=D1=80=D0=BE=D0=BD=D0=B8=D0=BA=D0=B0=20=D0=96?= =?UTF-8?q?=D1=83=D1=80=D0=B0=D0=B2=D0=BA=D0=BE=D0=B2=D0=B0?= Date: Tue, 3 Dec 2024 18:23:48 +0300 Subject: [PATCH 4/5] Added tests to program --- test_results.py | 331 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 331 insertions(+) create mode 100644 test_results.py diff --git a/test_results.py b/test_results.py new file mode 100644 index 0000000000..9992f9af93 --- /dev/null +++ b/test_results.py @@ -0,0 +1,331 @@ +import unittest +from math import isclose + +from rectangle import area, perimeter +class RectangleTestCase(unittest.TestCase): + + def TestCorrect(self): + test_area_data = [ + (2, 5, 10), + (15, 2, 30), + (6, 5, 30), + (6, 60, 360) + ] + for width, height, expect in test_area_data: + with self.subTest(width=width, height=height): + self.assertEqual(area(width, height), expect) + + test_perim_data = [ + (2, 2, 5, 5, 14), + (2, 5, 2, 5, 14), + (2, 5, 5, 2, 14), + (2, 5, 2, 5, 14) + ] + for param_1, param_2, param_3, param_4, expect in test_perim_data: + with self.subTest(param_1=param_1, param_2=param_2, param_3=param_3, param_4=param_4): + self.assertEqual(perimeter(param_1, param_2, param_3, param_4), expect) + + def TestNullValues(self): + test_area_data = [ + (0, 5, 0), + (15, 0, 0), + (0, 0, 0) + ] + for width, height, expect in test_area_data: + with self.subTest(width=width, height=height): + self.assertEqual(area(width, height), expect) + + test_perim_data = [ + (0, 0, 5, 5, 0), + (2, 0, 2, 0, 0), + (2, 0, 0, 2, 0), + (0, 5, 5, 0, 0) + ] + for param_1, param_2, param_3, param_4, expect in test_perim_data: + with self.subTest(param_1=param_1, param_2=param_2, param_3=param_3, param_4=param_4): + self.assertEqual(perimeter(param_1, param_2, param_3, param_4), expect) + + def TestNegativeValues(self): + test_area_data = [ + (3, -5), + (-15, 4), + (-4, -2), + (-5, 0), + (-33, 0) + ] + for width, height in test_area_data: + with self.subTest(width=width, height=height): + result = area(width, height) + self.assertTrue(result == False or result == -1) + + test_perim_data = [ + (0, 0, -5, -5), + (2, -9, 2, -9), + (-2, 0, 0, -2), + (0, -5, -5, 0) + ] + for param_1, param_2, param_3, param_4 in test_perim_data: + with self.subTest(param_1=param_1, param_2=param_2, param_3=param_3, param_4=param_4): + result = perimeter(param_1, param_2, param_3, param_4) + self.assertTrue(result == False or result == -1) + + def TestWrongInputData(self): + + test_perim_data = [ + (1, 4, 2, 3), + (1, 8, 1, 4), + (8, 8, 8, 4) + ] + for param_1, param_2, param_3, param_4 in test_perim_data: + with self.subTest(param_1=param_1, param_2=param_2, param_3=param_3, param_4=param_4): + result = perimeter(param_1, param_2, param_3, param_4) + self.assertTrue(result == False or result == -1) + + def TestAccuracyResults(self): + test_area_data = [ + (2.852, 5.432,15.492064), + (15.345678980, 2.45784930,37.71736633901771), + (6.000000004, 5.4387,32.6322000217548), + (6.009, 6.991, 42.008919) + ] + for width, height, expect in test_area_data: + with self.subTest(width=width, height=height): + res = area(width, height) + self.assertTrue(isclose(res, expect)) + + test_perim_data = [ + (15.492064, 5.4387, 15.492064, 5.4387, 41.861528), + (6.000000004, 6.000000004, 6.000000004, 6.000000004, 24.000000016), + (6.009, 6.009, 6.991, 6.991, 26), + (42.008919, 37.71736633901771, 37.71736633901771, 42.008919, 159.45257067803542) + ] + for param_1, param_2, param_3, param_4, expect in test_perim_data: + with self.subTest(param_1=param_1, param_2=param_2, param_3=param_3, param_4=param_4): + res = perimeter(param_1, param_2, param_3, param_4) + self.assertTrue(isclose(res, expect)) + +from circle import area, perimeter +class CircleTestCase(unittest.TestCase): + + def TestCorrect(self): + test_area_data = [ + (5, 78.539816339744831), + (134, 56410.43768785832739), + (56, 985.034561657591596), + (2, 12.566370614359173) + ] + for radius, expect in test_area_data: + with self.subTest(radius=radius): + res = area(radius) + self.assertTrue(isclose(res, expect)) + + test_perim_data = [ + (5, 31,415926535897932), + (134, 841,946831162064588), + (56, 351,858377202056843), + (2, 12.566370614359173) + ] + for radius, expect in test_perim_data: + with self.subTest(radius=radius): + res = perimeter(radius) + self.assertTrue(isclose(res, expect)) + + def TestNullValues(self): + test_area_data = [ + (0, 0) + ] + for radius, expect in test_area_data: + with self.subTest(radius=radius): + res = area(radius) + self.assertEqual(res, expect) + + test_perim_data = [ + (0, 0) + ] + for radius, expect in test_perim_data: + with self.subTest(radius=radius): + res = perimeter(radius) + self.assertEqual(res, expect) + + def TestNegativeValues(self): + test_area_data = [ + (-15), + (-2), + (-1), + (-1039843349400) + ] + for radius in test_area_data: + with self.subTest(radius=radius): + res = area(radius) + self.assertTrue(res == False or res == -1) + + test_perim_data = [ + (-15), + (-2), + (-1), + (-1039843349400) + ] + for radius in test_perim_data: + with self.subTest(radius=radius): + res = perimeter(radius) + self.assertTrue(res == False or res == -1) + + +from square import area, perimeter +class SquareTestCase(unittest.TestCase): + def TestCorrect(self): + test_area_data = [ + (5, 25), + (134, 17956), + (56, 3136), + (2, 4) + ] + for side, expect in test_area_data: + with self.subTest(side=side): + self.assertEqual(expect, area(side)) + + test_perim_data = [ + (5, 20), + (134, 536), + (56, 224), + (2, 8) + ] + for side, expect in test_perim_data: + with self.subTest(side=side): + self.assertEqual(expect, perimeter(side)) + + def TestNullValues(self): + test_area_data = [ + (0, 0) + ] + for side, expect in test_area_data: + with self.subTest(side=side): + self.assertEqual(expect, area(side)) + + test_perim_data = [ + (0, 0) + ] + for side, expect in test_perim_data: + with self.subTest(side=side): + self.assertEqual(expect, perimeter(side)) + + def TestNegativeValues(self): + test_area_data = [ + (-15), + (-2), + (-1), + (-1039843349400) + ] + for side in test_area_data: + with self.subTest(side=side): + res = area(side) + self.assertTrue(res == False or res == -1) + + test_perim_data = [ + (-15), + (-2), + (-1), + (-1039843349400) + ] + for side in test_perim_data: + with self.subTest(side=side): + res = perimeter(side) + self.assertTrue(res == False or res == -1) + + def TestAccuracyResults(self): + test_area_data = [ + (37.71736633901771, 1422.599723551666212), + (159.45257067803542, 25425.122295833874622), + (32.6322000217548, 1064.86047825981397), + (42.008919, 1764.749275548561) + ] + for side, expect in test_area_data: + with self.subTest(side=side): + self.assertTrue(isclose(expect, area(side))) + + test_perim_data = [ + (37.71736633901771, 150.86946535607084), + (159.45257067803542, 637.8102827121416), + (32.6322000217548, 130.5288000870192), + (42.008919, 168.035676) + ] + for side, expect in test_perim_data: + with self.subTest(side=side): + self.assertTrue(isclose(expect, perimeter(side))) + + +from triangle import area, perimeter +class TriangleTestCase(unittest.TestCase): + + def TestCorrect(self): + test_area_data = [ + (4, 5, 10), + (30, 2, 30), + (6, 8, 24), + (10, 7, 35) + ] + for osn, height, expect in test_area_data: + with self.subTest(osn=osn, height=height): + self.assertEqual(area(osn, height), expect) + + test_perim_data = [ + (2, 8, 6, 16), + (4, 5, 6, 15), + (19, 4, 20, 43), + (8, 18, 23, 49) + ] + for param_1, param_2, param_3, expect in test_perim_data: + with self.subTest(param_1=param_1, param_2=param_2, param_3=param_3): + self.assertEqual(perimeter(param_1, param_2, param_3), expect) + + + def TestWrongInputData(self): + test_area_data = [ + (3, -5), + (-15, 4), + (4, 0), + (0, 5), + (0, 0), + (-2, -8) + ] + for osn, height in test_area_data: + with self.subTest(osn=osn, height=height): + result = area(osn, height) + self.assertTrue(result == False or result == -1) + + test_perim_data = [ + (10, 3, -5), + (2, -9, 2), + (-2, 11, 8), + (0, 10, 6), + (6, 0, 3), + (8, 19, 0), + (3, 30, 6) + ] + for param_1, param_2, param_3 in test_perim_data: + with self.subTest(param_1=param_1, param_2=param_2, param_3=param_3): + result = perimeter(param_1, param_2, param_3) + self.assertTrue(result == False or result == -1) + + + def TestAccuracyResults(self): + test_area_data = [ + (2.852, 5.432, 7.746032), + (15.345678980, 2.45784930, 18.858683169508855), + (6.000000004, 5.4387, 16.3161000108774), + (6.009, 6.991, 21.0044595) + ] + for osn, height, expect in test_area_data: + with self.subTest(osn=osn, height=height): + res = area(osn, height) + self.assertTrue(isclose(res, expect)) + + test_perim_data = [ + (15.492064, 5.4387, 11.492064, 32.422828), + (6.000000004, 3.000000004, 5.000000004, 14.000000012), + (42.008919, 37.71736633901771, 32.008919, 111,73520433901771) + ] + for param_1, param_2, param_3, expect in test_perim_data: + with self.subTest(param_1=param_1, param_2=param_2, param_3=param_3): + res = perimeter(param_1, param_2, param_3) + self.assertTrue(isclose(res, expect)) From 63e42b6bc28050afbcc3495e98cf98bc0093c619 Mon Sep 17 00:00:00 2001 From: verliiar Date: Wed, 4 Dec 2024 11:08:32 +0300 Subject: [PATCH 5/5] Update README.md --- docs/README.md | 127 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 117 insertions(+), 10 deletions(-) diff --git a/docs/README.md b/docs/README.md index 63f8727939..44887c2288 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,10 +1,117 @@ -# 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 + +# Project Documentation + +## Общее описание решения +Этот проект включает в себя набор функций для работы с геометрическими фигурами такими как: прямоугольник, круг, квадрат, треугольник. +Для каждой фигуры существуют функции вычисления площади (`area`) и периметра (`perimeter`). + +Проект структурирован по файлам, где каждая фигура представлена отдельным модулем: + +- `rectangle.py` — работа с прямоугольниками. +- `circle.py` — работа с кругами. +- `square.py` — работа с квадратами. +- `triangle.py` — работа с треугольниками. + +--- + +## Описание функций + +### Файл: rectangle.py +#### +```def area(a, b) +'''Принимает параметры a и b (размеры прямоугольника), и вычисляет его площадь по формуле произведения.''' +``` +**Пример вызова**: +``` +area(4, 5) # Результат: 20 +``` + +#### +```def perimeter(a, b, c, d) +'''Принимает параметры a, b, c, d - 4 стороны прямоугольника, и вычисляет его периметр по формуле суммы длинн всех сторон''' +``` +**Пример вызова**: +``` +perimeter(4, 1, 4, 1) # Результат: 10 +``` + +### Файл: square.py +#### +```def area(a) +'''Принимает параметр a (длинна стороны квадрата), и вычисляет его площадь по формуле, возводя эту сторону в квадрат (все стороны квадрата равны).''' +``` +**Пример вызова**: +``` +area(3) # Результат: 9 +``` + +#### +```def perimeter(a) +'''Принимает параметр a (длинна стороны квадрата), и вычисляет его периметр, умножая сторону на 4 (т.к. все стороны квадрата равны).''' +``` +**Пример вызова**: +``` +perimeter(3) # Результат: 12 +``` + +### Файл: triangle.py +#### +```def area(a, h) +'''Принимает параметры a и h (основание треугольника и его высота соответственно), и вычисляет его площадь по формуле произведения 1/2 основания на высоту.''' +``` +**Пример вызова**: +``` +area(4, 3) # Результат: 6 +``` + +#### +```def perimeter(a, b, c) +'''Принимает параметры a и b и c (все три измерения треугольника), и вычисляет его периметр как сумму трех сторон''' +``` +**Пример вызова**: +``` +perimeter(3, 5, 7) # Результат: 15 +``` + +### Файл: circle.py +#### +```import math +'''Подключает библиотеку math для использования числа pi при вычислениях.''' +def area(r) +'''Принимает параметр r (радиус круга), и вычисляет его площадь по формуле произведения квадрата радиуса на число pi.''' +``` +**Пример вызова**: +``` +area(4) # Результат: 16pi +``` + +#### +```def perimeter(r) +'''Принимает параметр r - радиус треугольника, и вычисляет его периметр по формуле произведения 2pi на r''' +``` +**Пример вызова**: +``` +perimeter(4) # Результат: 8pi +``` + +--- + +## История изменений проекта + +1. **Хэш коммита: 8ba9aeb** +Добавлены файлы для вычисления периметра и площади круга и квадрата `circle.py` и `square.py` соответственно. + +2. **Хэш коммита: d078c8d** +Добавлен изначальный вариант файла docs - описания функционала проекта. + +3. **Хэш коммита: 9f6ced6** +Добавлен новый файл для вычисления периметра и площади прямоугольника `rectangle.py`. + +4. **Хэш коммита: 84200ab** +Добавлен новый файл для вычисления периметра и площади треугольника `triangle.py`. + + +5. **Хэш коммита: c9e1736** +Была исправлена ошибка в вычислении периметра прямоугольника, файл `rectangle.py`. + +---