Что такое параметры функции какую работу они выполняют охарактеризуйте их
BestProg
Функции. Часть 1. Описание функции. Фактические и формальные параметры. Передача параметров в функцию по значению и по адресу. Прототип функции
Содержание
Поиск на других ресурсах:
1. Что такое функция? Определение функции. Преимущества использования функций
При написании программ среднего и высокого уровня сложности возникает потребность в их разбиении на части. Разбиение большой программы на меньшие части позволяет уменьшить риск возникновения ошибок, повышает читабельность программного кода благодаря его структурированию.
Кроме того, если некоторый программный код повторяется несколько раз (или есть близким по смыслу), то целесообразно организовать его в виде функции, которую потом можно вызывать многократно используя ее имя. Таким образом, происходит экономия памяти, уменьшение исходного кода программы, и т.п..
Функция – это часть программы, которая имеет следующие свойства или признаки:
Использование функций в программах дает следующие преимущества:
2. Какая общая форма описания функции?
Общая форма описания функции выглядит следующим образом:
3. Примеры описания и использования функций, которые не возвращают значения
Пример 1. Функция MyFunc1() без параметров, которая не возвращает значения.
Если в теле некоторого класса или модуля описать функцию:
тогда вызвать эту функцию можно следующим образом:
Вызов функции из другого программного кода:
Вызов функции из другого программного кода:
4. Примеры описания и использования функций, которые получают один параметр
Пример 1. Функция, которая получает один параметр целого типа, умножает его на 5 и возвращает результат. Функция не выполняет вывода результата.
Вызов функции из другого программного кода
Реализация функции:
Вызов функции из другого программного кода:
5. Примеры описания и использования функций, которые получают два и больше параметра
Вызов функции MaxFloat() из другого программного кода:
Вызов функции из другого программного кода
6. Какие существуют способы передачи параметров в функцию? Пример
В C++ существует 3 способа передачи параметров в функцию:
Пример. Этот пример демонстрирует отличие между передачей параметров по значению, по адресу и по ссылке. Описывается функция, которая получает три параметра. Первый параметр ( x ) передается по значению. Второй параметр ( y ) передается по адресу (как указатель). Третий параметр ( z ) передается по ссылке.
Демонстрация вызова функции MyFunction() из другого программного кода:
Как видно из результата, значение переменной a не изменилось. Переменная a передавалась в функцию MyFunction() с передачей значения (первый параметр).
Точно так же изменилось и значение c после вызова функции. Ссылка есть адрес объекта в памяти. С помощью этого адреса можно иметь доступ к значению объекта.
7. Что такое формальные и фактические параметры функции? Пример
При вызове функции с параметрами, компилятор осуществляет копирование копий формальных параметров в стек.
Вызов функции из другого программного кода (другой функции)
При вызове функции из другого программного кода имеет место фактический параметр. В данном примере фактический параметр это переменная a и константа 23.
При вызове функции фактические параметры копируются в специальные ячейки памяти в стеке (стек – часть памяти). Эти ячейки памяти отведены для формальных параметров. Таким образом, формальные параметры (через использование стека) получают значение фактических параметров.
Поскольку, фактические параметры копируются в стек, то изменение значений формальных параметров в теле функции не изменит значений фактических параметров (так как это есть копия фактических параметров).
8. Какая область видимости формальных параметров функции? Пример
Область видимости формальных параметров функции определяется границами тела функции, в которой они описаны. В приведенном ниже примере формальный параметр n целого типа имеет область видимости в границах фигурных скобок < >.
Вызов функции из другого программного кода (другой функции):
9. Что такое прототип функции? Пример
Прототип функции – это соообщение компилятору и другим функциям о том, что такая функция существует. Иными словами, это сообщение компилятору и другим функциям о том, что в программе существует функция с указанной сигнатурой. Прототип функции состоит из сокращенного описания без тела функции.
Прототип функции содержит:
Общая форма объявления прототипа функции следующая:
При указании прототипа функции необязательно указывать имена параметров. Например, для функции
можно указать следующий прототип
В случаях, когда вызываемая функция, объявлена перед вызывающей ее функцией, можно обойтись без использования прототипа. В других случаях прототип функции обязателен.
Если функция объявляется в классе и вызывается из методов этого класса, тогда подобных ошибок не будет. Это объясняется тем, что в классе прототип функции известен всем методам класса.
10. Пример, демонстрирующий необходимость использования прототипа функции
то компилятор выдаст сообщение об ошибке
Понятие функции. Структура функции. Объявление функции. Общая структура программы. Передача параметров программе (стр. 1 )
| Из за большого объема этот материал размещен на нескольких страницах: 1 2 3 4 5 |
2. Понятие функции. Структура функции. Объявление функции. Общая структура программы. Передача параметров программе.
Каждая функция должна иметь имя, которое используется для ее объявления, определения и вызова. В любой программе на СИ должна быть функция с именем main (главная функция), именно с этой функции, в каком бы месте программы она не находилась, начинается выполнение программы.
Определение любой функции имеет вид:
Тип результата-имя функции (список параметров, если они есть)
Определение функции задает тип возвращаемого значения, имя функции, типы и число формальных параметров, а также объявления переменных и операторы, называемые телом функции, и определяющие действие функции. В определении функции также может быть задан класс памяти.
3. Объявление функции имеет такой же вид, что и определение функции, с той лишь разницей, что тело функции отсутствует, и имена формальных параметров тоже могут быть опущены.
4. Общая структура программы. Все программы на языке СИ содержат директивы препроцессора, описания, определения, выражения, операторы и функции.
-Описания. Описание устанавливает имена и атрибуты переменных, функций и типов, используемых в программе. Глобальные переменные описываются вне функций и действуют от конца описания до конца файла. Локальная переменная описывается внутри функции и действует от конца описания до конца функции.
-Определение. Определение устанавливает содержимое переменной или функции. Определение также отводит память, требуемую для переменных и функций.
-Выражение. Выражение-это комбинация операций и операндов, которое принимает единственное значение.
-Оператор. Операторы управляют порядком выполнения программы на языке СИ.
Все программы на языке СИ, там где начинается выполнение программы, имеют функцию с именем main. Фигурные скобки, в которые заключено тело функции main, определяют начало и конец программы.
5. Передача параметров программе.
Функция main, с которой начинается выполнение СИ-программы, может быть определена с параметрами, которые передаются из внешнего окружения, например, из командной строки. Во внешнем окружении действуют свои правила представления данных, а точнее, все данные представляются в виде строк символов. Для передачи этих строк в функцию main используются два параметра, первый параметр служит для передачи числа передаваемых строк, второй для передачи самих строк. Общепринятые (но не обязательные) имена этих параметров argc и argv. Параметр argc имеет тип int, его значение формируется из анализа командной строки и равно количеству слов в командной строке, включая и имя вызываемой программы (под словом понимается любой текст не содержащий символа пробел). Параметр argv это массив указателей на строки, каждая из которых содержит одно слово из командной строки. Если слово должно содержать символ пробел, то при записи его в командную строку оно должно быть заключено в кавычки.
Функция main может иметь и третий параметр, который принято называть argp, и который служит для передачи в функцию main параметров операционной системы (среды) в которой выполняется СИ-программа.
Функции всегда определяются глобально. Они могут быть объявлены с классом памяти static или extern. Объявления функций на локальном и глобальном уровнях имеют одинаковый смысл.
Правила определения области видимости для функций отличаются от правил видимости для переменных и состоят в следующем.
1. Функция, объявленная как static, видима в пределах того файла, в котором она определена. Каждая функция может вызвать другую функцию с классом памяти static из своего исходного файла, но не может вызвать функцию определенную с классом static в другом исходном файле. Разные функции с классом памяти static имеющие одинаковые имена могут быть определены в разных исходных файлах, и это не ведет к конфликту.
2. Функция, объявленная с классом памяти extern, видима в пределах всех исходных файлов программы. Любая функция может вызывать функции с классом памяти extern.
3. Если в объявлении функции отсутствует спецификатор класса памяти, то по умолчанию принимается класс extern.
Все объекты с классом памяти extern компилятор помещает в объектном файле в специальную таблицу внешних ссылок, которая используется редактором связей для разрешения внешних ссылок. Часть внешних ссылок порождается компилятором при обращениях к библиотечным функциям СИ, поэтому для разрешения этих ссылок редактору связей должны быть доступны соответствующие библиотеки функций.
Определение и вызов функций
Мощность языка СИ во многом определяется легкостью и гибкостью в определении и использовании функций в СИ-программах. В отличие от других языков программирования высокого уровня в языке СИ нет деления на процедуры, подпрограммы и функции, здесь вся программа строится только из функций.
При вызове функции ей при помощи аргументов (формальных параметров) могут быть переданы некоторые значения (фактические параметры), используемые во время выполнения функции. Функция может возвращать некоторое (одно!) значение. Это возвращаемое значение и есть результат выполнения функции, который при выполнении программы подставляется в точку вызова функции, где бы этот вызов ни встретился. Допускается также использовать функции не имеющие аргументов и функции не возвращающие никаких значений. Действие таких функций может состоять, например, в изменении значений некоторых переменных, выводе на печать некоторых текстов и т. п..
Определение функции задает тип возвращаемого значения, имя функции, типы и число формальных параметров, а также объявления переменных и операторы, называемые телом функции, и определяющие действие функции. В определении функции также может быть задан класс памяти.
int rus (unsigned char r)
Функция, вычисляющая факториал, будет иметь следующий вид:
Хотя компилятор языка СИ не ограничивает число рекурсивных вызовов функций, это число ограничивается ресурсом памяти компьютера и при слишком большом числе рекурсивных вызовов может произойти переполнение стека.
Вызов функции с переменным числом параметров
При вызове функции с переменным числом параметров в вызове этой функции задается любое требуемое число аргументов. В объявлении и определении такой функции переменное число аргументов задается многоточием в конце списка формальных параметров или списка типов аргументов.
Все аргументы, заданные в вызове функции, размещаются в стеке. Количество формальных параметров, объявленных для функции, определяется числом аргументов, которые берутся из стека и присваиваются формальным параметрам. Программист отвечает за правильность выбора дополнительных аргументов из стека и определение числа аргументов, находящихся в стеке.
Примерами функций с переменным числом параметров являются функции из библиотеки функций языка СИ, осуществляющие операции ввода-вывода информации (printf, scanf и т. п.). Подробно эти функции рассмотрены во третьей части книги.
Программист может разрабатывать свои функции с переменным числом параметров. Для обеспечения удобного способа доступа к аргументам функции с переменным числом параметров имеются три макроопределения (макросы) va_start, va_arg, va_end, находящиеся в заголовочном файле stdarg. h. Эти макросы указывают на то, что функция, разработанная пользователем, имеет некоторое число обязательных аргументов, за которыми следует переменное число необязательных аргументов. Обязательные аргументы доступны через свои имена как при вызове обычной функции. Для извлечения необязательных аргументов используются макросы va_start, va_arg, va_end в следующем порядке.
Макрос va_start предназначен для установки аргумента arg_ptr на начало списка необязательных параметров и имеет вид функции с двумя параметрами:
void va_start(arg_ptr, prav_param);
Параметр prav_param должен быть последним обязательным параметром вызываемой функции, а указатель arg_prt должен быть объявлен с предопределением в списке переменных типа va_list в виде:
Макрос va_start должен быть использован до первого использования макроса va_arg.
Макрокоманда va_arg обеспечивает доступ к текущему параметру вызываемой функции и тоже имеет вид функции с двумя параметрами
type_arg va_arg(arg_ptr, type);
Эта макрокоманда извлекает значение типа type по адресу, заданному указателем arg_ptr, увеличивает значение указателя arg_ptr на длину использованного параметра (длина type) и таким образом параметр arg_ptr будет указывать на следующий параметр вызываемой функции. Макрокоманда va_arg используется столько раз, сколько необходимо для извлечения всех параметров вызываемой функции.
Макрос va_end используется по окончании обработки всех параметров функции и устанавливает указатель списка необязательных параметров на ноль (NULL).
Урок №13. Параметры и аргументы функций
Обновл. 11 Сен 2021 |
На предыдущем уроке мы говорили о том, что функция может возвращать значение обратно в caller, используя оператор return. На этом уроке мы узнаем, что такое аргументы в функции и что такое параметры в функции.
Параметры и аргументы функций
Во многих случаях нам нужно будет передавать данные в вызываемую функцию, чтобы она могла с ними как-то взаимодействовать. Например, если мы хотим написать функцию умножения двух чисел, то нам нужно каким-то образом сообщить функции, какие это будут числа. В противном случае, как она узнает, что на что перемножать? Здесь нам на помощь приходят параметры и аргументы.
Параметр функции — это переменная, которая используется в функции, и значение которой предоставляет caller (вызывающий объект). Параметры указываются при объявлении функции в круглых скобках. Если их много, то они перечисляются через запятую, например:
Аргумент функции — это значение, которое передается из caller-а в функцию и которое указывается в скобках при вызове функции в caller-е:
Обратите внимание, аргументы тоже перечисляются через запятую. Количество аргументов должно совпадать с количеством параметров, иначе компилятор выдаст сообщение об ошибке.
Как работают параметры и аргументы функций?
При вызове функции, все её параметры создаются как локальные переменные, а значение каждого из аргументов копируется в соответствующий параметр (локальную переменную). Этот процесс называется передачей по значению. Например:
Как работают параметры и возвращаемые значения функций?
Используя параметры и возвращаемые значения, мы можем создавать функции, которые будут принимать и обрабатывать данные, а затем возвращать результат обратно в caller.
Например, простая функция, которая принимает два целых числа и возвращает их сумму:
Результат выполнения программы:
Еще примеры
Рассмотрим еще несколько вызовов функций:
Результат выполнения программы:
С первыми двумя вызовами всё понятно.
Следующая пара относительно лёгкая для понимания:
Теперь рассмотрим вызов посложнее:
add(1, multiply(2, 3)) => add(1, 6) => 7
Последний вызов может показаться немного сложным из-за того, что параметром функции add() является другой вызов add():
add(1, add(2, 3)) => add(1, 5) => 6
Задание №1: Что не так со следующим фрагментом кода?
Задание №2: Какие здесь есть две проблемы?
Задание №3: Какой результат выполнения следующей программы?
Задание №4: Напишите функцию doubleNumber(), которая принимает целое число в качестве параметра, удваивает его, а затем возвращает результат обратно в caller.
Задание №5: Напишите полноценную программу, которая принимает целое число от пользователя (используйте std::cin), удваивает его с помощью функции doubleNumber() из предыдущего задания, а затем выводит результат на экран.
Ответы
Чтобы просмотреть ответ, кликните на него мышкой.
Ответ №1
Функция multiply() имеет тип возврата void, что означает, что эта функция не возвращает значения. Но, так как она все равно пытается возвратить значение с помощью оператора return, мы получим ошибку от компилятора. Функция должна иметь тип возврата int.
Ответ №2
Проблема №1: main() передает один аргумент в multiply(), но multiply() имеет два параметра.
Проблема №2: multiply() вычисляет результат и присваивает его локальной переменной, которую не возвращает обратно в main(). А поскольку тип возврата функции multiply() — int, то мы получим ошибку (в некоторых компиляторах) или неожиданные результаты (в остальных компиляторах).
Ответ №3
Свойства функции. Возрастание и убывание, наибольшее и наименьшее значения, нули, промежутки знакопостоянства.
теория по математике 📈 функции
Каждый из нас встречался с разными графиками, как на уроках, так и в жизни. Например, рассматривали, как изменяется температура воздуха в определенный период времени.
На рисунке видно, что температура воздуха была отрицательной с 0 часов до 6 часов, а также с 20 до 24 часов. Еще можем сказать, что температура повышалась до 14 часов, а затем понижалась. То есть по данному графику мы смогли определить некоторые свойства зависимости температуры воздуха от времени суток.
Остановимся подробнее на свойствах функций.
Нули функции
Нули функции – это значение аргумента, при которых функция обращается в нуль. Если смотреть нули функции на графике, то берем точки, где график пересекает ось х.
На рисунке он пересекает ось х при х=-1; х=4; х=6. Эти точки пересечения выделены красным цветом. Внимание!
Существует функция, которая не будет иметь нули функции. Это гипербола. Вспомним, что функция имеет вид у=k/x, где х не равное 0 число.
а) Для нахождения нулей функции необходимо в данную формулу вместо у подставить число 0, так как координаты точки пересечения графика с осью х (х;0). Нам нужно найти значение х. Получаем 0 = –11х +12. Решаем уравнение. Переносим слагаемое, содержащее переменную, в левую часть, меняя знак на противоположный: 11х=22
Находим х, разделив 22 на 11: х=22:11
Таким образом, мы нашли нуль функции: х=2
Пример №2. Найти нули функции у=f(x) по заданному графику.
Находим точки пересечения графика с осью х и выписываем значения х в этих точках. Это (-4,9); (-1,2); 2,2 и 5,7. У нас на рисунке точки пересечения выделены красным цветом.
Промежутки знакопостоянства
Промежутки, где функция сохраняет знак (то есть значение y либо положительное на этом промежутке, либо отрицательное), называется промежутками знакопостоянства.
Пример №3. Найдем промежутки знакопостоянства по заданному на промежутке [-2; 10] графику функции у=f(x).
Функция принимает отрицательные значения в промежутках (-1; 3) и (8; 10]. Обратите внимание на линии синего цвета.
Возрастание и убывание функции
Значения функции могут уменьшаться или увеличиваться. Это зависит от того, как изменяются значения х. Рассмотрим это свойство по рисунку.
Посмотрим на значения х, которые увеличиваются от 2 до 5. В этом случае значения у уменьшаются. На графике эта часть выделена зеленым цветом. Слева направо эта часть графика идет вниз. То есть в промежутке [2;5] функция у=f(x) является убывающей.
Функция называется возрастающей в некотором промежутке, если большему значению аргумента из этого промежутка соответствует большее значение функции; функция называется убывающей в некотором промежутке, если большему значению аргумента из этого промежутка соответствует меньшее значение функции.
Что такое параметры функции какую работу они выполняют охарактеризуйте их
Синтаксис определения и вызова функции
Синтаксис функций (определения и вызова) включает в себя до десятка терминов и определений, поэтому придется сначала договориться о терминологии, не вникая в суть, а затем обсуждать механизмы ее работы.
Как любая другая переменная, результат функции относится к определенному типу данных, который указан в заголовке функции ( 6). Это делается тем же способом, что и для обычных переменных. Используется тот же самый синтаксис, в котором имя функции выступает в роли переменной-результата. Тип результата может быть любым, за исключением функции или массива.
return (nn+1) ; // FF = (double)(nn + 1)
Nothing(); // Просто вызов без использования результата
Определение функции представляет собой всего лишь статическую «заготовку» программы. Выполнение ее происходит тогда, когда в процессе вычисления выражения встречается вызов функции. Синтаксически вызовом функции называется упоминание имени этой функции в выражений ( 10), причем после имени функции в скобках следует список фактических параметров (12).
Фактические параметры – переменные, константы и выражения, которые ставятся в соответствие формальным параметрам при текущем вызове функции. По поводу них можно сказать следующее :
· между формальными и фактическими параметрами устанавливается «один-один» соответствие, которое действует только в течение текущего вызова функции (динамически);
· существуют различные способы установления соответствия, на настоящий момент реально распространенными в языках программирования являются способы передачи параметров по ссылке и по значению;
Способы соответствия формальных и фактических параметров
В настоящее время в большинстве языков программирования используются два способа передачи параметров: по ссылке и по значению. Особенностью Си является то, что он имеет возможность использовать ссылки не только неявно, но и с использованием такого архитектурно-ориентированного средства как указатель Кроме того, указатель и ссылка могут быть не только формальным параметром, но и результатом функции ( 5.2). Пока же мы ограничимся общепринятыми для всех языков программирования рамками.
· формальные параметры являются собственными переменными функции, аналогом локальных переменных;
· при вызове функции происходит присваивание формальным параметрам значений фактических (копирование вторых в первые);
· при изменении формальных параметров значения соответствующих им фактических параметров не меняются;
· передача параметров по значению используется для задании функции входных данных.
· формальные параметры существуют как синонимы фактических, в этом смысле они не являются «настоящими» переменными, под которые отводится память, а реализуется как элемент отображения;
· при изменении значений формальных параметров эти изменения проецируются на соответствующие им фактические;
· передача параметров по ссылке может использоваться для данных, которые являются либо чисто выходными (неявный результат функции), либо представляют собой внешние для функции данные, которые она должна изменить.
Доступ к объекту в виде значения (копии) и ссылки на оригинал широко используются в информационных технологиях. Для любого набора данных можно создать копию, передав ее пользователю, либо создать ссылку на оригинал. Например, на рабочем столе можно разместить копию файла (аналог передачи по значению), либо его ярлык (аналог передачи по ссылке).
В Си приняты следующие правила передачи, которые определяются синтаксическим видом формальных параметров в заголовке функции:
· по умолчанию (т.е. при отсутствии явных символов обозначения) все параметры, кроме массивов, передаются по значению, т.е. копируются ;
· массивы передаются исключительно по ссылке, т.е. отображаются;
· для явного указания способа передачи параметра по ссылке служит символ « &», который записывается перед именем формального параметра.
Механизм вызова функции
Механизм вызова функции является динамическим, т.е. действия, связанные с его реализацией, осуществляются при выполнении программы. Именно поэтому текст программы и его «развертка» во времени представляют для функции «две большие разницы». Это касается двух вещей :
· последовательность выполняемых действий (поток управления) при вызовах функций:
· соответствие между формальными и фактическими параметрами.
Именно поэтому мы и рассмотрим процесс вызова вышеприведенной функции в «исторической перспективе»:
1. результатом трансляции функции является программный код, размещенный в сегменте команд;
3. выполняется программный код вызывающей функции, пока в ней не встретится выражение, содержащий вызов функции;
4. в соответствии со списком фактических параметров устанавливается соответствие между элементами контекста вызывающей функции и формальными параметрами;
7. сохраняется точка возврата в вызывающую функцию, после чего происходит переход к началу блока программного кода функции sum ;
8. выполняется программный код функции sum ;
9. в контексте вызываемой функции используются локальные переменные и формальные параметры, в соответствии со способами передачи параметров массив A отображается на исходный массив B в контексте main ;
12. продолжается выполнение программного кода вызывающей функции.
Области действия функций. Определения и объявления
До сих пор мы ничего не говорили ни о взаимном расположении в программе определения функции и ее вызова, ни о соответствии формальных и фактических параметров, ни о контроле такого соответствия. Конечно, нельзя считать, что транслятор «знает» о всех функциях, когда либо написанных, либо находящихся в библиотеках, текстовых файлах и т.д.. Каждая программа должна сама сообщать транслятору необходимую информацию о функциях, которые она собирается вызывать. Перечислим, какую именно:
· список формальных параметров (переменные и типы).
При ее наличии транслятор может корректно сформировать вызов функции, даже если текст ее (определение) отсутствует в программе. Вся перечисленная информация о функции находится в ее заголовке. Таким образом, достаточно этот заголовок привести отдельно, и проблема корректного вызова решается. Такой заголовок называется объявлением или в рассматриваемом нами варианте синтаксиса прототипом функции
// определенной далее по тексту
extern int printf(char *. ); // Объявление библиотечной функции
// с переменным числом параметров
extern int other(void); // Объявление функции без
// параметров из другого
void main() // файла программы
int sum(int s[], int n) <. >// Определение ранее объявленной функции
Из примера видно, что объявление функции практически дублирует заголовок, отличаясь в некоторых деталях:
· объявление заканчивается символом «;» ;
· если функция находится вне текущего файла, то объявление предваряется служебным словом extern;
· имена переменных в списке формальных параметров объявления могут отсутствовать;
· если функция не имеет формальных параметров, то в объявлении присутствует формальный параметр типа void.
Имея предварительно определенную функцию или ее объявление, транслятор в состоянии проверить соответствие формальных и фактических параметров как по их количеству, так и по типам. При этом транслятор может выполнить неявные преобразования типов фактических параметров к типам формальных, если это потребуется:
extern double sin(double);
y = sin(x); //——Неявное преобразование (double)x
Глобальные переменные. Инициализация
Программа в целом представляет собой набор вызывающих друг друга функций с обязательной функцией main, имеющих собственные наборы локальных переменных.