Глобални и местни опции
Концепцията за глобални и локални променливи е въведена в езика Pascal поради наличието в него на концепцията за блокова структура. Всяка програма, процедура и функция е блок със собствен обхват от описания и може да съдържа в този блок описания на други процедури и функции, както и извиквания към тях. Програмата и наборът от процедури и функции, описани в нея, образуват блокова структура. Блок, който съдържа друг блок (процедура и функция) в своя раздел за деклариране, се нарича външен за него. Блок, съдържащ се в секцията за деклариране на блок, се нарича вътрешен или подблок. Обектите, описани вътре в подблок, са локални за него и са недостъпни за външни блокове, т.е. те могат да бъдат посочени само в рамките на блока, в който са описани. В пример 2.1 локалната променлива е I.
Вторият вариант е по-кратък. Печалбата ще бъде по-значителна, ако трябва да покажете няколко таблици с различни размери. След това променяме стойностите.
За да може процедурата да изпълнява не само една строго определена последователност от действия, а цяло семейство от подобни действия, но с различни параметри, е необходимо процедурата да бъде допълнена с тези параметри. В нашия случай е препоръчително да предоставите два параметъра: параметър, който определя дължината на низа, и параметър за избор на знака, който трябва да начертае низа.
Тогава програмата, която включва процедурата, ще изглежда като тази по-долу.
Пример 2.2.
FOR l:=1 TO Len DO write(Ch);
writeIn('Таблица 2.1');
Скобите след името на процедурата описват имената и типовете на формалните параметри. Извикването на такава процедура става с посочване на стойностите на действителните параметри, както следва:
където 40 - дължина на реда,‘='- използвансимвол.
Стойностите в скоби се наричат аргументи, т.е. тези стойности на действителните параметри, които се заместват при извикване на процедурата. Параметърът LEN ще бъде зададен на 40, параметърът Ch ще бъде зададен на‘=’от тип Char. По принцип аргументът и параметърът трябва да са от съвместими типове, т.е. стойността на аргумента трябва да е такава, че да може да бъде присвоена на параметъра.
Формалните параметри също са локални в рамките на процедура (I в пример 2.2). Обектите, декларирани в някакъв външен блок (или програма), са налични и могат да се използват във всеки негов подблок, т.е. те са глобални за тези подблокове. По този начин обектите, които са локални за блок, са глобални за всички негови подблокове. Тези обекти са етикети и имена на константи, типове, променливи, процедури и функции. На фиг. 2.1 показва диаграма, илюстрираща тази ситуация.
Променливите I, J, K са локални по отношение на блок 3 и не са налични в блокове 1,2. Променливите X, Y, Z са налични в блокове 2,3 и не са налични в блок 1, те са глобални по отношение на блок 3. Променливи A, B, C са налични в цялата програма и са глобални в блокове 2,3. На фиг. 2.2 показва по-сложна структура от четири блока. На тази фигура променливата L е едновременно локална и глобална, но те са различни променливи!
Променливата на реалния тип L, дефинирана в блок 1, е глобална в блок 2, но е предефинирана в блок 3, където е в сила новата асоциация между име и тип. Глобалната променлива с име L в блокове 3, 4 не е налична, промяната на стойността на локалната променлива L в блокове 3, 4 няма ефект върху глобалната променлива (нейната стойност няма да се промени). За да избегнете грешки,свързано с объркване при именуване, не трябва да използвате едни и същи променливи като глобални и като локални. Също така е препоръчително да се избягва съвпадението на имената на формалните и действителните параметри. Различните имена правят програмата по-описателна.
Използвайки параметри, можете да предавате данни не само на извиканата процедура, т.е. прехвърля информация директно, но също и от извиканата процедура към извикващата. Това се прави с помощта на атрибута VAR (променливи параметри, вижте подраздел 2.6).
Помислете за следния пример. Да предположим, че трябва да изчислите десетичния логаритъм за дадено число. Тъй като в Turbo Pascal няма такава функция, за изчислението използваме релацията
Можете да използвате следната процедура за превод.
Пример 2.3.
Процедура LOG10(Аргумент:Реален;Променлива LOG:Реален);
LOG := 0,4343 * LN(X)
Извикването на процедура се случва така: LOG10 (X, Y);
Функция
Функционалната подпрограма е предназначена да изчислява някакъв параметър. Функцията се състои от заглавка и тяло на функцията.
Заглавката на функцията изглежда така:
ФУНКЦИЯ (СПИСЪК НА ФОРМАЛНИТЕ ПАРАМЕТРИ): ;
където ФУНКЦИЯ е служебна дума; ИМЕ - името на процедурата, определено в съответствие с общите правила за конструиране на идентификатори; СПИСЪК НА ФОРМАЛНИТЕ ПАРАМЕТРИ - списък с имена за означаване на изходните данни и резултати от процедурата, като се посочват видовете им.
Допуска се описание на функция, което не съдържа:
в този случай параметрите на функцията се предават през системата от глобални параметри.
Тази подпрограма има две основни разлики от процедура. Първата разлика е заглавието. Състои се от думата Function, последвана от името на функцията, последвано от списък с формални параметри в скоби, последвано от двоеточиеизписва се типа функция, т.е. върнат тип параметър. Функцията може да връща реални, редни, низови и всякакви видове указатели.
Втората разлика е, че една процедура може да има множество изходни резултатни параметри, докато една функция може да има само една стойност, предадена през нейното име. Това обяснява факта, че в тялото на функцията поне веднъж изчислената стойност трябва да бъде присвоена на името на функцията.
Структурата на функцията е същата като на процедурите.
Пример 2.4. Функцията за изчисляване на тангенса tan(x) от аргумента x.
Функция Tan(x: real): real;
Var тангенси: реални;
допирателни:= Sin(x)/Cos(x); тен:=тангенти;
За да извикате функция от основната програма или друга подпрограма, в израза, където искате да използвате стойността на функцията, посочете името на функцията със списък от действителни параметри, които трябва да съвпадат по брой и тип с формалните параметри на функцията. Например, трябва да изчислите , операторът за присвояване ще бъде