Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2010, 10:40   #1
Vlasii
 
Регистрация: 14.11.2010
Сообщений: 5
По умолчанию Поиск последовательности чисел в строке файла. Паскаль

В каждой строке текстового файла найти самую длинную последовательность цифр. Вывести ее длину и саму эту последовательность.
Кто подскажет, как сделать? Я алгоритм уже продумал, только программа неправильно считает (переменным не то, что хотелось бы присваивается).
Vlasii вне форума Ответить с цитированием
Старый 14.11.2010, 10:44   #2
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
Я алгоритм уже продумал
Раз продумал, так выкладывай свою идею А мы поможем.
Цитата:
Сообщений: 1,128
Вот если убрать "1," то получится 128, а это 2 в седьмой степени...
_-Re@l-_ вне форума Ответить с цитированием
Старый 14.11.2010, 10:48   #3
Vlasii
 
Регистрация: 14.11.2010
Сообщений: 5
По умолчанию

Код:
program Poisk;
var
  t: text;
  posl, s, s2: string;
  max, lgth_next, digit_nach, digit_kon, i, lgth: integer;
  
function cifra(c: char): boolean;
begin
  if (ord(c) >= ord('0')) and (ord(c) <= ord('9')) then cifra := true
  else cifra := false; 
end;
  
begin
max_string := 0;
assign (t, 'aga.txt');
reset(t);
readln(t, s);
writeln(aga.txt:');
writeln(s);
close(t);

for i := 1 to length(s) do
if (cifra(s[i]) = true)  then
  begin
    digit_nach := i;
    break;
  end;
  
for i := digit_nach to length(s) do  
if (cifra(s[i]) = false) then
  begin       
    digit_kon := i;
    break;
  end;     
lgth := digit_kon - digit_nach;
max := lgth;


copy(s, digit_nach, lgth);
s2 := copy(s, digit_nach, lgth);   
writeln(s2);

writeln('------------------------'); 
writeln;   

for i := digit_kon to length(s) do
 begin 
  if (cifra(s[i]) = true)  then
      digit_nach := digit_kon;
  if (cifra(s[i]) = false) then     
      digit_kon := i;
  lgth_next := digit_kon - digit_nach;
  if (lgth_next > lgth) then
   posl := copy(s, digit_nach, lgth_next);   
   max := lgth_next;    
end;
writeln(posl);
writeln('Длина = ', max);

end.
В первых циклах я нахожу первую последовательность цифр, эта часть программы работает. Последний цикл не работает. Нужно найти первую последовательность цифр, а потом сравнивать ее с последующими. Но вот последующие последовательности как-то не получается найти.

Последний раз редактировалось Vlasii; 14.11.2010 в 10:50.
Vlasii вне форума Ответить с цитированием
Старый 14.11.2010, 10:52   #4
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию


Мда....Ну и алгоритм....
Объясняю как надо делать. Код выкладывать не буду. Некогда. Физику учу.
1. Пишешь функцию, которая в заданной строке ищёт энное число.
2. Используя эту функу, сканируешь всю строку. Если энное слово это число, то n:=n+1, если нет, то if n>t then t:=n;n:=0; и потом снова увеличиваешь n.
Ответом будет t.
Понятно?
_-Re@l-_ вне форума Ответить с цитированием
Старый 14.11.2010, 11:13   #5
Vlasii
 
Регистрация: 14.11.2010
Сообщений: 5
По умолчанию

А каким образом можно присвоить значение t (текстового файла) к переменной n, которую только что увеличивали на 1, следовательно, она integer. Чушь.

Последний раз редактировалось Vlasii; 14.11.2010 в 11:25.
Vlasii вне форума Ответить с цитированием
Старый 14.11.2010, 11:21   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ой как все у вас сложно...
Вот поиск самого числительного числа в строке:
Код:
 var w,e,s:string;i:integer;
begin
 e:='';w:='';
 s:='123 jhk56677kjhllh55f';
 for i:=1 to length(s) do begin
  if s[i] in ['0'..'9'] then e:=e+s[i];
  if not (s[i+1]  in ['0'..'9']) then begin
   if length(w)<length(e) then w:=e;
   e:='';
  end;
 end;
 write(w);readln;
  { TODO -oUser -cConsole Main : Insert code here }
end.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.11.2010, 11:31   #7
Vlasii
 
Регистрация: 14.11.2010
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ой как все у вас сложно...
Вот поиск самого числительного числа в строке:
Код:
 var w,e,s:string;i:integer;
begin
 e:='';w:='';
 s:='123 jhk56677kjhllh55f';
 for i:=1 to length(s) do begin
  if s[i] in ['0'..'9'] then e:=e+s[i];
  if not (s[i+1]  in ['0'..'9']) then begin
   if length(w)<length(e) then w:=e;
   e:='';
  end;
 end;
 write(w);readln;
  { TODO -oUser -cConsole Main : Insert code here }
end.
Я могу тоже самое про вашу программу сказать. Сразу за границы массива вылетит. Короче, придется самому разбираться, в инете такой проги не найти.
Vlasii вне форума Ответить с цитированием
Старый 14.11.2010, 11:43   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Сразу за границы массива вылетит.
Я так понял что поставить -1 кое где сложнее чем перерыть весь инет?
Ну а что ты прав... Это же такая аццкая работа две клавиши нажать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.11.2010, 11:56   #9
Vlasii
 
Регистрация: 14.11.2010
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Я так понял что поставить -1 кое где сложнее чем перерыть весь инет?
Ну а что ты прав... Это же такая аццкая работа две клавиши нажать.
Мне легче делать по своему алгоритму, чем разбираться, что не так в этом.
Vlasii вне форума Ответить с цитированием
Старый 14.11.2010, 12:26   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Мне легче делать по своему алгоритму, чем разбираться, что не так в этом.
после такого сильно задумался, стоит ли свой вариант публиковать..


ну да ладно. не зря же 10 минут потратил..
вот.
Код:

function LenMaxLengthNumber(s : string; var IndexOfMax : integer) : integer;
var
  i, max, k, max_index : integer;
begin
  {поиск самой длинной последовательности}
  max := 0;
  k := 0;
  for i := 1 to length(s) do begin
    if s[i] in ['0'..'9'] then inc(k)
    else
      begin
       if (k > max) then
         begin
           max := k;
           max_index := i - k;
         end;
       k := 0;
     end;
  end;

  {а это проверка, если самая длинная
      последовательность завершает строку}
  if (k > max) then begin
     max := k;
     max_index := Length(s) - k + 1;
  end;


  LenMaxLengthNumber := max;

  if max=0 then IndexOfMax := 0 { 'Ничего найти ва-аа-аще не удалось!' }
  else 
     IndexOfMax := max_index;
     { 'Самая длинная последовательность длиной ',max:1,
                ' начинается с позиции ', max_index:1; }
end;

var S0 : string;
  maxLength, indx : integer;
begin
  S0 := 'asdffs434 dfds 344sds7812';

  indx := 0;
  maxLength := LenMaxLengthNumber(S0, indx);

  if maxLength = 0 then
    WriteLn('Нет числовой последовательности в строке') 
  else
    WriteLn('Самая длинная последовательность длиной ',maxLength:1,
                ' является: "',Copy(S0,indx,maxLength)+'"');

  readln;
end.
Построчное чтение из файла в цикле, надеюсь, сумеете самостоятельно добавить?!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Паскаль. Поиск первого отличного символа в строке. ddeman666 Помощь студентам 2 04.05.2010 07:37
Поиск в последовательности чисел упорядоченной подпоследовательности макс длины Rusl92 Помощь студентам 6 27.02.2010 00:02
Определить k-ую цифру последовательности Фибоначчи и последовательности натуральных чисел. Med Помощь студентам 1 20.03.2009 11:40
Поиск последовательности цифр в строке mmx310 Microsoft Office Excel 14 05.02.2009 11:19
вычисление суммы чисел, кратных 3 из последовательности, состоящей из 10 чисел, заранее заданных Белка Помощь студентам 3 27.10.2007 11:53