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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.11.2011, 18:59   #1
charming
Пользователь
 
Регистрация: 25.09.2011
Сообщений: 14
Восклицание Одномерный массив. Паскаль. Исключить все нулевые элементы.

Дан одномерный массив числовых значений, насчитывающий n элементов. Исключить все нулевые элементы.
Помогите, пожалуйста, в решении этой задачи.
charming вне форума Ответить с цитированием
Старый 21.11.2011, 19:02   #2
IT-man
АльTRUEи$т
Форумчанин
 
Аватар для IT-man
 
Регистрация: 19.03.2009
Сообщений: 784
По умолчанию

Код:
i:=1;
while i<=n do
begin
if a[i]=0 then begin for j:=i to n-1 do a[j]:=a[j+1];n:=n-1;end
else i:=i+1;
end;
Цитата:
«Никто не войдет в Рай, имея хотя бы крупицу гордыни в своем сердце». «Аллах Красив и любит красоту. Гордыня означает отказ от истины и высокомерие»
IT-man вне форума Ответить с цитированием
Старый 21.11.2011, 19:05   #3
AVer
Андрей
Форумчанин
 
Аватар для AVer
 
Регистрация: 21.11.2006
Сообщений: 457
По умолчанию

1)В переменной Х хранить текущую длину массива.
2)Написать процедуру кторая все элементы от некого Н до Х двигать все элементы влево и уменьшает Х.
3) В цикле проходить массив и если элемент равен нулю вызывать процедуру и передавать номер элемента как Н.
ICQ: 5311314
[SIGPIC][/SIGPIC]
AVer вне форума Ответить с цитированием
Старый 21.11.2011, 19:28   #4
charming
Пользователь
 
Регистрация: 25.09.2011
Сообщений: 14
По умолчанию

Извиняюсь, можно поподробней.
Не понимаю...
charming вне форума Ответить с цитированием
Старый 21.11.2011, 19:33   #5
IT-man
АльTRUEи$т
Форумчанин
 
Аватар для IT-man
 
Регистрация: 19.03.2009
Сообщений: 784
По умолчанию

Цитата:
Извиняюсь, можно поподробней.
Не понимаю...
Цитата:
Сообщение от AVer Посмотреть сообщение
1)В переменной n хранить текущую длину массива.
2)Написать процедуру кторая все элементы от некого i до n двигать все элементы влево и уменьшает n
3) В цикле проходить массив и если элемент равен нулю вызывать процедуру и передавать номер элемента как i.
куда уж подробнее то?
Цитата:
«Никто не войдет в Рай, имея хотя бы крупицу гордыни в своем сердце». «Аллах Красив и любит красоту. Гордыня означает отказ от истины и высокомерие»
IT-man вне форума Ответить с цитированием
Старый 21.11.2011, 19:59   #6
charming
Пользователь
 
Регистрация: 25.09.2011
Сообщений: 14
По умолчанию

Код:
program new;
var a:array[1..15] of integer;
f:text;
i,n,g,j:integer;
begin
writeln('massiv ');
assign(f,'fail.dat');
reset(f);
n:=15;
for i:=1 to n do
begin
readln(f,a[i]);
writeln('a[',i,']=',a[i]);
end;
begin
i:=1;
while i<=n do
begin
if a[i]=0 then begin for j:=i to n-1 do a[j]:=a[j+1];n:=n-1;end
else i:=i+1;
end;
end;
readln;
end.
Вот код. Понимаю, что бред. Объясните, пожалуйста, что изменить!
charming вне форума Ответить с цитированием
Старый 21.11.2011, 21:11   #7
val_nnm
Форумчанин
 
Регистрация: 18.10.2009
Сообщений: 185
По умолчанию

Я бы лично сделал так

Код:
const maxN = 100;
var a:array[1..maxN] of integer;
    n:integer;

    k:integer;
    i:integer;

    f:text;
Begin
  Assign(f,'data.txt');
  reset(f);
  n := 0;
  while (not eof(f)) and (n<maxN) do Begin
    n := n + 1;
    readln(f,a[n]);
  end;
  close(f);
  
  for i := 1 to n do
    write(a[i]:3,' ');
  writeln;

  k := 0;
  for i := 1 to n do Begin
    if (a[i]<>0) then Begin
      k := k+1;
      if (k < i) then   { Условие небязательно. Эфективность его применения зависит от размера типа данных в массиве }
        a[k] := a[i];
    end;
  end;
  n := k;

  for i := 1 to n do
    write(a[i]:3,' ');
  writeln;
  readln;
End.
сложность алгоритма n против n*n (которая при удалении каждого элемента по отдельности)

здесь счётчик i проходит по всем элементам. а счётчик k это пзиция (одновременно и размер) в массива куда нужно записывать значение.
разница между ними это фактически сдвиг для очередного элемента.
если элемент не 0 то сдвиг остаёться постоянным (т.е. k увеличиваеться на 1 всел да i) А если элемент равен 0 то k остаёться прежним (а так как i было увеличенно на 1 то и сдвиг увеличиваеться).
На С# пишу лучше чем на русском.
"У меня правильнописание хромает. Оно хорошее, но почему-то хромает."
val_nnm вне форума Ответить с цитированием
Старый 21.11.2011, 21:59   #8
charming
Пользователь
 
Регистрация: 25.09.2011
Сообщений: 14
По умолчанию

Спасибо большое!
charming вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
создать массив и в него сохранить все элементы строки, разделенные запятой (из php в Паскаль) Dosuglist Паскаль, Turbo Pascal, PascalABC.NET 1 26.04.2011 14:24
все нулевые элементы размещены на местах с четными индексами строк и столбцов fcrCullen93 Общие вопросы C/C++ 13 05.02.2011 23:23
Уплотнить массив,удалив из него все нулевые строки и столбцы malishka ya@ Помощь студентам 0 29.05.2010 14:18
Уплотнить массив,удалив из него все нулевые строки и столбцы sonya17 Помощь студентам 0 27.05.2010 19:56