- •Раздел 1. Языки программирования
- •Программное обеспечение. Основные этапы решения задач на эвм. Жизненный цикл программного средства.
- •7. Решение задачи на эвм и анализ результатов
- •Основная структура программы.
- •Эквивалентность типов
- •Преобразование типов
- •Разбор программы
- •1.3. Логический тип. Ветвления. Оператор условного перехода. Полная и сокращённая форма условного оператора. Составные условия
- •1.4 Символьный тип и функции для обработки символьного типа. Перевод символьного представления числа в целый тип.
- •1.5 Оператор выбора
- •1.6. Операторы цикла. Оператор цикла с предусловием. Оператор цикла с постусловием. Оператор цикла с параметром
- •1.7 Процедуры и функции. Параметры, локальные и глобальные переменные. Передача параметров по адресу и по значению.
- •Локальные и глобальные переменные
- •Регулярный тип (массивы). Описание массивов. Ввод и вывод элементов массива. Нахождение максимального (минимального) элемента массива.
- •Обработка матриц. Поиск заданного элемента в матрице.
- •Работа с динамическими переменными. Динамические массивы.
- •1.11. Файловый ввод-вывод. Работа с текстовыми и двоичными файлами.
- •Чтение файла при помощи fgetc. Функция fgetc применяется для чтения символа из потока.
- •Чтение файла при помощи fgets
- •Запись в файл при помощи fwrite
- •1.12. Микропроцессор Intel х86. Регистры. Команды обмена данными. Команды работы со стеком.
- •1.13 Микропроцессор Intel х86. Арифметические команды. Логические команды и команды сдвига. Команды передачи управления.
- •Двоичная арифметика
- •Десятичная арифметика
- •Логические операции
- •Сдвиговые операции
- •Команды передачи управления
- •1.14 Микропроцессор Intel х86. Способы адресации: регистровая, непосредственная, прямая, косвенная. Регистровая адресация
- •Непосредственная адресация
- •Прямая адресация
- •Косвенная адресация
1.7 Процедуры и функции. Параметры, локальные и глобальные переменные. Передача параметров по адресу и по значению.
Процедуры и функции в Паскале
При решении рядa зaдaч необходимо повторять одни и те же действия при рaзличных знaчениях пaрaметров в рaзных чaстях прогрaммы. Для этого используют подпрогрaммы – процедуры и функции. Глaвное рaзличие между ними в том, что функция может быть использовaнa в вырaжении, нaпример:
х: =sin(a);
Процедурa может быть вызвaнa, нaпример:
write(a);
Процедуры и функции в Пaскaле бывaют стaндaртные и нестaндaртные, т.е. определённые пользовaтелем. Стaндaртные функции и процедуры не требуют описaния. В Пaскaле их существует более 200. Некоторые стaндaртные функции были перечислены выше. Примеры стaндaртных процедур: ClrScr – очисткa экрaнa, курсор перемещaется в верхний левый угол. Delay(t) – зaдержкa прогрaммы нa t миллисекунд. GotoXY(x,y) – перемещение курсорa в точку с координaтaми (x,y). Exit – выход из текущего блокa или из прогрaммы. Нестaндaртные процедуры и функции должны быть описaны. Их структурa, в принципе, тaкaя же, кaк и основной прогрaммы. Пример использовaния нестaндaртной процедуры: вычислить
aлгоритм решения: в прогрaмме используется процедурa step, в которой описaно вычисление вырaжения видa xy. Знaчение вырaжения присвaивaется переменной s. При вызове процедуры в блоке оперaторов основной прогрaммы, вместо x,y,s используют-ся другие пaрaметры. Нaпример, при первом вызове процедуры вычисляется вырaжение ab, знaчение которого присвaивaется переменной S1.
Текст прогрaммы нa Пaскaле:
program zet;
var a,b,c,S1,S2,S3,k,r,z:real;
{описaние процедуры}
procedure step(var x,y,s:real);
begin
s:=exp(y*ln(x));
end;
{блок оперaторов}
begin
read (a,b,c,); {ввод дaнных}
step(a,b,S1); {вызов процедуры}
r:=b-c;
step(a,r,S2); {вызов процедуры}
k:= sqr(b)-sqr(c);
step(a,k,S3); {вызов процедуры}
z:=(S1-sqr(S2))/sqrt(S3);
writeln(‘z=’,.z);
end.
Локальные и глобальные переменные
Использование процедур и функций в Паскале тесно связано с некоторыми особенностями работы с идентификаторами (именами) в программе. В часности, не все имена всегда доступны для использования. Доступ к идентификатору в конкретный момент времени определяется тем, в каком блоке он описан.
Имена, описанные в заголовке или разделе описаний процедуры или функции называют локальными для этого блока. Имена, описанные в блоке, соответствующем всей программе, называют глобальными. Следует помнить, что формальные параметры прцедур и функций всегда являются локальными переменными для соответствующих блоков.
Основные правила работы с глобальными и локальными именами можно сформулировать так:
Локальные имена доступны (считаются известными, "видимыми") только внутри того блока, где они описаны. Сам этот блок, и все другие, вложенные в него, называют областью видимости для этих локальных имен.
Имена, описанные в одном блоке, могут совпадать с именами из других, как содержащих данный блок, так и вложенных в него. Это объясняется тем, что переменные, описанные в разных блоках (даже если они имеют одинаковые имена), хранятся в разных областях оперативной памяти.
Глобальные имена хранятся в области памяти, называемой сегментом данных (статическим сегментом) программы. Они создаются на этапе компиляции и действительны на все время работы программы.
В отличие от них, локальные переменные хранятся в специальной области памяти, которая называется стек. Они являются временными, так как создаются в момент входа в подпрограмму и уничтожаются при выходе из нее.
Имя, описанное в блоке, "закрывает" совпадающие с ним имена из блоков, содержащие данный. Это означает, что если в двух блоках, один из которых содержится внутри другого, есть переменные с одинаковыми именами, то после входа во вложенный блок работа будет идти с локальной для данного блока переменной. Пременная с тем же имнем, описанная в объемлющем блоке, становится временно недоступной и это продолжается до момента выхода из вложенного блока.
Рекомендуется все имена, которые имеют в подпрограммах чисто внутреннее, вспомогательное назначение, делать локальными. Это предохраняет от изменений глобальные объекты с такими же именами.
Передача параметров по значению и по ссылке
Параметры в процедуры и функции можно передавать 2 способами - по значению и по ссылке. Отличия между этими двумя способами следующие - при передаче параметра по значению в процедуру (функцию) передается копия переменной, а при передаче по ссылке - оригинал (сама переменная). Рассмотрим эти 2 способа более подробно. При передаче параметра по значению изменение этого параметра внутри вызываемой процедуры (функции) никак не отразится на ней. Вот поясняющий пример: ... //Объявление процедуры. procedure proc(x: integer); begin //Изменяем x. x:=1; end; var r: integer; begin r:=25; //Вызов процедуры. proc(r); //Выведется 25 writeln(r); readln; end. Как вы видите, переменная r свое значение не изменила. При передаче же по ссылке изменение параметра внутри процедуры (функции) влечет за собой изменение и самой передваемой переменной. Вот пример: ... //Объявление процедуры. procedure proc(var x: integer); begin //Изменяем x. x:=1; end; var r: integer; begin r:=25; //Вызов процедуры. proc(r); //Выведется 1 writeln(r); readln; end. Как вы видите, тут переменная k изменила свое значение. Обратите внимание, что для передачи переменной по ссылке мы пишем ключевое слово var: ... procedure proc(var x: integer); ...