Стандартные подпрограммы для строк 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Стандартные подпрограммы для строк



Ниже приведены основные стандартные процедуры и функции для работы со строками типа String.

function AnsiCompareStr(const S1, S2: string): Integer;

Сравнивает две строки S1 и S2 в кодировке ANSI с учетом регистра. Возвращает знамение меньше 0. если SI1< S2, 0, если SI = S2, и больше 0, если S1 > S2. В русифицированных версиях Windows может быть применена к строкам, содержащим русские буквы.

function AnsiCompareText(const S1, S2: string): Integer;

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

function AnsiLowerCase(const S: string): string;

Возвращает в кодировке ANSI строку S, преобразованную к нижнему регистру. В русифицированных версиях Windows может быть применена к строкам, содержащим русские буквы.

function AnsiPos(const Substr, S: string): Integer;

Возвращает позицию (индекс) первого вхождения Substr в S. Если Substr нет в S, воз-вращается 0. В русифицированных версиях Windows может быть применена к строкам,содержащим русские буквы.

function AnsiUpperCase(const S: string): string;

Возвращает строку S в кодировке ANSI, преобразованную к верхнему регистру. В русифицированных версиях Windows может быть применена к строкам, содержащим русские буквы.

function Concat(sl [, s2,..., sn]: string): string;

Возвращает строку, представляющую собой сцепление из строк s1,…, sn. Идентичная операции «+» для строк.

function Copy(S; Index, Count: Integer): string;

Параметр S - это строка типа string или динамический массив. Функция Сору возвращает подстроку строки S, начинающуюся с символа S[Index] и содержащую Count символов.

procedure (var S: string; Index, Count:Integer);

Удаляет из S подстроку, начинающуюся с символа S[Index] и содержащую Count символов.

procedure Insert(Source:string; var S:string; Index:Integer);

Вставляет строку Source в S,начиная с символа номером Index.

function Length(S): Integer;

Возвращает число символов в строке S.

function Pos(Substr: string; S: string): Integer;

Возвращает позицию (индекс) первого вхождения подстроки Substr в строку S. Если Substr нет в S, возвращается 0.

procedure SetLength(var S; NewLength: Integer);

Параметр S является строкой или динамическим массивом. Процедура SetLength устанавливает новую длину NewLength строки S. Если строка имеет тип ShortString, то значение параметра NewLength должно находится в диапазоне 0..255. Для длинных строк значение параметра NewLength ограничено лишь размерами доступной памяти компьютера. При увеличении длины строки старые значения, находившиеся там, сохраняются, а во вновь добавленных позициях находятся неопределенные значения.

function StringOfChar(Ch: Char; Count: Integer): string;

Создает строку, состоящую из Count раз повторяющегося символа Char.

function Trim(const S: string): string;

Удаляет из строки S начальные и завершающие пробелы и управляющие символы.

function TrimLeft(const S: string): string;

Удаляет из строки S начальные пробелы и управляющие символы.

function TrimRight(const S: string): string;

Удаляет из строки S завершающие пробелы и управляющие символы.

Строковые выражения

Под строковым будем понимать выражение, результатом которого является символьная строка. Напомним, что символьные значения можно трактовать как строки единичной длины. Кроме операций отношения, над строками определена операция сцепления (конкатенации), которая обозначается знаком плюс — «+». Это бинарная операция. Ее результатом является последовательность символов первою операции после которой располагается последовательность символов второго операнда. Операндами могут быть строки, массивы типа char или символы. Например:

Выражение Результат

' Object'+' Pascal' ‘Object Pascal’

'Петров'+' П.П'+’.’ ‘Петров П.П.’

Строки разных типов могут смешиваться в одном выражении, переменным одного строкового типа можно присваивать значения другого строкового типа. Компилятор при этом осуществляет автоматическое приведение типов. Если переменной типа ShortString присваивается в качестве значения строка, длина которой превышает длину переменной,то срока усекается до длины переменной.

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

Пример 3.

Составить программу выполняющую следующие действия:

1.Ввод с клавиатуры строку 'Bloomed apples and pears' (Расцветали яблони и груши).

2.Определяет длину строки.

3.Выделяет из исходной строки подстроки 'apples’(яблони) и 'pears’ (груши).

4.Удаляет из исходной строки подстроку 'apples and’ (яблони и).

5.Вставляет удаленную подстроку на прежнее место.

6.Определяет номер позиции, в которой находится буква r в исходной строке.

Решение

Для решения этой задачи нам потребуются стандартные функции length, copy, pos и процедуры delete и insert.

Программа

program 3;

{$APPTYPE CONSOLE}

Uses

SysUtils;

var a,b,c,d:string;

Begin

writeln('Enter string');

readln(a);

writeln('length(a) = ',length(a));

b:= copy(a,9,6);

writeln(‘copy(a,9,6) = ',b);

с:=copy(a,20,5);

writeln('copy(a,20,5) = ',c);

d: = copy(a,9,11);

delete(a,9,ll);

writeln('after delete a = ‘,a);

insert(d,a,9);

writeln('after insert a = ',a);

writeln('pos(‘r’,a) = ',pos('r',a));

readln

End.

Результаты работы программы

Enter string

Bloomed apples and pears

length(a) = 24

copy(a,9,6) = apples

copy(a,20,5) = pears

after delete a = Bloomed pears

after insert a = Bloomed apples and pears

pos(‘r’,a) = 23

Следует отметить, что для ввода символьных строк необходимо использовать процедуру readln, а не read. Это объясняется тем, что в конце каждой символьной строки, вводимой с клавиатуры, стоит так называемый разделитель строк EOLN – последовательность кодов #13 (CR) и #10 (LF). Разделитель строк вставляется во вводимый текст при нажатии на клавишу Enter. В результате каждая символьная строка отображается в отдельной строке дисплея. Процедура Read может считывать данные только до символа EOLN. Данные расположенные в следующей символьной сроке, т.е за разделителем строк EOLN,для нее не доступны. Процедура readln считывает все символы, расположенные до разделителя строк, а затем и сам разделитель строк. Поскольку символы #13 (перевод каретки) и #10 (переход в начало строки) являются управляющими, то в результате их считывания курсор дисплея переходит в начало следующей строки. Расположенная в новой строке дисплея символьная строка может быть считана следующей процедурой readln. Из сказанного следует, в частности, что, если переменная x имеет тип string,то процедура

readln(x);

эквивалентна последовательности процедур

read(x);

readln;

Лекция 8. Преобразования типов

Преобразования типов

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

‘123456,78’

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

IntToStr()

Наиболее часто используемая функция. Как вы уже знаете, она принимает в качестве параметра целое число, и возвращает его в виде строки. Хотелось бы отметить еще одну особенность: эта функция предназначена для любого целого числа, не обязательно Integer. Если у вас есть переменная Byte, Word, Cardinal или Int64, все это переменные целого типа, и для любой из них годится функция IntToStr().

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

Var

b: Byte;

w: Word;

i: Integer;

Begin

b:= 5;

w:= 10;

i:= 20;

Edit1.Text:= IntToStr(b);

Edit2.Text:= IntToStr(w);

ShowMessage(IntToStr(i));

end;

StrToInt()

Эта функция напротив, принимает в качестве параметра строку, изображающую целое число, и возвращает его в виде целого числа. Все, что было сказано о типах данных в функции IntToStr(), справедливо и для этой функции. Примеры использования:

Var

b: Byte;

w: Word;

i: Integer;

Begin

b:= StrToInt(Edit1.Text); //внимание! Если пользователь введет число //больше 255, произойдет ошибка!

w:= StrToInt('50000');

i:= StrToInt(Edit2.Text);

end;

Как видите, действия этих функций очень похожи, только в последнем случае приходится применять осторожность, чтобы не превысить диапазон возможных значений. Если вы заранее не знаете, какое число введет пользователь, лучше использовать Integer, или Cardinal, если число без знака. Экономия памяти иной раз может вызвать серьезные ошибки в программе.

FloatToStr()

Эта функция принимает в качестве параметра вещественное число (то есть, число с запятой), и возвращает его в виде строки. Примеры применения почти аналогичны функции IntToStr(), однако есть одна особенность – если после запятой у Вас есть только нули, то функция вернет строку в виде целого числа:

s:= FloatToStr(125,00); // результат: '125'

Эта функция также предназначена для всех типов вещественных чисел.

StrToFloat()

Эта функция принимает в качестве параметра строку в виде вещественного или целого числа, и возвращает это вещественное число. Пример:

f:= StrToFloat('125'); //результат: 125,0

FormatFloat()

Эта функция по своему предназначению похожа на функцию FloatToStr(), однако она является гораздо более мощным инструментом. Эта функция не только возвращает вещественное число в качестве строки, но еще и позволяет задать желаемый формат этой строки. В прошлых примерах мы говорили, что функция FloatToStr() вместо строки ‘125,00’ выведет ‘125’. А если нужно все-таки ‘125,00’? Такое сплошь и рядом встречается, особенно в финансовой документации. Для этих целей и создана функция FormatFloat.

Она имеет два параметра – строку формата и само число. Строка может содержать следующие форматы:

Таблица 15.1. Возможные форматы FormatFloat().

Есть и другие варианты форматов, например, для представления числа в экспонентной форме, но они, как правило, не используются.

Поясним строку форматов подробней. В первом случае показаны варианты возвращаемых строк, если строка форматов вообще не указана (пустая строка).

«Решетка» (#) работает также, как «ноль», с той разницей, что если на этом месте не окажется цифры, то «решетка» ничего не выведет, а «ноль» подставит в это место ноль.

Знак запятая здесь указывают для разделения тысячных частей. Например, миллион будет выглядеть как строка ‘1 000 000’. Заметим, что на само число этот формат не оказывает никакого влияния, он нужен только для того, чтобы выводить число в удобочитаемой форме в виде строки. Примеры использования:

procedure TForm1.Button1Click(Sender: TObject);

Var

f: Real;

Begin

f:= 1234567.00;

ShowMessage(FormatFloat('0,000.00',f)); //результат: "1 234 567,00"

ShowMessage(FormatFloat('', f)); //результат: "1234567"

end;

Другие преобразования

Иногда, чтобы преобразовать один тип данных в другой, достаточно указать этот тип:

Var

p: PChar;

s: String;

Begin

p:= 'Строка';

s:= String (p);

p:= PChar(s);

В других случаях, схожие типы данных можно просто присваивать друг другу. Компилятор в этом случае сам произведет нужное преобразование. Например, целый тип данных можно присвоить вещественному числу, компилятор сам подставит ноль. А вот наоборот не получится, ведь вещественное число рассматривается, как два целых числа:

Var

f: Real;

i: Integer;

Begin

i:= 12;

f:= i; //Результат: 12,0 i:= f; //Ошибка! Так нельзя

Подстановка значений

Очень часто в языках программирования для элегантности кода подставляют одно значение вместо другого. Сравните два примера:

Var

s: String;

i: Integer;

Begin

s:= Edit1.Text;

i:= StrToInt(s);

end;

Все, что мы сделали в данном примере, так это присвоили переменной i число из Edit1, которое хранилось там в виде строки. Но для этого нам пришлось вначале занести эту строку в строковую переменную s, и уже ее обрабатывать функцией StrToInt(). Такой пример вполне будет работать, однако он слишком громоздок. Гораздо элегантнее выглядит следующий код:

Var

i: Integer;

Begin

i:= StrToInt(Edit1.Text);

end;

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

i:= StrToInt(Memo1.Lines[5]) + StrToInt(Edit1.Text);

s:= IntToStr(StrToInt(Memo1.Lines[5]) + StrToInt(Edit1.Text));

В первой строке в целую переменную i мы вывели сумму целых чисел, которые хранились в виде строки в Edit1 и в пятой строке Memo1.

Вторая строка сложнее. Здесь мы вначале перевели эти же числа в целые числа и суммировали их, затем вновь преобразовали в строку, чтобы записать сумму этих двух чисел в строковую переменную s. Поначалу вам такой код может показаться очень сложным, но попробуйте применять такой подход в своих программах, и вы быстро к нему привыкнете, и сами заметите, что такой код более компактен и элегантен. Возьмите вторую строку. Такой же результат можно было бы добиться упрощенными выражениями:

i:= StrToInt(Memo1.Lines[5]);

k:= StrToInt(Edit1.Text);

m:= i + k;

s:= IntToStr(m);

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



Поделиться:


Последнее изменение этой страницы: 2017-01-20; просмотров: 206; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.143.244.83 (0.054 с.)