Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СТАНДАРТНЫЕ ТИПЫ ДАННЫХ.docx
Скачиваний:
0
Добавлен:
14.11.2019
Размер:
40.69 Кб
Скачать

Строковый тип данных String.

Строка - это последовательность символов кодовой таб­лицы ASCII. При использовании в выражениях строка за­ключается в апострофы. Количество символов в строке (дли­на строки) может динамически изменяться в пределах от 0 до 255. Для определения данных строкового типа используется идентификатор String, за которым следует заключенное в квадратные скобки значение максимально допустимой длины строки данного типа. Если это значение не указывается, то по умолчанию длина строки принимается равной 255 байтам.

Переменную строкового типа можно определить через описание типа в разделе определения типов или непосредст­венно в разделе описания переменных.

Туре <имя типа> = String [максимальная длина строки];

Var <идентификатор> : < имя типа >;

Переменную типа String можно задать и без описания типа:

Var <идентификатор> : String [максимальная длина строки];

Определение строкового типа устанавливает максималь­ное количество символов, которое может содержать строка. Строковые данные могут использоваться в программе также в качестве констант. Не допускается применение стро­ковых переменных в качестве селектора в операторе Case.

Например:

Const Address = 'ул. Переверткина, 25'; {Строковая константа}

Type Flot = String [125]; {Длина строки 125 символов}

Var Fstr : Flot; {Описание с заданием типа}

Stl: String ; {По умолчанию длина строки - 255}

St2 : String [50]; {Длина строки - 50}

Nazv : String [280]; {Ошибка, длина Nazv превышает 255}

Тип String похож на одномерный массив символов, но в отличие от массива символов, количество символов в строке может меняться от 0 до N. К любому символу в строке можно обратиться так же, как к элементу массива, т.е. указав рядом с именем переменной типа String, в квадратных скобках ин­декс символа в строке.

Например:

St [2] - 2-ой символ в строке St;

St [i] -i-ый символ в строке St.

В самом начале строки (под нулевым номером) распо­ложен байт, содержащий значение текущей длины строки. Поэтому для определения объема памяти в байтах, требуе­мой для размещения строки, к значению ее максимальной длины прибавляется 1. Например, для размещения в памяти переменных Fstr, St2 требуется соответственно 126 байтов и 51 байт.

Для строк применимы операции: операция объединения строк (конкатенация) и операция сравнения.

Операция объединения строк обозначается знаком плюс (но это не сложение).

Например:

Stl: ='abed';

St2: ='efk';

St:= Stl + St2;

Результат работы функции: St содержит 'abedefk'.

Если длина результирующей строки превысит допусти­мую длину (255), то «лишние» символы отбрасываются.

Перечислим операции сравнения: = ,> = ,>,<>,<, <=. Сравнивать можно строки разной длины. Сравнение осуще­ствляется слева направо в соответствии с ASCII кодами сим­волов. Считается, что отсутствующие символы в более ко­роткой строке имеют код, меньше кода любого действительного символа. Например, 'АВ' больше, чем 'А'.

Тип данных String используется при обработке текстов, а это означает, что необходимо уметь:

-копировать часть строки;

-удалять часть строки;

-вставлять подстроку (т. е. часть строки) в данную строку;

-осуществлять поиск подстроки (т. е. часть строки) в данной строке.

Для реализации этих операций в Турбо-Паскале сущест­вуют стандартные процедуры и функции:

Функции и процедуры

Назначение

Length (Z: String): Integer

Возвращает текущую длину строки Z

Concat (Zi, [Z2,..., Z„] : String) : String;

Возвращает слияние (конкатенацию) строк ZbZ2,...,Zn.

Copy (Z: String; Index: Integer; Count: Integer): String;

Возвращает подстроку строки Z длиной Count, начинающуюся с позиции Index.

Pos (Substr: String; Z: String): Byte;

Определяет первое вхождение подстро­ки Z в строку Substr и возвращает 0, если Z не содержит Substr или номер первого символа Substr в Z.

Insert (Source: String; Var Z : String;Index: Integer);

Вставляет в строку Z подстроку Source, начиная с позиции Index .

Delete (Var Z: String; Index: Integer; Count: Integer);

Удаляет из строки Z подстроку длиной Count, начинающуюся с позиции Index.

Str (N : [:Width[:Decimals]]; Var Z: String);

Преобразует числовое значение N в строковое Z. Возможно задание формата jpN.

Val (Z; Var N; Var Code: Integ­er);

Преобразует строковое значение Z (строку цифр) в значение числовой пе­ременной N.

Рассмотрим работу функций на конкретных примерах. Используются две процедуры, которые корректно удаляют и вставляют символы в строку. При удалении символов ос­тавшаяся часть строки подтягивается к началу, чтобы занять образовавшуюся после удаления «дырку». При вставке, на­оборот, строка раздвигается, чтобы вместить вставляемые символы.

Например, надо удалить из строки St пять символов, начиная с 1-ой позиции:

St: = 'река Волга';

Delete (St, 1, 5);

Получим: St = 'Волга'.

Пусть необходимо удалить все пробелы из начала строки st (пробелы в на­чале строки называются ведущими пробелами):

While st [1] = ‘ ‘ Do Delete (st, 1,1);

Аналогичный фрагмент можно написать для удаления пробелов из конца строки (завершающих пробелов):

While St [Length (St)] = ‘ ‘ do Delete (St, Length (St), 1);

Например, вставим подстроку S2 в строку S1, начиная с 16-ой по­зиции.

S1 : ='Я разрабатываю программы '; S2 : = 'хорошие';

Insert (S2, SI, 16);

В результате получим: S1 =' Я разрабатываю хорошие программы'.

При вставке в начало и конец строки действие процеду­ры Insert аналогично выполнению операции конкатенации. Так, в примере со вставкой звездочек в конец строки можно заменить s : = s + ' * ' на Insert (' * ', s, length (s) +1).

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

Например, определим длину строки 123456789.

n : = Length ('123456789');

Результат работы функции n = 9.

Например, выделим из строки S1 пять символов, начиная с 1-ой позиции.

S1: =' Turbo Pascal';

S2: = Copy (S1, 1,5);

S3: = Copy (S1, 7, 3);

В результате получим S2 =' Turbo ', S3 =' Pas '.

Например, объединить три строки символов в строке s.

s: = Concat ('АА', 'XX', 'Y');

В результате s ='AAXXY'.

Функция Concat выполняет те же действия, что и опера­ция конкатенации. Например, для приведенного случая то же самое можно было записать так:

s : = 'АА' + 'XX' + 'Y';

Рассмотрим результат работы функции pos. Он имеет целочисленный тип и равен номеру той позиции, в которой находится 1-ый сим­вол подстроки. Если в строке подстроки не найдено, резуль­тат равен нулю.

S1 : = 'Turbo Pascal'; nl: = Pos ('Pascal', S1); n2 : = Pos ('паскаль', S1);

В результате nl = 7; n2 = 0 так как 'паскаль' и 'Turbo Pas­cal' - это разные строки.

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

Program lab;

Uses winCrt;

Const inst: Array [1 .. 12] of String [10] = ('январь', 'февраль', 'март',

'апрель', 'май', 'июнь', 'июль',

'август', 'сентябрь', 'октябрь',

'ноябрь','декабрь');

Var Str: String [10];

i: Integer;

Month: Boolean;

Begin

ClrScr;

WriteLn ('Введите имя месяца:');

ReadLn (Str);

For i:=1 To 12 Do

If Str=inst[i] Then Month:=True;

If Month=True Then

writeln ('Введено имя месяца')

Else WriteLn('Heт имени месяца');

End.

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

Program Lab2;

Uses WinCrt;

Const n = 30;

Var a: String [n];

p: String [7];

g, s, i,j,k: Integer;

BEGIN

ClrScr;

p:='aejiouy';

WriteLn ('Введите текст:');

k:=0;

Repeat

k:=k+1;

Read (a[k]);

Until (k=n) Or (a[k]='.');

WriteLn;

g:=0;

s:=0;

For i:=1 To k Do

For j:=1 To 7 Do

If a[i] = p[j] Then g:=g+1;

s:=k-g-1;

WriteLn ('Гласных =', g);

WriteLn ('Согласных = ', s);

End.

Задания для самостоятельного выполнения

1. Составьте программу шифрования текстового сообще­ния. Можно использовать простейший способ шифрования, при котором шифровальщик задает ключ шифровки - целое число, определяющее величину смещения букв русского алфа­вита. Например, при значении ключа, равном 3, в тексте буква 'а' меняется на 'г' и т. д. Составьте программу дешифрования текстового сообщения, зашифрованного вашей программой.

2. Дана произвольная строка текста. Выполните сортировку ее символов в порядке возрастания их номеров в таблице ASCII. Например, если введено: 'сва' в результате должно быть получено 'авс'.

3. В заданной строке текста удалите первое и последнее слово.

4. Пусть вводится последовательность символов длиной 10. Посчитайте, сколько среди них цифр.

5. В заданной строке текста выведите самое короткое и длинное слово. Удалите эти слова.

6. В заданной строке текста необходимо выбрать все цифры и записать их в массив. Подсчитайте количество цифр.

7. Даны два слова. Составьте программу, определяющую, можно или нет из букв слова А составить слово В.

8. Если в заданный текст входит каждая из букв слова 'KEY', тогда в качестве ответа вывести слово 'YES', а иначе - слово 'NO'.

9. Дана строка символов. Определить, сколько в ней слов четной длины. Удалить из нее каждое слово четной длины.

10. Дана строка символов. Определить, сколько в ней слов не­четной длины. Удалить из нее каждое слово нечетной длины.

11. В заданной строке текста определите слова, которые на­чинаются и заканчиваются на одну и ту же букву.

12. Вывести значение true, если в заданном тексте буква 'а' встречается чаще, чем буква 'в', и значение false иначе.

13. Дана произвольная строка текста. Выясните, является ли она палиндромом, т. е. читается ли строка слева направо так же, как и справа налево.

14. Напечатайте заданную последовательность символов, заменяя каждую точку многоточием.

15. Ввести строку, содержащую только цифры. Удалить из строки все впереди стоящие нули.

16. Введите строку, содержащую только цифры. Удалите из строки все нули.