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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.12.2015, 23:09   #1
viktor-zakal
Пользователь
 
Регистрация: 14.05.2010
Сообщений: 14
По умолчанию Функция размножения статей по шаблону

Здравствуйте форумчане. Я нашел функцию размножения статей по шаблону. Но как ее заставить работать под Delphi2010

Или подскажите вариант проще, чтоб обработка была вложенной конструкции типа

{{Моя |}Бабушка{| мне} {|очень }часто {рассказывала|говорила}|Бабушка {|очень }часто {рассказывала|говорила|вспоминала}| {Мой |} Дедушка{| мне} {{|очень }часто|постоянно} {рассказывал|говорил|вспоминал}}{ о том,|} {что|как} {мой прапрадед|брат моего пра- прадеда|отец моего прадеда} был {именитым|знаменитым|известным} {дворянином|боярином|человеком}. {Если честно|Честно говоря| Честно сказать|По правде говоря}, меня эти {истории|рассказы}{ очень| очень сильно| сильно|} {будоражили и интриговали| будоражили|интриговали}, {только|вот только} я {не знал|{|вообще }понятия не имел}, {как|каким образом} {можно|я могу} узнать {подробней|подробности} о своих {корнях|родственнках|предках}.


P/S...никак не получается заставить рекурсивно работать сей найденный код (((
Вот код
Код:

(* Модуль uCloner для размножения текста по формулам  *)
(* 1. Выбор случайного {слово1|слово2}                *)
(* 2. Перемешивание [%слово1|слово2%]                 *)

unit uCloner;

INTERFACE

// размножение статей {такого|этого} вида и такого [%слово1|слово2|слово3%]
// {выбор случайного|} и [%перемешивание%]
function Cloner(S: string): string;

IMPLEMENTATION

uses
  Classes,{ AcedStrings,} Fun;

// размножение статей
function Cloner(S: string): string;
var
  i, j: Integer;
  SL: TStringList;
  Fraza, Slovo: string;
begin
  // случайный вариант из фигурных скобок {слово1|слово2|слово3} 
  i:= G_PosStr('{', S);
  while i>0 do begin
    j:= G_PosStr('}', S);
    // ищем правую пару, кол-во открывающих и закрывающих скобок д.б. одинаковым
    while G_CountOfChar(Copy(S, i+1, j-i-1), '{')<>G_CountOfChar(Copy(S, i+1, j-i-1), '}') do
      j:= G_PosStr('}', S, j+1);
    if j>0 then begin
      SL:= TStringList.Create;
      Fraza:= Copy(S, i+1, j-i-1); // выделяем {фразу для размножения}
      G_Delete(S, i, j-i+1);
      if G_PosStr('{', Fraza)>0 then // рекурсивно размножаем
        Fraza:= Cloner(Fraza);
      Fraza:= Fraza + '|';
      j:= G_PosStr('|', Fraza); // выбираем варианты|варианты
      // ищем правую пару, кол-во открывающих и закрывающих скобок д.б. одинаковым
      while G_CountOfChar(Copy(Fraza, 1, j), '[')<>G_CountOfChar(Copy(Fraza, 1, j), ']') do
        j:= G_PosStr('|', Fraza, j+1);
      while j>0 do begin
        Slovo:= Copy(Fraza, 1, j-1); // отдельный вариант
        G_Delete(Fraza, 1, j);
        {G_Trim(Slovo);}
        SL.Add(Slovo); // добавляем в список
        j:= G_PosStr('|', Fraza);
        // ищем правую пару, кол-во открывающих и закрывающих скобок д.б. одинаковым
        while G_CountOfChar(Copy(Fraza, 1, j), '[')<>G_CountOfChar(Copy(Fraza, 1, j), ']') do
          j:= G_PosStr('|', Fraza, j+1);
      end;
      j:= Random(SL.Count);
      // берём случайный вариант из списк
      Slovo:= SL[j];
      Insert(Slovo, S, i);
      SL.Free;
    end;
    i:= G_PosStr('{', S);
  end; // while i>0 do begin

  // перемешивание вариантов из скобок [%слово1|слово2|слово3%]
  i:= G_PosStr('[%', S);
  while i>0 do begin
    j:= G_PosStr('%]', S);
    // ищем правую пару, кол-во открывающих и закрывающих скобок д.б. одинаковым
    while CountOfString(Copy(S, i+1, j-i-1), '[%')<>CountOfString(Copy(S, i+1, j-i-1), '%]') do
      j:= G_PosStr('%]', S, j+1);
    if j>0 then begin
      SL:= TStringList.Create;
      Fraza:= Copy(S, i+2, j-i-2); // выделяем [%фразу для перемешивания%]
      G_Delete(S, i, j-i+2);
      if G_PosStr('[%', Fraza)>0 then // рекурсивно перемешиваем
        Fraza:= Cloner(Fraza);
      Fraza:= Fraza + '|';
      j:= G_PosStr('|', Fraza); // выбираем варианты|варианты
      while j>0 do begin
        Slovo:= Copy(Fraza, 1, j-1); // отдельный вариант
        G_Delete(Fraza, 1, j);
        SL.Add(Slovo); // добавляем в список
        j:= G_PosStr('|', Fraza);
      end;
      Slovo:= '';
      while SL.Count>0 do begin
        j:= Random(SL.Count);
        // добавляем случайный вариант из списка
        Slovo:= Slovo + SL[j];
        SL.Delete(j);
      end;

      Insert(Slovo, S, i);
      SL.Free;
    end;
    i:= G_PosStr('{', S);
  end; // while i>0 do begin

  Result:= S;
end;

END.
viktor-zakal вне форума Ответить с цитированием
Старый 30.12.2015, 10:20   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А что функция вообще должна делать?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.12.2015, 11:10   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Виталий, она должна обрабатывать входной текст, то, что в фигурных скобках - это вариантная часть, варианты заданы через |
выбираются варианты случайным образом.
например
{Моя |}Бабушка{| мне} {|очень }часто {рассказывала|говорила}
может дать случайные варианты:
Моя Бабушка очень часто рассказывала
Бабушка часто рассказывала
Бабушка мне часто говорила
Бабушка мне очень часто рассказывала
Моя Бабушка мне очень часто говорила

и т.д.

суть проблемы в том, что каждый из вариантов тоже может быть вариантом (в фигурных скобках), а его варианты, в свою очередь, тоже могут быть вариантами и т.д. - вложенность практически неограниченная.

Поэтому тут и удобно использовать рекурсию.

p.s. помнится, на форуме решалась подобная задача. Надо поискать..
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.12.2015, 12:58   #4
viktor-zakal
Пользователь
 
Регистрация: 14.05.2010
Сообщений: 14
По умолчанию

да, вот никак не получается рекурсия.... я уже и posex и pos и delete менял, подгонял под код, но почему то цикл не останавливается.... первый заход идет нормально, а по второму уже пустота идет.... никак понять не могу.... с рекурсией сложной не работал ..... использую простой код, но давняя мечта - заставить работать сей код..... я понимаю, что ошибка вохможно простая, но ей богу, ну не вижу где ошибка в код закралась.... Кто силен, помогите, просто указать на ошибку. Или может есть альтернатива сложных вложений? по поиску-форума ничего не нашел...
viktor-zakal вне форума Ответить с цитированием
Старый 09.01.2016, 09:32   #5
viktor-zakal
Пользователь
 
Регистрация: 14.05.2010
Сообщений: 14
По умолчанию

ууухх)))) спасибо всем, разобрался сам!!!

проблеы были тут G_CountOfChar и тут CountOfString , эти функции я взял из инета готовыми, которые написаны на Ассемблере , и в котором я полный ноль.... Написал свои функции и все встало как надо...

Спасибо всем! всех с ПРАЗНИКОМ НОВОГО ГОДА И РОЖДЕСТВА!!!
viktor-zakal вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
программа размножения статей feesta Помощь студентам 2 19.04.2011 08:35
Рубрики статей Nikolai_ PHP 103 25.11.2010 10:33
переход статей timon777777 PHP 9 27.06.2010 23:16