Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Механизм передачи значения




Описание

Параметр-константа

Механизм передачи значения

 

В отличие от параметра-значения, для параметра-переменной не создается копии при вызове подпрограммы. Вместо этого в работе подпрограммы участвует та самая переменная, которая послужила аргументом. Понятно, что если ее значение изменится в процессе работы подпрограммы, то это изменение сохранится и после того, как будет уничтожен контекст подпрограммы. Понятно опять же и ограничение на аргументы, которые должны соответствовать параметрам-переменным: ни константа, ни выражение не смогут сохранить изменения, внесенные в процессе работы подпрограммы.

 

Итак, параметры-переменные и служат теми посредниками, которые позволяют получать результаты работы процедур, а также увеличивать количество результатов, возвращаемых функциями.

 

Замечание: Для экономии памяти в параметр-переменную можно передавать и такую переменную, изменять значение которой не требуется. Скажем, если нужно передать в качестве аргумента массив, то лучше не создавать его копию, как это будет сделано при использовании параметра-значения, а использовать параметр-переменную.

 

 

 

В списке параметров подпрограммы перед параметром-константой ставится служебное слово const. Например, процедура proc4 имеет один параметр-переменную и один параметр-константу:

 

procedure proc4(var k:integer; const flag:boolean);

 

При вызове подпрограммы параметру-константе может соответствовать аргумент, являющийся выражением, переменной или константой. Во время выполнения подпрограммы соответствующая переменная считается обычной константой. Ограничением является то, что при вызове другой подпрограммы из тела текущего параметра-константе не может быть подставлен в качестве аргумента в параметр-переменную.

 

Для типов данных здесь не обязательно строгое совпадение (эквивалентность), достаточно и совместимости по присваиванию (см. лекцию 2).

 

 

В некоторых источниках можно встретить утверждение о том, что для параметра-константы, как и для параметра-переменной, не создается копии в момент вызова подпрограммы. Однако выполнение простейшей проверки

 

var a: byte;

procedure prob(const c:byte);

begin

writeln(longint(addr(c))); {физ.адрес параметра с}

end;

begin

a:=0;

writeln(longint(addr(a))); {физ.адрес переменной а}

prob(a);

end.

 

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

 

Пример использования процедуры и функции

 

Программа вводит текстовую строку, преобразует все входящие в нее буквы в прописные и выводит результат.

Предполагается, что последовательность букв образуют непрерывный массив. В соответствии с таблицей кодировки символов коды символов латинских строчных букв от а до z образуют непрерывный массив монотонно нарастающих чисел от 97 до 122, а коды соответствующих им прописных букв – непрерывный массив чисел от 65 до 90. Преобразование строчных букв в прописные состоит в уменьшении кода буквы на 32.

 

program CharConvert;

procedure UpString(s1:string; var s2:string);

{процедура преобразует буквы входной строки s1 в

прописные буквы латинского алфавита и помещает

результат преобразования в выходную строку s2.}

var i:integer;

c:char; {рабочая переменная преобразования}

begin

s2:=’’; {вначале выходная строка пустая}

{цикл посимвольного анализа исходной строки}

for i:=1 to length(s1) do

begin

{берем из входной строки очередной символ}

c:=s1[i];

{проверяем символ на принадлежность к массиву}

if (c>=’a’) and (c<=’z’) then

c:=chr(ord(‘A’)+ord(c)-ord(‘a’));

s2:=s2+c;

end

end;

var sinp, sout:string; {исходная и преобразованная строки}

begin

write(‘Введите строку’);

readln(sinp);

UpString(sinp, sout); {преобразуем введенную строку к прописным буквам}

writeln(‘Результат’, sout)

end.

 

Перед параметром s2, с помощью которого в вызывающую программу возвращается результат преобразования, стоит зарезервированное слово var. Именно таким способом компилятору указываются те параметры, в которых процедура возвращает вызвавшей ее программе результат своей работы.

 

program CharConvert1;

function UpString(s1:string):string;

var i:integer;

c:char;

s2:string {Результат преобразования}

begin

s2:=’’;

for i:=1 to length(s1) do

begin

c:=upcase(s1[i]);

s2:=s2+c;

end;

UpString:=s2 {Присваиваем значение функции UpString}

end;

var sinp:string;

begin

write(‘Введите строку’);

readln(sinp);

writeln(‘Результат’, UpString(sinp))

end.

 

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

 




Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 284; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.007 сек.