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

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

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

Есть модуль для работы с множествами:
unit sets_3;
 
interface
 
  type
    t_mass = array[1..65520 div sizeof(boolean)] of boolean;
    t_p_mass = ^t_mass;
 
  procedure create_mass(ku: word; var ka: word; a: t_p_mass);
  procedure create_empty_mass(ku: word; var a: t_p_mass; ka: word);
  procedure universe(ku: word; var u: t_p_mass);
 
  function equality(ku: word; a,b: t_p_mass): boolean;
  function inclusion(ku: word; a,b: t_p_mass): boolean;
  function str_inclusion(ku: word; a,b: t_p_mass): boolean;
  procedure association(ku: word; a,b: t_p_mass; var c: t_p_mass; kc: word);
  procedure cross(ku: word; a,b: t_p_mass; var c: t_p_mass; kc: word);
  procedure difference(ku: word; a,b: t_p_mass; var c: t_p_mass; kc: word);
  procedure smc_difference(ku: word; a,b: t_p_mass; var c: t_p_mass; kc: word);
  procedure addition(ku: word; a: t_p_mass; var c: t_p_mass; kc: word);
 
implementation
//ka,kb,kc,ku - число элементов множества a,b,c,u соответственно.
var
  i,t: word;
  a,b,c,u: t_p_mass;
  ka,kb,kc,ku: word;
 
procedure create_mass;
//Процедура создания динамического массива типа t_p_mass в памяти и ввода его значений.
//Входные параметры: ku - мощность универсума.
//Выходные параметры: A - массив, хранящий элементы множества A.
var
  i,j: word;
  k,t: integer;
 
begin
  getmem(a, (ku) * sizeof(t_p_mass));
  for i:=1 to ku do
    a^[i]:=false;
  write('Введите количество элементов множества: ');
  read(ka);
  write('Введите элементы множества: ');
  for i:= 1 to ka do
    begin
      read(t);
      a^[t]:=true;
      end;
end;
 
procedure create_empty_mass;
//Процедура создания пустого массива типа t_p_mass в памяти.
//Входные параметры: ku - мощность универсума.
//Выходные параметры: A - пустой массив для хранения элементов множества.
 
begin
  ka:= 0;
  new(a);
  getmem(a, ku*sizeof(t_p_mass));
end;
 
procedure universe;
//Процедура создания универсума.
//Входные параметры: ku - мощность универсума.
//Выходные параметры: u - множество с элементами универсума.
 
var
  i: integer;
 
begin
  for i:=1 to ku do
    u^[i]:=true;
end;
 
function equality;
//Функция вычисления равенства A и B.
//Вход: А - массив, хранящий элементы множества А;
//      B - массив, хранящий элементы множества B;
//      ka - мощность множества A;
//      kb - мощность множества B;
//Выход: F=true, если A=B, иначе F=false.
 
var
  f: boolean;
  i: word;
 
begin
  i:=1;
  f:=true;
  while (i<=ku) and (f=true) do
    begin
      f:=a^[i]=b^[i];
      i:=i+1;
    end;
  equality:=f;
end;
 
function inclusion;
//Функция вычисления включения A в B.
//Вход: А - массив, хранящий элементы множества А;
//      B - массив, хранящий элементы множества B;
//Выход: F=true, если A включено в B, иначе F=false.
 
var
  f: boolean;
  i: word;
 
begin
  i:=1;
  f:=true;
  while (i<=ku) and (f=true) do
    begin
      f:=a^[i]<=b^[i];
      i:=i+1;
    end;
  inclusion:=f;
end;
 
function str_inclusion;
//Функция вычисления строгого включения A в B.
//Вход: А - массив, хранящий элементы множества А;
//      B - массив, хранящий элементы множества B;
//Выход: F=true, если A включено в B и не равно ему, иначе F=false.
 
var
  f,f2: boolean;
  i: word;
 
begin
  i:=1;
  f:=true;
  while (i<=ku) and (f=true) do
    begin
      f:=a^[i]=b^[i];
      i:=i+1;
    end;
 
  i:=1;
  f2:=true;
  while (i<=ku) and (f2=true) do
    begin
      f2:=a^[i]<=b^[i];
      i:=i+1;
    end;
  str_inclusion:= ((not f) and f2);
end;
 
procedure association;
//Процедура вычисления объединения A и B.
//Вход: А - массив, хранящий элементы множества А;
//      B - массив, хранящий элементы множества B;
//      ku - число элементов универсума;
//Выход: C - массив, хранящий объединение множеств A и B;
//       kc - число элементов конечного множества.
var
  i: word;
 
begin
  kc:=0;
  for i:=1 to ku do
  begin
    c^[i]:=a^[i] or b^[i];
    if c^[i]=true then kc:=kc+1;
  end;
 
end;
 
procedure cross;
//Процедура вычисления пересечения A и B.
//Вход: А - массив, хранящий элементы множества А;
//      B - массив, хранящий элементы множества B;
//      ku - число элементов универсума;
//Выход: C - массив, хранящий пересечение множеств A и B;
//       kc - число элементов конечного множества.
 
var
  i: word;
 
begin
  kc:=0;
  for i:=1 to ku do
  begin
    c^[i]:=a^[i] and b^[i];
    if c^[i]=true then kc:=kc+1;
  end;
end;
 
procedure difference;
//Процедура вычисления разности A и B.
//Вход: А - массив, хранящий элементы множества А;
//      B - массив, хранящий элементы множества B;
//      ku - число элементов универсума;
//Выход: C - массив, хранящий разность множеств A и B;
//       kc - число элементов конечного множества.
 
var
  i: word;
 
begin
  kc:=0;
  for i:=1 to ku do
  begin
    c^[i]:=a^[i]>b^[i];
    if c^[i]=true then kc:=kc+1;
  end;
end;
 
procedure smc_difference;
//Процедура вычисления симметрической  разности A и B.
//Вход: А - массив, хранящий элементы множества А;
//      B - массив, хранящий элементы множества B;
//      ku - число элементов универсума;
//Выход: C - массив, хранящий симметрическую разность множеств A и B;
//       kc - число элементов конечного множества.
 
var
  i: word;
 
begin
  kc:=0;
  for i:=1 to ku do
  begin
    c^[i]:=a^[i]<>b^[i];
    if c^[i]=true then kc:=kc+1;
  end;
end;
 
procedure addition;
//Процедура вычисления дополнения множества A.
//Вход: А - массив, хранящий элементы множества А;
//      ku - число элементов универсума;
//Выход: C - массив, хранящий дополнение множества A;
//       kc - число элементов конечного множества.
 
var
  i: word;
 
begin
  kc:=0;
  for i:=1 to ku do
  begin
    c^[i]:=(not a^[i]);
    if c^[i]=true then kc:=kc+1;
  end;
end;
 
end.
И есть программа, работающая с ним. Например:
program test;
 
uses crt, sets_3;

var
  i: word;
  a: t_p_mass;
  ka,ku: word;
 
begin
  ku:=10;
  clrscr;
  create_mass(ku,ka,a);
    for i:=1 to ku do
  if a^[i]=true then
    write(i, ' ');
end.
При попытке вывода элементов выбивает ошибку, связанную с памятью. Но я не могу понять, где именно ошибка. Подскажите, пожалуйста. Понимаю, что где-то в процедуре создания массива, но где именно?

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

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

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


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

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

14   голосов , оценка 3.857 из 5
Похожие ответы