Помощь - Поиск - Пользователи - Календарь
Полная версия: Операция с одномерным численным массивом
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Олег
Задание: найти наибольшее количество цифр, идущих подряд.

Функция, использует переменные
ntemp - количество цифр в строке
temp - сам массив цифр



Function count(ntemp:byte; temp:massiv):byte;
Var i,t,c,max:byte;
Begin
max:=1;
For i:=1 to (ntemp-1) do if (temp[i]=temp[i+1]-1) then
begin
 t:=i;
 c:=1; while (t<ntemp) and (temp[t]=temp[t+1]-1) do
 begin
 if c>max then max:=c; else  inc(c); inc(t);
 end;
 i:=t;
end;
count:=max+1;
End;




Проблема в следующем: функция циклится в процессе For , несмотря на то, что i много больше ntemp, чего, я полагаю, быть не должно.


Если дана строка вида 12345000 или 765123400 то проблем нет - последовательность одна. А вот при сравнении максимума все зависает.

Замечу, что пробовал не один алгоритм - эффект идентичный.
volvo
Во-первых, ты бы ПОЛНОСТЬЮ программу приводил, потому как кто его знает, КАК ты вызываешь, и ЧТО именно? А во вторых - сам виноват:
...
 i := t;
...
это внутри цикла по i ??? blink.gif Чего ж ты ждешь от программы, когда пользуешься средствами, которыми Borland пользоваться не рекомендует?
Гость
ну могу полностью программу...

Дан текстовый файл f, состоящий из нескольких строк. В каждой строке найти наибольшее количество цифр, идущих подряд. Из этих значений сформировать файл h.

А что же насчет изменения i - так другие мысли на ум не приходят, как это решать...


Program tip2;
Uses crt;
Type file1=text; file2=file of byte; massiv=array[0..10] of byte;
Var H:file2; F:file1; Fname:string; s:byte; re,n:massiv;

Function count(ntemp:byte; temp:massiv):byte;
Var i,t,c,max:byte;
Begin
max:=1;
For i:=1 to (ntemp-1) do if (temp[i]=temp[i+1]-1) then
begin
 t:=i;
 c:=1; while (t<ntemp) and (temp[t]=temp[t+1]-1) do
 begin
 if c>max then max:=c; else  inc(c); inc(t);
 end;
 i:=t;
end;
count:=max+1;
End;

Procedure Input(Var F:file1; Fname:string; Var s:byte; Var n:massiv);
Var x,i,j:byte;
Begin
clrscr;
Write('Input/filename: '); Readln(fname);
Assign(F,fname); ReWrite(F); Append(F);
Write('Input/count/strings: '); Readln(s);
For j:=1 to s do
 Begin
 Write('Input/count/elements: '); Readln(n[j]);
 Writeln('String ',j,#10,#13,'!start');
 For i:=1 to n[j]-1 do
  Begin
  write(i,')  '); Readln(x); Write(F,x,' ');
  End;
 Write(n[j],') '); Readln(x); Writeln(F,x);
 Writeln('!end');
 End;
 Close(F);
End;





Procedure mathpart(Var F:file1;Var re:massiv; s:byte; n:massiv);
var i,j,x,ntemp:byte; temp:massiv;
Begin
Reset(F);
For j:=1 to s do
begin
  for i:=1 to (n[j]-1) do
    Begin
    Read(F,x);
    temp[i]:=x;
    End;
  Readln(F,x); temp[n[j]]:=x;
 ntemp:=n[j];
 re[j]:=count(ntemp,temp);
End;
Write('Output/count: '); for j:=1 to s do write(re[j],' '); Writeln;
Close(F);
readkey;
End;

procedure Output(Var H:file2; s:byte; re:massiv);
Var j:byte;
Begin
Write('Input/filename: '); Readln(fname);
Assign(H,fname); ReWrite(H); Reset(H);
Write('Output/file/count: ');
For j:=1 to s do begin write(H,re[j]); write(re[j],' '); end;
Close(H);
readkey;
End;

Begin
Input(F,Fname,s,n);
mathpart(F,re,s,n);
output(H,s,re);
End.

volvo
function get_count(s: string): integer;
var i, count, max: integer;
begin
  s := s + ' ';
  count := 1; max := 0;
  for i := 2 to length(s) do begin
    if s[i] = s[i - 1] then inc(count)
    else begin
      if max < count then max := count;
      count := 1;
    end
  end;
  get_count := max;
end;

begin
  writeln(get_count('12333445678'));
  writeln(get_count('1010101888878888098'));
end.


Идея понятна?
Гость
Да, большое спасибо, самое главное увидел.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.