Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Pascal
Перезагрузить страницу Удалить из массива наиболее длинную последовательность уго нулевых элементов.
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Skankhunt01 Skankhunt01 вне форума
Новичок
 
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 08.01.2017
Exclamation Удалить из массива наиболее длинную последовательность уго нулевых элементов. - 08.01.2017, 21:57

Приветствую, подскажите как исправить программу
задание:
Дан одномерный числовой массив. Удалить из массива наиболее длинную последовательность его нулевых элементов. Если удаление элементов невозможно, выдать об этом сообщение.
Удаление элементов из массива оформить в виде подпрограммы
__________________________________________________ ________________
Для начала я просто попытался после ввода чисел вывести на экран число - самую длинную последовательность нулей. Но когда я сравниваю новое число нулей с предыдущим ,что-то идет не так...он считает просто количество всех нулей


program lll;
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.
Ответить с цитированием
  (#2 (permalink)) Старый
spider1581 spider1581 вне форума
Member
 
Сообщений: 185
Сказал(а) спасибо: 16
Поблагодарили 20 раз(а) в 19 сообщениях
Регистрация: 24.01.2014
По умолчанию 09.01.2017, 14:07

Я, конечно, с паскалем имел дело еще в универе, но все же представление имею.
1. Ваш код плохо читаем. Какой бегин относится к какому энду? Сразу и не скажешь, надо высматривать...с таким же успехом можно писать всю программу в одну строчку.
2. В вашем случае, я бы посоветовал использовать указатели. С ними намного проще удалять последовательности, если они находятся в середине.
3. Ваша программа делает именно то, что вы ей сказали. Где в вашем коде, вы делаете удаление последовательности? Вы находите самую длинную цепочку нулевых элементов и выводите эту цифру на экран, все. Для того чтобы удалить цепочку, нужно запоминать не только количество нулей для поиска, но и позиции начала и конца этой цепочки. После нахождения первого и последнего элемента, нужно организовать удаление этих элементов. К сожалению не помню, можно ли в паскале делать такое с массивами, здесь как раз и выделяется преимущество указателей, но если нельзя, то просто создайте новый массив размерностью n-(j-i+1), где n- размер исходного массива, j- порядковый номер конца цепочки, i- порядковый номер начала цепочки. После, перепишите в новый массив нужные вам элементы и выведете его на экран.
4.
Цитата:
Сообщение от Skankhunt01 Посмотреть сообщение
for k:= c to n-1 do {от i-ного элемента по конец
Почему вы смотрите массив по n-1? Ведь в этом случае, вы упускаете последний n-ый элемент...
5.
Цитата:
Сообщение от Skankhunt01 Посмотреть сообщение
c:=i;
Эта строчка вообще бессмысленна, так как дальше переменная с нигде не используется кроме как здесь
Цитата:
Сообщение от Skankhunt01 Посмотреть сообщение
for k:= c to n-1 do {от i-ного элемента по конец}
Не проще ли просто сделать так: for k:=i to n do ?
Удачи вам, дерзайте.
Ответить с цитированием
  (#3 (permalink)) Старый
Skankhunt01 Skankhunt01 вне форума
Новичок
 
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 08.01.2017
По умолчанию 09.01.2017, 18:06

спасибо, что уделили времени.
саму процедуру удаления последовательности нулевых элементов я понимаю как сделать(именно как вы их написали через 2 массива). А в данной программе я хотел только найти эту длиннейшую последовательность, чтобы вывелось число нулей в этой последовательности.
НО программа то не выполняет это. я пробовал разные входные числа, ни разу не сработало.
__________
or k:= c to n-1 do
if (a[k]=0) and (a[k+1]=0 )
___________
to (n-1) так как я сравниваю со след элементом(чтобы подряд шли нули) . а последний элемент так нельзя сравнить соответственно.
НУ вот третий день пытаюсь самостоятельно сделать всё правильно, ещё не выходит

Последний раз редактировалось Skankhunt01; 09.01.2017 в 18:11
Ответить с цитированием
  (#4 (permalink)) Старый
spider1581 spider1581 вне форума
Member
 
Сообщений: 185
Сказал(а) спасибо: 16
Поблагодарили 20 раз(а) в 19 сообщениях
Регистрация: 24.01.2014
По умолчанию 09.01.2017, 19:55

Проблема в том, что во внешнем цикле вы идете от 1 элемента к n, при нахождении первого нуля, допустим элемент 3 нулевой, вы начинаете новый цикл, который находит последовательность из трех нулей, т.е. элементы 3,4,5 нулевые...после конца этого дочернего цикла, продолжается внешний цикл, но он идет не с 6-го элемента, а с 4-го...вам нужно увеличивать счетчик внешнего цикла на количество элементов нулевой последовательности.
Ответить с цитированием
  (#5 (permalink)) Старый
Skankhunt01 Skankhunt01 вне форума
Новичок
 
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 08.01.2017
По умолчанию 09.01.2017, 20:35

Я понял про что вы, но ведь это не изменит сам конечный ответ...То есть разницы между подсчетом лишних последовательностей нулей ,и так как вы описали не будет,ведь наибольшее число и будет оставаться в переменной таким ,как только оно найдется.
ну по крайней мере по моей кривой программе я так планировал, но она не выполняет этого
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
spider1581 spider1581 вне форума
Member
 
Сообщений: 185
Сказал(а) спасибо: 16
Поблагодарили 20 раз(а) в 19 сообщениях
Регистрация: 24.01.2014
По умолчанию 09.01.2017, 21:06

Поставьте брейкпоинт в начале программы и продебажте весь код шаг за шагом, проверяя все переменные, тогда сразу найдете свою ошибку. Я вам уже указал на несколько недочетов в коде, возможно просто в сумме все эти недочеты приводят к тому, что программа работает некорректно.
А вообще, лучше начать все с начала. Программа маленькая, всего 20 строчек кода, много времени не займет. Нарисуйте блок-схему вашей программы, все до мелочей, до каждой переменной, а потом перенесите с бумаги в код. Если алгоритм правильный, то проблем не должно быть.
Ответить с цитированием
  (#7 (permalink)) Старый
Skankhunt01 Skankhunt01 вне форума
Новичок
 
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 08.01.2017
По умолчанию 10.01.2017, 19:42

Всё. разобрался, спасибо
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дана строка. Подсчитать самую длинную последовательность подряд идущих букв А imported_Ильяс Pascal 3 10.06.2011 23:49
Сумма элементов массива Stiker_534 Assembler 0 29.05.2011 19:48
Смещение элементов массива deff Вопросы начинающих программистов 1 20.05.2011 11:27
Нахождение четных элементов массива на С++ felixb Вопросы начинающих программистов 8 09.05.2011 23:32
Сортировка и поиск элементов массива Енот! Pascal 2 29.12.2010 12:32
Посчитать сумму элементов массива A n d r e y Вопросы начинающих программистов 1 27.12.2010 20:03
Как из массива удалить несколько элементов? Fraktalla Pascal 3 03.12.2010 17:01
Замена элементов динамического массива DarkZiMAN С/С++ 2 31.12.2009 13:12
Выборка случайных элементов из большого массива Vladimir the Red Sunny Алгоритмы 18 23.10.2008 20:52
Исключение из массива повторяющихся элементов Ceper@ Вопросы начинающих программистов 6 21.12.2006 13:30
Случайное перемешивание элементов массива imported_vor Delphi 1 28.05.2004 11:03
Как определить число элементов массива DarkStar C++ Builder 5 19.05.2004 11:29



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов