Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Turbo Pascal / Stud_1_1 / LecRus / MainPart.doc
Скачиваний:
117
Добавлен:
03.03.2016
Размер:
5.03 Mб
Скачать

Var s : string[V],

где v - атрибут длины, представляющий собой целочисленное выражение.

Каждый символ строки занимает один байт.

Атрибут длины может принимать значение от 0 до 255. При v = 0 имеем строку нулевой длины, т.е. пустую строку. Если атрибут длины не указан в объявлении строки, то по умолчанию он принимается равным 255.

Если строка объявлена в виде string[n], то в памяти для нее выделяется n+1 байт, которые имеют номера 0, 1, ... , n. В нулевом байте хранится текущая длина строки.

Память строке, как и другим переменным, выделяется в соответствии с описанием ее типа. Однако, как и в массиве, эта память может использоваться не полностью. При объявлении string[Nmax] текущее количество символов строки, обрабатываемое в программе, может принимать значение 0  nNmax. На это количество указывает содержимое нулевого байта строки. Поскольку численное значение байта изменяется в диапазоне 0 .. 255, то это и определяет минимальное и максимальное количество символов в строке.

Примечание. Хотя содержимое нулевого байта, определяющее текущую длину строки, по физическому смыслу – число, но этот байт, как и остальные байты строки, считается в программе символом. Поэтому более точно можно сказать, что текущая длина строки – это порядковый номер символа, записанного в нулевом байте.

Пример 1.

Var S1,S2 : string[20];

S3 : string;

Begin

S1:='abc'; S2:='';

Строкам S1 и S2 выделяется по 21 байту памяти, строке S3 - 256 байтов. Текущая длина строки S1 равна 3 символа, строки S2 - 0 символов (пустая строка); текущая длина строки S3 неопределенная, поскольку этой строке не присвоено никакого конкретного значения.

Пример 2.

Var S1 : string[10];

S2 : string[5];

S3 : string[20];

Begin

S1:='abcdefghijklmn';

S2:=S1; S3:=S1;

Как известно, при выполнении оператора присваивания вначале вычисляется значение выражения в его правой части, а затем полученное значение записывается в поле памяти, которое отведено для переменной в левой части. В первом операторе присваивания выражение в его правой части - это строка-константа 'abcdefghijklmn' длиной 14 символов. Так как эта длина превышает максимальную длину строки S1, то в S1 записываются лишь первые 10 символов, а остальные отбрасываются (они не поместятся в поле памяти, отведенное для строки S1).

Если строка в левой части оператора присваивания длиннее, чем значение строкового выражения, то ей устанавливается текущая длина, равная длине строки в правой части.

Содержимое строк в примере 2:

S1 : 'abcdefghij'; S2 : 'abcde'; S3 : 'abcdefghij';

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

Пример 3.

Var ch : char;

S : string;

Begin

S:='0123456789';

ch:=S[5]; S[7]:='z'; Writeln('ch=',ch,' S=',S);

S[0]:=chr(4); Writeln('ch=',ch,' S=',S);

Будет отпечатано:

ch=4 S=012345z789

ch=4 S=0123

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

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

Пример 4.

Var S : string[10];

Begin

S:='0123456789'; Writeln(' S=',S);

Writeln(' S=',S:15); Writeln(' S=',S:5);

Формат в процедуре печати определяет, сколько позиций на внешнем носителе (в данном случае на экране дисплея) должно быть выделено для размещения выводимого значения. Если формат превышает требуемое количество позиций, то "лишние" позиции слева заполняются пробелами (выводимая строка размещается в правой части поля). Если формат вывода меньше требуемого значения, то на внешнем носителе выделяется столько позиций, сколько содержится символов в выводимом значении.

В примере 4 будет отпечатано:

S=0123456789

S= 0123456789

S=0123456789

Пример 5. Ввод строковых переменных.

Будем рассматривать ввод из текстового файла F (частным случаем текстового файла является клавиатура ПЭВМ). Пусть в строках файла F, начиная с их первой позиции, записана следующая информация:

abcdefghijklmnopqrst

01234567899876

АБВГДЕЖЗИЙКЛМНОП

После открытия файла его указатель устанавливается в первую позицию первой строки файла. Ввод информации всегда производится, начиная с текущей позиции указателя файла. В данном случае имеем:

abcdefghijklmnopqrst

01234567899876

АБВГДЕЖЗИЙКЛМНОП

Пусть в разделе Var объявлены следующие переменные:

Var S1 : string[5];

S2 : string[10];

S3,S4 : string[15];

Рассмотрим выполнение оператора Read(F,S1,S2,S3,S4), эквивалентного следующим четырем операторам:

Read(F,S1); Read(F,S2); Read(F,S3); Read(F,S4).

При выполнении первого оператора в строку S1 будут занесены 5 символов, начиная с текущей позиции файла F; при этом строка S1 получит значение 'abcde'. Указатель файла переместится в позицию 6 первой строки:

abcdefghijklmnopqrst

01234567899876

АБВГДЕЖЗИЙКЛМНОП

После выполнения второго оператора ввода в переменную S2 запишется строка 'fghijklmno', а указатель файла переместится в позицию 16:

abcdefghijklmnopqrst

01234567899876

АБВГДЕЖЗИЙКЛМНОП

При вводе строк S3 и S4 будут использованы символы, начиная с текущего положения указателя файла и до конца строки. Тогда строке S3 будет присвоено значение 'pqrst', а строке S4 - пустое значение.

В этом случае текущая длина строки S3 станет равной 5, а строки S4 - 0.

Пусть по отношению к тому же файлу F ввод строк выполняют операторы

Readln(F,S1); Readln(F,S2); Readln(F,S3); Readln(F,S4).

Это эквивалентно следующему:

Read(F,S1); Readln(F);

Read(F,S2); Readln(F);

Read(F,S3); Readln(F);

Read(F,S4); Readln(F).

После выполнения первого оператора строка S1, как и раньше, получит значение 'abcde', а указатель файла переместится в позицию 6 первой строки. Выполняемый после этого оператор Readln(F) перемещает указатель в первую позицию второй строки. После выполнения всех операторов будем иметь:

S1 = 'abcde'

S2 = '0123456789'

S3 = 'АБВГДЕЖЗИЙКЛМНО'

S4 = ''.

По отношению к строкам выполняется лишь одна операция - операция сцепления (конкатенации), которая обозначается символом "+". Если переменные S1 и S2 объявлены как строки, то выражение S1 + S2 означает, что к концу строки S1 дописывается строка S2.

Пример 6.

Var S1,S2 : string[10];

S3 : string;

Begin

S1:='0123456789'; S2:='abcd'; S3:=S1+S2;

Writeln(' S3=',S3);

Будет отпечатано:

S3=0123456789abcd

Пример 7.

Var S : string[15];

i : byte;

Begin

S:='123456';

For i:=1 to 6 do

S:=S+'a';

Writeln('S=',S);

Получим:

S=123456aaaaaa (текущая длина строки равна 12)

Пример 8.

Var S : string[15];

i : byte;

Begin

S:='123456';

For i:=1 to 12 do

S:=S+'a';

Writeln('S=',S);

Получим:

S=123456aaaaaaaaa (текущая длина строки равна 15, но не 18 )

Пример 9.

Var S : string[15];

i : byte;

Begin

S:='123456';

For i:=7 to 12 do

S[i]:='a';

Writeln('S=',S);

Получим:

S=123456 (текущая длина строки равна 6)

В примере 9, хотя и будут заполнены байты 7 .. 12 символом 'a', но операции присваивания выполняются по отношению к отдельным символам, а не по отношению к строке в целом. Поэтому текущая длина строки не изменяется. Если после оператора цикла добавить оператор S[0] := chr(12), то будет напечатано

S=123456aaaaaa (текущая длина строки 12).

Для строк допустимы все операции отношения. Сравнение строк выполняется слева направо по одному байту, пока не будут обнаружены различные байты. Пусть в этих байтах расположены символы ch1 и ch2.

Тогда ch1 < ch2, если ord(ch1) < ord(ch2).

Если текущие длины сравниваемых строк неодинаковы, то более короткая строка дополняется справа символом chr(0), который меньше любого другого символа таблицы ASCII.

Пример 10.

Var b1,b2,b3 : boolean;

Begin

b1:='abcdefgh'<'abcdxyzu';

b2:='300'>'30';

b3:=''='1234567';

Здесь имеем b1 = true, b2 = true, b3 = false.

Строчные и прописные буквы в строке считаются разными. В частности, 'a'  'A', так как ord('a')  ord('A').

Строки могут быть объявлены не только как переменные (раздел Var), но и как константы (раздел Const). Например

Const Digits = ‘0123456789’;

Здесь нужно обратить внимание на следующее обстоятельство: к элементам строки-константы нельзя обращаться по индексу. Следовательно, мы не можем записать

ch := Digits[5] или Digits[5]:=’a’;

Разрешение доступа по индексу означало бы, что строку-константу можно изменять (пример – приведенный выше второй оператор присваивания), а это недопустимо для констант.

Соседние файлы в папке LecRus