Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.09.2012, 20:19   #1
Маx
Пользователь
 
Регистрация: 17.03.2012
Сообщений: 25
Восклицание Удалить элементы массива.

Дано 2 массива.
а: 1 .. 20
b: 1 .. n
Нужно удалить из массива b элементы, которые совпадают с єлементами массива a и записать в массив с.
Например:
а: 1,5,6,8,10,15,17 ....
b: 2,3,4,8,9,15,17 ...
Массив c должен получиться таким: 2,3,4,9 ...
Помогите пожалуйста
Маx вне форума Ответить с цитированием
Старый 22.09.2012, 21:17   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

И чем же тебе помочь?
Код покажи хоть, что-ли. И задачу почетче напиши - из каких условий n берется, например, совсем непонятно. Какая размерность массива c - тоже неясно: от 1 до 20 или от 1 до n?
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 22.09.2012, 21:27   #3
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

как-то так:
Код:
var 
i, j, g : integer;
KeyFound : boolean;
...
begin
n:=10; // длина масива В (для примера)
g:=1; // перывй элемент будущего массива С (предолагается что он динамический)
for i:=1 to n do // ходим по массиву В
  begin
    KeyFound:=False;  // считаем что совпадений нет
    for j:=1 to 20 do // ходим по массиву А
    begin
      KeyFound:=B[i]=A[j]; // проверяем на совпадение
      if (j=20) and (KeyFound=False) // определяем что закончился массив А и совпадений не найдено
        then 
        begin
          C[g]:=B[i];
          KeyFound:=False;
          g:=g+1;
        end;
    end;
  end;
end;
зы. эт первое что пришло в голову))
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...

Последний раз редактировалось Yurk@; 22.09.2012 в 21:31.
Yurk@ вне форума Ответить с цитированием
Старый 23.09.2012, 12:02   #4
Маx
Пользователь
 
Регистрация: 17.03.2012
Сообщений: 25
По умолчанию

Почему-то при использовании этого кода удаляются не все числа ... (

Последний раз редактировалось Маx; 23.09.2012 в 12:13.
Маx вне форума Ответить с цитированием
Старый 23.09.2012, 13:01   #5
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

у Yurk@ ошибка в этой строке:

Код:
KeyFound:=B[i]=A[j];
а от себя предложу решение, которое требует много памяти, но более эффективно при больших размерностях массивов a и b (больше 10000):

Код:
const
  n = 10;
 
var
  i: integer;
  a: array[1..20] of integer;
  b: array[1..n] of integer;
  c: array[1..n] of integer;
  d: array[-32768..32767] of boolean;
  count: integer;
begin
  randomize;
  //
  for i := 1 to 20 do a[i] := random(65535) - 32768;
  for i := 1 to n  do b[i] := random(65535) - 32768;
  //
  for i := 1 to n  do d[b[i]] := true;
  for i := 1 to 20 do d[a[i]] := false;
  //
  count := 0;
  for i := -32768 to 32767 do
    if (d[i]) then begin
      //
      inc(count);
      c[count] := i;
    end;
  //
  for i := 1 to count do
    write(c[i], ', ');
end.
http://ideone.com/VOUeK

Если известен диапазон чисел в массивах, можно d сделать меньше.

Хотя, не советую сдавать преподу такой вариант решения, вряд ли его оценят по-достоинтсву
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 23.09.2012, 21:14   #6
Маx
Пользователь
 
Регистрация: 17.03.2012
Сообщений: 25
По умолчанию

Спасибо, очень помогли!
Маx вне форума Ответить с цитированием
Старый 23.09.2012, 23:35   #7
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

А если массивы упорядочены, то можно за один проход по каждому массиву
Код:
const
  n=7; m=7;
var
  i, j, k : integer;
  a: array[1..n] of integer = (1,5,6,8,10,15,17);
  b: array[1..m] of integer = (2,3,4,8,9,15,17);
  c: array[1..n+m] of integer;
begin
  i := 1;
  j := 1;
  k := 1;
  while j<=m do begin
    while (a[i] < b[j]) and (i < n) do inc(i);
    if a[i] = b[j] then inc(i)
    else if (a[i] > b[j]) or (i = n) then begin
      c[k] := b[j];
      inc(k);
    end;
    inc(j);
  end;
  for i := 1 to k-1 do write(c[i], ' ');
  readln
end.
Можно ещё модифицировать случай при (i = n), добавив ещё один цикл заполнения остатка из массива b, и по его завершению сразу выпрыгнуть к выводу данных (всеми любимый goto ).
eoln вне форума Ответить с цитированием
Старый 24.09.2012, 04:47   #8
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Gentlemen, вы чего? Венисайд, при всем к тебе уважении.. ты сегодня выспался? )) Зачем такой расход памяти? А если бы диапазон был LongInt - так и стал бы работать с массивом 4 Гига? А если еще больше?.. Задача не стоит выеденного яйца, при этом упорядоченность (откуда ты ее взял, eoln?) тут совершенно ни при чем ), все и так делается за один проход. И уж конечно без goto..
Код:
const
  m= 20;
  n = 10;
var
  i,k: word;
  a,b,c: array[1..m] of integer;

procedure PrintArray(s: string; a: array of integer; n: word);
begin
  writeln(s);
  for n:=0 to n-1 do write(a[n]:4);
  writeln
end;

begin
  randomize; 
  writeln('initial data:');
  for i := 1 to m do a[i] := random(5);
  PrintArray('a:',a,m);
  for i := 1 to n  do b[i] := random(5);
  PrintArray('b',b,n);
  k:= 0;
  for i:=1 to n do if a[i]=b[i] then begin
    inc(k);
    c[k]:= b[i];
  end
  else
    b[i-k]:= b[i];
  writeln('modified, and built data:');
  PrintArray('b:',b,n-k);
  PrintArray('c:',c,k)
end.
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удалить из массива все элементы встречающиеся более двух раз. dimok5 Помощь студентам 0 15.03.2012 16:28
По массивам, SOS! из целочисленного массива удалить из массива элементы, встречающиеся менее 3-х раз prelest' Паскаль, Turbo Pascal, PascalABC.NET 1 23.05.2011 22:37
удалить из массива уникальные элементы хочу узнать Помощь студентам 2 26.09.2010 19:22
Как удалить нулевые элементы из массива? Diman_kemNVK Помощь студентам 2 13.04.2010 15:54
Удалить элементы массива Маськ@ Паскаль, Turbo Pascal, PascalABC.NET 1 21.12.2008 17:46