Advertisement
Guest User

Untitled

a guest
Feb 22nd, 2017
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.23 KB | None | 0 0
  1. -module(shapes).
  2. -export([perimeter/1, area/1, enclose/1, startTests/0]).
  3.  
  4. % For Functional Programming in Erlang
  5. % Kent University
  6. % 21 February 2017
  7.  
  8.  
  9. %%
  10. %% Triangle Inequality Theorem defines valid Triangles
  11. %%
  12.  
  13. validTriangle({A, B, C}) when A + B > C, B + C > A, A + C > B ->
  14. true;
  15. validTriangle({_A, _B, _C}) ->
  16. false.
  17.  
  18.  
  19. %%
  20. %% Perimeter Formula for Square, Rectangle, Circle and Triangle
  21. %%
  22.  
  23. perimeter({square, X}) when is_integer(X) or is_float(X) ->
  24. {ok, X * 4};
  25.  
  26. perimeter({rectangle, X, Y}) when (is_integer(X) or is_float(X)) and (is_integer(Y) or is_float(Y)) ->
  27. {ok, X * 2 + Y * 2};
  28.  
  29. perimeter({circle, R}) when is_integer(R) or is_float(R) ->
  30. {ok, 2 * math:pi() * R};
  31.  
  32. perimeter({triangle, A, B, C}) ->
  33. case validTriangle({A, B, C}) of
  34. true ->
  35. {ok, A + B + C};
  36. false ->
  37. {error, -1}
  38. end.
  39.  
  40.  
  41.  
  42. %%
  43. %% Area Formula for Square, Rectangle, Circle and Triangle
  44. %%
  45.  
  46. area({square, X}) when is_integer(X) or is_float(X) ->
  47. {ok, X * X};
  48.  
  49. area({rectangle, X, Y}) when (is_integer(X) or is_float(X)) and (is_integer(Y) or is_float(Y)) ->
  50. {ok, X * Y};
  51.  
  52. area({circle, R}) when is_integer(R) or is_float(R) ->
  53. {ok, math:pi() * R * R};
  54.  
  55. area({triangle, A, B, C}) -> %% validTriangle/3 will guard against non number inputs
  56. case validTriangle({A, B, C}) of
  57. true -> %% See Heron's Formula. This is valid for all triangle types
  58. S = (A+B+C)/2,
  59. {ok, math:sqrt(S*(S-A)*(S-B)*(S-C))};
  60. false ->
  61. {error, -1}
  62. end.
  63.  
  64.  
  65.  
  66. %%
  67. %% Enclosing Box Formula for Square, Rectangle, Circle and Triangle
  68. %%
  69.  
  70. enclose({square, X}) when is_integer(X) or is_float(X) ->
  71. {ok, {0, 0}, {0, X}, {X, 0}, {X, X}};
  72.  
  73. enclose({rectangle, X, Y}) ->
  74. {ok, {0, 0}, {0, X}, {Y, 0}, {Y,X}};
  75.  
  76. enclose({circle, R}) when is_integer(R) or is_float(R) ->
  77. {ok, {0, 0}, {0, 2 * R}, {2 * R, 0}, {2 * R, 2 * R}};
  78.  
  79. enclose({triangle, A, B, C}) -> %% validTriangle/3 will guard against non number inputs
  80. case validTriangle({A, B, C}) of
  81. true ->
  82. S = (A+B+C)/2, %% Heron's formula also yields triangle height given dimensions
  83. H = (2/C) * math:sqrt(S*(S-A)*(S-B)*(S-C)),
  84. {ok, {0, 0}, {0, H}, {C, 0}, {C, H}};
  85. false ->
  86. {error, -1}
  87. end.
  88.  
  89.  
  90. %%
  91. %% TESTS
  92. %%
  93.  
  94. printTest(TESTNAME, EXPECTED, OUTPUT) ->
  95. {ok, R} = OUTPUT,
  96. io:fwrite("~s should be \t\t ~w -> ~w\n", [TESTNAME, EXPECTED, R]).
  97.  
  98. printTest(TESTNAME, EXPECTED, OUTPUT, _TYPE) ->
  99. {ok, A, B, C, D} = OUTPUT,
  100. io:fwrite("~s should be \t\t ~w -> ~w,~w,~w,~w\n", [TESTNAME, EXPECTED, A, B, C, D]).
  101.  
  102.  
  103. startTests() ->
  104.  
  105. %% Perimeter Tests
  106.  
  107. printTest("Perimeter : Square : Integer ", 8, perimeter({square, 2})),
  108. printTest("Perimeter : Square : Float", 16.0, perimeter({square, 4.0})),
  109. printTest("Perimeter : Rectangle : Integer ", 14, perimeter({rectangle, 3, 4})),
  110. printTest("Perimeter : Rectangle : Float", 20.0, perimeter({rectangle, 9.0, 1.0})),
  111. printTest("Perimeter : Circle : Integer ", 2 * math:pi()*10, perimeter({circle, 10})),
  112. printTest("Perimeter : Circle : Float", 2 * math:pi()*20.0, perimeter({circle, 20.0})),
  113. printTest("Perimeter : Triangle : Integer ", 31, perimeter({triangle, 15, 9, 7})),
  114. printTest("Perimeter : Triangle : Float ", 31.0, perimeter({triangle, 15.0, 9.0, 7.0})),
  115. io:fwrite("\n"),
  116.  
  117. %% Area Test
  118.  
  119. printTest("Area : Square : Integer ", 4, area({square, 2})),
  120. printTest("Area : Square : Float", 25.0, area({square, 5.0})),
  121. printTest("Area : Rectangle : Integer ", 12, area({rectangle, 3, 4})),
  122. printTest("Area : Rectangle : Float", 9.0, area({rectangle, 9.0, 1.0})),
  123. printTest("Area : Circle : Integer ", math:pi()*10*10, area({circle, 10})),
  124. printTest("Area : Circle : Float", math:pi()*20.0*20.0, area({circle, 20.0})),
  125. printTest("Area : Triangle : Integer ", 20.69269194667528, area({triangle, 15, 9, 7})),
  126. printTest("Area : Triangle : Float ", 20.69269194667528, area({triangle, 15.0, 9.0, 7.0})),
  127. io:fwrite("\n"),
  128.  
  129. %% Enclosing Square Test
  130.  
  131. printTest("Enclosing Square : Square : Integer ", '{0,0},{0,2},{2,0},{2,2}', enclose({square, 2}), "Enclosing"),
  132. printTest("Enclosing Square : Square : Float", '{0,0},{0,5.0},{5.0,0},{5.0,5.0}', enclose({square, 5.0}), "Enclosing"),
  133. printTest("Enclosing Square : Rectangle : Integer ", '{0,0},{0,3},{4,0},{4,3}', enclose({rectangle, 3, 4}), "Enclosing"),
  134. printTest("Enclosing Square : Rectangle : Float", '{0,0},{0,9.0},{1.0,0},{1.0,9.0}', enclose({rectangle, 9.0, 1.0}), "Enclosing"),
  135. printTest("Enclosing Square : Circle : Integer ", '{0,0},{0,20},{20,0},{20,20}', enclose({circle, 10}), "Enclosing"),
  136. printTest("Enclosing Square : Circle : Float", '{0,0},{0,40.0},{40.0,0},{40.0,40.0}', enclose({circle, 20.0}), "Enclosing"),
  137. printTest("Enclosing Square : Triangle : Integer ", '{0,0},{0,5.912197699050079},{7,0},{7,5.912197699050079}', enclose({triangle, 15, 9, 7}), "Enclosing"),
  138. printTest("Enclosing Square : Triangle : Float ", '{0,0},{0,5.912197699050079},{7,0},{7,5.912197699050079}', enclose({triangle, 15.0, 9.0, 7.0}), "Enclosing").
  139.  
  140.  
  141.  
  142. %% OUTPUT FROM TESTS
  143.  
  144. %% 197> shapes:startTests().
  145. %% Perimeter : Square : Integer should be 8 -> 8
  146. %% Perimeter : Square : Float should be 16.0 -> 16.0
  147. %% Perimeter : Rectangle : Integer should be 14 -> 14
  148. %% Perimeter : Rectangle : Float should be 20.0 -> 20.0
  149. %% Perimeter : Circle : Integer should be 62.83185307179586 -> 62.83185307179586
  150. %% Perimeter : Circle : Float should be 125.66370614359172 -> 125.66370614359172
  151. %% Perimeter : Triangle : Integer should be 15 -> 31
  152. %% Perimeter : Triangle : Float should be 15.0 -> 31.0
  153.  
  154. %% Area : Square : Integer should be 4 -> 4
  155. %% Area : Square : Float should be 25.0 -> 25.0
  156. %% Area : Rectangle : Integer should be 12 -> 12
  157. %% Area : Rectangle : Float should be 9.0 -> 9.0
  158. %% Area : Circle : Integer should be 314.1592653589793 -> 314.1592653589793
  159. %% Area : Circle : Float should be 1256.6370614359173 -> 1256.6370614359173
  160. %% Area : Triangle : Integer should be 20.69269194667528 -> 20.69269194667528
  161. %% Area : Triangle : Float should be 20.69269194667528 -> 20.69269194667528
  162.  
  163. %% Enclosing Square : Square : Integer should be '{0,0},{0,2},{2,0},{2,2}' -> {0,0},{0,2},{2,0},{2,2}
  164. %% Enclosing Square : Square : Float should be '{0,0},{0,5.0},{5.0,0},{5.0,5.0}' -> {0,0},{0,5.0},{5.0,0},{5.0,5.0}
  165. %% Enclosing Square : Rectangle : Integer should be '{0,0},{0,3},{4,0},{4,3}' -> {0,0},{0,3},{4,0},{4,3}
  166. %% Enclosing Square : Rectangle : Float should be '{0,0},{0,9.0},{1.0,0},{1.0,9.0}' -> {0,0},{0,9.0},{1.0,0},{1.0,9.0}
  167. %% Enclosing Square : Circle : Integer should be '{0,0},{0,20},{20,0},{20,20}' -> {0,0},{0,20},{20,0},{20,20}
  168. %% Enclosing Square : Circle : Float should be '{0,0},{0,40.0},{40.0,0},{40.0,40.0}' -> {0,0},{0,40.0},{40.0,0},{40.0,40.0}
  169. %% Enclosing Square : Triangle : Integer should be '{0,0},{0,5.912197699050079},{7,0},{7,5.912197699050079}' -> {0,0},{0,5.912197699050079},{7,0},{7,5.912197699050079}
  170. %% Enclosing Square : Triangle : Float should be '{0,0},{0,5.912197699050079},{7,0},{7,5.912197699050079}' -> {0,0},{0,5.912197699050079},{7.0,0},{7.0,5.912197699050079}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement