Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Строка, строковые операторы и встроенные строковые функции




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

Методические указания к лабораторной работе № 5
по курсу: «Основы алгоритмизации и программирования»

 

Ростов-на-Дону

2009


Составитель: С.В.Шинакова

 

 

Методические указания и задания к выполнению лабораторной работы по теме "Программирование в Delphi: введение Object Pascal" / ДГТУ, Ростов-на-Дону, 2009. ** с.

 

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

 

 

Рецензент:

 

 

Печать оперативная. Формат 60х84/16. Бумага офсетная.

Объем 0,7 усл.-п.л., 0,7 уч.-изд.л.

Тираж ** экз.

____________________________________________________________________

ã ДГТУ, 2009





Цель работы

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

Строка, строковые операторы и встроенные строковые функции

Строка – это набор символов произвольной длины, которая относятся к структурированным типам данных. Строковые константы обозначаются апострофами. Ниже приведена таблица 1 типов строк в Delphi.

Таблица 1

Строковые типы в Object Pascal

Тин строки Максимальная длина Требования к памяти Используется для Нулевой
ShortString 255 от 2 байт до 256 байт обратной совместности нет
AnsiString ~231(~2Г6) от 4 байт до 2 ГБ однобайтных, двухбайтных и многобайтных символов ANSI есть
String ~2 Гб от 2 байт до 2 ГБ символов ANSI или Unicode есть или нет
WideString ~230(~1Гб) от 4 байт до 2 ГБ символов Unicode, в серверах СОМ и интерфейсах есть

 

В следующей строке кода переменной today присваивается значение Четверг:

today := 'Четверг'

           Операция конкатенации, обозначаемая символом + – единственная строковая операций Object Pascal. Конкатенация объединяет строки в указанном порядке слева направо. Таким образом, оператор + может выполнять различные операции в зависимости от типа операндов. Такие операторы называются перегружаемыми. В следующем фрагменте кода выполняется конкатенация строк:

weekendDays :='Суббота' + ' и ' + 'Воскресенье';

После выполнения этого кода переменная weekendDays содержит строку Суббота и Воскресенье.

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

weekendDays := ''Суббота и Воскресенье'';

Обрабатывая эту строку кода, компилятор сгенерирует сообщение о синтаксической ошибке. Компилятор Delphi не сможет понять структуру этого оператора. Он видит, что за первым апострофом непосредственно следует второй, и считает это пустой строкой, т.е. строкой, не содержащей символов. Затем оператор встречает слово Суббота и не знает, Как его понять, поскольку строка уже закончилась. К счастью, существует несколько способов включения апострофа в состав строки. Внутри строки компилятор считает последовательность из двух апострофов не признаком окончания строки, а одним апострофом, входящим в состав строки. В следующем фрагменте кода переменной weekendDays присваивается значение 'Суббота и Воскресенье':

weekendDays := '''Суббота и Воскресенье''';

Первый и последний апострофы обозначают конец строки. Каждая пара апострофов внутри строки рассматривается компилятором как один апостроф.

Другой способ включения апострофов в состав строки – использование числовых значений символов. В компьютере с каждым символом ассоциировано числовое значение ASCII (American Standard Code for Information Interchange – Американский стандартный код для обмена информацией). В операционной системе Windows на экран выводятся не все символы ASCII, в ней используется более ограниченный набор символов ANSI (American National Standards Institute – Национальный институт стандартизации США). Числовые значения большинства символов ASCII и ANSI совпадают.

Для работы с символами ASCII в Object Pascal есть две встроенные функции:

  • Chr(n) – возвращает символ, числовое значение ASCII которого равно n;
  • Ord (символ) – возвращает значение ASCII символа символ.

Например, Chr(65) возвращает символ A, a Ord('А') возвращает значение 65. Таким образом, числовое значение символа А равно 65.

Числовое значение ASCII символа "апостроф" равно 39, поэтому строку предыдущего примера можно записать в виде

weekendDays := Chr(39) + 'Суббота и Воскресенье' + Chr(39);

Этот оператор присваивания эквивалентен предыдущему: он присваивает переменной weekendDays значение 'Суббота и Воскресенье'.

Кроме функции Chr() и операции конкатенации, для включения в строку символа в Object Pascal можно воспользоваться управляющей последовательностью. Она состоит из символа #, за которым следует целое число в диапазоне от 0 до 255, обозначающее символ ASCII. Например, оператор

myString := #72#101#108#108#111;

эквивалентен оператору

myString := 'Hello';

Еще один пример: оператор

weekendDays := #39'Суббота и Воскресенье'#39;

эквивалентен и оператору

weekendDays := '''Суббота и Воскресенье''';

и оператору

weekendDays := Chr(39) + 'Суббота и Воскресенье' + Chr(39);

Обратите внимание: управляющая последовательность в составе строки не работает. Она управляет только работой компилятора. Например, если переменную myString: = 'Hel#108o' вывести на экран, то мы увидим не Hello, a Hel#108o.

Язык Object Pascal поддерживает также типы данных и функции, необходимые для работы с набором символов Unicode, в котором каждый символ представлен двумя байтами. Строка Unicode состоит из последовательности двухбайтовых символов. Преимуществом набора Unicode является то, что он содержит символы всех языков мира. Это существенно облегчает создание приложений, которые будут использоваться в других странах. Символы и строки Unicode иногда называют широкими символами и широкими строками. Первые 256 символов Unicode совпадают с символами набора ANSI. При необходимости вы можете обратиться к справочной системе Delphi, в которой представлена полная информация о символах Unicode.

Для обработки строк Object Pascal предоставляет довольно много встроенных процедур, благодаря которым он является одним из лучших языков для работы со строками. В таблице 2 перечислены некоторые наиболее полезные встроенные строковые функции и процедуры.

Таблица 2

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

Функция Назначение
CompareStr (const S1, S2: string): Integer; Сравнивает две строки с учетом регистра
CompareText (const S1, S2: string): Integer; Сравнивает две строки по числовым значениям символов без учета регистра
Concat(S1[,S2,…,SN]:string):string; Конкатенирует две (или более) строки в одну
Copy(St:String; Index,Count: Integer):string; Возвращает подстроку заданной строки
IsDelimiter (const Delimiters, S: string; Index: Integer): Boolean; Определяет, является ли указанный символ строки символом-разделителем
LastDelimiter(const Delimiters, S: string): Integer; Возвращает позицию последнего символа-разделителя в строке
Length(S): Integer; Возвращает количество символов в строке
LowerCase (const S: string): string; Возвращает копию строки, заменив все буквы верхнего регистра соответствующими буквами нижнего регистра
Pos(SubSt, St: String):Integer; Возвращает позицию первого символа в подстроке, содержащегося в заданной строке
QuotedStr (const S: string): string; Возвращает строку, выделенную апострофами (т.е. добавляет апострофы в конец и в начало строки)
StringOfChar (Ch: Char; Count: Integer): string; Возвращает строку с указанным количеством повторяющихся символов
StringReplace( const S, OldPattern, NewPattern: string; Flags: TReplaceFlags): string; Возвращает строку с заменой всех вхождений одной подстроки другой подстрокой
Trim(const S: string): string; Удаляет из строки пробелы, расположенные в начале и в конце строки, и управляющие символы
TrimLeft(const S: string): string;   Удаляет из строки пробелы, расположенные в ее начале, и управляющие символы
TrimRight(const S: string): string; Удаляет из строки пробелы, расположенные в ее конце, и управляющие символы
Uppercase(const S: string): string; Возвращает копию строки с заменой всех букв нижнего регистра соответствующими буквами верхнего регистра
WrapText(const Line, BreakStr: string; nBreakChars: TSysCharSet; MaxCol: Integer):string; Разбивает строку на несколько строк, имеющих указанный размер
Процедура Назначение
Delete (BufPos: longint; DelLen: longint) Удаляет подстроку из строки
lnsert (BufPos: longint; Text: string);   Вставляет подстроку в строку, начиная с указанной позиции
SetLength (var S; NewLength: Integer); Устанавливает длину строки
SetString (var s: string; buffer: PChar; len: Integer) Устанавливает содержимое и длину строки
Str(X [: Width [: Decimals ]]; var S); Преобразует числовую переменную в строку
Val(S; var V; var Code: Integer); Преобразует строку в числовую переменную

Как видно из таблицы 2, функция QuotedStr() предоставляет еще один способ размещения апострофов вокруг строки. С ее помощью фрагмент кода, присваивающий строке weekendDays значение 'Суббота и Воскресенье' можно записать так:

weekendDays := QuotedStr('Суббота и Воскресенье');

Работа со строками

Если заранее известно, что количество символов строковой переменной не будет превышать определенную величину, то эту переменную можно объявить как короткую строку. Короткие строки используются, если длина строки не превышает 255 символов. Синтаксис объявления короткой строки имеет вид

var

имя_строки: String[n];

Обратите внимание: переменная имя_строки занимает n+1 байт памяти (от 0 до n), причем байты от 1 до n содержат символы строки, а нулевой байт – размер строки. Поскольку максимальное число, которое можно хранить в байте, равно 255, то ясно, что п должно быть меньше или равно 255. Тип данных ShortString эквивалентен типу String[255]. Типы String[n] и ShortString введены главным образом для совместимости с предыдущими версиями Delphi и Turbo Pascal. Приведем пример использования короткой строки:

var

myString: String[10];

begin

myString := 'Это пример строки';

writeln(myString);

readln;

end;

Если выполнить этот код, то в окне консольного приложения появится строка Это пример. Куда подевались остальные символы?

Тип данных String эквивалентен типу AnsiString. Оба они являются типами длинной строки, длина которой ограничена только объемом доступной памяти. Перепишем предыдущий пример с использованием длинной строки:

var

myString: String;

begin

myString := 'Это пример строки';

writeln(myString);

readln;

end;

При выполнении этого кода в консольном окне появляется строка Это пример строки.

Тип String был первым строковым типом данных в Turbo Pascal. Первоначально этот тип был реализован как короткая строка. В режиме компилятора Delphi {$H+} или {$LONGSTRINGS on}, установленном по умолчанию, тип данных String определен как эквивалентный типу AnsiString. Режим {$H-} или { $LONGSTRINGS OFF} полезен при работе с кодами, унаследованными от старых версий Delphi или Turbo Pascal, в которых по умолчанию используются короткие строки. С помощью этой директивы компилятора можно также изменить определение типа String локально, только для старого фрагмента кода. При этом в остальном коде тип String будет определен как в режиме {$Н+}. Другой способ использования старого кода – изменить объявления String на String[255] или на ShortString, сделав таким образом код независимым от режима компилятора.

Строка фактически является массивом символов. Массив – это индексированный набор элементов одного и того же типа (который называется базовым типом). С каждым символом строки ассоциировано уникальное значение индекса. На рис. 1 показана структура строковой переменной как массива символов.

Предположим, переменной myString типа String присвоено значение

myString :='Это пример строки';

Тогда структура массива myString имеет вид:

Индекс 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 17 18
myString Э т о   п р и м е р     с т р о к и

Рис. 1. Внутренняя структура переменной myString

Обратиться к отдельному символу внутри строковой переменой можно с помощью выражения имя_строки[i], где i – индекс символа, на который вы хотите сослаться. Значение индекса первого симвоюла строковой переменной равно 1, второго – 2 и т.д. Обратите внимание: выражение имя_строки[i] имеет символьный тип, поэтому его значение можно сохранить в любой переменной символьного или строкового типа. Кроме того, выражение имя_строки[i] можно использовать в операторе присваивания или в качестве параметра подпрограммы. Используйте его в следующем упражнении:

Какой текст появится в результате выполнения этого кода?

К сожалению, функции UpperCase() и LowerCase() выполняют преобразование только латинских букв набора ASCII. Русские буквы они оставляют неизменными.

Контрольные задания

1. Дана символьная строка S. Скопировать посимвольно ее в другую символьную строку.

2. Дана символьная строка S. Составить алгоритм для выделение подстроки в исходной строке. В качестве входных параметров используются: номер символа, с которого начинается подстрока в строке, и длина подстроки.

3. Дана символьная строка S. Подсчитать сколько раз в заданной строке встречаются символы ‘a’ и ‘1’.

4. Дана символьная строка S. Скопировать первые N сиволов из исходной строки в новую. N вводиться с клавиатуры. Если N больше длины строки, то строка копируется целиком.

5. Дана символьная строка S. В этой строке все символы ‘7’ и ‘!’ заменить на символы ‘?’.

6. Даны две символьные строки S1 и S2. Получить третью строку, как объединение двух строк следующим способом: если S1= “123” и S2= “abc”, то S3=“1a2b3c”.

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

Контрольные вопросы

1. Как можно объявить величину строкового типа?

2. К каким типам данных относятся строки?

3. Какова максимально возможная длина строки?

4. С величиной какого типа данных совместим по присваиванию отдельный символ строки?

5. Расскажите об операциях, которые можно выполнять над строковыми величинами.

6. Расскажите о функциях, определенных для величин строкового типа.

7. Расскажите о процедурах, определенных для величин строкового типа.

8. Как осуществляется доступ к отдельному символу строки?

9. Что такое конкатенация строк?

10. Поясните применение управляющих последовательностей.

11. Что такое короткая строка и когда она применяется, чем отличие длинной строки от короткой?

12. Какая функция (процедура) является аналогом операции конкатенация строк (+) при работе со строками?

13. Опишите 4 типа строк в языке Object Pascal Delphi 5-6: String, ShortString, AnsiString, WideString.

14.  Опишите назначение процедур и функций обработки строк в стиле Pascal: Concat, Copy, Delete, FloatToStr, Insert, Length, Pos, StrToInt.










Последнее изменение этой страницы: 2018-05-31; просмотров: 194.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...