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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.06.2010, 20:11   #1
Vladimir-888
Пользователь
 
Регистрация: 01.04.2010
Сообщений: 29
По умолчанию Сжать массив

Подскажите плиз, как сжать двумерный массив, удалив из него все элементы, модуль которых находится в интервале [a,b], а все освободившиеся в конце элементы заполнить нулями.
Vladimir-888 вне форума Ответить с цитированием
Старый 22.06.2010, 00:26   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Пройти по массиву и удалить из него все элементы, для которых выполняется условие.
p51x вне форума Ответить с цитированием
Старый 22.06.2010, 08:45   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

p51x, коллега, Вы невнимательно прочитали тему и не обратили внимание на фразу "освободившиеся в конце элементы "...

Vladimir-888, по сути p51x прав.
Заводим индекс, куда писать, пишем только числа, которые не попадают в заданный интервал.
примерно так:
Код:
k:=0;
for i:=1 to MaxElement do
  if (Abs(Mass[i])<a) or (Abs(Mass[i])>b) then 
       {число не попало в интервал, нужно его сохранить в массив}
    begin
       inc(k);
       if k<>i then 
         {пишем, если только надо "сдвигать"
          если элемент и так на своём месте, писать его не 
           надо }
         Mass[k] := Mass[i];
    end;
  {всё. Теперь в K число оставленных элементов!}
  
  {занулим оставшиеся}
  for i:=K+1 to MaxElement do
     Mass[i] := 0;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.06.2010, 09:59   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Когда-то я преподователей удивил вот таким финтом:
Код:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;
var a:array[1..5,1..5] of integer;
e,i,j:integer;
begin
 e:=0;
 for i:=1 to 5 do begin
  for j:=1 to 5 do begin
   a[i,j]:=random(10);write(a[i,j]:5);
    if (a[i,j] in [0]) then begin
     dec(e);
    end else
     a[e div 5+1,e mod 5+1]:=a[i,j];
    inc(e);
  end;writeln;
 end;writeln;
 {$o-}
 {Зачищаем остаток}
 for i:=e to 25 do
  a[i div 5+1,i mod 5+1]:=0;
  { TODO -oUser -cConsole Main : Insert code here }
 for i:=1 to 5 do begin
  for j:=1 to 5 do begin
   write(a[i,j]:5);
  end;writeln;
 end;writeln;
 readln;
end.
А че прикольно, шринковка так сказать на лету.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.06.2010, 11:29   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Код:
А че прикольно, шринковка так сказать на лету.
Супер! Спасибо за код! Мне понравилось!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.06.2010, 11:36   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Пользуйся на здоровье, хоть его конечно и оптимизировать неплохо бы, но я уж не стал заморачиваться.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.06.2010, 20:24   #7
Vladimir-888
Пользователь
 
Регистрация: 01.04.2010
Сообщений: 29
По умолчанию

Цитата:
Сообщение от
Заводим индекс, куда писать, пишем только числа, которые не попадают в заданный интервал.
примерно так:
[CODE
k:=0;
for i:=1 to MaxElement do
if (Abs(Mass[i])<a) or (Abs(Mass[i])>b) then
{число не попало в интервал, нужно его сохранить в массив}
begin
inc(k);
if k<>i then
{пишем, если только надо "сдвигать"
если элемент и так на своём месте, писать его не
надо }
Mass[k] := Mass[i];
end;
{всё. Теперь в K число оставленных элементов!}

{занулим оставшиеся}
for i:=K+1 to MaxElement do
Mass[i] := 0;

[/CODE]
это понятно, но для одномерного массива, а я никак не могу применить на двумерном, помогите
Vladimir-888 вне форума Ответить с цитированием
Старый 23.06.2010, 20:27   #8
Vladimir-888
Пользователь
 
Регистрация: 01.04.2010
Сообщений: 29
По умолчанию

Цитата:
Vladimir-888, по сути p51x прав.
Заводим индекс, куда писать, пишем только числа, которые не попадают в заданный интервал.
примерно так:
Код:
k:=0;
for i:=1 to MaxElement do
  if (Abs(Mass[i])<a) or (Abs(Mass[i])>b) then 
       {число не попало в интервал, нужно его сохранить в массив}
    begin
       inc(k);
       if k<>i then 
         {пишем, если только надо "сдвигать"
          если элемент и так на своём месте, писать его не 
           надо }
         Mass[k] := Mass[i];
    end;
  {всё. Теперь в K число оставленных элементов!}
  
  {занулим оставшиеся}
  for i:=K+1 to MaxElement do
     Mass[i] := 0;
это понятно, но этот код для одномерного массива, а я никак не могу применить к двумерному, помогите
Vladimir-888 вне форума Ответить с цитированием
Старый 23.06.2010, 20:39   #9
romlo
Пользователь
 
Аватар для romlo
 
Регистрация: 21.06.2010
Сообщений: 49
По умолчанию

оберни всё в for b:=1 to maxInColumn do
begin
{тут этот код}
end;
mass[i] замени на mass[b,i];
mass[k] замени на mass[b,k];
romlo вне форума Ответить с цитированием
Старый 23.06.2010, 20:50   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
но этот код для одномерного массива, а я никак не могу применить к двумерному, помогите
хм, а чем Вам код Stilet из поста #4 не подходит?
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сжать bmp? MkG Общие вопросы C/C++ 2 23.05.2010 12:10
Как сжать и распаковать файл с помощью API? 3D Hunter Win Api 10 16.03.2010 03:05
программа 160 м.б весит ее нужно сжать до 50. WinRar так не сжимет Alex2009 Свободное общение 9 30.11.2009 15:46
Упорядочить массив в порядке возрастания и напечатать входной и исходный массив. TheVenny Помощь студентам 3 26.11.2008 15:06
сжать файл andrey4623 Общие вопросы Delphi 14 13.01.2008 07:31