- •Алгоритмические языки и программирование работа с массивами
- •Брянск 2007
- •1. Цель работы
- •2. Теоретическая часть
- •2.1. Одномерные массивы
- •2.2. Двумерные и многомерные массивы
- •2.3. Строки
- •2.3.1. Подпрограммы для работы со строками
- •2.3.2. Работа со строками длиной более 255 символов
- •2.4. Сортировка данных
- •2.4.1. Сортировка вставкой
- •2.4.2. Сортировка выбором
- •2.4.3. Сортировка обменом («пузырьковая» сортировка)
- •2.4.4. Сравнение прямых методов сортировки
- •2.5. Пример сортировки методом «пузырька»
- •3. Порядок выполнения работы
- •4. Список заданий
- •5. Контрольные вопросы
- •6. Список рекомендуемой литературы
2.3. Строки
Для работы с символьной информацией принято использовать структуру данных – строка. Определение переменных типа «строка» содержит служебное слово string, за которым может следовать максимальная длина строки в квадратных скобках (целочисленная константа в диапазоне от 0 до 255).
Например:
Var a: string [14]; {Определение строки с именем a длиной 14 символов}
line: string; {Определение строки с именем line с максимально возможной длиной}
Объявление переменной line типа string подобно следующему объявлению:
Var line: array [0..255] of char;
Доступ к отдельным элементам строки (символам) выполняется с помощью индексации. В результате получается величина типа char, например: a[6] – обращение к шестому символу строки. Тип string и стандартный тип char совместимы, т.е. строки и символы могут употребляться в одних и тех же выражениях.
Две сравниваемые строки являются одинаковыми, если они совпадают посимвольно и имеют одинаковую длину.
2.3.1. Подпрограммы для работы со строками
Для работы со строками типа string в Pascal используются следующие процедуры и функции, находящиеся в модуле System:
function Concat(s1 [, s2, …,sn]: string): string; выполняет конкатенацию (сцепление) последовательности строк;
function Copy(s: string; index, count: integer): string; возвращает копию подстроки с позиции index длиною count из заданной строки s;
procedure Delete(var s: string; index, count: integer); удаляет из строки подстроку начиная с позиции index длиною count;
procedure Insert(source: string; var s: string; index: integer); добавляет в строку s подстроку source на позицию index;
function Length(s: string): integer; возвращает текущую длину строки;
function Pos(substr, s: string): byte; производит поиск подстроки substr в строке s, если подстрока встречается, возвращается позиция ее начала;
procedure Str(x [: width [: decimals]]; var s: string); преобразует численное значение x в его строковое представление s;
procedure Val(s; var v; var code: integer); преобразует строковое значение s в его численное представление code.
Пример.
{Удаление переданного символа из строки}
Var s: string;
ch: char;
Function DelChars(_s: string; _ch: char): string;
Var i: byte;
Begin
For i:=1 To length(s) Do
if (_s[i]=_ch) then Delete(_s, i, 1);
DelChars:=_s;
End;
BEGIN
Writeln('Input string');
Readln(s);
Writeln('Input char');
Readln(ch);
Writeln(DelChars(s, ch));
END.
2.3.2. Работа со строками длиной более 255 символов
Помимо представления строки с помощью типа данных string, в языке Pascal существует и другой способ реализации строк с помощью типа данных PChar. Для работы со строками, представленными типом данных PChar, разработано множество процедур и функций, которые находятся в стандартном модуле String.
В отличие от переменной/константы объявленной типа string, где максимальное количество символов равно 255, переменная/константа типа PChar может содержать множество символов, ограниченное только размером памяти одного сегмента 65534 байтов. В конце строки PChar имеется признак конца строки, называемый «нуль-символ», он обозначается \0.
0 |
1 |
2 |
3 |
4 |
5 |
6 |
с |
т |
р |
о |
к |
а |
\0 |
Строки с завершающим нулем хранятся в памяти в виде символьных массивов с нулевой базой, то есть нижняя граница которых равна нулю.
Const Len=300;
Type TStr=array[0..Len] of Char;
Для работы со строками типа PChar используются следующие процедуры и функции:
function StrCat(Dest, Source: PChar): PChar; добавляет одну строку к концу другой строки и возвращает указатель на результирующую строку;
function StrComp(S1, S2: PChar): integer; сравнивает две строки S1 и S2. Если S1< S2, то результатом будет отрицательное число; если S1= S2, то результатом будет 0; если S1> S2, то результатом будет положительное число;
function StrCopy(Dest, Source: PChar): PChar; копирует значение одной строки в другую. Возвращает указатель на начало результирующей строки;
procedure StrDispose(S: PChar); уничтожает строку, распределенную ранее с помощью функции StrNew;
function StrECopy(Dest, Source: PChar): PChar; копирует значение одной строки в другую. Возвращает указатель на конец результирующей строки;
function StrEnd(S: PChar): PChar; возвращает указатель на завершающий строку нулевой символ;
function StrIComp(S1, S2: PChar): integer; сравнивает две строки аналогично StrComp без учета регистра символов;
function StrLCat(Dest, Source: PChar; MaxLen: Word): PChar; добавляет одну строку к концу другой строки аналогично StrCat с установленной максимальной длиной результирующей строки и возвращает указатель на результирующую строку;
function StrLComp(S1, S2: PChar; MaxLen: Word): integer; сравнивает две строки аналогично StrComp, учитывая только установленное количество символов;
function StrLCopy(Dest, Source: PChar; MaxLen: Word): PChar; копирует заданное число символов из Source в Dest аналогично StrCopy и возвращает указатель результирующей строки;
function StrLen(S: PChar): Word; возвращает длину строки;
function StrLIComp(S1, S2: PChar): integer; сравнивает две строки аналогично StrLIComp без учета регистра;
function StrLower(S: PChar): PChar; преобразовывает каждую букву строки в нижний регистр;
function StrMove(Dest, Source: PChar; Count: Word): PChar; копирует заданное количество символов из Source в Dest и возвращает указатель результирующей строки;
function StrNew(S: PChar); выделяет для строки память в динамической распределяемой области;
function StrPas(S: PChar): string; преобразовывает строку типа PChar в строку типа string;
function StrPCopy(Dest: PChar; Source: string): PChar; копирует значение строки string в строку типа PChar и возвращает указатель результирующей строки;
function StrPos(S1, S2: PChar): PChar; возвращает указатель на первое вхождение строки S2 в S1, если совпадения нет, то возвращается nil;
function StrRScan(S: PChar; Ch: char): PChar; возвращает указатель на последнее вхождение символа Ch в строку S, если совпадения нет, то возвращается nil;
function StrScan(S: PChar; Ch: char): PChar; возвращает указатель на первое вхождение символа Ch в строку S, если совпадения нет, то возвращается nil;
function StrUpper(S: PChar): PChar; преобразовывает каждую букву строки в верхний регистр.