Readln;
end.
Очевидно, программа дважды напечатает константу C1, – проверьте меня. Теперь добавим объявление локальной константы с тем же именем C1, поместив его между заголовком процедуры Local и её телом. К совпадающим именам я прибегнул не от бедности фантазии, – мой умысел скоро прояснится.
const c1 = ’Глобальная’;
procedure Local;
const c1 = ’Локальная’;
begin
Writeln(c1);
end;
begin {--- главная программа ---}
Local;
Writeln(c1);
Readln;
end.
Известно, что компилятор не допускает совпадающих имен, но здесь – иное дело. Локальная константа C1 «спряталась» внутри своей процедуры и, как говорят программисты, не видна за её пределами.
Запустив на выполнение этот вариант программы, вы убедитесь, что внутри процедуры будет напечатана локальная константа, а в главной программе – глобальная. Отсюда следуют два правила, имеющих силу для констант, переменных и других объектов, о которых вы со временем узнаете. Правила эти таковы:
• локальные объекты (константы, переменные и прочие) видны лишь внутри тех подпрограмм, в которых они объявлены;
• при совпадении имен локального и глобального объектов, внутри подпрограммы имеет силу локальный объект; при этом глобальный объект скрывается локальным.
С учетом сказанного нашу неработающую программу можно исправить так:
{ P_20_1 – вариант программы с локальной переменной }
var S: string;
procedure Scan(arg : string);
var
begin
for k:=1 to Length(arg) do
if arg[k]=’A’ then arg[k]:=’B’;
end;
begin { главная программа }
for k:=1 to 3 do begin
Write(’Введите строку: ’); Readln(S);
Scan(S);
Writeln(S);
end;
end.
Теперь совпадение имен локальной и глобальной переменных k не нарушает работу программы, поскольку это разные переменные. Они могли бы иметь