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

Лабораторная работа №8

Тема работы: Обработка строк.

Цель работы: Приобретение практических навыков работы с символами и строками.

Задание к работе:

1) изучить теоретический материал в лабораторной работе;

2) получить вариант индивидуального задания;

3) разработать алгоритм решения задачи;

4) написать и отладить программу;

5) подготовить ответы на контрольные вопросы.

Содержание отчета:

1) постановка задачи индивидуального задания;

2) программа (текст рабочего модуля);

3) результаты работы программы;

4) ответы на контрольные вопросы;

5) выводы о проделанной работе.

ТЕОРЕТИЧЕСКИЙ МАТЕРИАЛ

Строковые типы, объявление строки, сравнение строк

Для обработки текстов в Delphi используются следующие типы:

§ короткая строка ShortString или String[N], где N<=255;

§ длинная строка String;

§ широкая строка WideString;

§ нуль-терминальная строка Pchar.

Общим для этих типов является то, что каждая строка трактуется как одно­мерный массив символов, количество символов в котором может меняться в рабо­тающей программе: для String[N] длина строки меняется от 0 до N, для String и Pchar – от 0 до 2 Гбайт.

Примеры объявлений строковых типов:

Var

s: String[200]; // Короткая строка длиной до 200 символов

smax: ShortString; // Короткая строка длиной до 255 символов

st: String; // Длинная строка

Здесь 200 – максимальная длина строки.

Две строки можно сравнивать между собой. Строки считаются равными, если они имеют одинаковые значения, и их текущие длины равны. Текущая длина – это фактическое количество символов в строке.

При сравнении двух строк (назовем их А и В) последовательно сравниваются соответствующие символы двух строк – первый с первым (А[1] с B[1]), второй со вторым (А[2] с B[2]) и так далее (А[i] с B[i]). Сравнение производится по значению ASCII кодов соответствующих символов, то есть условие равенства двух символов выглядит примерно таким образом: ord(A[I])=ord(B[I]). Если первые символы равны, то сравниваются вторые. Если равны и вторые, тогда сравниваются третьи. И так далее до тех пор, пока либо не попадется пара неодинаковых символов, либо обе строки не закончатся одновременно. Если встретилась пара неодинаковых символов, тогда большей считается та строка, символ которой в несовпадающей паре имеет больший ASCII код. Если строки закончились одновременно, то они считаются равными.

Примеры:

а) ′Ложка′=′Ложка′ – строки равны (все символы совпадают);

б) ′Китай′<’китай’ – ord(‘K’)<ord(‘к’);

в) ′к рошка′<′крошка ′ – ord(‘ ’)<ord(‘р’);

г) ‘тол’ < ‘толстый’ – все три символа ‘тол’ совпали с ‘толстый’, но ‘тол’ короче, чем ‘толстый’;

г) ‘ангел’>’angel’ – код русской ‘а’ больше, чем код латинской ‘a’.

Различают строки-получатели и строки-источники. Пример:

t:= ′20 лет спустя′;

Здесь переменная t – получатель, строковая константа ′20 лет спустя′ – источник.

Если максимальная длина получателя равна текущей длине источника, значение источника целиком размещается в получателе.

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

Если максимальная длина получателя (n) меньше текущей длины источника, значением получателя становятся первые n символов источника.

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

Concat(s1, s2[, …, sn]) – функция возвращает строку, представляющую собой сцепление строк-параметров s1, s2, …, sn.

Copy(st, p, n) – функция копирует из строки st с позиции p n символов.

Delete(st, p, n) – процедура удаляет из строки st с позиции p n символов.

Insert(s, st, p) – процедура вставляет подстроку s в строку st с позиции p.

Length(st) – функция возвращает текущую длину строки st.

Ord(st[0]) – функция возвращает текущую длину строки st, которая хранится в нулевой позиции.

Pos(s, st) – функция отыскивает в строке st первое вхождение подстроки s и возвращает номер позиции, с которой она начинается; если подстрока не найдена, возвращается ноль.

Str(x[:width[:desimals]], st) – процедура преобразует число x вещественного или целого типа в строку символов st; параметры width и desimals, если они присутствуют, задают формат преобразования: width определяет общую ширину поля, выделенного под символьное представление числа x, а desimals – количество символов в дробной части (этот параметр имеет смысл, когда x – веще­ственное число).

Val(st, x, code) – процедура преобразует строку символов st во внутреннее представление целой или вещественной переменной x; пара­метр code содержит ноль, если преобразование про­шло успешно, и тогда в x помещается результат преобразования, в противном случае он содержит номер позиции в строке st, где обнаружен ошибочный символ, и в этом случае содержимое x не меняется; в строке st могут быть ведущие пробелы, ведомые пробелы недопустимы.

Выделяют:

§ процедуры (Delete, Insert, Str, Val);

§ функции (Concat, Copy, Length, Ord, Pos).

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

§ строка (Concat, Copy, Delete, Insert, Str);

§ число (Length, Ord, Pos, Val).

Примеры:

а) Memo1.Lines.Add(copy(′Москва Смоленск Орел Тула′,17,4));

Будет выведено: Орел

б) s:=′понедельник вторник четверг′;

insert(′среда ′,s,21);

writeln(s);

Будет выведено: понедельник вторник среда четверг

в) s:=′лиса ворона обезьяна′;

delete(s,6,7);

Memo1.Lines.Add(s);

Будет выведено: лиса обезьяна

г) Memo1.Lines.Add(′L=′+IntToStr(length(′ромашка астра георгин′)));

Будет выведено: L=21

д) s:=′Терпение и труд все перетрут′;

Memo1.Lines.Add(IntToStr(ord(s[0])));

Будет выведено: 28

е) Memo1.Lines.Add(′P=′+IntToStr(pos(′нос′,′утконос носорог′)));

Будет выведено: P=5

и) Memo1.Lines.Add(IntToStr(pos(′роса′,′росток простор′)));

Будет выведено: 0

Пример приложения:

Код обработчика события по нажатию на кнопке «Выполнить»:

procedure TForm1.Button1Click(Sender: TObject);

Var

i: integer;

s: string;

function myUpCase(ch: char): char; // создали свою функцию, так как стандартная функция

begin // UpCase обрабатывает только английские символы

if (ch in ['a'..'z', 'а'..'я'])

then result:= chr(ord(ch) - 32)

else result:= ch;

end;

Begin

s:= Edit1.Text;

for i:=1 to length(s) do // проходим по каждому символу строки

case edit1.Text[i] of

'0'..'5': s[i]:= '%'; // если символ является числом от 0 до 5, то меняем его на %

'6'..'9': s[i]:= '^'

else s[i]:= myUpCase(s[i]); // приводим символ к верхнему регистру, если он не

end; // является числом

Edit2.Text:= s;

end;


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: