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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 22.07.2009, 10:12   #11
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Ser@Fim, +100
я согласен с Вашим замечанием!!!
а ещё надо в основной цикл добавить проверку для вот таких "хитрых" последовательностей:
'3123123'
тут хитрость в том, что не надо продолжать искать, если больше половины строки прошли... тогда у подстрок получаются пересекающиеся части..
Код:
 while (pos(copy(s,1,i),copy(s,i,length(s)-i))<>0)
           and (i<(length(s)-i) ) do
   inc(i);
Serge_Bliznykov вне форума
Старый 22.07.2009, 10:19   #12
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Тут хитростей много навертеть можно, но это уже должен сделать сам автор, ато как то некрасиво получается, такие простейшие вещи за него другие делают.

Кстати думаю скорость чуть-чуть увеличтся если поменять местами условия:
Код:
 while (i<(length(s) div 2) ) and (pos(copy(s,1,i),copy(s,i,length(s)-i))<>0)
           do
   inc(i);
Ибо если не выполнится (i<(length(s) div 2) ) второе проверяться не будет по закону оптимизации, а второе условие тяжелее первого - так что незачем напрягать лишний раз кору дуба
I'm learning to live...
Stilet вне форума
Старый 22.07.2009, 10:29   #13
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

блин.. нашёл ещё "дырку" в алгоритме:
попробуйте для последовательности 123412341234
найди последовательность.
Serge_Bliznykov вне форума
Старый 22.07.2009, 14:06   #14
Zhamie
Пользователь
 
Регистрация: 20.07.2009
Сообщений: 17
По умолчанию

Спасибо за ваши старания...

Я кое-как исправила свою начальную программку и вот что получилось:
Код:
var i,j,k:integer;
     q,t:integer;
     n:integer;
     e:array[1..100] of integer;

 begin
   n:=Memo1.Lines.Count;
   for i:=1 to n do
   begin
     e[i]:= StrToInt(Memo1.Lines.Strings[i-1]);
   end;
   begin
     k:=1;
     for i:=1 to n do
     begin
       for j:=2 to n do
       if  e[i] = e[j]
       then
       for q:=i+1 to j-1 do
       begin
         t:=j+1;
         if (e[q] = e[t]) then
         k:=k+1;
         inc(t);
       end
        else Continue;

   end;

   Memo2.Lines.Add('Период псевдослучайной последовательности: ');

   for i:=1 to k do
    Memo2.Lines.Add(IntToStr(e[i]));

   Memo2.Lines.Add('Длина периода: '+IntToStr(k));

    end;
    end.
...зацените )

oops... снова ошибки в коде.

Последний раз редактировалось Stilet; 22.07.2009 в 14:37.
Zhamie вне форума
Старый 23.07.2009, 11:10   #15
Ser@Fim
Пользователь
 
Регистрация: 10.07.2009
Сообщений: 19
По умолчанию

Покритикую немножко себя: ошибся, для последовательности 121125 моя проверка была бы ошибочной
По делу - действительно, для последовательностей повторяющихся несколько раз (123123123123) алгоритм не работает.
Вот переделал код Zhamie:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var i,j,k:integer;
     q,t:integer;
     n:integer;
     s:string;
     b:boolean;
begin
   s:=Edit1.Text;
   n:=length(s);
   k:=1;
   for i:=1 to n do
    begin
     for j:=2 to n do
      if  s[i] = s[j]
       then
        begin
         b:=True;
         for q:=i+1 to j-1 do
          begin
           t:=j+q-1;
           if (s[q] = s[t]) then
            k:=k+1
           else
            begin
             b:=False;
             break;
            end;
           inc(t);
          end;
         if (b=True) then
          for q:=2*k+1 to n do
           begin
            t:=q mod k;
            if (t=0) then t:=k;
            if (s[q]<>s[t]) then
             b:=false;
           end;
         if (b=True) then
          break
         else
          k:=1;
        end
       else Continue;
    end;
    Memo2.Lines.Add('Период псевдослучайной последовательности: ');
    Memo2.Lines.Add(copy(s,1,k));
    Memo2.Lines.Add('Длина периода: '+IntToStr(k));
end;
Действовал "в лоб", так что за оптимизаторские ошибки приношу извинения. Например 1212512125 сначала ищем ближайшее повторение (12), затем проверяем, чтобы оставшаяся часть так же повторялась (что не выполняется, тк дальше идет 5) и заново
Ser@Fim вне форума
Старый 23.07.2009, 13:38   #16
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Не уверен, правильно ли, но пока ошибок не вижу:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  s: String;
  i, j, l: Integer;
begin
  s := Edit1.Text;
  l := 1;
  i := 1;
  j := 2;
  while j <= length(s) do
    if s[i] = s[j] then
    begin
      inc(i);
      inc(j);
    end
    else
    begin
      i := 1;
      inc(l);
      j := l + 1;
    end;
  Caption := 'Äëèíà ' + IntToStr(l) + ', ïåðèîä ' + Copy(s, 1, l);
end;

Последний раз редактировалось Somebody; 23.07.2009 в 13:59.
Somebody вне форума
Старый 23.07.2009, 16:49   #17
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Somebody, отлично!
Проверил.
мне тоже не удалось найти "плохих" последовательностей..
Serge_Bliznykov вне форума
Старый 23.07.2009, 17:05   #18
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Цитата:
Caption := 'Äëèíà ' + IntToStr(l) + ', ïåðèîä ' + Copy(s, 1, l);
Перед тем как копировать текст, содержащий русские буквы, проследите чтоб была русская раскладка клавиатуры, русские символы будут отображаться нормально.
puporev вне форума
Старый 23.07.2009, 22:33   #19
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Код:
Caption := 'Длина ' + IntToStr(l) + ', Период ' + Copy(s, 1, l);
Serge_Bliznykov вне форума
Старый 24.07.2009, 08:41   #20
Zhamie
Пользователь
 
Регистрация: 20.07.2009
Сообщений: 17
По умолчанию

Программа действительно без ошибок.

ОГРОМЕННОЕ СПАСИБО ВАМ ВСЕМ!!!
Zhamie вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как устроится на работу прогером в период кризиса Tlegen Свободное общение 1 20.06.2009 17:13
Период дроби! prosport91 Паскаль, Turbo Pascal, PascalABC.NET 0 09.06.2009 15:57
Период дроби Магистраль Помощь студентам 7 06.04.2009 09:11
Определить k-ую цифру последовательности Фибоначчи и последовательности натуральных чисел. Med Помощь студентам 1 20.03.2009 11:40
Запрос на подсчет записей за период Luna_13 БД в Delphi 3 13.10.2008 23:58