Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
trest
0 / 0 / 2
Регистрация: 25.06.2011
Сообщений: 100
#1

Как рандомно менять слова в файле. Движок по обработке команд в тексте. - Delphi

25.06.2011, 10:17. Просмотров 1197. Ответов 19
Метки нет (Все метки)

приветствую!

подскажите пожалуйста как сделать следующее:

есть два файла в первом список слов

слово1
слово2
слово3
..... и т.д.

второй содержит текст с определенными символами (макрос) например {SLOVO}:

"К Земле приближается {SLOVO}. По расчетам НАСА, небесное тело в 10 метров диаметром {SLOVO} в 12 тысячах километров от {SLOVO} планеты. По космическим {SLOVO}, это — немного."

надо чтобы {SLOVO} заменялся на случайное слово из первого файла.
я пробовал по разному но никак не могу побороть, получается что из файла с словами случайно берется 1 слово и им меняется {SLOVO} а мне надо чтобы каждый раз {SLOVO} менялось разным словом из первого файла.

блин надеюсь понятно сформулировал

у меня сейчас код такой
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Memo7.Lines.LoadFromFile('c:\prog\slova.txt');
Randomize;
 
az:=Memo7.Lines.Count;
 
for i:=0 to az-1 do
Begin
 
keyg:=Memo7.Lines[i];
keywd2:=Memo7.Lines[Round(random*Memo7.Lines.Count)];
 
Memo2.Lines.LoadFromFile('c:\prog\page.txt'); 
Memo2.Lines.Text := StringReplace(Memo2.Lines.Text,'{SLOVO}',keywd2,[rfReplaceAll]); 
Memo2.Lines.SaveToFile('c:\prog\' +TranslitRE(keyg) +'.txt');
 
end;

http://www.cyberforum.ru/cpp-beginners/thread1980611.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.06.2011, 10:17
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как рандомно менять слова в файле. Движок по обработке команд в тексте. (Delphi):

Задача по обработке файлов. Определить,есть ли в файле английские слова и сколько
Заметил,что на неё решения так и не нашли((может кто то знает,как её делать, ...

Как менять цвета рандомно, нашел код который работает, но я кое-что не понимаю
Искал в инете как менять цвета рандомно, нашел код который работает, но я...

Как лучше - создавать и уничтожать несколько команд или каждый раз просто менять свойство команды
У меня несколько команд: 1) запрос к одной таблице; 2) очистка второй таблицы;...

подскажите по обработке команд в MVVM
Добрый день! Уважаемые форумчане, подскажите пожалуйста где можно в доступном...

Как из текстового файла рандомно выводить слова
Как из текстового файла ,в котором слова расположены в столбик, рандомно...

19
HyperZen
488 / 242 / 55
Регистрация: 16.06.2011
Сообщений: 838
25.06.2011, 12:39 #2
Грузи строки из мемо в TStringList и делай с ними что хочешь
0
trest
0 / 0 / 2
Регистрация: 25.06.2011
Сообщений: 100
25.06.2011, 15:56  [ТС] #3
Цитата Сообщение от HyperZen Посмотреть сообщение
Грузи строки из мемо в TStringList и делай с ними что хочешь
а на примере можеш показать? я второй день как программить начал
0
Mawrat
12821 / 5729 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
25.06.2011, 17:03 #4
Предлагаю такой пример:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
uses
  StrUtils;
 
procedure TForm1.Button1Click(Sender: TObject);
const
  //Имя файла с текстом.
  Fn1 = 'data.txt';
  //Имя файла со списком слов для замены.
  Fn2 = 'list.txt';
  //Шаблон для замены.
  sTemp = '{SLOVO}';
var
  F1 : File;
  S, S2, FileName1, FileName2 : String; //AnsiString.
  Sl : TStringList;
  Size, Pos1, Cnt, Len1, Len2 : Integer;
begin
  //Полные имена файлов, с учётом предполажения, что
  //они лежат в той же папке, где расположен исполняемый файл программы.
  FileName1 := ExtractFilePath(ParamStr(0)) + Fn1;
  FileName2 := ExtractFilePath(ParamStr(0)) + Fn2;
 
  //Создаём экземпляр списка.
  Sl := TStringList.Create;
  //Загружаем строки из файла в список.
  Sl.LoadFromFile(FileName2);
 
  //Связываем файловую переменную с именем файла.
  AssignFile(F1, FileName1);
  //Открываем файл и задаём режим с минимальным блоком чтения/записи в 1 байт.
  Reset(F1, 1);
  //Размер файла в минимальных блоках, т. е., в данном случае - в байтах.
  Size := FileSize(F1);
  //Устанавливаем длину строки, равной длине файла.
  SetLength(S, Size);
  //Читаем содержимое из файла в строку.
  BlockRead(F1, Pointer(S)^, Size);
  //Закрывае файл.
  CloseFile(F1);
 
  //Заменяем шаблоны в прочитанном тексте на случайно выбранные
  //элементы из списка Sl.
  //Длина шаблона.
  Len1 := Length(sTemp);
  //Количество элементов в списке Sl.
  Cnt := Sl.Count;
  //Ищем позицию на которой расположен первый шаблон.
  Pos1 := PosEx(sTemp, S, 1);
  //Инициализация генератора случайных чисел.
  Randomize;
  while Pos1 > 0 do begin
    //Удаляем найденный шаблон.
    Delete(S, Pos1, Len1);
    //Выбираем случайный элемент из списка Sl.
    S2 := Sl[ Random(Cnt) ];
    //Опеределяем длину элемента.
    Len2 := Length(S2);
    //Вставляем элемент в строку.
    Insert(S2, S, Pos1);
    //Ищем следующий шаблон.
    Pos1 := PosEx(sTemp, S, Pos1 + Len2);
  end;
 
  //Удаляем экземпляр списка из памяти.
  Sl.Free;
 
  //Помещаем обработанный текст в Мемо.
  Memo1.Text := S;
end;
Функция PosEx() объявлена в модуле StrUtils.
Следует иметь в виду, что функции Insert() и Delete() весьма ресурсоёмкие. Они тратят вычислительные ресурсы пропорционально размерам строк, которые они обрабатывают.
Можно написать более оптимальный по производительности код. Но в этом есть смысл, если требуется многократная обработка больших объемов текста - например, множество файлов, размером в несколько мегобайт (или несколько десятков мегобайт).
1
Вложения
Тип файла: rar Project.rar (166.7 Кб, 17 просмотров)
trest
0 / 0 / 2
Регистрация: 25.06.2011
Сообщений: 100
26.06.2011, 02:23  [ТС] #5
блин чето так и не смог запустить Ваш код
Вы не могли бы проект прикрепить?

---
Mawrat: Теперь, проект приложил.


Добавлено через 25 минут
спасибо!!!
то что надо
буду разбираться и переделывать под себя...

Добавлено через 3 часа 22 минуты
появился еще один вопрос

я решил добавить еще один макрос назовем его {BSLOVO} отличие его от {SLOVO} только в том чтобы это слово начиналось с заглавной буквы.

можно ли это сделать?
0
Mawrat
12821 / 5729 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
26.06.2011, 03:21 #6
Предлагаю изменить идею алгоритма. Обработку можно построить по принципу конвейеров:
строка - конвейер символов - конвейер шаблонов.
Эта схема позволит обрабатывать в строке любое количество различных шаблонов за один проход:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
procedure TForm1.Button1Click(Sender: TObject);
const
  //Имя файла с текстом.
  Fn1 = 'data.txt';
  //Имя файла со списком слов для замены.
  Fn2 = 'list.txt';
  //Множество допустимых для шаблона символов.
  D = ['A'..'Z', '{', '}'];
  //Шаблоны для замены.
  sTemp1 = '{SLOVO}';
  sTemp2 = '{BSLOVO}';
var
  F1 : File;
  S, S1, S2, FileName1, FileName2 : String; //AnsiString.
  Sl : TStringList;
  i, Pos1, Cnt, Len, Len1 : Integer;
begin
  //Полные имена файлов, с учётом предполажения, что
  //они лежат в той же папке, где расположен исполняемый файл программы.
  FileName1 := ExtractFilePath(ParamStr(0)) + Fn1;
  FileName2 := ExtractFilePath(ParamStr(0)) + Fn2;
 
  //Создаём экземпляр списка.
  Sl := TStringList.Create;
  //Загружаем строки из файла в список.
  Sl.LoadFromFile(FileName2);
 
  //Связываем файловую переменную с именем файла.
  AssignFile(F1, FileName1);
  //Открываем файл и задаём режим с минимальным блоком чтения/записи в 1 байт.
  Reset(F1, 1);
  //Размер файла в минимальных блоках, т. е., в данном случае - в байтах.
  Len := FileSize(F1);
  //Устанавливаем длину строки, равной длине файла.
  SetLength(S, Len);
  //Читаем содержимое из файла в строку.
  BlockRead(F1, Pointer(S)^, Len);
  //Закрывае файл.
  CloseFile(F1);
 
  //Поиск и обработка шаблонов.
  //Количество элементов в списке Sl.
  Cnt := Sl.Count;
  Pos1 := 0;
  //Инициализация генератора случайных чисел.
  Randomize;
  //Перебор всех символов строки справа-налево.
  for i := Len downto 1 do begin
    
    //Конвейер символов.
    
    //Пропускаем символы, не относящиеся к шаблону.
    if not (S[i] in D) then Continue;
    //Отслеживаем конец шаблона.
    if S[i] = '}' then Pos1 := i;
    //Если конец шаблона не найден - пропускаем итерацию.
    if Pos1 = 0 then Continue;
    //Отслеживаем начало шаблона.
    if S[i] = '{' then begin
      
      //Конвейер шаблонов.
      
      //Размер шаблона.
      Len1 := Pos1 - i + 1;
      //Извлекаем шаблон.
      S1 := Copy(S, i, Len1);
      //Обработка шаблонов.
      if (S1 = sTemp1) or (S1 = sTemp2) then begin
        //Удаляем шаблон из строки.
        Delete(S, i, Len1);
        //Выбираем случайный элемент из списка Sl.
        S2 := Sl[ Random(Cnt) ];
        //Вставляем элемент в строку.
        Insert(S2, S, i);
        //Если это шаблон sTemp2, то делаем первую букву заглавной.
        if S1 = sTemp2 then
          S[i] := AnsiUpperCase(S[i])[1]
        ;
      end;
      //Сброс позиции.
      Pos1 := 0;
    end;
  end;
 
  //Удаляем экземпляр списка из памяти.
  Sl.Free;
 
  //Помещаем обработанный текст в Мемо.
  Memo1.Text := S;
end;
1
trest
0 / 0 / 2
Регистрация: 25.06.2011
Сообщений: 100
26.06.2011, 12:39  [ТС] #7
спасибо!

все раьотает просто супер!

появился еще вопрос мне нужно добавить еще макрос {RND_1_150}

когда он будет находиться в тексте , нужно чтобы выводилось рандомное чило от 1 до 150
только в тексте будет встречаться не постоянно {RND_1_150} а например несколько вариантов {RND_1_50} и еще {RND_1_250}

в общем каждый раз число от и до может меняться.

как такое реализовать?
0
Mawrat
12821 / 5729 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
26.06.2011, 19:53 #8
В общем, здесь нужен движок для обработки команд.
Например, вариант трёхступенчатой обработки - парсер строки - парсер команд - исполнитель команд.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
uses
  Math, StrUtils;
 
//Обработчик команд.
function ProcCmd(var aRes : String; const aName : String; aSlArg, aSlWords : TStrings) : Boolean;
var
  Name : String;
  Num1, Num2 : Integer;
begin
  Result := True;
  Name := AnsiUpperCase(aName);
 
  if aName = 'RANDOM_WORD' then begin
    aRes := aSlWords[ Random(aSlWords.Count) ];
  end else if aName = 'RANDOM_UWORD' then begin
    aRes := aSlWords[ Random(aSlWords.Count) ];
    aRes := AnsiUpperCase(aRes);
  end else if aName = 'RANDOM_LWORD' then begin
    aRes := aSlWords[ Random(aSlWords.Count) ];
    aRes := AnsiLowerCase(aRes);
  end else if aName = 'RANDOM_FUWORD' then begin
    aRes := aSlWords[ Random(aSlWords.Count) ];
    if aRes <> '' then aRes[1] := AnsiUpperCase(aRes[1])[1];
  end else if aName = 'RANDOM_INT' then begin
    if aSlArg.Count = 1 then begin
      Num1 := StrToInt(aSlArg[0]);
      aRes := IntToStr( Random(Num1) );
    end else if aSlArg.Count > 1 then begin
      Num1 := StrToInt(aSlArg[0]);
      Num2 := StrToInt(aSlArg[1]);
      aRes := IntToStr( RandomRange(Num1, Num2) );
    end
  end else if aName = 'REVERSE_WORD' then begin
    aRes := aSlWords[ Random(aSlWords.Count) ];
    aRes := ReverseString(aRes);
  (* Добавление новых команд
  end else if aName = 'XXXXX' then begin
    ...
    aRes := ...;
  *)
  end else begin
    Result := False;
  end;
end;
 
//Парсер команд.
function ParseCmd(var aRes : String; const aArg : String; aSlWords : TStrings) : Boolean;
const
  D = [',', ';', #9, #10, #13, #32];
var
  Name : String;
  SlArg : TStringList;
  i, Len, Pos1, Pos2, P1 : Integer;
begin
  Result := False;
 
  Len := Length(aArg);
 
  //Левая скобка.
  Pos1 := 0;
  for i := 2 to Len - 1 do begin
    if aArg[i] = '(' then begin
      Pos1 := i;
      Break;
    end;
  end;
  if Pos1 = 0 then Exit;
 
  //Правая скобка.
  Pos2 := 0;
  for i := Pos1 + 1 to Len - 1 do begin
    if aArg[i] = ')' then begin
      Pos2 := i;
      Break;
    end;
  end;
  if Pos2 = 0 then Exit;
 
  //Имя команды.
  Name := Copy(aArg, 2, Pos1 - 2);
 
  //Список параметров.
  Inc(Pos1);
  Dec(Pos2);
  P1 := 0;
  SlArg := TStringList.Create;
  for i := Pos1 to Pos2 do begin
    if aArg[i] in D then Continue;
    if (i = Pos1) or (aArg[i - 1] in D) then P1 := i;
    if (i = Pos2) or (aArg[i + 1] in D) then begin
      SlArg.Add( Copy(aArg, P1, i - P1 + 1) );
    end;
  end;
 
  //Вызов обработчика команды.
  Result := ProcCmd(aRes, Name, SlArg, aSlWords);
end;
 
//Парсер строки.
function ParseStr(const aStr : String; aSlWords : TStrings) : String;
const
  //Множество допустимых для шаблона символов.
  D = ['A'..'Z', '_', '0'..'9', '.', ',', ';', '{', '}'];
var
  S, S1, S2 : String; //AnsiString.
  i, Pos1, Len, Len1 : Integer;
begin
  S := aStr;
  //Перебор всех символов строки справа-налево.
  Len := Length(S);
  Pos1 := 0;
  for i := Len downto 1 do begin
 
    //Конвейер символов.
 
    //Пропускаем символы, не относящиеся к шаблону.
    if not (S[i] in D) then Continue;
    //Отслеживаем конец шаблона.
    if S[i] = '}' then Pos1 := i;
    //Если конец шаблона не найден - пропускаем итерацию.
    if Pos1 = 0 then Continue;
    //Отслеживаем начало шаблона.
    if S[i] = '{' then begin
 
      //Конвейер шаблонов.
 
      //Размер шаблона.
      Len1 := Pos1 - i + 1;
      //Извлекаем шаблон.
      S1 := Copy(S, i, Len1);
      //Обработка шаблонов.
      if ParseCmd(S2, S1, aSlWords) then begin
        //Удаляем шаблон из строки.
        Delete(S, i, Len1);
        //Вставляем элемент в строку.
        Insert(S2, S, i);
      end;
      //Сброс позиции.
      Pos1 := 0;
    end;
  end;
 
  Result := S;
end;
 
//Загрузка исходных данных.
procedure TForm1.Button1Click(Sender: TObject);
const
  Fn1 = 'data.txt';
  Fn2 = 'list.txt';
var
  FileName1, FileName2 : String;
begin
  //Полные имена файлов, с учётом предполажения, что
  //они лежат в той же папке, где расположен исполняемый файл программы.
  FileName1 := ExtractFilePath(ParamStr(0)) + Fn1;
  FileName2 := ExtractFilePath(ParamStr(0)) + Fn2;
 
  //Загружаем исходный текст из файла.
  Memo1.Lines.LoadFromFile(FileName1);
  //Загружаем из файла список слов.
  Memo2.Lines.LoadFromFile(FileName2);
end;
 
//Обработка текста.
procedure TForm1.Button2Click(Sender: TObject);
begin
  Randomize;
  Memo3.Text := ParseStr(Memo1.Text, Memo2.Lines);
end;
Новые команды надо реализовывать в процедуре ProcCmd(). Там комментами помечен шаблон для добавления.
---
Движок распознаёт команды вида: {COMMAND(A1, A2, ..., AN)}.
Где COMMAND - идентификатор команды. - Регистр букв - произвольный. A1, A2, ..., AN - список аргументов. После идентификатора команды обязательно должны идти круглые скобки, даже если аргументов нет - например, так: COMMAND().
Если идентификатор COMMAND зарегистрирован в ProcCmd(), то он будет обработан.
---
Реализованные команды:
RANDOM_WORD() - Печатает случайное слово из списка.
RANDOM_UWORD() - Печатает заглавными буквами случайное слово из списка.
RANDOM_LWORD() - Печатает строчными буквами случайное слово из списка.
RANDOM_FUWORD() - Печатает случайное слово из списка. Первую букву слова делает заглавной.

RANDOM_INT(A1) - Печатает случайное целое число из диапазона 0..(A1-1).
RANDOM_INT(A1, A2) - Печатает случайное целое число из диапазона A1..A2.

REVERSE_WORD() - Печатает задом-наперёд случайное слово из списка.
---
Пример исходного текста:
Код
...aaaaaaa...{RANDOM_WORD()}...aaaaaaa...{RANDOM_UWORD()}...aaaaaaa...{RANDOM_LWORD()}
...aaaaaaa...{RANDOM_FUWORD()}...aaaaaaa...{RANDOM_INT(10)}...aaaaaaa...{RANDOM_INT(10, 20)}
...aaaaaaa...{RANDOM_INT(20)}...aaaaaaa...{RANDOM_INT(100)}...aaaaaaa...{XXX}...aaaaaaa...{YYY}
...aaaaaaa...{REVERSE_WORD()}...aaaaaaa...{ZZZ()}...aaaaaaa...
Список слов:
Код
слово1
слово2
слово3
слово4
слово5
слово6
слово7
слово8
слово9
слово10
Результат обработки:
Код
...aaaaaaa...слово3...aaaaaaa...СЛОВО1...aaaaaaa...слово7
...aaaaaaa...Слово6...aaaaaaa...7...aaaaaaa...12
...aaaaaaa...6...aaaaaaa...68...aaaaaaa...{XXX}...aaaaaaa...{YYY}
...aaaaaaa...3оволс...aaaaaaa...{ZZZ()}...aaaaaaa...
0
Миниатюры
Как рандомно менять слова в файле. Движок по обработке команд в тексте.  
Вложения
Тип файла: rar TextEngine.rar (168.0 Кб, 8 просмотров)
trest
0 / 0 / 2
Регистрация: 25.06.2011
Сообщений: 100
26.06.2011, 20:14  [ТС] #9
ого! серьезно все...
еще раз спасибо!

пойду разбираться

Добавлено через 15 минут
а еще вопрос

как мне сюда добавить бы еще одну комманду

чтобы менялось не просто на случайное слова а на блок слов из списка от 5 до 15 штук и каждый раз рандомно в этом пределе.

можно ли добавить такое в этот обработчик или так же прийдется серьезно переделывать?
0
Mawrat
12821 / 5729 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
26.06.2011, 20:49 #10
Теперь там обобщённый подход реализован. Чтобы добавить новую команду надо придумать для неё идентификатор и реализовать её выполнение в функции ProcCmd().
Цитата Сообщение от trest Посмотреть сообщение
как мне сюда добавить бы еще одну комманду
чтобы менялось не просто на случайное слова а на блок слов из списка от 5 до 15 штук и каждый раз рандомно в этом пределе.
Например, можно сделать так:
Новая команда: RANDOM_NWORDS(A1), где A1 - это количество слов, которое надо распечатать.
Реализация:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
//Обработчик команд.
function ProcCmd(var aRes : String; const aName : String; aSlArg, aSlWords : TStrings) : Boolean;
var
  Name : String;
  i, Num1, Num2 : Integer; //Добавлена переменная i.
begin
  Result := True;
  Name := AnsiUpperCase(aName);
 
  if aName = 'RANDOM_WORD' then begin
    aRes := aSlWords[ Random(aSlWords.Count) ];
  end else if aName = 'RANDOM_UWORD' then begin
    aRes := aSlWords[ Random(aSlWords.Count) ];
    aRes := AnsiUpperCase(aRes);
  end else if aName = 'RANDOM_LWORD' then begin
    aRes := aSlWords[ Random(aSlWords.Count) ];
    aRes := AnsiLowerCase(aRes);
  end else if aName = 'RANDOM_FUWORD' then begin
    aRes := aSlWords[ Random(aSlWords.Count) ];
    if aRes <> '' then aRes[1] := AnsiUpperCase(aRes[1])[1];
  end else if aName = 'RANDOM_INT' then begin
    if aSlArg.Count = 1 then begin
      Num1 := StrToInt(aSlArg[0]);
      aRes := IntToStr( Random(Num1) );
    end else if aSlArg.Count > 1 then begin
      Num1 := StrToInt(aSlArg[0]);
      Num2 := StrToInt(aSlArg[1]);
      aRes := IntToStr( RandomRange(Num1, Num2) );
    end
  end else if aName = 'REVERSE_WORD' then begin
    aRes := aSlWords[ Random(aSlWords.Count) ];
    aRes := ReverseString(aRes);
  
  //Новая команда. Начало.
  end else if aName = 'RANDOM_NWORDS' then begin
    Num1 := 0;
    if aSlArg.Count > 0 then Num1 := StrToInt(aSlArg[0]);
    aRes := '';
    for i := 1 to Num1 do begin
      if i > 1 then aRes := aRes + ', ';
      aRes := aRes + aSlWords[ Random(aSlWords.Count) ];
    end;
  //Новая команда. Конец.
  
  (* Добавление новых команд
  end else if aName = 'XXXXX' then begin
    ...
    aRes := ...;
  *)
  end else begin
    Result := False;
  end;
end;
Здесь реализовано так, что слова будут распечатаны через запятую. Кроме этого, если встретится команда без параметров: RANDOM_NWORDS() - то она будет воспринята, также как: RANDOM_NWORDS(0) - в этом случае будет возвращена пустая строка.
0
trest
0 / 0 / 2
Регистрация: 25.06.2011
Сообщений: 100
26.06.2011, 21:00  [ТС] #11
вставил код новый, но выдает ошибку

ругается на строку
aRes := aRes + aSlWords[ Random(aSlWords.Count) ];

и пишет вот что
[Error] Unit1.pas(74): Missing operator or semicolon
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'

может я что то не так сделал?
0
Mawrat
12821 / 5729 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
26.06.2011, 21:05 #12
Там точка с запятой пропущена в конце строки:
Delphi
1
if i > 1 then aRes := aRes + ', '
Вот так надо подправить:
Delphi
1
2
3
4
5
6
7
8
9
10
  //Новая команда. Начало.
  end else if aName = 'RANDOM_NWORDS' then begin
    Num1 := 0;
    if aSlArg.Count > 0 then Num1 := StrToInt(aSlArg[0]);
    aRes := '';
    for i := 1 to Num1 do begin
      if i > 1 then aRes := aRes + ', '; //Здесь добавлена точка с запятой.
      aRes := aRes + aSlWords[ Random(aSlWords.Count) ];
    end;
  //Новая команда. Конец.
1
trest
0 / 0 / 2
Регистрация: 25.06.2011
Сообщений: 100
26.06.2011, 21:14  [ТС] #13
спасибо!!!
работает!


блин мне бы Ваш талант в программировании

когад начал пытаться написать то что задумал, казалось все легко и просто, а сейчас чето совсем в ступор впадаю...

получается Вы мне весь код написали
спасибо еще раз

---
Mawrat: Пожалуйста.
0
Mawrat
12821 / 5729 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
26.06.2011, 21:28 #14
Цитата Сообщение от trest Посмотреть сообщение
а сейчас чето совсем в ступор впадаю...
trest, этот код сложный.
---
А умение программировать - это дело наживное. Постепенно, шаг за шагом - чтение книг, статей, общение на форумах, изучение чужих кодов, написание своего кода.
0
trest
0 / 0 / 2
Регистрация: 25.06.2011
Сообщений: 100
26.06.2011, 23:14  [ТС] #15
Цитата Сообщение от Mawrat Посмотреть сообщение
Умение программировать - это дело наживное. Постепенно, шаг за шагом - чтение книг, статей, общение на форумах, изучение чужих кодов, написание своего кода.
вот я и делаю первые шаги наверное слишком с сложного сразу решил начать.

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

---
Mawrat: Хорошо. А код этот, в самом деле, сложный - он, в общем, не для начинающих. - Или для таких начинающих, которые уже достаточное время "начинают".


Добавлено через 1 час 41 минуту
ну вот и снова вопросы

1) насчет RANDOM_NWORDS(A1) пробовал ставить RANDOM_NWORDS(A1) выводит 15 слов
ставлю RANDOM_NWORDS(5,15) я думал будет выводить от 5 до 15 слов, но выводит только 5 штук.

2) и еще получается RANDOM_NWORDS(A1) берет слова из того же списка слов, а мне понадобилось чтобы этот оператор брал из другого списка. как сделать?
0
Mawrat
12821 / 5729 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
27.06.2011, 01:05 #16
Цитата Сообщение от trest Посмотреть сообщение
1) насчет RANDOM_NWORDS(A1) пробовал ставить RANDOM_NWORDS(A1) выводит 15 слов
ставлю RANDOM_NWORDS(5,15) я думал будет выводить от 5 до 15 слов, но выводит только 5 штук.
Там сейчас реализовано так, что эта команда распознаёт не более одного параметра. Если параметр передавать прямо в таком виде: "A1", то должна быть ошибка - в момент, когда ProcCmd() попытается этот параметр в число перевести.
Цитата Сообщение от trest Посмотреть сообщение
2) и еще получается RANDOM_NWORDS(A1) берет слова из того же списка слов, а мне понадобилось чтобы этот оператор брал из другого списка. как сделать?
Чтобы это реализовать, надо "довести" через параметры второй список в функцию ProcCmd().
Т. е. надо для второго списка предусмотреть дополнительный параметр - также как это сделано для первого списка. Т. е. поменять надо так - добавляем ещё один список aSlWord2:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//Обработчик команд.
function ProcCmd(var aRes : String; const aName : String; aSlArg, aSlWords, aSlWords2 : TStrings) : Boolean;
...
begin
...
end;
 
//Парсер команд.
function ParseCmd(var aRes : String; const aArg : String; aSlWords, aSlWords2 : TStrings) : Boolean;
...
begin
...
  //Вызов обработчика команды.
  Result := ProcCmd(aRes, Name, SlArg, aSlWords, aSlWords2);
end;
 
//Парсер строки.
function ParseStr(const aStr : String; aSlWords, aSlWords2 : TStrings) : String;
...
begin
...
      //Обработка шаблонов.
      if ParseCmd(S2, S1, aSlWords, aSlWords2) then begin
...
end;
После этого, с учётом этих условий:
Цитата Сообщение от trest Посмотреть сообщение
ставлю RANDOM_NWORDS(5,15) я думал будет выводить от 5 до 15 слов, но выводит только 5 штук.
Вводим, новую команду, например, с таким именем: RANDOM_RANGE_WORDS(A1, A2).
И ProcCmd() следует переписать так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
//Обработчик команд.
function ProcCmd(var aRes : String; const aName : String; aSlArg, aSlWords, aSlWords2 : TStrings) : Boolean;
var
  Name : String;
  i, Num1, Num2 : Integer;
begin
  Result := True;
  Name := AnsiUpperCase(aName);
 
  if aName = 'RANDOM_WORD' then begin
    aRes := aSlWords[ Random(aSlWords.Count) ];
  end else if aName = 'RANDOM_UWORD' then begin
    aRes := aSlWords[ Random(aSlWords.Count) ];
    aRes := AnsiUpperCase(aRes);
  end else if aName = 'RANDOM_LWORD' then begin
    aRes := aSlWords[ Random(aSlWords.Count) ];
    aRes := AnsiLowerCase(aRes);
  end else if aName = 'RANDOM_FUWORD' then begin
    aRes := aSlWords[ Random(aSlWords.Count) ];
    if aRes <> '' then aRes[1] := AnsiUpperCase(aRes[1])[1];
  end else if aName = 'RANDOM_INT' then begin
    if aSlArg.Count = 1 then begin
      Num1 := StrToInt(aSlArg[0]);
      aRes := IntToStr( Random(Num1) );
    end else if aSlArg.Count > 1 then begin
      Num1 := StrToInt(aSlArg[0]);
      Num2 := StrToInt(aSlArg[1]);
      aRes := IntToStr( RandomRange(Num1, Num2) );
    end
  end else if aName = 'REVERSE_WORD' then begin
    aRes := aSlWords[ Random(aSlWords.Count) ];
    aRes := ReverseString(aRes);
  end else if aName = 'RANDOM_NWORDS' then begin
    Num1 := 0;
    if aSlArg.Count > 0 then Num1 := StrToInt(aSlArg[0]);
    aRes := '';
    for i := 1 to Num1 do begin
      if i > 1 then aRes := aRes + ', '; //Здесь добавлена точка с запятой.
      aRes := aRes + aSlWords[ Random(aSlWords.Count) ];
    end;
  end else if aName = 'RANDOM_RANGE_WORDS' then begin
    Num2 := 0;
    if aSlArg.Count = 1 then begin
      Num1 := StrToInt(aSlArg[0]);
      Num2 := Random(Num1);
    end else if aSlArg.Count > 1 then begin
      Num1 := StrToInt(aSlArg[0]);
      Num2 := StrToInt(aSlArg[1]);
      Num2 := RandomRange(Num1, Num2);
    end;
    aRes := '';
    for i := 1 to Num2 do begin
      if i > 1 then aRes := aRes + ', ';
      aRes := aRes + aSlWords2[ Random(aSlWords2.Count) ];
    end;
  (*
  end else if aName = 'XXXXX' then begin
    ...
    aRes := ...;
  *)
  end else begin
    Result := False;
  end;
end;
И в обработчике нажатия кнопки "Обработать" добавить этот второй список. Пускай он будет взять из Memo3. А результат обработки записывается в Memo4.
Delphi
1
2
3
4
5
6
//Обработка текста.
procedure TForm1.Button2Click(Sender: TObject);
begin
  Randomize;
  Memo4.Text := ParseStr(Memo1.Text, Memo2.Lines, Memo3.Lines);
end;
---
В дальнейшем, может быть, понадобится добавлять ещё списки или другие данные. Тогда также придётся "дотягивать" до ProcCmd() через дополнительные параметры. Таких параметров может накопиться достаточно много. Это приведёт к существенному усложнению вызовов процедур.
---
В этом случае можно изменить концепцию программы. И выполнить задачу в терминах ООП (объектно-ориентированного программирования). В результате получим решение с очень широкими возможностями по обработке данных. Здесь можно будет легко использовать дополнительные списки и другие переменные без усложнения вызовов. Переход на эту концепцию упростит код в понимании специалиста. Но с точки зрения начинающего программиста, код наоборот покажется, наверное, ещё сложнее.
---
В общем, вот как будет выглядеть реализация объектного подхода в программе. Весь функционал и данные по обработке строки теперь представлены в виде класса TTextProc:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Memo1: TMemo;
    Memo2: TMemo;
    Memo3: TMemo;
    Memo4: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
  TTextProc = class(TObject)
  private
    FList1 : TStrings;
    FList2 : TStrings;
  protected
    function GetList1 : TStrings; virtual;
    function GetList2 : TStrings;  virtual;
    procedure SetList1(aList : TStrings); virtual;
    procedure SetList2(aList : TStrings); virtual;
 
    //Обработчик команд.
    function ProcCmd(var aRes : String; const aName : String; aSlArg : TStrings) : Boolean; virtual;
    //Парсер команд.
    function ParseCmd(var aRes : String; const aArg : String) : Boolean; virtual;
  public
    constructor Create;
    destructor Destroy; override;
    //Парсер строки.
    function ParseStr(const aStr : String) : String; virtual;
 
    property List1 : TStrings read GetList1 write SetList1;
    property List2 : TStrings read GetList2 write SetList2;
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
uses
  Math, StrUtils;
 
//------------------------------------------------------------------------------
// TTextProc
//------------------------------------------------------------------------------
 
constructor TTextProc.Create;
begin
  inherited;
  FList1 := nil;
  FList2 := nil;
end;
 
destructor TTextProc.Destroy;
begin
  FreeAndNil(FList1);
  FreeAndNil(FList2);
  inherited;
end;
 
function TTextProc.GetList1: TStrings;
begin
  Result := FList1;
end;
 
function TTextProc.GetList2: TStrings;
begin
  Result := FList2;
end;
 
procedure TTextProc.SetList1(aList: TStrings);
begin
  if FList1 = nil then FList1 := TStringList.Create;
  FList1.Assign(aList);
end;
 
procedure TTextProc.SetList2(aList: TStrings);
begin
  if FList2 = nil then FList2 := TStringList.Create;
  FList2.Assign(aList);
end;
 
//Обработчик команд.
function TTextProc.ProcCmd(var aRes : String; const aName : String; aSlArg : TStrings) : Boolean;
var
  Name : String;
  i, Num1, Num2 : Integer;
begin
  Result := True;
  Name := AnsiUpperCase(aName);
 
  if aName = 'RANDOM_WORD' then begin
    aRes := List1[ Random(List1.Count) ];
  end else if aName = 'RANDOM_UWORD' then begin
    aRes := List1[ Random(List1.Count) ];
    aRes := AnsiUpperCase(aRes);
  end else if aName = 'RANDOM_LWORD' then begin
    aRes := List1[ Random(List1.Count) ];
    aRes := AnsiLowerCase(aRes);
  end else if aName = 'RANDOM_FUWORD' then begin
    aRes := List1[ Random(List1.Count) ];
    if aRes <> '' then aRes[1] := AnsiUpperCase(aRes[1])[1];
  end else if aName = 'RANDOM_INT' then begin
    if aSlArg.Count = 1 then begin
      Num1 := StrToInt(aSlArg[0]);
      aRes := IntToStr( Random(Num1) );
    end else if aSlArg.Count > 1 then begin
      Num1 := StrToInt(aSlArg[0]);
      Num2 := StrToInt(aSlArg[1]);
      aRes := IntToStr( RandomRange(Num1, Num2) );
    end
  end else if aName = 'REVERSE_WORD' then begin
    aRes := List1[ Random(List1.Count) ];
    aRes := ReverseString(aRes);
  end else if aName = 'RANDOM_NWORDS' then begin
    Num1 := 0;
    if aSlArg.Count > 0 then Num1 := StrToInt(aSlArg[0]);
    aRes := '';
    for i := 1 to Num1 do begin
      if i > 1 then aRes := aRes + ', '; //Здесь добавлена точка с запятой.
      aRes := aRes + List1[ Random(List1.Count) ];
    end;
  end else if aName = 'RANDOM_RANGE_WORDS' then begin
    Num2 := 0;
    if aSlArg.Count = 1 then begin
      Num1 := StrToInt(aSlArg[0]);
      Num2 := Random(Num1);
    end else if aSlArg.Count > 1 then begin
      Num1 := StrToInt(aSlArg[0]);
      Num2 := StrToInt(aSlArg[1]);
      Num2 := RandomRange(Num1, Num2);
    end;
    aRes := '';
    for i := 1 to Num2 do begin
      if i > 1 then aRes := aRes + ', ';
      aRes := aRes + List2[ Random(List2.Count) ];
    end;
  (*
  end else if aName = 'XXXXX' then begin
    ...
    aRes := ...;
  *)
  end else begin
    Result := False;
  end;
end;
 
//Парсер команд.
function TTextProc.ParseCmd(var aRes : String; const aArg : String) : Boolean;
const
  D = [',', ';', #9, #10, #13, #32];
var
  Name : String;
  SlArg : TStringList;
  i, Len, Pos1, Pos2, P1 : Integer;
begin
  Result := False;
 
  Len := Length(aArg);
 
  //Левая скобка.
  Pos1 := 0;
  for i := 2 to Len - 1 do begin
    if aArg[i] = '(' then begin
      Pos1 := i;
      Break;
    end;
  end;
  if Pos1 = 0 then Exit;
 
  //Правая скобка.
  Pos2 := 0;
  for i := Pos1 + 1 to Len - 1 do begin
    if aArg[i] = ')' then begin
      Pos2 := i;
      Break;
    end;
  end;
  if Pos2 = 0 then Exit;
 
  //Имя команды.
  Name := Copy(aArg, 2, Pos1 - 2);
 
  //Список параметров.
  Inc(Pos1);
  Dec(Pos2);
  P1 := 0;
  SlArg := TStringList.Create;
  for i := Pos1 to Pos2 do begin
    if aArg[i] in D then Continue;
    if (i = Pos1) or (aArg[i - 1] in D) then P1 := i;
    if (i = Pos2) or (aArg[i + 1] in D) then begin
      SlArg.Add( Copy(aArg, P1, i - P1 + 1) );
    end;
  end;
 
  //Вызов обработчика команды.
  Result := ProcCmd(aRes, Name, SlArg);
end;
 
//Парсер строки.
function TTextProc.ParseStr(const aStr : String) : String;
const
  //Множество допустимых для шаблона символов.
  D = ['A'..'Z', '_', '0'..'9', '.', ',', ';', '{', '}'];
var
  S, S1, S2 : String; //AnsiString.
  i, Pos1, Len, Len1 : Integer;
begin
  Randomize;
  S := aStr;
  //Перебор всех символов строки справа-налево.
  Len := Length(S);
  Pos1 := 0;
  for i := Len downto 1 do begin
 
    //Конвейер символов.
 
    //Пропускаем символы, не относящиеся к шаблону.
    if not (S[i] in D) then Continue;
    //Отслеживаем конец шаблона.
    if S[i] = '}' then Pos1 := i;
    //Если конец шаблона не найден - пропускаем итерацию.
    if Pos1 = 0 then Continue;
    //Отслеживаем начало шаблона.
    if S[i] = '{' then begin
 
      //Конвейер шаблонов.
 
      //Размер шаблона.
      Len1 := Pos1 - i + 1;
      //Извлекаем шаблон.
      S1 := Copy(S, i, Len1);
      //Обработка шаблонов.
      if ParseCmd(S2, S1) then begin
        //Удаляем шаблон из строки.
        Delete(S, i, Len1);
        //Вставляем элемент в строку.
        Insert(S2, S, i);
      end;
      //Сброс позиции.
      Pos1 := 0;
    end;
  end;
 
  Result := S;
end;
 
//------------------------------------------------------------------------------
// TForm1
//------------------------------------------------------------------------------
 
const
  Fn1 = 'data.txt';
  Fn2 = 'list1.txt';
  Fn3 = 'list2.txt';
 
//Загрузка исходных данных.
procedure TForm1.Button1Click(Sender: TObject);
var
  Path, FileName : String;
begin
  //Путь к папке с файлами, с учётом предполажения, что
  //они лежат в той же папке, где расположен исполняемый файл программы.
  Path := ExtractFilePath(ParamStr(0));
 
  //Загружаем исходный текст из файла.
  FileName := Path + Fn1;
  Memo1.Lines.LoadFromFile(FileName);
 
  //Загружаем из файла первый список слов.
  FileName := Path + Fn2;
  Memo2.Lines.LoadFromFile(FileName);
 
  //Загружаем из файла второй список слов.
  FileName := Path + Fn3;
  Memo3.Lines.LoadFromFile(FileName);
end;
 
//Обработка текста.
procedure TForm1.Button2Click(Sender: TObject);
var
  TextProc : TTextProc;
begin
  //Создаём экземпляр класса.
  TextProc := TTextProc.Create;
 
  //Передаём в экземпляр списки слов.
  TextProc.List1 := Memo2.Lines;
  TextProc.List2 := Memo3.Lines;
 
  //Обработка текста.
  Memo4.Text := TextProc.ParseStr(Memo1.Text);
 
  //Удаяем из памяти экземпляр класса.
  FreeAndNil(TextProc);
end;
 
procedure TForm1.Button3Click(Sender: TObject);
var
  FileName : String;
begin
  FileName := ExtractFilePath(ParamStr(0)) + Fn1;
  Memo1.Lines.SaveToFile(FileName);
end;
 
end.
Теперь класс TTextProc содержит скрытые поля FList1 и FList2. И все методы этого класса имеют доступ к этим полям. Подобным образом можно добавлять дополнительные списки и другие данные. Можно создать массивы списков или списки списков и пр. - то, что обеспечит наиболее удобное представление данных.
1
Миниатюры
Как рандомно менять слова в файле. Движок по обработке команд в тексте.  
Вложения
Тип файла: rar TTextProc.rar (168.1 Кб, 12 просмотров)
trest
0 / 0 / 2
Регистрация: 25.06.2011
Сообщений: 100
27.06.2011, 01:29  [ТС] #17
чем дальше тем страшнее

спасибо, правда сегодня уже не осилю, буду завтра разбираться...
0
trest
0 / 0 / 2
Регистрация: 25.06.2011
Сообщений: 100
29.06.2011, 09:25  [ТС] #18
добрый день!

подскажите а как можно высчитать время работы программы?

ну например чтобы после остановки программы сохранялся текстовый файл а внем было время сколько затратила программа на выполнение?

как я понял надо использовать системное время чтобы более точно было....

Добавлено через 22 минуты
сам разобрался

спасибо.

Добавлено через 20 минут
столкнулся с бедой сам врядли разберусь ХЭЛП!

на маленьких лбъемах программа работает стабильно, но вот решил напрячь и посмотреть на результаты и получил ошибку Out of memory а прога дошла только до середины

подскажите как побороть
0
Mawrat
12821 / 5729 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
29.06.2011, 09:52 #19
Цитата Сообщение от trest Посмотреть сообщение
подскажите а как можно высчитать время работы программы?
Для замеров времени удобно использовать показания мультимедийного таймера. Этот таймер показывает количество миллисекунд, прошедшее от момента запуска Windows.
Delphi
1
2
3
4
5
6
7
8
9
10
11
var
  Dt : Int64;
begin
  Dt := GetTickCount;
  
  //Далее некоторый процесс.
  //...
  //...
  
  //Количество миллисекунд, затраченное на процесс.
  Dt := GetTickCount - Dt;
Значения мультимедийного таймера могут обновляются с периодичностью 3 - 10 мс. Поэтому он пригоден для замера интервалов не менее, чем в несколько десятков миллисекунд.
Если надо замерить время выполнения более быстрых процессов - для это можно поступить так: такой процесс запускается в цикле, например, 1000 раз и замеряется время выполнения всего этого цикла. Потом, полученное время усредняется: Dt / 1000 - получаем среднее время выполнения одной итерации.
Цитата Сообщение от trest Посмотреть сообщение
на маленьких лбъемах программа работает стабильно, но вот решил напрячь и посмотреть на результаты и получил ошибку Out of memory
Если очень большие тексты - здесь понадобится рассмотреть вопрос обработки текста по частям. Т. е., понадобится ещё один конвейер, который будет передавать на обработку части текста приемлемого размера. Кроме этого, можно оптимизировать работу программы по быстродействию.
0
trest
0 / 0 / 2
Регистрация: 25.06.2011
Сообщений: 100
29.06.2011, 11:29  [ТС] #20
Цитата Сообщение от Mawrat Посмотреть сообщение
Если очень большие тексты - здесь понадобится рассмотреть вопрос обработки текста по частям. Т. е., понадобится ещё один конвейер, который будет передавать на обработку части текста приемлемого размера. Кроме этого, можно оптимизировать работу программы по быстродействию.
плохо не хотелось бы еще переделывать код уже много чего добавил боюсь запутаюсь совсем...
проблема именно в файлах с словами, когда просто тестил в каждом файле было от 3 до 10 слов проблем небыло, а вот стал пробовать от 200 до 1000 поймал ошибку

а еще вопрос у меня список текстовых файлов с русскими словами, некоторые обрабатываются нормально а вот в некоторых вместо русских букв кракозябры, я так понимаю это проблема кодировки в самих файлах да?

Добавлено через 1 час 31 минуту
разобрался с проблемой памяти
мой косяк был....
0
29.06.2011, 11:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.06.2011, 11:29
Привет! Вот еще темы с решениями:

В текстовом файле input.txt записан русский текст. Найти в тексте слова
В текстовом файле input.txt записан русский текст. Найти в тексте слова,...

Как сделать, чтобы слова выбирались рандомно, но не повторялись?
Как сделать так что бы слова выбирались рандомно, но не повторялись? Какие...

Определить количество повторений в тексте заданного слова. Считать, что слова в тексте отделены друг от друга
1)В строке удалить введённое буквосочетание. 2)Определить количество...

Можно ли рандомно менять цвета в какой-либо фигуре в Pascal ABC?
Нужно например нарисовать фигуру(круг,квадрат), и в заданных фигурах должны...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru