Строковый тип данных. Работа со строками в Turbo Pascal (4 часа)
Цель работы
Ознакомление с понятиями динамическая память, динамическая переменная, указатель. Получение практических навыков написания и отладки программ в среде Turbo Pascal для работы с динамическими массивами.
Краткая теоретическая справка
Строковый тип данных
Для обработки текста в Турбо Паскале был введён строковый тип данных string (строка). Строковый тип обобщает понятие символьных массивов, позволяя динамически изменять длину строки. Различают строковые переменные и строковые константы.
Строковый тип данных подобен одномерному массиву символов, задаваемому в виде array [0 .. N] of char.
Строковый тип данных может быть объявлен в разделах констант, типов и переменных:
const
Strcon = ' Strcon – это строковая константа';
type
S1 = string [N];
S2 = string;
var
S3, S4: string [M];
S5: string;
S6, S7: S1;
S8: S2;
Строковую константу объявляют в разделе констант. Строковая константа – последовательность любых символов, кроме символа возврата каретки, заключённая в апострофы. Если в строковой константе встречается апостроф, то он удваивается.
Строковую константу можно записать как последовательность ASCII- кодов символов, перед каждым из которых должен стоять символ сеточки #. Например, строки #139#165#170#230#168#239 и 'Лекция' эквиваленты.
Допускается в одной строковой константе совмещать оба вида записи, чередуя их любым образом. Это позволяет использовать в строке все виды символов, включая управляющие. Например, допустима запись
#7'Допущена ошибка !'#13'Нажмите клавишу ввода "Enter"',
что означает подачу звукового сигнала (#7) для привлечения внимания оператора, вывод текста "допущена ошибка!", переход на новую строку (#13) и вывод текста на ней "Нажмите клавишу ввода "Enter".
Выражения в квадратных скобках после слова string указывают максимальную длину строки и могут быть любыми константами порядкового типа, принимающими заданные значения в интервале от 1 до 255 включительно, т.е. N ≤ 255 и M ≤ 255. Если значение константы не указано, то длина строки принимается максимально возможной и равной 255 байтам (элементам).
Операции над строками
Значение строковой переменной может быть присвоено оператором присваивания либо прочитано из некоторого файла, например, текстового, соответствующей процедурой присваивания или чтения:
S3 := 'Тульский государственный университет'
S5 := S3;
readln(F, S5) ; {Чтение из файла F}
При вводе строковых переменных вводимые символы размещаются с начала строкового массива. Если количество введённых символов меньше заданной длины строки, то оставшиеся байты заполняются пробелами. Если заданная длина строки меньше, чем длина присваиваемого значения, то лишние символы отбрасываются.
Строка в Паскале трактуется одновременно как простое (скалярное) значение, так и как массив символов. Поэтому некоторые операции могут выполняться над строкой целиком (например, ввод и вывод), а некоторые над каждым символом по отдельности.
К конкретному символу строки можно обратиться как к элементу массива, указав в квадратных скобках после имени строки порядковый номер элемента строки.
В отличие от массивов переменные строкового типа могут участвовать как операнды в инструкциях ввода-вывода, например, в виде readln (S3) или в виде write (S3).
Самый первый байт в строке имеет индекс "0" и содержит текущую длину строки. Поэтому по операторуwrite (S3 [0]) на экран монитора будет выведен символ, описывающий длину строки S3. Количество символов в строке при её вводе определяется автоматически, при этом также автоматически заполняется нулевой байт.
К строкам можно применять операцию объединения (сцепления) строк, называемую конкатенацией и обозначаемую знаком "+". Например, после выполнения оператора
S6 := 'a' + 'b' + 'c';
строка S6 будет содержать текст "abc", а после выполнения оператора
S6 := S6 + 'd' + 'e' + 'f';
– текст "abcdef".
Все остальные действия над строками реализуются с помощью четырёх стандартных строковых функций Concat, Length, Copy, Pos и четырёх строковых процедур Delete, Insert, Str и Val, находящихся в модуле System.
Строковая функция Concat (St1, St2 [, St3, .., StN]) – конкатенация – имеет тип string и возвращает строку, полученную в результате слияния ("сцепления") строк-параметров St1, St2, .., StN. Например, функция
Concat ('abc', 'def');
эквивалентна действию оператора S6 := S6 + 'd' + 'e' + 'f';
Строковая функция Length (St) – "длина" – имеет тип byte и возвращает текущую длину строки St. Функцию Length удобнее использовать вместо выражения St [0], т.к. оно не даёт никаких преимуществ, а только затрудняет чтение текста программы.
Строковая функцияCopy (St, m, n) – "копирование" – имеет тип string и возвращает подстроку длиной n символов из строки St, начиная с символа номера m. Параметры m и n должны имеет тип integer, параметр St – тип string.
Строковая функцияPos (SubSt, St) – "позиция" – имеет типbyte и предназначена для поиска в строке St первого участка текста, совпадающего с текстом строки ("подстроки") SubSt. Если такой участок найден, то функция получит номер позиции, с которой начинается совпадение текстов. Если совпадения нет, то функция получит значение "ноль".
Строковая процедура Delete(St, m, n) – "удаление" – удаляет n символов из строки St, начиная с позиции m. Параметры m и n должны имеет тип integer или byte, параметр St – тип string.
Строковая процедураInsert(SubS, S,n) – "вставка" – вставляет подстроку SubS в строку S, начиная с позиции n. Параметр n должен иметь типinteger или byte.
Строковая процедураStr (X [: width [: decimals]], St) преобразует число Х любого вещественного или целого типов в строку символов St. Такое же преобразование делает процедура Writeln перед выводом. Если количество полей width под строковое представление значения Х не задано, то целое число будет занимать фактическое количество позиций, а вещественное будет записано в показательной форме в виде мантиссы и порядка числа и займёт 22 позиции (16 – мантисса, 8 – порядок). Если количество полей width под строковое представление значения Х задано, то целое число будет занимать width позиций. Если Х – вещественное число, то оно будет представлено в десятичной форме и также занимать width позиций, включая decimals позиций после десятичной точки.
Строковая процедураVal(St, x, y) преобразует строковое изображение числа St в число x целого или вещественного типа. Параметр y содержит признак ошибки преобразования. Если преобразование прошло успешно, то в x помещается результат преобразования, а переменная y будет равна 0. В противном случае параметр y будет содержать номер позиции строки St, где обнаружен ошибочный символ, а содержимое x не изменится.
В Паскале различают ведущие и ведомые пробелы. Пробел в начале строки перед символом называют ведущим, а в конце строки после конечного символа – ведомым.
При обращении к процедуре Val ведомые пробелы недопустимы. Поэтому, например, обращение
Val (' 125', x, y);
будет успешным, x станет равным 125, y – 0, а обращение
Val ('125 ', x, y);
будет ошибочным: значение x станет равным 125, т.е. не изменится, а y станет равным 4, т.е. укажет на ошибку в четвёртой позиции.
Если имеет место обращение
Val ('3,1416', x, y);
то x станет равным3,1416, т.е. не изменится, а y станет равным 2, т.к. имеет место ошибка: вместо десятичной точки поставлена запятая. Если же написано
Val ('3.1416', x, y);
то х будет равен 3.1416, а y станет равным нулю.
Кроме того, к строкам можно применять функцию Upcase (Ch) типа char, которая преобразует латинскую букву Ch в заглавную. Если значение символа Ch не является латинской буквой, то функцияUpcase его не изменит.
К строкам также применимы операции отношения =, <>, <, <=, >, >=. Сравнение строк происходит посимвольно слева направо. При этом один символ считается больше другого, если его код в таблице ASCII больше.
Как только в одной из строк впервые обнаружится больший символ, то эту строку считают большей и на этом их сравнение заканчивают.
Строки считаются равными, если имеют одинаковую длину и у них совпадают соответствующие символы.
Если длина одной строки больше, чем у другой, то строка большей длины считается большей.
Например, приведённые далее соотношения являются правильными:
'A' > '1', 'abcd' < 'acbd', 'abcd' > 'abc', 'abc ' = 'abc', 'c' < 'bbb'.
Любая заглавная буква всегда меньше соответствующей ей строчной, т.к. в кодовой таблице ASCII сначала располагаются все заглавные буквы, а затем строчные, т.е. заглавные буквы имеют меньшие номера.
Не нашли, что искали? Воспользуйтесь поиском по сайту:
©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.
|