Skip to content

Commit

Permalink
Python exercise 2.
Browse files Browse the repository at this point in the history
  • Loading branch information
jclarkeSTFC committed Jul 25, 2023
1 parent 3b51d96 commit a3a8313
Show file tree
Hide file tree
Showing 4 changed files with 101 additions and 0 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,6 @@ exercises-python/james_clarke/.idea/*
*.exe
*.out
*.app

# Other
*.pyc
32 changes: 32 additions & 0 deletions exercises-python/james_clarke/ex02_oo_basics/ShapeSorter.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
from Shapes import *


class ShapeSorter:
def __init__(self, shapes: list[Shape]):
self.shapes = shapes

def of_type(self, shape_type: type):
matching_shapes = [s for s in self.shapes if isinstance(s, shape_type)]
if len(matching_shapes) == 0:
print("No shapes of type " + str(shape_type))
return
for shape in matching_shapes:
print(shape.to_string())

def with_sides(self, number_sides: int):
matching_shapes = [s for s in self.shapes if s.sides == number_sides]
if len(matching_shapes) == 0:
print("No shapes with " + str(number_sides) + " sides")
return
for shape in matching_shapes:
print(shape.to_string())

def area_descending(self):
sorted_by_area = sorted(self.shapes, key=lambda s: s.area, reverse=True)
for shape in sorted_by_area:
print(shape.to_string())

def perimeter_descending(self):
sorted_by_perimeter = sorted(self.shapes, key=lambda s: s.perimeter, reverse=True)
for shape in sorted_by_perimeter:
print(shape.to_string())
48 changes: 48 additions & 0 deletions exercises-python/james_clarke/ex02_oo_basics/Shapes.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import math


class Shape:
_type_name = "Shape"

def __init__(self, number_of_sides: int, total_area: float, perimeter_length: float):
self.sides = number_of_sides
self.area = total_area
self.perimeter = perimeter_length

def to_string(self) -> str:
return self._type_name + " " + str(self.sides) + " sides, " + str(self.perimeter) + " perimeter, " \
+ str(self.area) + " area"


class Rectangle(Shape):
_type_name = "Rectangle"

def __init__(self, side_length: float, other_side_length: float):
my_area = side_length * other_side_length
my_perimeter = 2 * side_length + 2 * other_side_length
Shape.__init__(self, number_of_sides=4, total_area=my_area, perimeter_length=my_perimeter)


class Square(Rectangle):
_type_name = "Square"

def __init__(self, every_side_length: float):
Rectangle.__init__(self, side_length=every_side_length, other_side_length=every_side_length)


class Circle(Shape):
_type_name = "Circle"

def __init__(self, radius: float):
my_area = math.pi * radius**2
my_perimeter = 2 * math.pi * radius
Shape.__init__(self, number_of_sides=1, total_area=my_area, perimeter_length=my_perimeter)


class Triangle(Shape):
_type_name = "Triangle"

def __init__(self, height: float, base: float):
my_area = 0.5 * base * height
my_perimeter = base + 2*math.sqrt(height**2 + base**2 / 4)
Shape.__init__(self, number_of_sides=3, total_area=my_area, perimeter_length=my_perimeter)
18 changes: 18 additions & 0 deletions exercises-python/james_clarke/ex02_oo_basics/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
from Shapes import *
from ShapeSorter import *


def main():
shapes = [Square(2), Square(2.5), Rectangle(1, 2), Rectangle(2, 1), Triangle(2, 3), Triangle(3.1, 2.3), Circle(4.1)]
sorter = ShapeSorter(shapes)
sorter.of_type(type(Square(2)))
print("")
sorter.with_sides(4)
print("")
sorter.area_descending()
print("")
sorter.perimeter_descending()


if __name__ == "__main__":
main()

0 comments on commit a3a8313

Please sign in to comment.