Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМК ПП1 (C++ БД).doc
Скачиваний:
4
Добавлен:
01.03.2025
Размер:
5 Мб
Скачать
☆

2.2. Обработка строк

Вы уже знакомились в общих чертах с этим аспектом программирования в рамках дисциплины «Программирование и основы алгоритмизации» [2, с. 47, 51, 90];[4, с. 47, 52, 90]. Ввиду важности роли, которую занимают строки при практическом программировании, рассмотрим функции обработки строк на более глубоком уровне.

Для обработки текстов в C++Bilder используются следующие два основных типа: строка AnsiString и строка string [2,c. 44];[4,c. 44].

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

Строки типа string, называемые также «строками с нулевым окончанием», были задуманы как средство передачи параметров встроенным в Windows процедурам, и используются в основном в системном программировании. Применение этих строк для прикладных программ возможно, но затруднено, поэтому разработчики C++Builder включили в состав системы механизм обработки строк, заимствованный из Паскаля. Эти строки получили тип AnsiString и представляют собою удобный и хорошо разработанный аппарат для прикладных задач. В дальнейшем мы будем использовать строки исключительно типа AnsiString, кроме особых случаев обращения к процедурам API Windows (раздел 5.1).

Строка как тип данных обладает двойственной природой: её можно рассматривать как:

  • единую переменную и тогда применять к ней комплексные операции обработки;

  • массив односимвольных переменных, и тогда рассматривать каждый символ по отдельности в адекватных операторах цикла.

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

Операции над строками

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

  • конкатенация или соединение (сложение);

  • операции отношения.

Операция соединения строк обозначается простым знаком «плюс», например,

AnsiString s1,s2,s3;

s1=”ABCD”; s2=”123”;

s3=s1+s2;

Строка s3 приобретает значение ”ABCD123”, то есть вторая строка «приставляется» к первой.

Операции отношения строк обозначаются также общепринятыми значками, их результатом являются логические значения true или false. Операции отношения = =, !=, >, <, >=, <= выполняются над двумя строками посимвольно, слева направо, причем сравниваются внутренние коды символов. Если одна строка короче другой по длине, недостающие символы короткой строки заменяются значением #0.

Таким образом, разрешаются такие записи:

Запись

Словесный эквивалент

Выполнение

s1==s2

строки равны (в этом случае знак равенства сдваивается)

если коды всех символов строки s1 попарно равны кодам s2, то результат true

s1!=s2

строки не равны

если встречается первая неравная пара кодов, то строки считаются неравными и результат true

s1>s2

строка s1 больше строки s2

сравниваются коды символов последовательно слева направо. Если для всех пар символов сохраняется справедливость условия s1>s2, результат будет true. При первом же невыполнении результат становится false и сравнение прекращается

s1<s2

строка s1 меньше строки s2

аналогично пункту s1>s2

s1>=s2

строка s1 больше или равна строке s2

аналогично пункту s1>s2

s1<=s2

строка s1 меньше или равна строке s2

аналогично пункту s1>s2

Все мыслимые операции по обработке строк можно свести к последовательной обработке элементов массива, составляющего строку, однако такая работа малопроизводительна. Поэтому в состав Builder включены разветвленные и мощные библиотечные процедуры и функции, предусматривающие реализацию часто встречающихся задач. Наиболее точные сведения о библиотечных функциях обработки строк содержатся во встроенном в Builder разделе String functions. Наиболее часто используемые средства приведены в таблице функций в данном разделе. Детальные сведения о строковых функциях можно получить в [1,3,4,5].

Встроенные процедуры и функции для работы со строками

Function AnsiLowerCase(const S: String): String;

Возвращает исходную строку S, в которой все заглавные буквы заменены на строчные в соответствии с национальной кодировкой Windows (т. е. с учетом кириллицы)

Function AnsiUpperCase(const S: String): String;

Возвращает исходную строку s, в которой все строчные буквы заменены на заглавные в соответствии с национальной кодировкой Windows

Function Concat(Sl [, S2, ..., SN]: String): String;

Возвращает строку, представляющую собой сцепление строк –параметров S1, S2, ... , SN

Function Copy(

St: String;

Index, Count: Integer): String;

Копирует из строки St count символов, начиная с символа с номером Index

Procedure Delete(

St: String;

Index, Count: Integers);

Удаляет count символов из строки St, начиная с символа с номером index

Procedure Insert(

SubSt:

String; St, Index: Integer);

Вставляет подстроку SubSt в строку St, начиная с символа с номером Index

Function Length(St: String): Integer;

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

Function LowerCase(const S:String): String;

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

(возможны неточности при работе с кириллицей)

Function Pos(SubSt, St:String): Integer;

 

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

Function Uppercase(const S:String): String;

Возвращает исходную строку S, в которой все строчные латинские буквы заменены на заглавные (возможны неточности при работе с кириллицей)

Подпрограммы преобразования строк в другие типы

Function StrToDate(St: String): TDateTime;

Преобразует символы строки St в дату. Строка должна содержать два или три числа, разделенных правильным для Windows разделителем даты (в русифицированной версии таким разделителем является “.”). Первое число – правильный день, второе – правильный месяц. Если указано третье число, оно должно задавать год в формате XX или ХХХХ. Если символы года отсутствуют, дата дополняется текущим годом. Например: DateToStr(StrToDate('28.02')) даст строку '28.02.2011' (см. ниже пояснения)

Function StrToDateTime(St:

String): TDateTime;

Преобразует символы строки St в дату и время. Строка должна содержать правильную дату (см. StrToDate) и правильное время (см. StrToTime), разделенные пробелом, например: StrToDateTime('28.02 21:23')

Function StrToFloat(St:String): Extended;

 

Преобразует символы строки St в вещественное число. Строка не должна содержать ведущих или ведомых пробелов

Function StrToInt(St:String): Integer;

Преобразует символы строки St в целое число. Строка не должна содержать ведущих или ведомых пробелов

Function StrToTime(St:String): TDateTime;

Преобразует символы строки St во время.

Строка должна содержать два или три числа, разделенных правильным для Windows разделителем времени (для русифицированной версии таким разделителем является “:”). Числа задают часы, минуты и, возможно, секунды. За последним числом через пробел могут следовать символы “am” или “рm”, указывающие на 12-часовой формат времени

Procedure Val(St: String; var

X; Code: Integer);

 

 

Преобразует строку символов St во внутреннее представление целой или вещественной переменной х, которое определяется типом этой переменной. Параметр Code содержит ноль, если преобразование прошло успешно, и тогда в х помещается результат преобразования, в противном случае он содержит номер позиции в строке St, где обнаружен ошибочный символ, и в этом случае содержимое х не меняется. В строке St могут быть ведущие и/или ведомые пробелы. Если St содержит символьное представление вещественного числа, разделителем целой и дробной частей должна быть точка независимо от того, каким символом этот разделитель указан в Windows

Подпрограммы обратного преобразования

Function DateTimeToStr(Value: TDateTime): String; Procedure DateTime –ToString(var St: String; Format: String; Value: TDateTime);

Преобразует дату и время из параметра в строку символов. Преобразует дату и время из параметра value в строку St в соответствии со спецификаторами параметра Format (см. пояснения ниже)

Function DateToStr(Value: TDateTime): String;

Преобразует дату из параметра value в строку символов

Function FloatToStr(Value: Extended): String;

Преобразует вещественное значение value в строку символов.

Function FloatToStrF(

Value:

Extended;

Format: TFloatFormat; Precision, Digits: Integer) :

String;

Преобразует вещественное значение Value в строку символов с учетом формата Format и параметров precision и Digits (см. пояснения ниже)

Function FormatDateTime (Format: String; Value:.TDateTime): String;

Преобразует дату и время из параметра value в строку символов в соответствии со спецификаторами параметра Format (см. пояснения ниже)

function IntToHex(Value: Integer; Digits: Integer):Strings;

Преобразует целое число Value в строку символьного представления шестнадцатеричного формата: Digits – минимальное количество символов в строке

Function IntToStr(Value: Integer) : String;

Преобразует целое значение Value в строку символов

Procedure Str(X [:Width[:Decimals]]; var St:String) ;

 

 

 

Преобразует число х любого вещественного или целого типов в строку символов St; параметры width и Decimals, если они присутствуют, задают формат преобразования: width определяет общую ширину поля, выделенного под соответствующее символьное представление вещественного или целого числа х, a Decimals – количество символов в дробной части (этот параметр имеет смысл только в том случае, когда х – вещественное число)

Function TimeToStr(Value: TDateTime): String;

Преобразует время из параметра Value в строку символов

Правила использования параметров функции FloatToStrF

Обращение к функции

FloatToStrF(Value:Extended; Format: TFloatPormat; Precision, Digits: Integer);

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

Значение Format

Описание

ffExponent

Научная форма представления с множителем ехх (“умножить на 10 в степени XX”). precision задает общее количество десятичных цифр мантиссы, Digits – количество цифр в десятичном порядке хх. Число округляется с учетом первой отбрасываемой цифры:3,1416Е+00

ffFixed

Формат с фиксированным положением разделителя целой и дробной частей, precision задает общее количество десятичных цифр в представлении числа. Digits – количество цифр в дробной части. Число округляется с учетом первой отбрасываемой цифры:3,14

ffGeneral

Универсальный формат, использующий наиболее удобную для чтения форму представления вещественного числа. Соответствует формату ffFixed, если количество цифр в целой части меньше или равно precision, а само число – больше или равно 0,00001, в противном случае соответствует формату ffExponent: 3,1416

ffNumber

Отличается от ffFixed использованием символа – разделителя тысяч при выводе больших чисел (для русифицированной версии Windows таким разделителем является пробел)

ffCurrency

Денежный формат. Соответствует ffNumber, но в конце строки ставится символ денежной единицы (для русифицированной версии Windows – символы “р.”). Для value =3.1416 получим 3 141,60.