Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
по freePascal.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
148.48 Кб
Скачать

Строки. Процедуры и функции для работы со строками.

Часто в задачах программирования приходится обрабатывать текст. Одним из важнейших вопросов для любого русскоязычного программиста является вопрос кодировок. На сегодняшний день не существует единой универсальной кодировки. Наиболее распространенным стандартом кодирования, позволяющим представить знаки практически всех письменных языков, является стандарт Unicode. Стандарт состоит из двух основных разделов: универсальный набор символов (universal character set) и семейство кодировок (Unicode transformation format). Универсальный набор символов задаёт однозначное соответствие символов кодам — элементам кодового пространства, представляющим неотрицательные целые числа. Семейство кодировок определяет машинное представление последовательности кодов UCS.

Коды в стандарте Юникод разделены на несколько областей. Область с кодами от U+0000 до U+007F содержит символы набора ASCII с соответствующими кодами. Далее расположены области знаков различных письменностей, знаки пунктуации и технические символы.

Большинство современных операционных систем в той или иной степени обеспечивают поддержку Unicode.

В операционных системах семейства Windows NT для внутреннего представления имён файлов и других системных строк используется двухбайтовая кодировка UTF-16LE. Системные вызовы, принимающие строковые параметры, существуют в однобайтном и двухбайтном вариантах.

UNIX-подобные операционные системы, в том числе GNU/Linux, BSD, Mac OS X, используют для представления Юникода кодировку UTF-8. Большинство программ могут работать с UTF-8 как с традиционными однобайтными кодировками, не обращая внимания на то, что символ представляется как несколько последовательных байт. Для работы с отдельными символами, строки обычно перекодируются в UCS-4, так что каждому символу соответствует машинное слово. Машинное слово — машинно-зависимая и платформо-зависимая величина, измеряемая в битах или байтах, равная разрядности регистров процессора и/или разрядности шины данных.

Рассмотрим наиболее популярные кодировки для кириллицы:

однобайтовые:

KOI8-r, широко используется в *nix-системах;

Windows 1251, используется в ОС Windows,

cp866 — альтернативная кодировка DOS;

ISO – кодировка, утвержденная международной организацией по стандартизации.

Среди двухбайтных кодировок наиболее популярна UCS, используемая в операционных системах Windows.

Также существует несколько кодировок с переменным числом байт на символ. UTF-8, где минимум — один байт, и UTF-16, где, соответственно, два.

UTF-16 используется в Windows;

UTF-8 широко распространена на платформах *nix.

FPC, как и большинство компиляторов, воспринимает тексты программ только в однобайтной кодировке, причем в качестве значимых используются только символы из первой половины кодовой таблицы. В UTF-8 эти символы кодируются аналогично, т.е. исходный код в UTF-8 компилятор корректно воспримет, какими бы ни были символы в строках и комментариях.

Все буквы европейских языков и знаки препинания кодируются одним двухбайтным символом. Поэтому, для большинства задач работа с кодировкой UTF-16 с UCS-кодировкой отличаться не будут.

Обработка текста в Free Pascal состоит из обработки символов и обработки строк.

Символ - это буква, цифра или какой-либо знак.

В Free Pascal могут использоваться два типа символов, из которых составляются строки: 1 байтные - Char (AnsiChar) и 2 байтные — WideChar.

Строка - это набор символов. Текстовая строка имеет определенную длину. В Free Pascal длина короткой строки ограничена 255 символами. Под каждый символ отводится по одному байту, в котором хранится код символа. Кроме того, каждая строка содержит еще дополнительный байт, в котором хранится длина строки. Длина строки хранится в первом ее байте, индекс которого равен 0.

Для работы со строками существует тип данных string. Free Pascal по умолчанию трактует тип string, как короткую строку(ShortString), а не длинную строку AnsiString. Для того чтобы компилятор по умолчанию трактовал тип string как длинную строку, следует использовать директиву {$LONGSTRINGS ON} или ключ командной строки -Sh.

Тип данных AnsiString используется для хранения последовательностей символов, таких как предложения. Каждый символ - это AnsiChar с гарантированным 1 байтным размером. В отличие от строк ShortString, строки AnsiString - это переменные-указатели. Память для AnsiString выделяется только по мере необходимости.

В языке Free Pascal существует специальный тип pchar, описывающий длинные строки. Переменная типа pchar – это строка, длина которой не указывается явно: строка начинается с первого символа и замыкается символом #0. Поскольку тип pchar определяется как указатель на символ, ASCIIZ-строки создаются в динамической памяти. С типом pchar совместим любой символьный массив, левая граница которого равна нулю. ASCIIZ-строки индексируются с отсчетом значений индекса от 0. Строковые константы также могут быть записаны в переменные типа pchar.

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

s1:= ’ Привет! ’;

При использовании коротких строк (ShortString) в программе можно ограничить длину текста, хранимого в строковой переменной. Для этого строковую переменную нужно объявить следующим образом (в скобках указывается максимальная длина строки):

var s:string [30];

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

Пустая строка – это строка, которая не имеет элементов, обозначается двумя рядом стоящими апострофами. Например:

s:=''; // s – пустая строка.

Строку в языке Free Pascal можно рассматривать, как массив символов, поэтому из строки можно получить любой символ, указав его номер в квадратных скобках рядом с именем переменной.

Например:

var s : string ;

c : char ;

begin

s := ’ Привет’ ;

c :=s [ 4 ] ;

. . .

Результатом работы будет символ «в».

Рассмотрим пример для работы с переменой типа pchar.

var s:array[0..4000] of char;

p :pchar;

begin

s:='Привет!';

p:=s;

writeln(p);// p=’Привет!’

p[4]:=#0;

writeln(s); // s=’Прив’

readln;

end.

Рассмотрим основные операции со строками.

Одной из основных операцией со строками является их объединение (конкатенация). Для этого их можно сложить подобно числам. Например:

var s : string;

begin

s := ’ Привет ’ + ’ ’ + ’Pascal ’;

Результатом работы оператора будет строка «Привет Pascal».

Строки можно сравнивать друг с другом с помощью операций отношения. При сравнении строки рассматриваются посимвольно слева направо, при этом сравниваются коды соответствующих пар символов. Строки равны, если они имеют одинаковую длину и посимвольно эквивалентны. В строках разной длины существующий символ всегда больше соответствующего ему отсутствующего символа. Меньшей будет та строка, у которой меньше код первого несовпадающего символа (вне зависимости от максимальных и текущих длин сравниваемых строк).

Например:

'abc' > 'ab' // true

'abc' = 'abc' // true

'abc' < 'abc' // false

В языке программирования Free Pascal имеется несколько полезных стандартных процедур и функций, ориентированных на работу со строками, рассмотрим некоторые из них:

Length(s:string):integer

Функция возвращает в качестве результата значение текущей длины строки-параметра

Concat(s1,[s2,...,sn]:string):string

Функция выполняет слияние строк-параметров, которых может быть произвольное количество. Каждый параметр является выражением строкового типа. Если длина строки-результата превышает 255 символов, то она усекается до 255 символов. Данная функция эквивалентна операции конкатенации "+" и работает немного менее эффективно, чем эта операция.

Copy(s:string; index:integer; count:integer):string

Функция возвращает подстроку, выделенную из исходной строки s, длиной count символов, начиная с символа под номером index.

Delete(var s:string; index,count:integer)

Процедура удаляет из строки-параметра s подстроку длиной count символов, начиная с символа под номером index.

Insert(source:string; var s:string;index:integer)

Процедура предназначена для вставки строки source в строку s, начиная с символа index этой строки.

Pos(substr,s:string):byte

Функция производит поиск в строке s подстроки substr. Результатом функции является номер первой позиции подстроки в исходной строке. Если подстрока не найдена, то функция возвращает 0.

Chr(n: byte): char

Функция возвращает символ по коду, равному значению выражения n. Если n можно представить как числовую константу, то можно также пользоваться записью #n.

Ord(ch: char): byte;

В данном случае функция возвращает код символа ch.

UpCase(c: char): char;

Если c - строчная латинская буква, то функция возвращает соответствующую прописную латинскую букву, в противном случае символ c возвращается без изменения.

Val(st: string; x: числовая переменная; var code: integer)

Процедура преобразует строковую запись числа, содержащуюся в st, в числовое представление, помещая результат в x. x - может быть как целой, так и действительной переменной. Если в st встречается недопустимый (с точки зрения правил записи чисел) символ, то преобразование не происходит, а в code записывается позиция первого недопустимого символа. Выполнение программы при этом не прерывается, диагностика не выдается. Если после выполнения процедуры code равно 0, то это свидетельствует об успешно произошедшем преобразовании.

StrToFloat(s:string):real;

Функция преобразовывает символы из строки s в вещественное число.

StrToInt(s:string):integer;

Функция преобразовывает символы из строки s в целое число.

FloatToStr(x:real):string;

Функция преобразует вещественное число x в строку.

IntToStr(x:integer):real;

Функция преобразует вещественное число x в строку.

Для того, чтобы использовать функции StrToFloat и StrToInt необходимо подключить модуль sysutils.

Например:

uses sysutils;

var s:string

x:integer;

begin

s:=’1234’;

x:=StrToInt(s);

Задача.

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

var s1,s2,s3,s4,slovo:string;

k,l,i:integer;

begin

s1:='Иванов';

s2:='Сергей';

s4:='в';

writeln(s1,' ',s2);

s3:=s1+' '+s2; // Иванов Сергей

s3:=concat(s1,' ',s2); // Иванов Сергей

l:=length(s3); // l=13

k:=pos(s4,s3); // k=2

writeln('Вхождение',s4,' в ',s3,' на позиции',k);

s4:=copy(s3,8,6); // Сергей

slovo:=copy(s3,1,pos(' ',s3)-1); // Иванов

for i:=1 to l do

if s3[i]<>' ' then slovo:=slovo+s3[i]

else break; // Иванов

delete(s3,5,2); // Иван Сергей

writeln(s3);

readln;

end.

Задания для самостоятельной работы.

  1. Дана символьная строка. Подсчитать в ней количество букв 'и','к'.

  2. Даны 2 строки, состоящие из цифр. Склеить 2 строки, перевести каждую из данных строк в числа и посчитать их сумму.

  3. Дана строка. Найти в ней определенную последовательность символов и заменить на другую последовательность.

  4. Подсчитать количество цифр в произвольной строке.

  5. Дана строка. Удалить в строке лишние пробелы. Лишними считаются пробелы, которые следуют непосредственно за пробелами, т.е. между словами всегда должен находиться один пробел.

  6. Дана строка. Добавить в нее пробелы после знаков препинания, если они там отсутствуют.

  7. Дана строка не более 30 символов. Переписать в обратном порядке все слова, начинающиеся с заданной буквы. Определить количество предложений в строке.