Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion circle.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

74 changes: 72 additions & 2 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -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
- Square: P = 4a
- Triangle: P = a + b + c
15 changes: 15 additions & 0 deletions rectangle.py
Original file line number Diff line number Diff line change
@@ -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
9 changes: 8 additions & 1 deletion square.py
Original file line number Diff line number Diff line change
@@ -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
44 changes: 44 additions & 0 deletions test_circle.py
Original file line number Diff line number Diff line change
@@ -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)
56 changes: 56 additions & 0 deletions test_rectangle.py
Original file line number Diff line number Diff line change
@@ -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)
44 changes: 44 additions & 0 deletions test_square.py
Original file line number Diff line number Diff line change
@@ -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)
74 changes: 74 additions & 0 deletions test_triangle.py
Original file line number Diff line number Diff line change
@@ -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)
14 changes: 14 additions & 0 deletions triangle.py
Original file line number Diff line number Diff line change
@@ -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