11"""
22Find the area of various geometric shapes
33"""
4- from math import pi
4+ from math import pi , sqrt
55
66
77def surface_area_cube (side_length : float ) -> float :
@@ -26,7 +26,7 @@ def surface_area_sphere(radius: float) -> float:
2626 """
2727 Calculate the Surface Area of a Sphere.
2828 Wikipedia reference: https://en.wikipedia.org/wiki/Sphere
29- :return 4 * pi * r^2
29+ Formula: 4 * pi * r^2
3030
3131 >>> surface_area_sphere(5)
3232 314.1592653589793
@@ -44,7 +44,7 @@ def surface_area_sphere(radius: float) -> float:
4444
4545def area_rectangle (length : float , width : float ) -> float :
4646 """
47- Calculate the area of a rectangle
47+ Calculate the area of a rectangle.
4848
4949 >>> area_rectangle(10, 20)
5050 200
@@ -68,7 +68,7 @@ def area_rectangle(length: float, width: float) -> float:
6868
6969def area_square (side_length : float ) -> float :
7070 """
71- Calculate the area of a square
71+ Calculate the area of a square.
7272
7373 >>> area_square(10)
7474 100
@@ -84,7 +84,7 @@ def area_square(side_length: float) -> float:
8484
8585def area_triangle (base : float , height : float ) -> float :
8686 """
87- Calculate the area of a triangle
87+ Calculate the area of a triangle given the base and height.
8888
8989 >>> area_triangle(10, 10)
9090 50.0
@@ -106,9 +106,42 @@ def area_triangle(base: float, height: float) -> float:
106106 return (base * height ) / 2
107107
108108
109+ def area_triangle_three_sides (side1 : float , side2 : float , side3 : float ) -> float :
110+ """
111+ Calculate area of triangle when the length of 3 sides are known.
112+
113+ This function uses Heron's formula: https://en.wikipedia.org/wiki/Heron%27s_formula
114+
115+ >>> area_triangle_three_sides(5, 12, 13)
116+ 30.0
117+ >>> area_triangle_three_sides(10, 11, 12)
118+ 51.521233486786784
119+ >>> area_triangle_three_sides(-1, -2, -1)
120+ Traceback (most recent call last):
121+ ...
122+ ValueError: area_triangle_three_sides() only accepts non-negative values
123+ >>> area_triangle_three_sides(1, -2, 1)
124+ Traceback (most recent call last):
125+ ...
126+ ValueError: area_triangle_three_sides() only accepts non-negative values
127+ """
128+ if side1 < 0 or side2 < 0 or side3 < 0 :
129+ raise ValueError ("area_triangle_three_sides() only accepts non-negative values" )
130+ elif side1 + side2 < side3 or side1 + side3 < side2 or side2 + side3 < side1 :
131+ raise ValueError ("Given three sides do not form a triangle" )
132+ semi_perimeter = (side1 + side2 + side3 ) / 2
133+ area = sqrt (
134+ semi_perimeter
135+ * (semi_perimeter - side1 )
136+ * (semi_perimeter - side2 )
137+ * (semi_perimeter - side3 )
138+ )
139+ return area
140+
141+
109142def area_parallelogram (base : float , height : float ) -> float :
110143 """
111- Calculate the area of a parallelogram
144+ Calculate the area of a parallelogram.
112145
113146 >>> area_parallelogram(10, 20)
114147 200
@@ -132,7 +165,7 @@ def area_parallelogram(base: float, height: float) -> float:
132165
133166def area_trapezium (base1 : float , base2 : float , height : float ) -> float :
134167 """
135- Calculate the area of a trapezium
168+ Calculate the area of a trapezium.
136169
137170 >>> area_trapezium(10, 20, 30)
138171 450.0
@@ -172,7 +205,7 @@ def area_trapezium(base1: float, base2: float, height: float) -> float:
172205
173206def area_circle (radius : float ) -> float :
174207 """
175- Calculate the area of a circle
208+ Calculate the area of a circle.
176209
177210 >>> area_circle(20)
178211 1256.6370614359173
@@ -188,7 +221,7 @@ def area_circle(radius: float) -> float:
188221
189222def area_ellipse (radius_x : float , radius_y : float ) -> float :
190223 """
191- Calculate the area of a ellipse
224+ Calculate the area of a ellipse.
192225
193226 >>> area_ellipse(10, 10)
194227 314.1592653589793
@@ -214,7 +247,7 @@ def area_ellipse(radius_x: float, radius_y: float) -> float:
214247
215248def area_rhombus (diagonal_1 : float , diagonal_2 : float ) -> float :
216249 """
217- Calculate the area of a rhombus
250+ Calculate the area of a rhombus.
218251
219252 >>> area_rhombus(10, 20)
220253 100.0
@@ -236,24 +269,20 @@ def area_rhombus(diagonal_1: float, diagonal_2: float) -> float:
236269 return 1 / 2 * diagonal_1 * diagonal_2
237270
238271
239- def main ():
240- print ("Areas of various geometric shapes: \n " )
241- print (f"Rectangle: { area_rectangle (10 , 20 )} " )
242- print (f"Square: { area_square (10 )} " )
243- print (f"Triangle: { area_triangle (10 , 10 )} " )
244- print (f"Parallelogram: { area_parallelogram (10 , 20 )} " )
245- print (f"Trapezium: { area_trapezium (10 , 20 , 30 )} " )
246- print (f"Circle: { area_circle (20 )} " )
247- print ("\n Surface Areas of various geometric shapes: \n " )
248- print (f"Cube: { surface_area_cube (20 )} " )
249- print (f"Sphere: { surface_area_sphere (20 )} " )
250- print (f"Rhombus: { area_rhombus (10 , 20 )} " )
251-
252-
253272if __name__ == "__main__" :
254-
255273 import doctest
256274
257275 doctest .testmod (verbose = True ) # verbose so we can see methods missing tests
258276
259- main ()
277+ print ("[DEMO] Areas of various geometric shapes: \n " )
278+ print (f"Rectangle: { area_rectangle (10 , 20 ) = } " )
279+ print (f"Square: { area_square (10 ) = } " )
280+ print (f"Triangle: { area_triangle (10 , 10 ) = } " )
281+ print (f"Triangle: { area_triangle_three_sides (5 , 12 , 13 ) = } " )
282+ print (f"Parallelogram: { area_parallelogram (10 , 20 ) = } " )
283+ print (f"Trapezium: { area_trapezium (10 , 20 , 30 ) = } " )
284+ print (f"Circle: { area_circle (20 ) = } " )
285+ print ("\n Surface Areas of various geometric shapes: \n " )
286+ print (f"Cube: { surface_area_cube (20 ) = } " )
287+ print (f"Sphere: { surface_area_sphere (20 ) = } " )
288+ print (f"Rhombus: { area_rhombus (10 , 20 ) = } " )
0 commit comments