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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.01.2017, 23:28   #1
Skankhunt02
Новичок
Джуниор
 
Регистрация: 09.01.2017
Сообщений: 7
Вопрос Удалить из массива наиболее длинную последовательность его нулевых элементов. Pascal

Доброго времени суток, прошу помощи по следующей задаче:
Дан одномерный числовой массив. Удалить из массива наиболее длинную последовательность его нулевых элементов. Если удаление элементов невозможно, выдать об этом сообщение.
Удаление элементов из массива оформить в виде подпрограммы.
Я пробовал разными способами и очень долго пытался достичь правильной работы программы. И сейчас решил обратиться за помощью.
___________________________________ _________________________
вот кусок программы который должен подсчитать количество нулей в максимальной длины их последовательности. никак не могу исправить...


Код:
const n=10;
var
a:array[1..n] of integer;
k,x,z,c,i,b,p:integer;
begin
  for i:=1 to n do
  readln(a[i]);
  for i:=1 to n do
  write(a[i],' ');
  p:=1;
    for i:= 1 to n do begin {повтор для всех чисел}
    b:=1;                     {обнуляем для повторного подсчета нулей}
      if a[i]=0 then begin    
      c:=i;
      
      for k:= c to n-1 do  {от i-ного элемента по конец}
       if (a[k]=0) and (a[k+1]=0) then  b:=b+1;  {считаем последовательность нулей}
       
       end;
       if (p<b) then p:=b;
       
       end;
       
       
    writeln(p);
    end.
если у вас имеется возможность составить программу полностью, буду очень признателен!!!
Skankhunt02 вне форума Ответить с цитированием
Старый 10.01.2017, 10:48   #2
Plague
Забанен
Форумчанин Подтвердите свой е-майл
 
Аватар для Plague
 
Регистрация: 01.11.2006
Сообщений: 420
По умолчанию

Код:
const n=20;
var k,mk,mi,i:integer;
    a:array[1..n] of integer; 
begin
  for i:=1 to n do
    begin
      a[i]:=random(2);
      write(a[i],' ');
    end;
  writeln;
  
  k:=0;
  mk:=0;
  mi:=-1;
  for i:=1 to n do
    if a[i]=0 then k:=k+1 else 
      begin
        if k>mk then 
          begin
            mk:=k;
            mi:=i-k;
          end;
        k:=0;
      end;
  if k=n then
    begin
      mk:=n;
      mi:=1;
    end;
  writeln('Наиболее длинная подпоследовательность нулевых элементов');
  writeln('состоит из ',mk,' нулей');
  writeln('начинается c ',mi,' элемента');
end.
Если ничто другое не помогает, прочтите, наконец, инструкцию! Аксиома Кана

Последний раз редактировалось Plague; 10.01.2017 в 10:52.
Plague вне форума Ответить с цитированием
Старый 10.01.2017, 11:31   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Plague, есть баг в алгоритме - не обрабатываете нули в конце...
проверить можно, например, так:
Код:
  for i:=1 to n do
    begin
      a[i]:=random(2); if i>14 then a[i] := 0;
      write(a[i],' ');
    end;
исправить легко - так:
Код:
  k:=0;
  mk:=0;
  mi:=-1;
  for i:=1 to n do begin
    if a[i]=0 then k:=k+1;
    if (a[i]<>0) or (i=n) then
      begin
        if k>mk then
          begin
            mk:=k;
            mi:=i-k;
          end;
        k:=0;
      end;
  end;
  writeln('Наиболее длинная подпоследовательность нулевых элементов');
  writeln('состоит из ',mk,' нулей');
  writeln('начинается c ',mi,' элемента');

-------

Цитата:
Сообщение от Skankhunt02 Посмотреть сообщение
Удалить из массива наиболее длинную последовательность его нулевых элементов.
если таких последовательностей несколько, то что делать?


Цитата:
Сообщение от Skankhunt02 Посмотреть сообщение
Если удаление элементов невозможно, выдать об этом сообщение.
простите, а в каком случае это невозможно? если в массиве нет нулей совсем?
или если массив полностью состоит из нулей?

Последний раз редактировалось Serge_Bliznykov; 10.01.2017 в 11:33.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.01.2017, 12:00   #4
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

Как реализуется удаление из массива (для классики(ТП7.0))?
Код:
N := N - mk
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 10.01.2017, 17:27   #5
Skankhunt02
Новичок
Джуниор
 
Регистрация: 09.01.2017
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Plague, есть баг в алгоритме - не обрабатываете нули в конце...
проверить можно, например, так:
Код:
  for i:=1 to n do
    begin
      a[i]:=random(2); if i>14 then a[i] := 0;
      write(a[i],' ');
    end;
исправить легко - так:
Код:
  k:=0;
  mk:=0;
  mi:=-1;
  for i:=1 to n do begin
    if a[i]=0 then k:=k+1;
    if (a[i]<>0) or (i=n) then
      begin
        if k>mk then
          begin
            mk:=k;
            mi:=i-k;
          end;
        k:=0;
      end;
  end;
  writeln('Наиболее длинная подпоследовательность нулевых элементов');
  writeln('состоит из ',mk,' нулей');
  writeln('начинается c ',mi,' элемента');

-------


если таких последовательностей несколько, то что делать?


простите, а в каком случае это невозможно? если в массиве нет нулей совсем?
или если массив полностью состоит из нулей?
Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Plague,
если таких последовательностей несколько, то что делать?


простите, а в каком случае это невозможно? если в массиве нет нулей совсем?
или если массив полностью состоит из нулей?
Об этих случаях я совсем не подумал... наверное придется удалять последнюю по порядку последовательность. Этот вопрос не обговаривался, даже не знаю как лучше сделать.
А условие "Если удаление элементов невозможно, выдать об этом сообщение" при отсутствии нулей совсем, т.к. преподователь просит заполнение через random, соответсвенно все нули там не окажутся..
Skankhunt02 вне форума Ответить с цитированием
Старый 10.01.2017, 17:46   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Skankhunt02 Посмотреть сообщение
т.к. преподователь просит заполнение через random, соответсвенно все нули там не окажутся..
ну, это не факт. и вероятность такого события тем больше, чем меньше размер массива n

вот поставьте в пример n=2.
Можете гарантировать, что все (оба) элемента массива будут не нулевые?

а если массив будет заполнять не random, а пользователь?
Он то уж вполне может все нули вбить.

Впрочем, это ваше дело - учитывать эту ситуацию или нет.


Цитата:
Сообщение от Skankhunt02 Посмотреть сообщение
А условие "Если удаление элементов невозможно, выдать об этом сообщение" при отсутствии нулей совсем
это легко. если if mi < 0 then WriteLn('Нулей в массиве нет');


Цитата:
Сообщение от Skankhunt02 Посмотреть сообщение
наверное придется удалять последнюю по порядку последовательность.
для поиска последней подпослдовательности код нужно исправить на:
Код:
      if k>=mk then
          begin
            mk:=k;
            mi:=i-k;
          end;

Цитата:
Сообщение от Aleksandr H. Посмотреть сообщение
Как реализуется удаление из массива (для классики(ТП7.0))?
угу. если не брать во внимание обычные статические массивы (а не указатели и выделяемую память), тогда нужно
1) переписать элементы, стоящие после удаляемых на место удаляемых.
2) уменьшить переменную N, в которой хранится размер массива.

p.s.
разумеется, n должна быть не константой.

ну, начало программы в классическом TP может выглядеть примерно так:
Код:
const MaxN=200;
var k,mk,mi,i, n:integer;
    a:array[1..MaxN] of integer; 
....
begin
    repeat
       WriteLn('Введите размер массива (от 1 до ',MaxN,'): ');
       ReadLn(n);
    until (n>0) and (n<=MaxN);
    for i:=1 to n do
    begin
      a[i]:=random(2);
    .............
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.01.2017, 18:00   #7
Skankhunt02
Новичок
Джуниор
 
Регистрация: 09.01.2017
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
угу. если не брать во внимание обычные статические массивы (а не указатели и выделяемую память), тогда нужно
1) переписать элементы, стоящие после удаляемых на место удаляемых.
2) уменьшить переменную N, в которой хранится размер массива.

p.s.разумеется, n должна быть не константой.
Я сейчас попробовал сделать эту процедуру удаления последовательности, но делаю процедуры во второй раз, и не совсем понимаю как всё устроено...
не могли бы вы помочь написать эту процедуру конкретно для моей задачи ? Чтобы сразу как бы вся программа работала, удалила последовательность эту и вывела новый массив на экран...
заранее большое спасибо!!! и так уже многое объяснили

_____________
Избегайте лишнего цитирования. Не надо оставлять цитату, которая не нужна Вам при ответе!
Модератор

Последний раз редактировалось Serge_Bliznykov; 10.01.2017 в 18:07.
Skankhunt02 вне форума Ответить с цитированием
Старый 10.01.2017, 18:09   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Skankhunt02 Посмотреть сообщение
Я сейчас попробовал сделать эту процедуру удаления последовательности, но делаю процедуры во второй раз, и не совсем понимаю как всё устроено...
покажите, как попробовали
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.01.2017, 18:22   #9
Skankhunt02
Новичок
Джуниор
 
Регистрация: 09.01.2017
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
покажите, как попробовали
procedure udalen(i:integer; mi:integer;b:integer;a:real; с:integer; p:real; k:real; var SS:real);
begin
for i:=1 to mi do
b[a]:=p[a];
for a:=c to n do
b[a]:=p[a];
end;
я понимаю,что это бред конечно, но в моей голове пока только так)))
b[a] - нулевой массив
Skankhunt02 вне форума Ответить с цитированием
Старый 11.01.2017, 00:55   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ладно. держи готовый код за старания

Код:

const MaxN=200;
type TMyArray = array[1..MaxN] of integer;


procedure DeleteZero(indexBegin, countDeleted :integer; var Arr:TMyArray; var N : integer);
var i : integer;
begin
  if (indexBegin + countDeleted - 1)=N
    then {удалить надо хвост - просто изменяем размер и выходим}
      N := N - countDeleted
    else begin
      for i:=indexBegin+countDeleted to N do
        Arr[i-countDeleted] := Arr[i];
      N := N - countDeleted
    end;
end;


var k,mk,mi,i, n:integer;
    a:TMyArray;
begin
    repeat
       WriteLn('Введите размер массива (от 1 до ',MaxN,'): ');
       ReadLn(n);
    until (n>0) and (n<=MaxN);
  for i:=1 to n do
    begin
      a[i]:=random(2);
        if a[i]=1 then A[i] := i; // это чтобы вместо единиц были порядковые числа
      write(a[i],' ');
    end;
    WriteLn;
    
    
  k:=0;
  mk:=0;
  mi:=-1;
  for i:=1 to n do begin
    if a[i]=0 then k:=k+1;
    if (a[i]<>0) or (i=n) then
      begin
        if k>=mk then
          begin
            mk:=k;
            mi:=i-k;
            if (a[i]=0) and (i=n) then mi:=mi+1; {учесть и последний элемент}
          end;
        k:=0;
      end;
  end;

  if mk=0 then WriteLn('В массиве нет нулевых элементов')
  else
    if mk=n then writeLn('В массиве все нулевые, после удаления будет пустой массив!')
    else begin
      writeln('Наиболее длинная подпоследовательность нулевых элементов');
      writeln('состоит из ',mk,' нулей');
      writeln('начинается c ',mi,' элемента');
      writeln;
      
      DeleteZero(mi, mk, A, n);
      Write('Полученный массив: ');
      for i:=1 to n do
          write(a[i],' ');
    end;
end.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти в массиве целых чисел наиболее длинную возрастающую последовательность MeeGoo Помощь студентам 0 15.05.2016 12:59
удаление из массива нулевых элементов tomas88 C# (си шарп) 0 20.05.2014 20:09
удаления из массива нулевых элементов tomas88 Помощь студентам 2 15.04.2014 07:28
В целочисленном массиве найти наиболее длинную цепочку одинаковых подряд стоящих элементов C++ Елена Погодина Помощь студентам 10 16.06.2011 22:33
Записать в массив Z подряд семь нулевых элементов массива R,состоящего из N элементов.(Язык QBasic) Лиза) Помощь студентам 0 11.01.2011 16:02