Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Задача последовательности.


Автор: nik118 7.1.2005, 14:47
Дана задача:
Дана последовательность целых чисел. Построить последовательность номеров позиций, откуда начинаются последовательности, состоящие как минимум из 2-х единиц подряд.
Вход
В каждой строке входа дано по одному элементу исходной последовательности. Признак конца последовательности - 0.
Выход
В каждую строку выхода вывести по одному элементу результирующей последовательности. Заключительный нуль в результат не выводить.
Пример
Вход:

4
1
1
1
6
1
2
1
1
0
Выход:

2
8
-----------------------------------------------------
Я тут папробывал написать код ,но он не работает?
Если его запустить без использование массива то он выдаёт только последее значение, а по условию нужно каждый номер последовательности вывести в новую строку.

Код

var s:string;
var k,i,j:integer;
rez: array[1 .. 20] of integer;
rez1: array[1 .. 20] of string;

begin
ReadLn(s);

for i:=1 to Length(s) do
begin
  if s[i+1]=s[i] then
  begin
j:=0;
     rez[j]:=i;
     j:=j+1;
 

end;
end;
for k:=0 to 20 do

WriteLn(rez[k]);
end.

Автор: Zero 7.1.2005, 16:29
Кароче переделывать твой код бесполезно, там полностью всё не так:
1. Раздел Var пишется только один раз в головной программе, он предназначен для описания всех типов.
2. Не вижу смысла использовать строковый массив, ведь у тебя и числа и позиции целого типа.
Предлагаю такое решение:
Код

program pr;
Const
 Nmax=100;
Var
 i,j,m:integer;
 a,b:array[1..Nmax] of integer;
Begin
 writeln('Вход:');
 i:=1;
 Repeat
   readln(m);
   a[i]:=m;
   i:=i+1;
 Until m=0;

 i:=1; j:=1;
 Repeat
   if a[i]=1 then
     begin
       if a[i+1]=1 then
         begin
           b[j]:=i;
           j:=j+1;
         end;
       repeat
         i:=i+1;
       until a[i]<>1;
     end
   else i:=i+1;
 Until a[i]=0;

 writeln('Выход:');
 for i:=1 to j-1 do
   writeln(b[i]);
End.

Автор: volvo877 7.1.2005, 17:08
nik118
Цитата(nik118 @ 7.1.2005, 14:47)
В каждой строке входа дано по одному элементу исходной последовательности.

Как-то не вяжется с тем, что ты пытаешься сделать в программе:
Код

begin
 ReadLn(s);
 ...
 {больше ввод не происходит}
end.

То есть, один ReadLn. Или ты пытаешься ввести строку вида '4111612110' сразу, если же нет, то как ты хочешь получить следующую строку входа?

Автор: Zero 7.1.2005, 17:12
Цитата(volvo877 @ 7.1.2005, 17:08)
как ты хочешь получить следующую строку входа?
Так как написано у меня. smile

Автор: volvo877 7.1.2005, 17:16
Zero
То что у тебя - понятно... smile Но как nik118 пытался сделать это изначально, вот в чем вопрос ... Я кстати, предлагал ему такое решение, но оно его не устроило...

Автор: Zero 7.1.2005, 17:21
Цитата(volvo877 @ 7.1.2005, 17:16)
Но как nik118 пытался сделать это изначально, вот в чем вопрос ...
Незнаю, я не телепат. smile
Цитата(volvo877 @ 7.1.2005, 17:16)
Я кстати, предлагал ему такое решение, но оно его не устроило...
Незнаю где ты ему предлагал, пусть тогда скажет что ему тут не понравилось.

Автор: Q 23.1.2005, 10:39
Код

procedure Output(var A: mas; n: integer);
var
 j,k: integer;
begin
 j:=1;
 repeat
   if A[j] = 1 then
   begin
     k:=j;
     while A[j] = 1 do Inc(j);
     if j-k > 1 then Writeln(IntToStr(k));
   end;
   Inc(j);
 until j >= n;
end;

Автор: Druidik25 2.2.2005, 16:51
Сложно определить чего тут все добиваются, если чисел больше 500?. Написано же заканчиваются 0!!!
Zero, вот правильно написал, но зачем усложнять жизнь - вся программа пишется при пятерых переменных и массивом. И всё решается одним цыклом для ввода данных и одним для вывода.

Код

program kvs;
var mas:array[1..100] of integer;
     s,a,b,i,k:integer;
begin
i:=0;                 //Номер результата
s:=0;                //Количество встретившихся 1
a:=0;                //Номер начала появляющихся 1
k:=0;                //Номер по порядку введенного числа

repeat
 readln(b);            //Число ввода
 k:=k+1;                //Номер числа увеличился
 if b=1 then begin
  if s=0 then a:=k; //Запомнили появление 1
  s:=s+1;               //Количество 1 увеличилось на 1
 end else begin
                          //Единицы закончились - пора чего-то с ними делать.
  if s>1 then begin
                          //Количество "1" больше 1 тогда записываем в результаты
    i:=i+1;           //Увеличиваем номер результата
    mas[i]:=a;     //Записываем результат
    a:=0;             //Номер начала появлений 1 обнуляем
    s:=0;             //Количество, тоже, обнуляем.
  end;
 end;
until b=0;

//Вывод результата:
for k:=1 to i do begin
 writeln('Результат=',mas[k]);
end;
end;



Добавлено @ 16:57
Цитата(Zero @ 7.1.2005, 16:29)
1. Раздел Var пишется только один раз в головной программе, он предназначен для описания всех типов.

С этим я не согласен, Паскаль позволяет VAR писать хоть перед каждым новым объявлением переменной.

Автор: Zero 6.2.2005, 16:04
Цитата(Druidik25 @ 2.2.2005, 16:51)
С этим я не согласен

Хм... Точно, я до этого так не эксперементировал.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)