На предыдущем уроке мы узнали, что функция может возвращать значение обратно в вызывающую функцию. Мы использовали это для создания модульной функции getValueFromUser , которую мы использовали в этой программе:
#include int getValueFromUser() < std::cout ; std::cin >> input; return input; > int main() < int num < getValueFromUser() >; std::cout
Однако что, если мы также захотим поместить строку вывода в отдельную функцию? Вы можете попробовать что-то вроде этого:
#include int getValueFromUser() < std::cout ; std::cin >> input; return input; > // Эта функция не будет компилироваться void printDouble() < std::cout int main() < int num < getValueFromUser() >; printDouble(); return 0; >
Этот код не скомпилируется, потому что функция printDouble не знает, что такое идентификатор num . Вы можете попробовать определить num как переменную внутри функции printDouble() :
void printDouble() < int num<>; // мы добавили эту строку std::cout
Хотя это устраняет ошибку компиляции и делает программу пригодной для компиляции, программа по-прежнему работает некорректно (всегда выводит « 0 doubled is: 0 »). Суть проблемы здесь в том, что у функции printDouble нет способа получить доступ к значению, введенному пользователем.
Женские параметры отбора мужчин. Денис Байгужин.
Нам нужен способ передать значение переменной num в функцию printDouble , чтобы printDouble могла использовать это значение в теле функции.
Параметры и аргументы функции
Во многих случаях полезно иметь возможность передавать информацию вызываемой функции, чтобы у этой функции были данные для работы. Например, если мы хотим написать функцию для сложения двух чисел, нам нужен способ сообщить этой функции, какие два числа нужно складывать при ее вызове. Иначе как функция узнает, что складывать? Мы делаем это с помощью параметров и аргументов функции.
Параметр функции – это переменная, используемая в функции. Параметры функции работают почти так же, как переменные, определенные внутри функции, но с одним отличием: они всегда инициализируются значением, предоставленным вызывающей функцией.
Параметры функции определяются в объявлении функции путем помещения их в скобки после идентификатора функции, при этом несколько параметров разделяются запятыми.
Вот несколько примеров функций с разным количеством параметров:
// Эта функция не принимает параметров // Она никак не зависит от вызывающей стороны void doPrint() < std::cout // Эта функция принимает один целочисленный параметр с именем x // Вызывающая сторона предоставит значение x void printValue(int x) < std::cout // Эта функция имеет два целочисленных параметра, один с именем x, а другой с именем y // Вызывающая сторона предоставит как x, так и y int add(int x, int y)
Аргумент – это значение, которое передается от вызывающей стороны к функции при ее вызове:
doPrint(); // у этого вызова нет аргументов printValue(6); // 6 — это аргумент, переданный в функцию printValue() add(2, 3); // 2 и 3 — аргументы, переданные в функцию add()
Обратите внимание, что несколько аргументов также разделяются запятыми.
Передача параметров в функцию по значению. Параметры функции. Передача аргументов в функцию. #34
Как параметры и аргументы работают вместе
Когда функция вызывается, все параметры функции создаются как переменные, а значение каждого из аргументов копируется в соответствующий параметр. Этот процесс называется передачей по значению.
#include // Эта функция имеет два целочисленных параметра, один с именем x, а другой с именем y // Значения x и y передаются вызывающей стороной void printValues(int x, int y) < std::cout int main() < printValues(6, 7); // Этот вызов функции имеет два аргумента, 6 и 7 return 0; >
Когда функция printValues вызывается с аргументами 6 и 7, параметр x в printValues создается и инициализируется значением 6, а параметр y в printValues создается и инициализируется значением 7.
Это дает в результате следующий вывод:
Обратите внимание, что количество аргументов обычно должно соответствовать количеству параметров функции, иначе компилятор выдаст ошибку. Аргумент, переданный функции, может быть любым допустимым выражением (поскольку аргумент является, по сути, просто инициализатором для параметра, а инициализатор может быть любым допустимым выражением).
Исправляем нашу тестовую программу
Теперь у нас есть инструмент, необходимый для исправления программы, представленной в начале урока:
#include int getValueFromUser() < std::cout ; std::cin >> input; return input; > void printDouble(int value) // Эта функция теперь имеет целочисленный параметр < std::cout int main() < int num < getValueFromUser() >; printDouble(num); return 0; >
В этой программе переменная num сначала инициализируется значением, введенным пользователем. Затем вызывается функция printDouble , и значение аргумента num копируется в параметр value функции printDouble . Затем функция printDouble использует значение параметра value .
Использование возвращаемых значений в качестве аргументов
В приведенной выше задаче мы видим, что переменная num используется только один раз, чтобы передать возвращаемое из функции getValueFromUser значение аргументу вызова функции printDouble .
Параметры
Обмен информацией между основной программой и подпрограммой осуществляется с помощью параметров.
Фактические параметры – это реальные величины, над которыми должны быть выполнены действия, описанные в подпрограмме. Фактические параметры перечисляются через «,».
Формальные параметры – это переменные, которые используются в подпрограмме для описания действий над данными.
Формальные параметры можно разбить на категории:
- параметры-значения;
- параметры-переменные;
- параметры-процедуры;
- параметры-функции.
При передаче параметров по значению подпрограмма получает копию переменной. Изменение копии внутри подпрограммы не влияет на оригинал. При вызове подпрограммы фактические параметры вычисляются и используются как начальные значения формальных параметров, т. е. осуществляется подстановка значений. Параметры-значения используются для передачи исходных данных в подпрограмму. При передаче параметров-переменных в подпрограмму передается адрес переменной, таким образом, подпрограмма получает доступ к самой переменной и может ее изменять. Параметры-переменные могут использоваться как для передачи исходных данных, так и для сохранения результата. Формальные параметры перечисляются через «;» и задаются в виде: : для параметров-значений; var : для параметров-переменных. Если несколько параметров имеют одинаковый тип, то они могут быть перечислены через запятую перед указанием типа. Формальные и фактические параметры должны соответствовать:
- по количеству;
- по порядку следования;
- по типу.
Пример использования процедур с параметрами: Для массивов А(5) и В(6) найти разность между суммами элементов: Сумму найти в подпрограмме-процедуре. Код программы: Program Pp; Uses crt; Const n=6; Type TMas=array[1..n] of real; Var a, b:TMas; i:byte; Sa, Sb, y:real; Procedure Sum_Mas(c:Tmas; k:byte; var s:real); begin s:=0; for i:=1 to k do s:=s+c[i]; end; begin clrscr; for i:=1 to 5 do begin write(‘Введите а[‘, i, ‘]=’); readln(a[i]) end; for i:=1 to 6 do begin write(‘Введите b[‘, i, ‘]=’); readln(b[i]) end; Sum_Mas(a, 5, Sa); Sum_Mas(b, 6, Sb); y:=Sa-Sb; writeln(‘Результат=’, y:6:3); readkey end. Результаты работы программы: Введите а[1]=4.5 Введите а[2]=2.7 Введите а[3]=4.6 Введите а[4]=1.2 Введите а[5]=-7.5 Введите b[1]=3.6 Введите b[2]=8.4 Введите b[3]=-5.1 Введите b[4]=-5.8 Введите b[5]=3.5 Введите b[6]=9.4 Результат=-8.500
Подпрограмма-функция
Подпрограмма-функция предназначена для вычисления какого-либо значения. Описание функции начинается с заголовка: function имя [(список_формальных_параметров)]:тип_возвращаемого_результата; Имя функции используется для передачи результата в вызывающую программу, поэтому в теле функции хотя бы раз должно быть присвоено значение результата имени функции. Для вызова функции следует в выражении, где необходимо использовать значение функции, указать имя функции со списком фактических параметров: имя_функции [(список_фактических_параметров)] Пример использования процедур с параметрами: Для массивов А(5) и В(6) найти разность между суммами элементов: Сумму найти в подпрограмме-функции. Код программы: Program Pp; Uses crt; Const n=6; Type TMas=array[1..n] of real; Var a, b:TMas; i:byte; y:real; Function Sum_Mas(c:Tmas; k:byte):real; var s:real; begin s:=0; for i:=1 to k do s:=s+c[i]; Sum_Mas:=s end; begin clrscr; for i:=1 to 5 do begin write(‘Введите а[‘, i, ‘]=’); readln(a[i]) end; for i:=1 to 6 do begin write(‘Введите b[‘, i, ‘]=’); readln(b[i]) end; y:=Sum_Mas(a, 5)-Sum_Mas(b, 6); writeln(‘Результат=’, y:6:3); readkey end. Результаты работы программы: Введите а[1]=3 Введите а[2]=6 Введите а[3]=7.3 Введите а[4]=5.7 Введите а[5]=2.4 Введите b[1]=6.7 Введите b[2]=4.5 Введите b[3]=1.8 Введите b[4]=-4.7 Введите b[5]=-3.7 Введите b[6]=5.2 Результат=14.600 23
Источник: studfile.net
Параметры
Аргументы — это имена значений, переданных в функцию в результате вызова функции. Параметры — это значения, которые ожидает получить функция. В прототипе функции в круглых скобках после имени функции содержится полный список параметров функции и их типов. Объявления параметров определяют типы, размеры и идентификаторы значений, хранящихся в параметрах.
Синтаксис
function-definition :
declaration-specifiers opt attribute-seq opt declarator declaration-list opt compound-statement
/* attribute-seq используется только в системах Майкрософт */
direct-declarator : /* Оператор объявления функции */
direct-declarator ( parameter-type-list ) /* Оператор объявления нового стиля */
direct-declarator ( identifier-list opt ) /* Оператор объявления старого стиля */
parameter-type-list : /* Список параметров */
parameter-list
parameter-list , .
parameter-list :
parameter-declaration
parameter-list , parameter-declaration
parameter-declaration :
declaration-specifiers declarator
declaration-specifiers abstract-declarator необ.
parameter-type-list содержит последовательность объявлений параметров, разделенных запятыми. Форма каждого параметра в списке параметров выглядит следующим образом.
Параметры функции, объявленные с атрибутом auto , создают ошибки. Идентификаторы параметров используются в теле функции для ссылки на значения, переданные в функцию. Параметрам можно присвоить имена в прототипе, но имена выходят за пределы области в конце объявления. Поэтому имена параметров можно присвоить таким же образом или по-другому в определении функции. Эти идентификаторы невозможно переопределить в крайнем блоке тела функции, но их можно переопределить во внутренних вложенных блоках, как если бы список параметров был внешним блоком.
Каждому идентификатору в parameter-type-list должен предшествовать соответствующий описатель типа, как показано в следующем примере:
void new( double x, double y, double z ) < /* Function body here */ >
Если в списке имеется хотя бы один параметр, то список может заканчиваться запятой и тремя точками ( , . ). Эта конструкция, называемая нотацией с многоточием, указывает переменное число аргументов функции. (Дополнительные сведения см. в статье Вызовы с переменным количеством аргументов.) Однако в вызове функции должно быть как минимум столько аргументов, сколько параметров имеется перед последней запятой.
Если аргументы не требуется передавать в функцию, список параметров заменяется ключевым словом void . В данном случае использование ключевого слова void отличается от его использования в качестве описателя типа.
Порядок и тип параметров, включая любое использование нотации с многоточием, должны быть одинаковыми во всех объявлениях функций (если есть) и в определении функции. Типы аргументов после обычных арифметических преобразований должны быть совместимы по назначению с типами соответствующих параметров. (Дополнительные сведения об арифметических преобразованиях см. в статье Обычные арифметические преобразования.) Аргументы после многоточия не проверяются. Параметр может иметь любой основной тип, тип структуры, объединения, указателя или массива.
Компилятор выполняет обычные арифметические преобразования отдельно для каждого параметра и для каждого аргумента при необходимости. После преобразования параметры имеют длину не менее int и никогда не имеют типа float , если для конкретного параметра в прототипе явно не задан тип float . Это означает, например, что объявление параметра как char будет иметь тот же эффект, что и его объявление как int .
Источник: learn.microsoft.com