Узнаю дубовый стиль преподавания.
Вместо
type
massiv = array of integer;
myset = set of byte;
var
mass : massiv;
mn : myset;
пишем
var
mass : array of integer;
mn : set of byte;
Если вы передаете в функцию не копию массива, а сам массив (а это видно по слову var в параметрах), совершенно не обязательно его возвращать. И вообще, это лучше сделать процедурой. Кроме того, у вас всего один массив и всего одно множество, так что передавать их совершенно излишне - они и так в программе висят. Вместо
function clm(var mass: massiv; mn : myset): massiv;
можно написать просто: procedure clm;
Строка result:=mass тоже идет лесом
Операторные скобки begin и end имеют смысл только для нескольких операторов. Одиночный оператор ими обрамлять нужно только в том случае, если он в одиночку составляет все тело программы. Вместо
Код: Выделить всё
for i:=1 to length(mass) do
begin
if mass[i] in mn then
begin
for s:=i+1 to length(mass) do
begin
mass[s-1]:= mass[s];
setlength(mass,(n-1));
end;
end;
end;
пишем
Код: Выделить всё
for i:=1 to length(mass) do
if mass[i] in mn then
begin
for s:=i+1 to length(mass) do
mass[s-1]:= mass[s];
setlength(mass,(n-1));
end;
Кстати, setlength лучше вынести из внутреннего цикла. А то так и будет зачем-то много раз устанавливать эту несчастную длину.
Кроме того, вы делаете ужасную вещь. Вы перед вызовом сlm запихиваете в n последний элемент множества. Допустим, есть у вас массив длиной 1000 элементов. А последний элемент множества у вас - число 2. И что? Компилятор выполнит setlength(mass, 2-1) - и останется у вас массив с одним элементом. Так что заменяем setlength(mass,(n-1)) на setlength(mass, length(mass)-1).
readln(m);
n:=m-1;
setlength(mass,n);
- это вообще бред. Длина массива должна быть именно m, а индексы в нем - от 0 до m-1. Можете проверить: от 0 до 9 включительно ровно 10 цифр. Так что пишем
readln(m);
setlength(mass, m);
И следующий цикл будет уже не for i:= 0 to n do, а for i:= 0 to m do.
Далее. Вы когда-нибудь пробовали вводить вручную, скажем, 100 значений? Если нет, предупреждаю сразу - это муторно. Лучше пусть программа их сама вводит, от балды. Так что ставим в самом начале кода uses crt;, после begin - randomize, а цикл у нас будет выглядеть где-то так:
for i:= 0 to m do mass
:=random(100);
Далее
for i:=0 to length(mass) do
begin
writeln(mass,' ');
end;
Как я уже говорил - begin и end тут не нужны
Ну а дальше - уже сами.