Процедуры и функции
В процедуре вначале с помощью оператора 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). В левой части оператора присваивания в этом случае указывается имя функции.