Символьные типы данных

Лекция 10 Символьные типы данных

Аннотация: В этой лекции мы вернемся к символьным типам данных, и изучим их подробней. Освоим новую WinAPI-функцию MessageBox(), научимся обрабатывать строки.

Ключевые слова: пробел, процент, ANSI, поле, enter, tab, слово, функция, widestring, shortstring, массив, строка символов,индексация, байт, переменная, pchar, указатель, компьютер, Windows, значение, идентификатор, пользователь, программа,приложение, компонент, CASE, операции, синтаксис, индекс, count, параметр

Символ

Символ – это один знак. Любой – буква, цифра, арифметический знак или пробел, знак препинания или подчеркивания... А также специальные символы – переход на новую строку, BackSpace, знак доллара или процент. Тип "символ" в Delphi обозначается Char:

var

   c : Char;

begin

 c := 'В';

 ShowMessage('Вы ввели ' + c);

 c := #13;

 ShowMessage('Переход на новую' + c + 'строку');

  ...

Мы уже говорили, что символы берутся из таблицы символов ANSI или UNICODE. Большинство символов используются, некоторые символы являются служебными. Обратите внимание, что большая буква "А" и маленькая "а" - это разные символы! Также разными символами являются латинская "с" и русская "с", хотя они похожи, как две капли воды.

Нулевой символ не используется, он зарезервирован как полный нуль. Программисты нашли достойное применение этому символу, используя его в событиях ввода текста, когда требуется запретить пользователю ввод каких-либо символов. Служебные символы мы не можем увидеть в текстовом поле. Служебные символы, это <Esc>, <Enter>, <Tab> и другие. Каждый символ обрабатывается компьютером как число от 0 до 255, таким образом, слово "ПРИВЕТ" в памяти машины будет выглядеть как набор цифр: "207 208 200 194 197 210".

Функции работы с символами

В практике часто приходится обрабатывать отдельные символы. Переменным символьного типа Char можно присваивать значения таким образом:

var

  c,b : Char;

begin

  c := 'a';

  b := c;

Поскольку для компьютера символ – число, то символьные данные можно сравнивать между собой. При этом большим будет тот символ, число которого в таблице символов больше. Например, 'я' будет больше, чем 'а':

if b > c then ShowMessage('Истина!')

else ShowMessage('Ложь!');

При работе с символьными переменными часто используют функции Chr() и Ord(). Функция Chr() принимает в качестве параметра число, и возвращает символ, который соответствует этому числу в таблице ANSI:

function Chr ( X: Byte ): Char;

Функция Ord() совершает прямо противоположное действие, она принимает в качестве параметра символ, и возвращает число, под которым этот символ хранится в таблице ANSI:

function Ord ( C: Char ): Byte;

Символьные переменные можно использовать с этими функциями:

a := Chr(200);

i := Ord(a);

i := Ord('f');

В первой строке в переменную a мы записали символ "И", которому в таблице символов соответствует номер 200. Во вторую, целую переменную, мы записали число 200, так как символ с этим номером был записан в переменную a, которую мы передали в качестве параметра. Наконец, в третьей строке мы в целую переменную записали число 102, этот номер соответствует символу "f".

Строка

Строка – это набор символов. Строку можно представить в виде статичного или динамичного массива символьных данных. Типы строк мы уже разбирали в "Управляющая конструкция if, цикл for" : AnsiString – строка из ANSI – символов, и WideString – строка из UNICODE – символов.

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

var

  s : String;

begin

  s := 'Это многострочная' + #13 + 'строка';

  ShowMessage(s);

Как видно из примера, строку можно составлять из нескольких подстрок, и даже добавлять в нее отдельные символы. В примере мы добавили символ под номером 13, это символ перехода на новую строку. В результате выполнения этого кода процедураShowMessage() выведет на экран сообщение, разбитое на две строки:

Это многострочная

строка

ShortString – короткая строка из ANSI – символов. Может содержать от 0 до 255 символов. Используется нечасто. Собственно, вы можете объявить тип String с заранее указанным размером:

var

  s : String[100];

Как видите, строка объявляется с числовым индексом, почти как массив. Собственно, строка символов и есть массив символьных данных, и обращаться с ней можно также. Индексация символов в строке начинается с единицы, то есть, индексу 1 соответствует 1-й символ строки.

var

  stroka : String;

begin

  stroka := 'Привет';

  stroka[5] := 'а';  //изменили 5-й символ строки

  ShowMessage(stroka); //результат: строка "Приват"

PChar

Это тоже строка, и в будущем нам придется с ней сталкиваться. Эта строка работает совершенно иначе, чем String. СтрокаString представляет собой массив символов, в нулевом элементе которого содержится количество байт, отводимых под эту строку. А переменная типа PChar – это не сама строка, а указатель на начало строки, то есть переменная указывает на первый символ строки в памяти компьютера. А где же тогда PChar хранит количество байт в строке?! А нигде! Мы уже говорили о таблице символов ANSI, и выяснили, что нулевой символ – пустой. Вот последний символ PChar как раз и хранит этот символ, икомпьютер, найдя его, считает, что строка окончена.

Со строками PChar работать очень неудобно, однако нам придется это делать, когда мы будем работать с функциями WinAPIнапрямую. Функции WinAPI – это функции самой Windows, а не Delphi. Однако Delphi позволяет использовать их. Иногда это бывает необходимо, например, когда средств Delphi недостаточно для выполнения намеченной задачи. Использование таких функций не всегда удобно, однако они выполняются процессором намного быстрее, так как содержатся в самой операционной системе. Пример – функция MessageBox().

Вы уже привыкли выводить сообщения с помощью функции Delphi ShowMessage()? Привыкайте к новой функции!

Application.MessageBox('строка 1', 'строка 2',[ кнопки + тип_окна]);

Здесь:

  •  строка 1 - выводит текст внутри окна.
  •  строка 2 – текст в заголовке окна.

Если не указывать [кнопки + тип_окна] то выйдет простое окно с кнопкой ОК, как в функции ShowMessage().

Таблица 10.1. Типы кнопокКнопкиОписаниеMB_OK(ОК)MB_OKCANCEL(ОК и Отмена)MB_RETRYCANCEL(Повторить и Отмена)MB_YESNO(Да и Нет)MB_YESNOCANCEL(Да, Нет и Отмена)MB_ABORTRETRYIGNORE(Прервать, Повтор и Пропустить)Таблица 10.2. Типы оконТип окнаОписаниеMB_ICONWARNING(желтый треугольник с "!")MB_ICONINFORMATION(белый шарик с "i")MB_ICONQUESTION(белый шарик с "?")MB_ICONERROR(красный круг с белым крестиком)

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

Таблица 10.3. Возвращаемое функцией значениеЗначениеНажатая кнопкаIDOKОКIDCANCELОтменаIDABORTПрерватьIDRETRYПовторIDIGNOREПропуститьIDYESДаIDNOНет

Пример использования:

Application.MessageBox('Ошибка копирования файла!', 'Ошибка',

    MB_ABORTRETRYIGNORE+MB_ICONERROR)

В результате выполнения этой функции программа выведет окно:

Рис. 10.1. Окно функции MessageBox()

Давайте сразу попробуем эту функцию на примере. Создайте новое приложение. На форму установите компонент Label для вывода результата, и кнопку. В свойстве Caption компонента Label удалите весь текст. Создаем обработчик нажатия кнопки. Поскольку функция возвращает перечисляемое значение, мы можем использовать case. Пишем такой код:

case Application.MessageBox('Ошибка копирования файла!', 'Ошибка',

        MB_ABORTRETRYIGNORE+MB_ICONERROR) of

 IDABORT : Label1.Caption := 'Прервать';

 IDRETRY  : Label1.Caption := 'Повтор';

 IDIGNORE: Label1.Caption := 'Пропустить';

end; //case

В примере в качестве селектора для case мы указали саму функцию. Когда пользователь нажмет одну из кнопок, функция вернет числовое значение, соответствующее константе одной из кнопок. В результате, выполнится нужный код, и в свойство Captionкомпонента Label запишется, какая из кнопок была нажата.

Сохраните пример, откомпилируйте и посмотрите, как он работает. Попробуйте изменить тип окна на другой, например наMB_ICONQUESTION.

Функции работы со строками

Используя операции сравнения =, <, >, <=, >= строки можно сравнивать между собой. При этом большей считается та строка, в одинаковой позиции которой находится символ с большим кодом. Если все символы одинаковы, строки считаются равными. Примеры:

Таблица 10.4. Примеры сравнения строкСтрока 1Строка 2Результат сравненияИвановИвановСтроки равнывасильевВасильевСтрока 1 > Строки 2АлексеевПетровСтрока 1 < Строки 2ИвановаИвановСтрока 1 > Строки 2

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

Length()

Очень полезная, и часто используемая функция. Она возвращает длину строки (количество символов). Примеры использования:

Var

  s : String;

  i : Integer;

begin

  s := ‘Иванов’;

  i := Length(s); //результат – 6

  i := Length(‘Иванова’); // результат - 7

Процедура Delete

Процедура принимает в качестве параметра строку и удаляет какую-то ее часть. Синтаксис процедуры такой:

Delete(Строка, p, n);

Где:

  •  Строка – переменная строкового типа.
  •  p – номер символа, с которого начинается удаление.
  •  n – количество удаляемых символов.

Пример использования:

s := 'Город Санкт-Петербург';

Delete(s, 7, 6);

В результате выполнения данного кода в строке s останется текст "Город Петербург".

Функция Pos()

Функция находит подстроку Substr в строке S и возвращает индекс первого символа найденной подстроки. Если S не содержит указанную подстроку, то функция возвращает 0:

Функция Pos ( Substr: string, S: string ): Integer;

Пример использования:

var

  S: string;

  I: Integer;

begin

  S:= 'В лесу родилась елочка';

  I:= Pos( 'лес', S);     // I = 3

end;

Функция Copy()

Функция возвращает подстроку размером Count символов, начиная с символа Index. Параметр S – передаваемая в функцию строка; Index и Count – целые числа. Если Index больше длины строки, то функция возвращает пустую строку. Если значениепараметра Count больше, чем может быть возвращено функцией, то возвращаются символы или элементы, начиная с Index и до конца S.

Функция Copy ( S, Index, Count ): string;

Пример использования:

var

  S: string;

begin

  S:= 'Победа';

  S:= Copy( S, 3, 4);     // S = 'беда'

end;

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

← Предыдущая
Страница 1
Следующая →

Файл

Лекция_10.doc

Лекция_10.doc
Размер: 101 Кб

.

Пожаловаться на материал

 В этой лекции мы вернемся к символьным типам данных, и изучим их подробней. Освоим новую WinAPI-функцию MessageBox(), научимся обрабатывать строки.

У нас самая большая информационная база в рунете, поэтому Вы всегда можете найти походите запросы

Искать ещё по теме...

Похожие материалы:

Цели и задачи налогового администрирования

Курсовая работа. Теоретические аспекты налогового администрирования Совершенствование работы налогового администрирования в налоговой инспекции

Профілактика спортивного травматизму у дітей молодшого шкільного віку

Курсова робота Кафедра здоров’я людини, рекреації та фітнесу. Мета:  визначити причини виникнення травматизму під час занять фізичною культурою в молодших класах середньої школи та особливості травм

Анализ и прогноз динамики трудовых ресурсов

Практическая работа по дисциплине: «Статистика». Основные понятия трудовых ресурсов. Понятие и состав трудовых ресурсов. Особенности использования трудовых ресурсов. Обеспеченность трудовыми ресурсами и эффективность их использования. Анализ трудовых показателей по показателям рядов динамики

Государственное право. Часть 4

Что такое конфедерация и государства-конфедерации. Система государственной власти и управления. Что такое федерация и особенности статуса. Ветви власти.

Конспект лекций по курсу «Электротехника и электроника»

Основные понятия, определения и законы электротехники. Переменный электрический ток. Магнитные пускатели. Электродвигатели. Схема и временная диаграмма фазных токов статора асинхронного двигателя. Заземление.

Сохранить?

Пропустить...

Введите код

Ok