Иллюстрированный самоучитель по Turbo Pascal

Процедуры и функции

В процедуре вначале с помощью оператора s2: = ''; подготавливается "пустая" выходная строка, т.е. строка нулевой длины. Затем используется цикл от 1 до длины входной строки s1 (эта длина получается с помощью стандартной функции Length), в ходе которого проверяется принадлежность очередного символа указанным подмассивам и осуществляется необходимая коррекция его внутреннего кода. Для доступа к отдельным символам строки используется замечательное свойство типа данных STRING, позволяющее рассматривать строку как набор (массив) символов. Первый символ этого набора имеет индекс 1, второй – 2 и т.д. Индекс указывается сразу за именем строки в квадратных скобках. Таким образом, s1 [i] – это i-ый символ строки s1. Преобразованный символ добавляется в конец выходной строки.

Добавив комментарии и поместив тело процедуры вместо заглушки в первоначальный вариант программы, получим окончательно ее рабочий вариант (пример 2.10).

Пример 2.10.

Program CharsConvert;
{Программа вводит произвольную текстовую строку, преобразует
все входящие в нее буквы в прописные и печатает результат преобразования}

PROCEDURE UpString(sl: String; var s2: String);
{Эта процедура преобразует буквы входной строки si в прописные буквы латинского
 или русского алфавита и помещает результат преобразования в выходную строку s2.
Используется предположение о том, что последовательности латинских букв
 от "а" до "z" и русских букв. от "а" до "п" и от "р" до "я", а также последовательности
 соответствующих им прописных букв образуют непрерывные массивы}
var
i: Integer; {Счетчик цикла преобразования}
с: Char; {Рабочая переменная преобразования}
begin {UpString}
s2: = ' '; {Вначале выходная строка пуста}
{Цикл посимвольного анализа исходной строки}
for i: = 1 to Length(s1) do
begin
{Берем из входной строки очередной символ}
с: = s1[i];
{Проверяем символ на принадлежность к одному из трех подмассивов}
if (с >= 'a') and (с <= 'z') then
с: = chr(ord('А')+ord(c)-ord('a')) {A,a – латинские!}
else if (c >= 'a') and (c <= 'n') then
с: = chr(ord('A')+ord(c)-ord('a')) {A,a – русские!}
else if (c >= 'p') and (с <= 'я') then
с: = chr(ord('P')+ord(c)-ord('p'));
s2: = s2+c
end
end; {UpString}
var
Sinp, Sout: String; {Исходная и преобразованная строки}
begin { Начало основной (вызывающей) программы}
Write('Введите строку: ');
ReadLn(Sinp); {Вводим исходную строку}
UpString(Sinp,Sout); {Преобразуем ее к прописным буквам}
WriteLn(' Результат: ',Sout) {Печатаем результат}
end. {Конец вызывающей программы}

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

Function UpString(s1: String): String;
var
i: Integer; с: Char;
s2: String; {Результат преобразования}
begin {UpString}
s2: = ' ';
for i: = 1 to Length(si) do
begin
{Получаем и преобразуем очередной символ}
с: = UpCase(si [i]);
if (с >= 'a') and (с <= 'п') then
с: = chr(ord('A')+orcKcJ-ord('a'))
else
if (c >= 'p') and (с <= 'я') then
с: = chr(ord('P')+ord(c)-ord('p'));
s2: = s2+c
end;
UpString: = s2 {Присваиваем значение функции UpString}
end; {UpString}
var
Sinp: String;
begin {Начало основной программы}
Write('Введите строку: ');
ReadLn(Sinp);
WriteLn(' Результат: ',UpString(Sinp))
end. {Конец основной программы}

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

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.