Найти ошибку в модуле работы с множествами - 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);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д