Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Задачка с процедурой.

Автор: DarkWishmaster 9.12.2010 23:58

Привет всем! Вот такая задачка, есть вектор A[1..100] of integer;
надо создать процедуру которая будет показывать сколько нулей в самой длиной цепи из нулей в векторе, и показывать позиции в векторе первого и последнего нуля в цепи, например:
x 0000 xx 00
Результат:
нулей 4
первая позиция нуля -2
последнея позиция нуля -5.

Автор: Lapp 10.12.2010 7:31

Цитата(DarkWishmaster @ 9.12.2010 19:58) *
Привет всем! Вот такая задачка,
Привет и тебе! ))
Ну, задачка - а дальше-то что?.. blink.gif

Автор: TarasBer 10.12.2010 14:50

С каких пор вообще тут пошла привычка не делать ни-че-го для решения своей задачи? Такого я больше ни на одном сайте не вижу, чтобы кто-то приходил и говорил "сделайте за меня", а если такое и происходит, то тема тонет под слоем жирного ржача.

Автор: Lapp 10.12.2010 15:33

Цитата(TarasBer @ 10.12.2010 10:50) *
С каких пор вообще тут пошла привычка не делать ни-че-го для решения своей задачи? Такого я больше ни на одном сайте не вижу, чтобы кто-то приходил и говорил "сделайте за меня", а если такое и происходит, то тема тонет под слоем жирного ржача.
Не, ну ладно еще ниче не сделают - так еще даже и НЕ ПОПРОСЯТ РЕШИТЬ (или там помочь..) Просто скопипастил условие - и пошел отдыхать, добрый дядя все за меня сделает!
Автор этой темы хоть "привет" сказал. И на том спасибо..

БЛИН!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!111

Автор: DarkWishmaster 10.12.2010 19:39

Извините конечно, но я не просто скопировал и пошёл отдыхать, и я тоже не люблю такие вещи. Я два часа думал, ну и как-бы получился алгоритм для поиска цепей, но как показать позицию первого и последнего ноля так и не нашёл. Я в 10 классе. процедуры мы вообще не учим, я самостоятельно по книге учусь и на 11 класс, поэтому и несколько туплю.
Мне не нужно что бы вы сделали для меня програму, а подкинули идею как это можно сделать.
Спасибо за внимание.

Автор: мисс_граффити 10.12.2010 21:06

Идея....

1. Считаем, что и начало, и конец максимальной последовательности - 0 элемент (если в массиве нумерация с 1)
2. Идем по массиву. Если встретили 0, ставим флажок в значение "истина"; запоминаем положение начала цепочки.
3. Пока флажок в истине, идем по массиву в поиске первого НЕнулевого элемента (или конца массива).
Как только нашли - сбрасываем флажок, запоминаем конец последовательности.
Сравниваем длину текущей последовательности с длиной максимальной. Если у текущей больше, меняем значения начала и конца для максимальной.

Кода не будет, пока ты САМ не приложишь хоть какие-то усилия к решению.

З.Ы. 10 класс - это вполне взрослые люди, способные отвечать за свои поступки. ИМХО.

Автор: DarkWishmaster 10.12.2010 22:01

k:=0; l:=0;
for i:=1 to n do begin
if a[i]=0 then k:=k+1;
if k>l then begin l:=k; k:=0; end;
writeln(l);о во
ну тут по поиску цепи более менее мне понятно, но как найти позицию в векторе первого и последнего нуля.

Автор: Lapp 11.12.2010 11:31

2 мисс_граффити:
флажок тут совершенно лишний.. Признаком того, что найдена последовательность, может являться само отличие ее длины от нуля. Но и это тоже лишнее smile.gif, потому что можно считать что мы ВСЕГДА внутри последовательности нулей (может быть, нулевой длины)), то есть поиск ее вообще отпадает. И последнее: запоминать и начало, и конец - тоже слишком много чести, когда есть длина smile.gif.

2 DarkWishmaster:
если что непонятно - спрашивай..

const
n=60;

var
i,l,m,x: integer;
a: array [1..n] of integer;

begin
Randomize;
for i:=1 to n do a[i]:=Random(3);
for i:=1 to n do Write(a[i]:(10-(i-1)mod 10) div 5);
WriteLn;

l:=0;
for i:=1 to n do begin
if a[i]=0 then Inc(l) else l:=0;
if l>m then begin
m:=l;
x:=i
end
end;

Write('max=',m);
if m>0 then Write(' x1=',x-m+1,' x2=',x);
ReadLn
end.

Автор: DarkWishmaster 11.12.2010 22:12

Ого спасибо огромное!
1)random(3) он заполняет вектор числами 0,1,2 -> вопрос, можно ли например заполнить тоже по 3 только в другом диапазоне -6,7,9. Или вообще задавать числа? И ещё вопрос, какую функцию выполняеть Randomize? потому что если его удалить то никаких изменений.

Дальше всё понятно, спасибо.

Такое страное ощущения когда думаешь и не получаеться что-то сделать а потом видешь как это просто )

Автор: TarasBer 11.12.2010 23:02

Ну, например, random(10) выдаёт число от 0 до 9.
А вот random(17)-3 выдаёт число от -3 до 13

randomize нужен для того, чтобы числа не повторялись одни и те же при каждом запуске программы (он инициализирует генератор случайных чисел текущим временем).

Автор: DarkWishmaster 11.12.2010 23:12

Спасибо всем!
Теперь наверно тему можно закрыть.

Автор: мисс_граффити 12.12.2010 1:48

1) в другом диапазоне можно, но он должен быть непрерывный. например -6,-7,-8. или 7,8,9. то есть подряд числа чтобы шли. конечно, при желании можно и -6,7,9 получить, но это надо будет уже писать свою обработку результатов.
2) инициализирует генератор случайных чисел. грубо говоря, чтобы при каждом новом запуске массив получался свой, а не всегда одинаковые.