Назад Домой! Дальше Лекция 4. Строки


Строка - последовательность символов. Минимальная длина строки равна нулю. Это - пустая строка. Строки похожи на одномерные массивы, но могут изменять длину во время работы программы. В Turbo Pascal 7 есть 2 типа данных для работы со строками.

A) Тип string - это строка длиной не более 255 символов.

Можно указать максимальную длину строки, например - string[50]. Рассмотрим программу:
var ss: string; st: string[20];
begin  ss:= 'Это пример строки';
st:= copy(ss,1,11)+ ss[5]+'рограммы !';
 writeln (st); readln;
end.
-------
Результат:
Turbo Pascal  Version 7.0  Copyright (c) 1983,92 Borland International
Это пример программы

В примере строка st описана с указанием максимальной длины (лишние символы справа отбрасываются), поэтому результат равен: st ='Это пример программы'.

ss[5] - это 5-й символ строки ss, т е 'п'. Copy - это функция, которая (здесь) возвращает 11 символов строки ss, начиная с 1-го символа. Знак + соединяет строки. Цепочка символов, заключенная в апострофы есть КОНСТАНТА строкового типа.

Каждый символ строки занимает при хранении в памяти один байт. В памяти хранится код символа, т е число 0..255. Длину строки можно увидеть в нулевом символе, т е ss[0] = 17 и st[0] = 20, но чтобы это увидеть в программе, требуется преобразование к типу Byte, например:

writeln('Длина строки ss = ', byte(ss[0]));

Существует много подпрограмм для работы со строками (но в Delphi их еще больше, а в PHP - много)

---------------
procedure Delete (var S: string; Index,Count:Integer);
Удаляет подстроку из строки S.
Параметр S - переменная строкового типа. Index и Count - целочисленные
выражения. Delete удаляет Count символов из строки S, начиная с позиции
Index. 
---------------
procedure Insert (Source: string; var S: string; Index: Integer);
 Вставляет подстроку в строку.
 Параметр Source - выражение строкового типа. Параметр S - переменная 
 строкового типа любой длины. Index - выражение целочисленного типа.
 Процедура Insert вставляет строку Source в строку S в позиции с номером
 Index. Если возникающая в результате строка длиннее 255-и символов, то она
 усекается после 255-го символа.
---------------
procedure Str (X [: Width [: Decimals ]]; var S) 
 Преобразовывает число в строку.
 Преобразовывает числовое значение X в строковое представление этого числа,
Необязательные: Width - ширина поля вывода, Decimals- число цифр дробной части.
--------------

procedure Val (S; var V; var Code: Integer) 
 Преобразовывает строковое значение в его числовое представление.
 Где:
   S    - переменная строкового типа. Должна представлять
          последовательность символов, формирующих число.
   V    - переменная типа Real или Integer
   Code - переменная типа Integer
 Преобразовывает строковое значение (S) в его числовое представление, как это
 происходит при чтении из текстового файла с помощью Read. Code - позиция, в
 которой произошла ошибка при преобразовании, или нуль, если ошибки не было.
------------------
function Copy (S; Index, Count: Integer): string;
 Возвращает подстроку строки.
 Параметр S - выражение строкового типа. Index и Count - выражения
 целочисленного типа. Функция Copy возвращает подстроку строки S, содержащую
 Count символов, начиная с символа с номером Index.
----------------
function Length (S): Integer;
 Возвращает динамическую длину строки.
-----------------
function Pos (Substr: string; S: string): Integer; 
 Параметры Substr и S - строковые выражения. Pos ищет первое вхождение строки
 Substr в строку S и возвращает целочисленное значение, которое является
 индексом первого символа Substr внутри S. Если строка Substr не найдена, то
 Pos возвращает нуль.
-------------
Примечание: подробнее - читайте в справочной системе Турбо-Паскаль7

Эти же подпрограммы есть в Делфи. Чтобы найти их и другие подпрограммы, поступим так:
1. В окне редактора (среды IDE Делфи), где виден текст разрабатываемого модуля допишем lehgth к какому-нибудь комментарию, например: { Public declarations length }
2. Поставим курсор внутрь lehgth (это имя одной из строковых функций) и нажмем клавишу F1. Далее в окошке "Найденные разделы" выберем Length function ( Object ... Щелкнем "Показать". Получим справку об этой функции. НО САМОЕ ВАЖНОЕ - здесь же список подпрограмм для работы со строками (string handling routines). Щелкаем эту ссылку и видим список. Незнающим английский не стоит комплексовать, так как разобраться в синтаксисе можно, зная только Паскаль. Однако имена подпрорамм понимать очень полезно.
3.Например,
function AnsiEndsText(const ASubText, AText: string): Boolean; возвращает true, если строка ASubText является суффиксом (окончанием) строки AText. Здесь ANSI-кодировка (1 символ в 1 байте), Ends- конец, Text- вероятно, угадаете.
4.Аналогично можно найти тригонометрические функции Делфи, "зацепившись" за sin (Category - trigonometry routines), или арифметические, начав с sqrt - корень квадратный.(Category -arithmetic routines)

Б) ASCIIZ - строка размером до 64Кб, оканчивающаяся кодом 0

Этот тип данных введен в 7-й версии Turbo Pascal. Определение типа:
type PChar = ^Char;
То есть это просто УКАЗАТЕЛЬ на один символ. (Тип данных - указатели будет рассмотрен далее). Однако в режиме "Расширенный синтаксис" компилятора (это режим {$X+}- по умолчанию) переменные типа PChar можно использовать как переменные типа:
type PChar = array[0..K] of Char;
где K < 64*1024 - число символов в строке ( не считая завершающего нуля). Использование переменных этого типа немного отличается от использования переменных типа string.
1. Если s1: PChar; s2:string; то s1[0] и s2[1] - крайние левые символы строк.
2. Для типа PChar используются другие подпрограммы. Пример на Turbo Pascal7
uses strings;  {подключаем модуль}
var ss: string;  ssP,stP: PChar;  ii:Integer;
begin
 ssP:= 'Это пример строки'#0;
 ss:= Copy(StrPas(ssP),1,11)+ ssP[4]+'рограммы !';
 StrPCopy(stP, ss);
 for ii:=0 to StrLen(stp) {длина строки типа PChar}
  do write(stp[ii]);
  readln;
end. {Программа выводит:
Это пример программы !
}
В этом примере работа со строками выполняется над данными типа string, а показанные здесь функции StrPas StrPCopy выполняют только преобразование типов. Для использования этих подпрограмм необходимо подключить модуль strings. Тип PChar необходим для обращения к функциям ОС Windows, т е при использовании WinAPI (для этого в Делфи есть модуль Windows, а в TPas7 - WinProcs, WinTypes) Рассмотрим аналогичный пример в Делфи (консольная программа). Комментарии в тексте.
program PChar1;
{$APPTYPE CONSOLE}
uses sysutils;
var pss,pst: PChar;  ss: string;
begin
 pss:= 'Eto primer stroki';
 ss:= copy(StrPas(pss),1,11) + pss[4]+'rogrammi !';
{ StrPas(pss) - преобразует строку pss к типу string
  copy - функция, рассмотренная ранее для Turbo Pascal
}
 GetMem(pst,Length(ss) + 1);
 { GetMem - выделяет переменной pst память на 1 больше размера строки ss}
 pst := StrPCopy(pst,ss);
 writeln('Result= ',pst);
 readln;
 {Программа печатает:
  Result= Eto primer programmi !
 }
end.

В) Для работы со строками в Делфи можно использовать типы данных:

1. ShortString - это тип, который в Паскале назывался string. Допускается ограничение длины: string[20];
2. AnsiString - в работе с переменными этого типа используются те же подпрограммы и методы, как для коротких строк. Можно хранить строки не длинее 2Гб. Однако при объявлении таких переменных память для них не выделяется. Она будет выделена при присваивании или процедурой SetLength. Присваивание таким строкам значений типа PChar требуется предварительное преобразование типов, например,
 
var ss: string; sp: PChar;
begin . . . ss:= PChar(sp);
Примеры преобразований можно видеть в предыдущем примере.
3. WideString - тип, предназначенный для хранения текстов в кодировке UniCode. Для каждого символа отводится 2 байта. В остальном он похож на AnsiString.
4. Под типом string в Делфи понимают, в зависимости от настройки компилятора, или AnsiString или WideString.
5. И, конечно, PChar, такой же, как в Паскале, но может хранить до 2Гб.

Примеры программ и варианты заданий по этой теме можно найти в справочнике-задачнике. Запустите его, щелкните кнопку "Задания", выберите: Турбо-Паскаль, Задание 3-а.

Назад Дальше
Rambler's Top100
Hosted by uCoz