Песни о Паскале | страница 80
>var N, i: integer;
>begin
>N:=0; { обнуляем счетчик }
>for i:=1 to Length(str) do
> if str[i]=ch then N:= N+1;
>Count:= N; { передаем результат через имя функции }
>end;
>var S: string;
>begin {--- главная программа ---}
>S:='PASCAL';
>Writeln( Count(S, 'A'));
>Writeln( Count('BANAN', 'N') + Count('BANAN', 'B'));
>Readln;
>end.
Вернемся к программе «P_20_1», заменяющей символы «A» на символы «B». Помните сколько крови она попортила прежде чем заработать? Заменив процедуру Scan на функцию с тем же именем, мы решим проблему возврата результата. Результат, разумеется, должен иметь строковый тип. Обратите внимание на то, что ключевые слова VAR или CONST в заголовке не указаны, а потому параметр arg можно употребить в теле функции в качестве локальной переменной.
>{ P_23_2 – замена символов в строке с применением функции }
>function Scan(arg : string): string;
>var k: integer;
>begin
> for k:=1 to Length(arg) do
> if arg[k]=’A’ then arg[k]:=’B’; { замена в параметре arg }
> Scan:= arg;
>end;
>var S: string; k: integer;
>begin {--- главная программа –--}
> for k:=1 to 3 do begin
> Write(’Введите строку: ’); Readln(S);
> Writeln(Scan(S));
> end;
> Readln;
>end.
Хорошая функция возвращает правильный результат, а отличная делает ещё что-нибудь полезное. Программисты нередко поручают одной функции несколько дел, вот пример: напишем функцию Swap (обмен) булевого типа, принимающую ссылки на две переменные. Функция должна сравнить эти переменные и вернуть TRUE, если первая из них окажется больше второй. Мало того, в этом случае она должна обменять значения этих переменных (как в процедуре Swap, рассмотренной ранее). Короче, функция будет такой.
>function Swap( var a1, a2 : integer) : Boolean;
>var t: integer;
>begin
> if a1 > a2
> then begin
> { обмен значений переменных }
> t:=a1; a1:=a2; a2:=t;
> Swap:= true
> end
> else Swap:= false
>end;
Где применить такую функцию? Пусть переменные N1, N2, N3 содержат три разных числа. Переложим эти числа так, чтобы в N1 оказалось наименьшее, а в N3 – наибольшее число, то есть, чтобы соблюдалось условие: N1 < N2 < N3. Такая сортировка выполняется тремя вызовами функции Swap (в комментариях показаны результаты обмена).
> Swap(N1, N2); { N1 < N2 }
> if Swap(N2, N3) { N2 < N3 }
> then Swap(N1, N2); { N1 < N2 < N3 }
Здесь в первой и третьей строках функция вызывается как процедура, поскольку возвращаемый ею булев результат не используется. Во второй строке она вызывается как функция, поскольку результат использован оператором IF.