Мансуров. Основы программирования в среде Lazarus. 2010
.pdfГлава 3 Более сложные элементы языка
____________________________________________________________________
a:= 'Head&Shoulders';
writeln(UTF8ToConsole('Исходная строка: '),
UTF8ToConsole(a));
c:= Copy(a, 6, 9);
c:= UTF8Copy(a, 6, 9); // можно и так
writeln(UTF8ToConsole('Результирующая строка: '),
UTF8ToConsole(c));
a:= 'Меню:Окружение';
writeln(UTF8ToConsole('Исходная строка: '),
UTF8ToConsole(a));
//c:= Copy(a, 6, 9); // это неправильно!
//c:= Copy(a, 10, 18); // но можно так c:= UTF8Copy(a, 6, 9); // лучше всего так
writeln(UTF8ToConsole('Результирующая строка: '),
UTF8ToConsole(c));
writeln(UTF8ToConsole('Нажмите любую клавишу'));
readkey;
end.
Процедура Delete- удаляет из строки подстроку
Описание:
Delete(var S: string, index: integer, count: integer);
S – исходная строка, index – номер символа, начиная с которого удаляет-
ся подстрока из S, count- количество символов в подстроке. Также имеет-
ся аналогичная процедура UTF8Delete().
Пример:
program procedure_delete;
{$mode objfpc}{$H+}
181
3.3Обработка символьной информации в Паскале
____________________________________________________________________
uses
CRT, FileUtil, LCLProc;
var
a: string;
begin
a:= '123XYZ';
writeln(UTF8ToConsole('Исходная строка: '),
UTF8ToConsole(a));
UTF8Delete(a, 4, 3);
writeln(UTF8ToConsole('Результирующая строка: '),
UTF8ToConsole(a));
a:= '123АБВ';
writeln(UTF8ToConsole('Исходная строка: '),
UTF8ToConsole(a));
UTF8Delete(a, 4, 3);
writeln(UTF8ToConsole('Результирующая строка: '),
UTF8ToConsole(a));
writeln(UTF8ToConsole('Нажмите любую клавишу'));
readkey;
end.
Процедура Insert – добавляет подстроку в строку.
Описание:
Insert(Source: string, S: string, index: integer);
Source - исходная строка
S- добавляемая строка
index - номер символа строки Source, начиная с которого добавля-
ется подстрока S.
182
Глава 3 Более сложные элементы языка
____________________________________________________________________
Пример:
program procedure_insert; {$mode objfpc}{$H+}
uses
CRT, FileUtil, LCLProc; var
S: string; begin
S:= '1236789'; writeln(UTF8ToConsole('Исходная строка: '),
UTF8ToConsole(S));
Insert('45', S, 4);
writeln(UTF8ToConsole('Результирующая строка: '),
UTF8ToConsole(S));
S:= 'абвеѐжзиклмн';
writeln(UTF8ToConsole('Исходная строка: '),
UTF8ToConsole(S));
UTF8Insert('гд', S, 4);
writeln(UTF8ToConsole('Результирующая строка: '),
UTF8ToConsole(S));
writeln(UTF8ToConsole('Нажмите любую клавишу'));
readkey;
end.
Функция Pos- производит поиск подстроки в строке.
Описание:
Pos(Substr, S: string): Byte;
Substr –подстрока, поиск которой производится в строке S. Функция
Pos возвращает номер символа, начиная с которого подстрока Substr найде-
183
3.3Обработка символьной информации в Паскале
____________________________________________________________________
на в S. Если такой подстроки нет, то возвращается 0. В модуле LCLProc
имеется аналогичная функция UTF8Pos().
Пример:
program function_pos_1; {$mode objfpc}{$H+} uses
CRT, FileUtil; var
S: string; i: integer;
begin
S:= 'МАМАША'; i:= Pos('ША', S);
writeln(UTF8ToConsole('Строка: '), UTF8ToConsole(S)); writeln(UTF8ToConsole('Номер символа, с которого')); writeln(UTF8ToConsole('начинается подстрока "ША"= '), i); writeln(UTF8ToConsole('Нажмите любую клавишу'));
readkey;
end.
Пример: Дана строка символов. Определить, входит ли в эту строку под-
строка 'ША'. Строку ввести с клавиатуры.
program function_pos_2; {$mode objfpc}{$H+} uses
CRT, FileUtil, LConvEncoding , LCLProc; var
184
Глава 3 Более сложные элементы языка
____________________________________________________________________
S: string; Substr: string; i: integer;
begin
writeln(UTF8ToConsole('Введите строку символов')); readln(S);
{$IFDEF WINDOWS}
S:= CP866ToUTF8(S);
{$ENDIF}
Substr:= 'ША';
i:= UTF8Pos(Substr, S); if i = 0 then
writeln(UTF8ToConsole('В данной cтроке ') + UTF8ToConsole(S) + UTF8ToConsole(' подстрока '), UTF8ToConsole(Substr) +
UTF8ToConsole(' отсутствует'))
else
writeln(UTF8ToConsole('подстрока ') +
UTF8ToConsole(Substr) +
UTF8ToConsole(' входит в данную строку с номера символа '), i); writeln(UTF8ToConsole('Нажмите любую клавишу'));
readkey;
end.
Процедура Str – преобразует численное значение в его строковое пред-
ставление. Описание:
Str(X[: width[: decimals]], S: string);
X- числовая переменная (типа integer или real)
width - длина строки S; decimals - количество знаков после за-
пятой.
185
3.3Обработка символьной информации в Паскале
____________________________________________________________________
Пример:
program function_str; {$mode objfpc}{$H+} uses
CRT, FileUtil; var
S: string;
X: real;
begin X:=123.565; Str(X:6:2, S);
{теперь S='123.56'}
writeln(S);
writeln(UTF8ToConsole('Нажмите любую клавишу'));
readkey;
end.
Процедура Val преобразует строковое значение в его численное пред-
ставление.
Описание:
Val(S: string, v, code: integer);
S- исходная строка символов
v- числовая переменная – результат преобразования S code- целая переменная
Если невозможно преобразовать S в число, то после выполнения процеду-
ры Val code 0, если преобразование произошло удачно, то code=0.
Пример:
program function_val;
uses
CRT, FileUtil;
186
Глава 3 Более сложные элементы языка
____________________________________________________________________
var
S: string;
c: integer;
X: real;
begin
S:='234.12';
Val(S, X, c);
writeln(X);
writeln(X:0:2);
writeln(UTF8ToConsole('Нажмите любую клавишу'));
readkey;
end.
Процедуру удобно использовать для организации контроля при вводе чи-
словых данных. Для этого сначала необходимо вводить числа в символьном формате, затем преобразовывать в число процедурой Val и проверять значение code.
Функция LowerCase преобразует заглавные буквы в строчные (не рабо-
тает с кириллицей). Описание:
LowerCase(const S: String): String;
Функция Uppercase преобразует строчные буквы в заглавные (не рабо-
тает с кириллицей). Описание:
Uppercase (const S: String): String;
Удобнее для этих же целей использовать функции UTF8LowerCase() и
UTF8UpperCase()которые поддерживают кириллицу.
program project1;
187
3.3Обработка символьной информации в Паскале
____________________________________________________________________
{$mode objfpc}{$H+} uses
Crt, FileUtil, LCLProc, LConvEncoding; var
str: string; begin
writeln(UTF8ToConsole('Введите строку')); readln(str);
{$IFDEF WINDOWS}
str:= CP866ToUtf8(str); {$ENDIF}
str:= UTF8UpperCase(str); writeln(UTF8ToConsole('Строка в верхнем регистре: '),
UTF8ToConsole(str)); str:= UTF8LowerCase(str);
writeln(UTF8ToConsole('Строка в нижнем регистре: '), UTF8ToConsole(str));
writeln(UTF8ToConsole('Нажмите любую клавишу'));
readkey;
end.
Рассмотрим вкратце еще несколько функций работы со строками:
CompareStr(const S1, S2: string): Integer — выполняет сравнение двух строк, делая различие между строчными и заглавными буквами;
не учитывает местный язык. Возвращаемое значение меньше нуля, если S1 <
S2, равно нулю, если S1 = S2, и больше нуля, если S1 > S2.
CompareText(const S1, S2: string): Integer — выполняет сравнение двух строк, не делая различий между строчными и заглавными бук-
188
Глава 3 Более сложные элементы языка
____________________________________________________________________
вами; не учитывает местный язык. Возвращаемое значение меньше нуля, если
S1 < S2, равно нулю, если S1 = S2, и больше нуля, если S1 > S2.
IntToStr(Value: Integer): string — преобразует целое число
Value в строку.
StrToInt(const S: string): Integer — преобразует строку в це-
лое число. Если строка не может быть преобразована в целое число, функция генерирует исключительную ситуацию класса EConvertError (обработка исклю-
чительных ситуаций рассматривается в главе 6).
DateToStr(const DateTime: TDateTime): string — преобразует
числовое значение даты в строку.
StrToDate(const S: string): TDateTime — преобразует строку со значением даты в числовой формат даты и времени.
Trim(const S: string): string — возвращает часть строки S без лидирующих и завершающих пробелов и управляющих символов.
AnsiToUTF8(const S: string): UTF8String — преобразует стро-
ку в формат UTF-8.
UTF8Decode(const S: UTF8String): WideString — преобразует
строку формата UTF-8 к строке формата Unicode.
UTF8Encode(const WS: WideString): UTF8String — преобразует
строку формата Unicode к строке формата UTF-8.
UTF8ToAnsi(const S: UTF8String): string — преобразует стро-
ку формата UTF-8 к стандартной строке.
189
3.4 Массивы
____________________________________________________________________
3.4.Массивы
Внекоторых случаях приходится сталкиваться с ситуацией, когда должно использоваться относительно много переменных одного типа.
Представим себе программу, которая позволяет вычислить определенные метеорологические данные и в которой всегда будет не меньше 365 перемен-
ных. Таким образом можно присваивать отдельным переменным метеорологи-
ческие данные по отдельным дням всего года.
В принципе сейчас нет никакой проблемы, чтобы объявить тип real у 365
переменных, используя запись.
var day1, day2, day3 и т.д. day365:real;
Однако в Паскале нельзя писать и "т.д.". Нужно перечислить все перемен-
ные. Для этого нужна по крайней мере страница. Если теперь нужно подсчи-
тать среднее арифметическое на один день, то нужно записать:
sred:= (day1 + day2 + и т.д. + day365)/ 365;
и опять как быть с "и т.д."?
Для таких случаев Паскаль предоставляет возможность введения большого числа переменных одного и того же типа, используя простые выражения.
Эта возможность в Паскале реализуется с помощью так называемых мас-
сивов. Используется служебное слово array, которое указывает на ряд пере-
менных одного и того же типа и имеющих одно имя.
Например:
var
day: array[1..365] of real;
С помощью этого описания определяется массив day состоящий из 365
элементов (переменных) вещественного типа. Каждый элемент массива может использоваться как отдельная переменная. Можно записать:
day[1]:= 1.25;
190