Фактический параметр должен быть переменной

Фактический параметр должен быть переменной

Если перед именем формального параметра стоит ключевое слово var, то такой параметр есть параметр-переменная. Примерами таких параметров служат x1 и x2 в заголовке

Фактический параметр, соответствующий параметру-переменной, может быть только переменной (не константой и не выражением).

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

Пример. При вызове процедуры sq оператором sq(p, q, r, y, z) для переменных x1 и x2 используются непосредственно те ячейки, которые отведены для y и z . Поэтому оператор присваивания x1 := (-b + sqrt(d)) / (2 * a) засылает полученное значение в y .

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

Результаты, выдаваемые процедурой h – 11; основная ветка программы выводит 01.

Разберем этот пример: фактический параметр a соответствует формальному параметру-значению x , а фактический параметр b – формальному параметру-переменной y . Под параметры a и x отведены две разные ячейки памяти, а под b и y – одна и та же ячейка.

При обращении к h(a, b) из ячейки a пересылается значение 0 в ячейку x , а в ячейку y засылается адрес ячейки b , содержащей 0, т.к. в процедуре h параметр x – это параметр-значение, а y – параметр-переменная.

При выполнении оператора x := x + 1 в ячейку x прибавляется 1 и в ячейке x окажется 1, а в ячейке a по-прежнему 0.

Выполнение оператора y := y + 1 имеет следующий смысл: «взять число из ячейки, адрес которой находится в y (т.е. из ячейки b ), прибавить 1 и заслать в ту же ячейку (т.е. в b )».

Поэтому в результате выполнения оператора y := y + 1 значение ячейки b станет 1. Оператор печати из процедуры выдаст содержимое ячейки x и ячейки y , т.е. 1 и 1. Оператор печати в программе напечатает содержимое a , которое осталось равным 0, и содержимое ячейки b , которое теперь равно 1.

Процедуры в Паскале допускают рекурсию, т.е. процедура может вызвать сама себя.

Если в процедуре p есть обращение к процедуре q , описанной ниже, то перед описанием p процедура q декларируется как forward: после заголовка процедуры q ставится двоеточие, а затем ключевое слово forward . В этом случае параметры процедуры описываются только в операторе с forward . В заголовке самой процедуры параметры опускаются.

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

Рассмотрим использование параметров-значений и параметров-переменных.

Если в списке формальных параметров имени параметра предшествует слово VAR, то этот параметр является параметром — переменной. В качестве фактического параметра, соответствующего формальному параметру — переменной, должна использоваться переменная. Ее тип должен совпадать с типом, заданным в описании формального параметра — переменной. Все действия, задаваемые телом процедуры, выполняются над фактическим параметром — переменной, который доступен в течение всего времени действия оператора процедуры.

Читайте также:  Xiaomi redmi note 5 камера сколько мегапикселей

Если переменная, выступающая в качестве фактического параметра, изменяет свое значение в процессе выполнения процедуры, то после завершения выполнения процедуры это значение остается доступным для последующих действий. Следовательно, если некоторый параметр процедуры представляет собой результат ее выполнения, то он обязательно должен описываться как формальный параметр — переменная.

Если в списке формальных параметров ничего не предшествует имени параметра, то он является параметром — значением. Фактическим параметром, соответствующим параметру — значению, должно быть выражение, в частности, просто имя переменной или константа. Формальный параметр в этом случае — просто локальная переменная вызываемой процедуры. В качестве начального значения такому параметру присваивается текущее значение соответствующего фактического параметра, то есть значение выражения, вычисленное в момент обращения к процедуре. Значение формального параметра может изменяться при выполнении процедуры, однако никакого влияния на значение фактического параметра это не оказывает. Следовательно, параметр — значение не может представлять собой результат работы процедуры.

Если у процедуры нет списка формальных параметров, то она называется процедурой без параметров.

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

лабораторные работы и задачи по программированию и информатике, егэ по информатике

Процедуры в Паскале

Подпрограмма — это фрагмент кода, который имеет свое имя и создается в случае необходимости выполнять этот код несколько (много) раз. Подпрограмма описывается единожды перед началом основной программы (до begin ). Компилятор пропускает данный фрагмент кода, пока в основной программе не встретит «вызов» подпрограммы, который выглядит как обращение к ней по имени (возможно, имени с аргументами, указанными в скобках).

Во многих языках программирования подпрограммы существуют только в виде функций. Однако в Паскале подпрограмма — и функция и процедура. Разница между ними станет очевидна в данном уроке.

Итак, рассмотрим синтаксис объявления и описания процедуры в Паскале

procedure pr; var i:integer; begin for i:=1 to 60 do begin <тело подпрограммы>write(‘*’); writeln; end; end; <конец подпрограммы>begin pr; <вызов процедуры>end.

В данном примере работы с процедурой в Паскале очевидно, что компилятор пропустит блок описания процедуры и дойдет до основной программы (9 строка кода). И только после того, как встретится вызов процедуры (10 строка), компилятор перейдет к ее выполнению, вернувшись к строке 1.

Процедуры с параметрами. Фактические и формальные параметры

Рассмотрим пример необходимости использования процедуры.

Особенность: Три похожие фигуры.

  • общее: размеры, угол поворота
  • отличия: координаты, цвет
  • Алгоритм решения:

    • выделить одинаковые или похожие действия (три фигуры);
    • найти в них общее (размеры, форма, угол поворота) и отличия (координаты, цвет);
    • отличия записать в виде неизвестных переменных, они будут параметрами процедуры.

    Решение на паскале:
    Процедура:

    Программа:

    uses GraphABC; procedure Tr( x, y: integer; color:system.Drawing.Color); begin MoveTo(x, y); LineTo(x, y-60); LineTo(x+100, y); LineTo(x, y); FloodFill(x+20, y-20,color); end; begin SetPenColor(clBlack); Tr(100, 100, clBlue); Tr(200, 100, clGreen); Tr(200, 160, clRed); end.

    Читайте также:  Gtx последняя версия видеокарта

    Рассмотрим синтаксис объявления и описания процедуры с параметрами в Паскале.

    Параметры процедуры (в некоторых языках они называются аргументами) указываются в скобках после ее имени (в объявлении).

    В данном примере в качестве введенного символа будем использовать параметр процедуры. Формальный параметр процедуры указывается в скобках при ее описании. Обязательно необходимо указать тип формального параметра через двоеточие.

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

    var s:char; procedure pr(a:char); var i:integer; begin for i:=1 to 60 do begin write(a); writeln; end; end; begin writeln(‘simvol’); readln(s); pr(s); end.

    В данном примере при вызове процедуры компилятор заменит формальный параметр a фактическим параметром s , т.е. тем символом, который будет введен с клавиатуры. Оба параметра имеют тип данных char .

    • число фактических параметров должно быть равно числу формальных параметров;
    • соответствующие фактические и формальные параметры должны совпадать по порядку следования и по типу данных.

    Процедуры с параметрами. Параметр-переменная

    var x,y,m,n:integer; procedure MaxNumber(a,b:integer;var max:integer); begin if a>b then max:=a else max:=b; end; begin write(‘vvedite x,y’); readln(x,y); MaxNumber(x,y,m); <фактические параметры>writeln(‘max=’,m) end.

    В примере формальные параметры a и b служат для помещения в них сравниваемых чисел, а параметр-переменная max — для сохранения в ней максимального из двух чисел. Параметр-переменная или выходной параметр передает свое значение в основную программу (фактическому параметру m ), т.е. возвращает значение, тогда как формальные параметры-значения (входной параметр), наоборот, принимают значения из основной программы (из фактических параметров x и y ). Для параметра-переменной ( max ) используются те ячейки памяти, которые отведены под соответствующий параметр при вызове процедуры (ячейка m ).

    Таким образом, сформулируем понятия:

    Если в качестве формального параметра указана обычная переменная с указанием ее типа, то такой параметр есть параметр-значение или входной параметр ( a и b в примере). Тип данных формального параметра-значения должен соответствовать типу данных его фактического параметра ( a и b должны попарно соответствовать типу данных x и y ).

    Если перед именем формального параметра в объявлении процедуры стоит служебное слово var, то такой параметр называется параметром-переменной или выходным параметром ( max в примере). Для него используются те ячейки памяти, которые отведены под соответствующий параметр при вызове процедуры ( m ). Фактический параметр, соответствующий параметру-переменной, может быть только переменной (не константой, не литералом и не выражением).

    var x,y:integer; procedure exchange(a: integer;var b:integer); var c:integer; begin if a>b then begin c:=a; a:=b; b:=c; <второй параметр процедуры — b — всегда будет максимальным>end; end; begin writeln(‘введите два числа’); readln(x,y); exchange (x,y); writeln(‘max=’,y) end.

    Читайте также:  Как выставить видеокарту в биосе

    Используя данный способ решения задачи, мы обошлись без третьего параметра. Для этого в процедуре мы использовали еще одну локальную переменную c . Процедура меняет значения переменных a и b таким образом, чтобы b всегда была максимальной. Поэтому в 15 строке программы в качестве максимальной выводится второй параметр ( y ), соответствующий формальному параметру b .

    1. Необходимо определить наибольший общий делитель двух введенных чисел, используя цикл.
    2. Необходимо определить наибольший общий делитель двух введенных чисел, используя процедуру (два параметра-значения, один параметр-переменная).


    Словесный алгоритм:

    • Вводятся a и b (например, 18 и 24)
    • В цикле повторяем действия:
    • Если а 18 если b>a -> swap(a,b) 24/18 = 1(6) a=6, b=18 6 18/6 =3(0) a=0, b=6 6 128 и 56 128/56=2(16) a=16,b=56 16 56/16=3(8) a=8,b=16 8 16/8=2(0) a=0, b=8 8

    0 do begin if a

    В задачах на Паскале часто встречается необходимость заполнить массив данными и затем вывести значения на экран. Почему бы не автоматизировать данную задачу заполнения и вывода массива — т.е. оформить при помощи процедур, а в дальнейшем использовать данные процедуры при надобности.

    const n = 10; var i:integer; a, b: array[1..n] of integer; procedure arr_out (k:integer; arr: array[1..n] of integer); var i: byte; begin write (‘вывод массива: ‘); for i := 1 to k do write (arr[i]:4); writeln; end; begin for i:=1 to n do a[i]:=random(10); arr_out (n, a); end.

    Пояснение:
    Тело основной программы:
    — формирование элементов массива (с функцией random ).
    — вызов процедуры с двумя параметрами: количество элементов, массив.
    Тело процедуры:
    — вывод элементов массива с использованием параметров

    Продолжим нашу задачу:

    const n = 10; var a, b: array[1..n] of integer; procedure arr_rand (k:integer; var arr: array[1..n] of integer); var i: byte; begin write (‘Заполнение массива случайными числами ‘); randomize; for i := 1 to k do arr[i]:=random(100); end; begin arr_rand (n, a); end.

    Самостоятельная работа

    Общее задание 2: Описать процедуру Mean(X, Y, AMean, GMean) , вычисляющую:

    • среднее арифметическое AMean = (X+Y)/2
    • и среднее геометрическое GMean = √X*Y двух положительных вещественных чисел X и Y .

    X и Y — входные параметры, AMean и GMean — выходные параметры вещественного типа.
    В основной программе: Для заданных A, B, C, D найти среднее арифметическое и среднее геометрическое для пар (A, B), (A, C), (A, D), используя созданную процедуру.

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

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

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

    Ссылка на основную публикацию
    Файл cms что это
    Файлы формата CMS открываются специальными программами. Существует 2 типа форматов CMS, каждый из которых открывается разными программами. Чтобы открыть нужный...
    Унитаз лира киров отзывы
    Сырье также используется импортное, тщательно отобранное и экологически чистое — глина, гипс, каолин, полевой шпат, красители. Гарантия на производимые компанией...
    Унитаз ресса киров отзывы
    Мы предлагаем унитазы росссийского производителя Роза (Киров). В нашем каталоге собрано 30 моделей по цене от 3 090р. Перейдите по...
    Файл менеджер для windows 10 на русском
    Менеджер файлов осуществляет просмотр, копирование, управление медиафайлами и папками на персональном компьютере. Он предоставляет функцию быстрого перемещения объектов для ускорения...
    Adblock detector