Найти ошибку в модуле работы с множествами - Free Pascal

Узнай цену своей работы

Формулировка задачи:

Есть модуль для работы с множествами:
Листинг программы
  1. unit sets_3;
  2. interface
  3. type
  4. t_mass = array[1..65520 div sizeof(boolean)] of boolean;
  5. t_p_mass = ^t_mass;
  6. procedure create_mass(ku: word; var ka: word; a: t_p_mass);
  7. procedure create_empty_mass(ku: word; var a: t_p_mass; ka: word);
  8. procedure universe(ku: word; var u: t_p_mass);
  9. function equality(ku: word; a,b: t_p_mass): boolean;
  10. function inclusion(ku: word; a,b: t_p_mass): boolean;
  11. function str_inclusion(ku: word; a,b: t_p_mass): boolean;
  12. procedure association(ku: word; a,b: t_p_mass; var c: t_p_mass; kc: word);
  13. procedure cross(ku: word; a,b: t_p_mass; var c: t_p_mass; kc: word);
  14. procedure difference(ku: word; a,b: t_p_mass; var c: t_p_mass; kc: word);
  15. procedure smc_difference(ku: word; a,b: t_p_mass; var c: t_p_mass; kc: word);
  16. procedure addition(ku: word; a: t_p_mass; var c: t_p_mass; kc: word);
  17. implementation
  18. //ka,kb,kc,ku - число элементов множества a,b,c,u соответственно.
  19. var
  20. i,t: word;
  21. a,b,c,u: t_p_mass;
  22. ka,kb,kc,ku: word;
  23. procedure create_mass;
  24. //Процедура создания динамического массива типа t_p_mass в памяти и ввода его значений.
  25. //Входные параметры: ku - мощность универсума.
  26. //Выходные параметры: A - массив, хранящий элементы множества A.
  27. var
  28. i,j: word;
  29. k,t: integer;
  30. begin
  31. getmem(a, (ku) * sizeof(t_p_mass));
  32. for i:=1 to ku do
  33. a^[i]:=false;
  34. write('Введите количество элементов множества: ');
  35. read(ka);
  36. write('Введите элементы множества: ');
  37. for i:= 1 to ka do
  38. begin
  39. read(t);
  40. a^[t]:=true;
  41. end;
  42. end;
  43. procedure create_empty_mass;
  44. //Процедура создания пустого массива типа t_p_mass в памяти.
  45. //Входные параметры: ku - мощность универсума.
  46. //Выходные параметры: A - пустой массив для хранения элементов множества.
  47. begin
  48. ka:= 0;
  49. new(a);
  50. getmem(a, ku*sizeof(t_p_mass));
  51. end;
  52. procedure universe;
  53. //Процедура создания универсума.
  54. //Входные параметры: ku - мощность универсума.
  55. //Выходные параметры: u - множество с элементами универсума.
  56. var
  57. i: integer;
  58. begin
  59. for i:=1 to ku do
  60. u^[i]:=true;
  61. end;
  62. function equality;
  63. //Функция вычисления равенства A и B.
  64. //Вход: А - массив, хранящий элементы множества А;
  65. // B - массив, хранящий элементы множества B;
  66. // ka - мощность множества A;
  67. // kb - мощность множества B;
  68. //Выход: F=true, если A=B, иначе F=false.
  69. var
  70. f: boolean;
  71. i: word;
  72. begin
  73. i:=1;
  74. f:=true;
  75. while (i<=ku) and (f=true) do
  76. begin
  77. f:=a^[i]=b^[i];
  78. i:=i+1;
  79. end;
  80. equality:=f;
  81. end;
  82. function inclusion;
  83. //Функция вычисления включения A в B.
  84. //Вход: А - массив, хранящий элементы множества А;
  85. // B - массив, хранящий элементы множества B;
  86. //Выход: F=true, если A включено в B, иначе F=false.
  87. var
  88. f: boolean;
  89. i: word;
  90. begin
  91. i:=1;
  92. f:=true;
  93. while (i<=ku) and (f=true) do
  94. begin
  95. f:=a^[i]<=b^[i];
  96. i:=i+1;
  97. end;
  98. inclusion:=f;
  99. end;
  100. function str_inclusion;
  101. //Функция вычисления строгого включения A в B.
  102. //Вход: А - массив, хранящий элементы множества А;
  103. // B - массив, хранящий элементы множества B;
  104. //Выход: F=true, если A включено в B и не равно ему, иначе F=false.
  105. var
  106. f,f2: boolean;
  107. i: word;
  108. begin
  109. i:=1;
  110. f:=true;
  111. while (i<=ku) and (f=true) do
  112. begin
  113. f:=a^[i]=b^[i];
  114. i:=i+1;
  115. end;
  116. i:=1;
  117. f2:=true;
  118. while (i<=ku) and (f2=true) do
  119. begin
  120. f2:=a^[i]<=b^[i];
  121. i:=i+1;
  122. end;
  123. str_inclusion:= ((not f) and f2);
  124. end;
  125. procedure association;
  126. //Процедура вычисления объединения A и B.
  127. //Вход: А - массив, хранящий элементы множества А;
  128. // B - массив, хранящий элементы множества B;
  129. // ku - число элементов универсума;
  130. //Выход: C - массив, хранящий объединение множеств A и B;
  131. // kc - число элементов конечного множества.
  132. var
  133. i: word;
  134. begin
  135. kc:=0;
  136. for i:=1 to ku do
  137. begin
  138. c^[i]:=a^[i] or b^[i];
  139. if c^[i]=true then kc:=kc+1;
  140. end;
  141. end;
  142. procedure cross;
  143. //Процедура вычисления пересечения A и B.
  144. //Вход: А - массив, хранящий элементы множества А;
  145. // B - массив, хранящий элементы множества B;
  146. // ku - число элементов универсума;
  147. //Выход: C - массив, хранящий пересечение множеств A и B;
  148. // kc - число элементов конечного множества.
  149. var
  150. i: word;
  151. begin
  152. kc:=0;
  153. for i:=1 to ku do
  154. begin
  155. c^[i]:=a^[i] and b^[i];
  156. if c^[i]=true then kc:=kc+1;
  157. end;
  158. end;
  159. procedure difference;
  160. //Процедура вычисления разности A и B.
  161. //Вход: А - массив, хранящий элементы множества А;
  162. // B - массив, хранящий элементы множества B;
  163. // ku - число элементов универсума;
  164. //Выход: C - массив, хранящий разность множеств A и B;
  165. // kc - число элементов конечного множества.
  166. var
  167. i: word;
  168. begin
  169. kc:=0;
  170. for i:=1 to ku do
  171. begin
  172. c^[i]:=a^[i]>b^[i];
  173. if c^[i]=true then kc:=kc+1;
  174. end;
  175. end;
  176. procedure smc_difference;
  177. //Процедура вычисления симметрической разности A и B.
  178. //Вход: А - массив, хранящий элементы множества А;
  179. // B - массив, хранящий элементы множества B;
  180. // ku - число элементов универсума;
  181. //Выход: C - массив, хранящий симметрическую разность множеств A и B;
  182. // kc - число элементов конечного множества.
  183. var
  184. i: word;
  185. begin
  186. kc:=0;
  187. for i:=1 to ku do
  188. begin
  189. c^[i]:=a^[i]<>b^[i];
  190. if c^[i]=true then kc:=kc+1;
  191. end;
  192. end;
  193. procedure addition;
  194. //Процедура вычисления дополнения множества A.
  195. //Вход: А - массив, хранящий элементы множества А;
  196. // ku - число элементов универсума;
  197. //Выход: C - массив, хранящий дополнение множества A;
  198. // kc - число элементов конечного множества.
  199. var
  200. i: word;
  201. begin
  202. kc:=0;
  203. for i:=1 to ku do
  204. begin
  205. c^[i]:=(not a^[i]);
  206. if c^[i]=true then kc:=kc+1;
  207. end;
  208. end;
  209. end.
И есть программа, работающая с ним. Например:
Листинг программы
  1. program test;
  2. uses crt, sets_3;
  3.  
  4. var
  5. i: word;
  6. a: t_p_mass;
  7. ka,ku: word;
  8. begin
  9. ku:=10;
  10. clrscr;
  11. create_mass(ku,ka,a);
  12. for i:=1 to ku do
  13. if a^[i]=true then
  14. write(i, ' ');
  15. end.
При попытке вывода элементов выбивает ошибку, связанную с памятью. Но я не могу понять, где именно ошибка. Подскажите, пожалуйста. Понимаю, что где-то в процедуре создания массива, но где именно?

Решение задачи: «Найти ошибку в модуле работы с множествами»

textual
Листинг программы
  1. procedure create_mass(ku: word; var ka: word; VAR a: t_p_mass);

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.857 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы