Пожалуйста помогите решить задачку....
Написать функцию которая принимает на вход динамический массив целых чисел и множество чисел, которых в этом массиве быть не должно. Функция должна исключить из массива все указанные в множестве числа.
Задачка должна быть написана на Delphi
Удаление элементов множества из динамического массива...
Я воопще не представляю как это сделать...((((
-
- Сообщения: 526
- Зарегистрирован: 03 янв 2009, 23:17
- Откуда: Voronezh
- Контактная информация:
Ну если "воопще", то это тяжелый случай 
Описываешь сначала тип массива и тип множества, что-то типа:
type massiv=array[1..1000] of integer;
mnozh=set of integer;
Потом объявляешь функцию:
function CleanMass(mass:^massiv;mn:mnozh):^massiv;
Потом включаешь голову, читаешь темы "Множества" и "Динамические структуры данных", разбираешься и собственно реализуешь функцию

Описываешь сначала тип массива и тип множества, что-то типа:
type massiv=array[1..1000] of integer;
mnozh=set of integer;
Потом объявляешь функцию:
function CleanMass(mass:^massiv;mn:mnozh):^massiv;
Потом включаешь голову, читаешь темы "Множества" и "Динамические структуры данных", разбираешься и собственно реализуешь функцию

Нет религии выше истины
Вот что у меня получилось, но программа все равно не идет...может кто нибудь знает...плииииззз подскажите как написать.
Код: Выделить всё
program udmas;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
massiv = array of integer;
myset = set of byte;
var
mass : massiv;
mn : myset;
n,m,i,s : integer;
function clm(var mass: massiv; mn : myset): massiv;
var i : integer;
begin
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;
result:= mass;
end;
begin
writeln('vvedite kolvo elementov mass');
readln(m);
n:=m-1;
setlength(mass,n);
for i:= 0 to n do
begin
writeln ('vvedite element mass');
readln(mass[i]);
end;
for i:=0 to n do
begin
write(mass[i],' ');
end;
writeln('vvedite kolvo elementov mnva');
readln(m);
for i:=1 to m do
begin
writeln('vvedite elt mn-va');
readln(n);
include(mn,n);
end;
clm(mass,mn);
for i:=0 to length(mass) do
begin
writeln(mass[i],' ');
end;
readln;
end.
Узнаю дубовый стиль преподавания.
Вместо
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 имеют смысл только для нескольких операторов. Одиночный оператор ими обрамлять нужно только в том случае, если он в одиночку составляет все тело программы. Вместо
пишем
Кстати, 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 тут не нужны
Ну а дальше - уже сами.
Вместо
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;
Кроме того, вы делаете ужасную вещь. Вы перед вызовом с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 тут не нужны
Ну а дальше - уже сами.
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.