Помощь - Поиск - Пользователи - Календарь
Полная версия: Операция с одномерным численным массивом
Форум «Всё о Паскале» > 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©; 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©; 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.


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