На самом деле, оказалось довольно простой задачей.
var P1,P2,P3,P4:String; I:Integer; begin P1:='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; P2:='ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; P3:='abcdefghijklmnopqrstuvwxyz0123456789'; P4:='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; for I:=1 to 23 do begin WriteLn(GenerateString(75,P1)); end; WriteLn('Press ENTER'); ReadLn(); end.
Пока все совсем просто, создаем 4 паттерна (алфавита) для теста, заполняем паттерны, создаем счетчик для цикла, а в цикле вызываем функцию GenerateString
, таким образом генерируем 23 строки.
1. Функция GenerateString
принимает 2 параметра — длина генерируемой строки и паттерн/алфавит, возвращает строку:
function GenerateString (len:Integer; Pattern:String): String;
2. Заводим две внутренних переменных, счетчик для текущей позиции символа в генерируемой строке, и переменную для хранения случайного символа, который получим из строки Pattern
:
var I:Integer; C:Char;
3. Инициализируем значение переменной Result
, которую функция автоматически возвратит в качестве результата функции:
Result:='';
Если этого не сделать, то при попытке заранее выделить память под переменную, компилятор выдаст предупреждение:
Hint: Function result variable of a managed type does not seem to be initialized
(Подсказка: Переменная результата функции управляемого типа, похоже, не инициализирована).
4. И счетчик для текущего символа:
I:=0;
5. Выделяем память под будущую строку, если этого не сделать, память будет выделяться динамически, что будет тормозить процесс:
SetLength(Result,len);
6. Запускаем цикл:
while I < len do begin //... end;
В цикле:
1. Получаем случайный символ.
2. Записываем полученный символ в нужное место результирующей строки.
3. Увеличиваем счетчик цикла.
В Pascal это очень просто, строка рассматривается как массив, а символы — элементы массива. Нумерация символов в строке начинается с единицы, т.е. если мы хотим в переменную C
(типа char
) записать третий символ из строки Pattern
, то это делается так:
C:=Pattern[3];
Для этого применяется функция RandomRange
из модуля Math
со следующим синтаксисом:
RandomRange(начальное_значение, конечное_значение);
т.е. если вызвать функцию таким образом:
I:= RandomRange(1,10);
то в переменной I
(целого типа) окажется случайное значение от 1
до 10
.
Внимание! Не забудьте в начале программы подключить модуль Math
!
Uses Math;
Ну а длина строки, это совсем просто: Length(Pattern)
.
Итого:
1. Получение случайного символа:
C:=Pattern[RandomRange(1, Length(Pattern))];
2. Запись символа в результирующую строку:
Result[I+1]:=C;
3. Увеличение счетчика:
inc(I);
function GenerateString (len:Integer; Pattern:String): String; var I:Integer; C:Char; begin Result:=''; I:=0; SetLength(Result,len); while I < len do begin C:=Pattern[RandomRange(1, Length(Pattern))]; Result[I+1]:=C; inc(I); end; end;