Лабораторная работа №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;