Удаление элементов множества из динамического массива...

Ответить
Antine
Сообщения: 5
Зарегистрирован: 16 мар 2009, 18:54

Пожалуйста помогите решить задачку....

Написать функцию которая принимает на вход динамический массив целых чисел и множество чисел, которых в этом массиве быть не должно. Функция должна исключить из массива все указанные в множестве числа.

Задачка должна быть написана на Delphi
dr.Jekill
Сообщения: 526
Зарегистрирован: 03 янв 2009, 23:17
Откуда: Voronezh
Контактная информация:

Выкладывай свои наработки.
Нет религии выше истины
Antine
Сообщения: 5
Зарегистрирован: 16 мар 2009, 18:54

Я воопще не представляю как это сделать...((((
dr.Jekill
Сообщения: 526
Зарегистрирован: 03 янв 2009, 23:17
Откуда: Voronezh
Контактная информация:

Ну если "воопще", то это тяжелый случай :)

Описываешь сначала тип массива и тип множества, что-то типа:
type massiv=array[1..1000] of integer;
mnozh=set of integer;

Потом объявляешь функцию:
function CleanMass(mass:^massiv;mn:mnozh):^massiv;
Потом включаешь голову, читаешь темы "Множества" и "Динамические структуры данных", разбираешься и собственно реализуешь функцию :)
Нет религии выше истины
Antine
Сообщения: 5
Зарегистрирован: 16 мар 2009, 18:54

Самое главное начать)))
Antine
Сообщения: 5
Зарегистрирован: 16 мар 2009, 18:54

Вот что у меня получилось, но программа все равно не идет...может кто нибудь знает...плииииззз подскажите как написать.

Код: Выделить всё

  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.
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Узнаю дубовый стиль преподавания.
Вместо
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 тут не нужны

Ну а дальше - уже сами.
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Ответить