Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Praktikum_po_programmirovaniyu.doc
Скачиваний:
23
Добавлен:
09.12.2018
Размер:
2.5 Mб
Скачать

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

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

Определить строковый тип можно непосредственно в разделе описания переменных или же через предварительное создание типа.

Type

{Создание строкового типа}

St = string[10];

Var

{Описание переменных строкового типа}

tr: st;

a: string[14];

Количество символов строки можно динамически изменять от 0 до 255.

Число, стоящее в квадратных скобках определяет максимальную длину строки. Если это число не задано, максимальная длина строки равна 255.

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

Если a: = ‘double’, то длина этой строки определяется так: ord(a [0]). Ячейки памяти с первой по 5 – ую соответствуют занятой части строки, а с 6-той по 255-ую – свободной части строки

0 1 2 3 4 5 6

0

d

o

u

b

l

e . . .

Элементы строки нумеруются целыми числами, начиная с 1.

58

Выражения, в которых операндами служат строковые данные, называются строковыми выражениями. Они состоят из строковых констант, переменных, указателей функций и знаков операций.

Над строковыми переменными допустимы следующие операции:

Операция сцепления (+) соединяет несколько строк в одну результирующую строку.

‘Дом ’+’номер ’+’три’ → ‘Дом номер три’.

Длина результирующей строки не должна превышать 255 символов.

Операции отношения (= , <>, < , >, >= , <=) - проводят сравнение двух строковых операндов и имеют приоритет более низкий, чем у операции сцепления. Сравнение строк производится слева направо до первого несовпадающего символа, и та строка считается больше, в которой первый несовпадающий символ имеет больший номер в стандартной таблице кодов для обмена информацией. Результат операций отношения имеет логический тип.

‘пример1’ < ‘пример2’ - true

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

‘xxxxxxx’ >’xxxxx’.

Строки считаются равными, если они содержат одни и те же символы и имеют одинаковую длину.

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

Str1: = ‘группа учащихся’;

Str1: = Str1+’первого курса’;

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

59

a: string[6]; a: = ‘Группа 1’ → Группа

a: string[2]; a: = ‘Группа’ → Гр

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

var

lit: char;

st1: string[12]; st2: string[30];

begin

lit: = ‘z’;

st1: =’отдел’;

st2: = st1+lit;

st1: = ‘0’;

lit: =st1; {Такое присваивание допустимо, так как st1 имеет текущую длину, равную единице}

lit: = st2; {Такое присваивание недопустимо, так как st2 имеет текущую длину больше единицы}

end.

К отдельным символам строки можно обратиться по номеру (индексу) данного символа в строке. Индекс определяется целочисленным выражением, которое записывается в квадратных скобках:

st2[1+2] → д

st2[6] → z

st2[0] дает доступ к нулевому байту, содержащему значение текущей длины строки. Значение нулевого байта не должно превышать 255. Однако нарушение этого правила не вызывает прерывания. Для обеспечения такой проверки нужно использовать директиву компилятора {$R+}.

Для работы со строковыми переменными используются следующие процедуры:

60

Delete(st,poz,n) – удаление символов строки, начиная с позиции . Если , выдается сообщение об ошибке.

‘program’ → delete(st,4,2) → ‘proam’

Insert(st1,st2,poz) - вставка строки в строку , начиная с позиции .

var st1, st2, st3: string[25];

st1: = ‘по ’;

st2: = ‘практикум логике’;

insert(st1,st2,11);

После вызова этой процедуры переменной будет соответствовать строка ‘практикум по логике’.

Str(I,st) – преобразование числового значения величины в строковую переменную . После переменной может указываться формат. Если в формате указано недостаточно места для вывода, то поле вывода автоматически расширяется до нужной величины.

I Выражение Результат

125 str(I:4,st) ‘_125’

1.34E+03 str(-I:3,st) ‘-1340’

Val(st,I,code) – преобразование строковой переменной в величину целочисленного или вещественного типа . Значение не должно содержать незначащие пробелы в начале и конце. Параметр сообщает об ошибке. При отсутствии ошибки переменная = 0, в противном случае переменная равна номеру позиции, в которой обнаружена ошибка.

st Выражение Результат

‘3056’ val(st,I, code) 3056 0

‘1.6+03’ val(st,I,code) 1600 0

‘1.678A+03’ val(st,I,code) ? 6

Для работы со строковыми переменными используются следующие функции:

61

Copy(st,poz,n) – выделяет из строки подстроку длиной символов, начиная с позиции . Если > длины строки , то результатом будет пробел. Если , выдается сообщение об ошибке.

st Выражение Результат

‘program’ copy(st,4,4) ‘gram_’

Concat(st1,st2,...,stn) - сцепляет последовательность строк в одну результирующую строку. Длина результирующей строки не должна превышать 255 символов.

Concat(‘for ‘, ‘i: = 1 to 5 do’) → for i: = 1 to 5 do

Length(st) - вычисляет количество символов в строке . Результат имеет целочисленный тип.

st Выражение Результат

‘program’ length(st) 7

Pos(st1,st2) - обнаруживает первое появление в строке подстроки . Результат имеет целочисленный тип и равен номеру той позиции, где находится первый символ подстроки . Если в строке подстрока не найдена, то результат будет равен 0.

st2: = ‘program’;

st1: = ‘gr’;

Результат функции pos(st2,st1) равен 4.

Upcase(ch) – преобразует строчную букву в прописную. Параметр и результат имеет символьный тип. Функция обрабатывает только буквы латинского алфавита.

st Выражение Результат

‘f’ upcase(st) ‘F’

Пример 1. Разработать программу, которая удаляет все пробелы в строке слева.

Program delpr;

Var st:string[120];

Dlina: byte;

Begin

62

writeln(‘Введите строку с одним или несколькими пробелами слева’);

readln(st);

dlina: = ord(sr[0]);

{В цикле происходит удаление из строки st одного символа} {слева, результат снова записывается в переменную st, поэтому} {при повторном выполнении цикла переменная имеет уже на} {один пробел меньше.}

while(dlina > 0) and (st[1]=’ ’) do

delete(st,1,1);

writeln(‘Результирующая строка’);

writeln(st);

end.

Контрольные вопросы и упражнения

1. Разработайте программу, которая преобразует строку строчных латинских букв в строку прописных латинских букв.

2. Разработайте программу, которая преобразует строку прописных латинских букв в строку строчных латинских букв.

3. Дана строка, состоящая из последовательности слов, разделенных, по крайней мере, хотя бы одним пробелом. Разработать программу, которая подсчитывала бы количество слов в этой строке.

4. Дано натуральное число . Разработать программу для нахождения цифры, стоящей на - том месте в этом числе.

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

6. Дан текст. Разработать программу, которая выводит на экран только целые числа, отсеивая прочие данные.

63

7. Разработать программу, которая обращает введенное слово, т.е. переставляет символы в слове в обратном порядке.

8. Разработать программу для подсчета одинаковых символов в заданной строке.

9. Дана строка, состоящая из последовательности слов, разделенных пробелами. Разработать программу для подсчета количества слов, начинающихся и заканчивающихся одной и той же буквой.

10. Дан текст, состоящий из 60 литер. Напечатать только строчные русские буквы, входящие в этот текст.

11. Дана последовательность символов, содержащая от 1 до 30 слов, в каждом из которых от 1 до 5 строчных латинских букв; между соседними словами - запятая, за последним словом точка:

- напечатать эту же последовательность слов, но в обратном порядке;

- напечатать все слова в алфавитном порядке;

- напечатать все симметричные слова.

12. Дана последовательность слов, содержащая от 2 до 30 слов, в каждом из которых от 2 до 10 латинских букв; между соседними словами – не менее одного пробела, за последним словом - точка. Напечатать все слова, отличные от последнего слова, предварительно преобразовав каждое их них по следующим правилам:

- перенести первую букву в конец слова;

- перенести последнюю букву в начало слова;

- удалить из слова последнюю букву;

- удалить из слова первую букву.

- если слово нечетной длины, то удалить его среднюю букву.

13. Напечатать в обратном порядке заданный текст. Текст заканчивается точкой.

64