10-2.14

Символьный тип

В зависимости от компилятора Pascal символьный тип char занимает 1 или 2 байта. В компиляторе FreePascal, Borland Pascal, Turbo Pascal и других традиционных компиляторах — 1 байт. В PascalABC.NET — 2 байта.

Строковый тип

Для работы с символьной информацией в Pascal используют новый тип данных — строковый, именуемый ключевым словом STRING (или просто строка). Этот тип данных во многом похож на одномерный массив символов (Array[0..N] of char), но длина строки (максимальное количество символов N ограничивается числом 255). Значение N определяется при объявлении типа STRING(N) и может быть любой константой порядкового типа, но не больше 255. Значение N при объявлении типа STRING можно не указывать: в этом случае длина строки принимается равной 255 символам.

Строка трактуется как цепочка символов и к любому символу в строке можно обратиться по адресу (индексу), подобно одномерным массивам типа Array[0..N] of char. Самый первый байт в строке, имеющий адрес 0 (ноль), содержит код, равный числу символов в строке (длине строки).

Функции Ord и Chr

Для преобразования между символами и их кодами в кодировке Windows (CP1251) используются стандартные функции Chr и Ord:

  • Chr(n)
    - функция, возвращающая символ с кодом n в кодировке Windows;

  • Ord(с)
    - функция, возвращающая значение типа byte, представляющее собой код символа c в кодировке Windows.

Примеры описания строк:

type

str_type = string[12];

const

n = 50;

var

s1: string;

s2, s3: str_type;

s4: string[n];

s5, s6, s7: string[7];

Длина строки хранится в первом ее байте, индекс которого равен 0.

Объявление типизированной константы для типа string осуществляется так:

const

s: string = 'FreePascal'

Существует понятие пустой строки, то есть строки, в которой нет ни одного символа. Пустая строка обозначается двумя рядом стоящими апострофами (например, st := '').

Операции над строками

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

s1 := 'this is text';

s2 := s1;


Строки можно объединять с помощью операции конкатенации, которая обозначается знаком +.

s1 := 'John';

s2 := 'Black';

s1 := s1 + ' ' + s2;

Строки можно сравнивать друг с другом с помощью операций отношения.

К строкам применимы все операции сравнения <, >, <=, >=, =, <>.


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

'abc' > 'ab' (true)

'abc' = 'abc' (true)

'abc' < 'abc ' (false)

Имя строки может использоваться в процедурах ввода-вывода. При вводе в строку считывается из входного потока количество символов, равное длине строки или меньшее, если символ перевода строки (который вводится нажатием клавиши Enter) встретится раньше. При выводе под строку отводится количество позиций, равное ее фактической длине.

readln (s1);

write (s1);


К отдельному символу строки можно обращаться как к элементу массива символов, например s1[3]. Символ строки совместим с типом char, их можно использовать в выражениях одновременно, например:


s1[3] := 'h';

writeln (s2[3] + 'r');


Можно осуществлять коррекцию любого символа строковой переменной, для чего в соответствующем операторе достаточно указать имя переменной типа string, вслед за которым в квадратных скобках задается номер ее элемента (например, str[3] := 'j').

Элементы строки нумеруются с единицы, так как в каждой строковой переменной имеется элемент с номером 0, в котором в виде символа хранится длина текущей строки. Чтобы узнать текущую длину, достаточно применить функцию ord к нулевому элементу строки. Например:

writeln(ord(st[0]))


Нулевой элемент строковой переменной можно корректировать. При этом будет изменяться текущая длина строки. Например, выражение str[0] := #50 устанавливает текущую длину равной 50.

Встроенные функции

  • length(stroka) ; — возвращает длину строки stroka;

  • insert(vst_stroka,stroka,position); — вставляет подстроку vst_stroka в строку stroka, начиная с позиции position;

  • delete (stroka, posit ion, count) ; — удаляет из строки stroka количество count символов, начиная с позиции position;

  • copy (stroka, posit ion, count, ) ; — возвращает подстроку строки stroka длины count, начиная с позиции position;

  • pos (podstroka, stroka) — возвращает позицию подстроки pods t г oka в строке stroka; если pods troka не найдена, возвращается 0;

  • val (stroka, variabl ,variabl_err) ; — преобразует строковое представление целого или вещественного числа stroka к числовому значению и записывает его в переменную variabl. Если преобразование выполнено успешно, то в переменную variabl_err записывается 0, иначе — значение >0;

  • str (number, stroka) ; — преобразует целое или вещественное число number в строку и записывает результат в строку stroka.

Разбор примеров

Пример №1 -- считывание строк

Задача: Пользователь вводит произвольную строку. Cчитайте её, сложите саму с собой и выведите на экран.

Решение:

var s:string;

begin

writeln('vvedite stroku:'); // выводим пояснение для пользователя

readln(s); // считываем строку

s := s + s; // сложение строк

writeln('Poluchaem: ', s);

end.

Пример №2 -- считывание строки и её сложение с литералом

Задача: Пользователь вводит произвольную строку. Cчитайте её, сложите саму со строкой '123' и выведите на экран.

Решение:

var s:string;

begin

writeln('vvedite stroku:'); // выводим пояснение для пользователя

readln(s); // считываем строку

writeln('Poluchaem: ', s + '123'); // подставляем выражение как второй аргумент процедуры вывода

end.

-- в данном решении мы не записывали значение литерала в переменную, хотя могли бы, например:

var s, b:string; // объявим две переменные

begin

writeln('vvedite stroku:'); // выводим пояснение для пользователя

readln(s); // считываем строку

b := '123';

writeln('Poluchaem: ', s + b); // подставляем выражение как второй аргумент процедуры вывода

end.

Также мы могли бы объявить отдельную переменную для хранения результата, записать в неё результат конкатенации и затем вывести её значение:

var s, b, e :string; // объявим три переменные строкового типа

begin

writeln('vvedite stroku:'); // выводим пояснение для пользователя

readln(s); // считываем строку

b := '123';

e := s + b;

writeln('Poluchaem: ', e); // подставляем переменную в качестве второго аргумента процедуры

end.

Пример №3 -- считывание двух строк и их сложение с записью в переменную

Задача: Получите от пользователя две произвольных строки, сложите их, запишите результат конкатенации в переменную и выведите результат на экран.

Решение:

var s1, s2 :string;

begin

writeln('Vvedite pervuy stroku:');

readln(s1);

writeln('Vvedite vtoruy stroku:');

readln(s2);

s1 := s1 + s2; // сложение строк, запишем в первую переменную, чтобы не объявлять третью

write('Poluchaem: ', s1);

end.

Пример №4

Задача: Получите от пользователя три строковых значения, выведете на экран результат проверки условия:

""первое значение равно второму или первое НЕ равно третьему""

Используя логическую операцию OR, и оператор сравнения можем решить так:

program Project1;

var a, b, c: string; // секция объявления переменных

begin

//получим значения переменных от пользователя

writeln('vvedite pervuy stroku: ');

readln(a);

writeln('vvedite vtoruy stroku: ');

readln(b);

writeln('vvedite tretiy stroku: ');

readln(c);

writeln('otvet:', (a = b) OR (a <> c));

end.