Способы передачи параметров в функцию
Обмен информацией между вызываемой и вызывающей функциями осуществляется с помощью механизма передачи параметров.Список_переменных, указанный в заголовке функции называется формальными параметрами или просто параметрами функции. Список_переменных в операторе вызова функции — это фактические параметры или аргументы.
Передача параметров выполняется следующим образом. Вычисляются выражения, стоящие на месте фактических параметров. Затем формальным параметрам присваиваются значения фактических. Выполняется проверка типов и при необходимости выполняется их преобразование.
Передача параметров в функцию может осуществляться по значению и поадресу.
При передачи данных по значению функция работает с копиями фактических параметров, и доступна к исходным значениям аргументов у нее нет. При передачи по адресу в функцию передается не переменная, а ее адрес, и, следовательно, функция имеет доступ к ячейкам памяти, в которых хранятся аргументов. Таким образом, данные, переданные по значению, функция изменить не может, в отличие от данных, переданных по адресу.
Если требуется запретить изменение параметра внутри функции, используют модификатор const. Заголовок функции в общем виде будет выглядеть так:
Тип имя_функции (const тип_переменной* имя_переменной, …) Пример
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#include "stdafx.h" #include <iostream> using namespace std; int f1(int i) //данные передаются по значению { return (i++); } int f2 (int* j) //данные передаются по адресу { //при подстановке фактического параметра, //для получения его значения, применяется операция разадресации * return((*j)++); } int f3 (const int* k) //изменение параметра не предусмотрено { return (*k); } int main () { int a; cout<<"a="; cin>>a; f1(a); cout<<"a="<<a<<"\n"; f2(&a); //для передачи фактического параметра //используется операция взятия адреса & cout<<"a="<<a<<"\n"; f3(&a); cout<<"a="<<a<<"\n"; system ("pause"); return 0; } |
Возврат результата с помощью оператора return
Возврат результата из функции в вызывающую ее функцию осуществляется оператором
return (значение);
Работает оператор так. Вычисляется значение выражения, указанного послеreturn и преобразуется к типу возвращаемого функцией значения. Выполнение функции завершается, а вычисленное значение передается в вызывающую функцию. Любые операторы, следующие в функции за операторомreturn, игнорируются. Программа продолжает свою работу с оператора следующего за оператором вызова данной функции.
Оператор return может отсутствовать в функциях типа void, если возврат происходит перед закрывающейся фигурной скобкой, и в функции main.
Также функция может содержать несколько операторов return, если это определенно потребностями алгоритма. Например, в следующей программе функция f сравнивает значение переменной с нулем. Если число положительное, то в программу передается значение равное 1, если отрицательное, то -1, а если нулевое, то 0.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#include "stdafx.h" #include <iostream> using namespace std; int f(int a) { if (a>0) return 1; else if (a<0) return -1; else return 0; } //функцию можно переписать так //int f(int a) //{ int r; //if (a>0) r=1; //else if (a<0) r=-1; //else r=0; //return(r); //} int main () { int b; cout<<"b="; cin>>b; if (f(b)==1) cout<<"positive value \n"; else if (f(b)==-1) cout<<"negative value \n"; else cout<<"zero value \n"; system ("pause"); }//в функции main отсутствует оператор return |
-
Функции и массивы: массивы как параметры функций. http://www.c-cpp.ru/books/peredacha-massivov-v-funkcii
-
Функции с умалчиваемыми значениями параметров.
http://www.studfiles.ru/preview/1644583/page:2/ тип имя_параметра = умалчиваемое_значение
Как следует из формата, для параметра может быть задано (а может отсутствовать) умалчиваемое значение. Это значение используется в том случае, если при обращении к функции соответствующий параметр опущен. При задании начальных (умалчиваемых) значений должно соблюдаться следующее соглашение. Если параметр имеет умалчиваемое значение, то все параметры, специфицированные справа от него, также должны иметь начальные значения.
Передача параметров функции main . http://www.edu.severodvinsk.ru/after_school/nit/2006/web/davidov/index.files/page0024.htm Функция main, с которой начинается выполнение СИ-программы, может быть определена с параметрами, которые передаются из внешнего окружения, например, из командной строки. Во внешнем окружении действуют свои правила представления данных, а точнее, все данные представляются в виде строк символов. Для передачи этих строк в функцию main используются два параметра, первый параметр служит для передачи числа передаваемых строк, второй для передачи самих строк. Общепринятые (но не обязательные) имена этих параметров argc и argv. Параметр argc имеет тип int, его значение формируется из анализа командной строки и равно количеству слов в командной строке, включая и имя вызываемой программы (под словом понимается любой текст не содержащий символа пробел). Параметр argv это массив указателей на строки, каждая из которых содержит одно слово из командной строки. Если слово должно содержать символ пробел, то при записи его в командную строку оно должно быть заключено в кавычки.
Функция main может иметь и третий параметр, который принято называть argp, и который служит для передачи в функцию main параметров операционной системы (среды) в которой выполняется СИ-программа.
Заголовок функции main имеет вид:
int main (int argc, char *argv[], char *argp[])
перационная система поддерживает передачу значений для параметров argc, argv, argp, а на пользователе лежит ответственность за передачу и использование фактических аргументов функции main.
Следующий пример представляет программу печати фактических аргументов, передаваемых в функциюmain из операционной системы и параметров операционной системы.
Пример:
int main ( int argc, char *argv[], char *argp[])
{ int i=0;
printf ("\n Имя программы %s", argv[0]);
for (i=1; i>=argc; i++)
printf ("\n аргумент %d равен %s", argv[i]);
printf ("\n Параметры операционной системы:");
while (*argp)
{ printf ("\n %s",*argp);
argp++;
}
return (0);
}
-
Ссылки: назначение, определение, использование.
https://ru.wikipedia.org/wiki/%D1%F1%FB%EB%EA%E0_(C++)
-
Рекурсивные вызовы функций: назначение, примеры рекурсивных задач, прямая и косвенная рекурсия.http://kvodo.ru/urok-6-3-rekursivnyie-funktsii-peregruzka.html http://ci-plus-plus-snachala.ru/?p=24
Под рекурсивной функцией в программирование понимают функцию, которая вызывает сама себя. Рекурсивные функции чаще всего используют для компактной реализации рекурсивных алгоритмов. Классическими рекурсивными алгоритмами могут быть возведение числа в целую положительную степень, вычисление факториала.
Перейдет к примеру применения рекурсивной функции.
Задача
Вычислить факториал числа n.
Для справки: «Факториалом числа N называют произведение всех натуральных чисел от 1 до N»
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include "stdafx.h" #include <iostream> using namespace std; long int factorial(int n) { if (n<=1) return (n); else return(n*factorial(n-1)); } int main () { int i; long int f; cout<<"i="; cin>>i; f=factorial(i); cout<<i<<"!="<<f<<endl; system("pause"); return 0; } |
-
Рекурсией называется вызов функции из самой себя.
-
Функции, которые во время выполнения вызывают сами себя называют рекурсивными.
-
Рекурсия бывает прямой и косвенной.
-
Прямая рекурсия – это если функция содержит в своем теле вызов самой себя
-
Косвенная рекурсия – это если первая функция вызывают вторую функцию, но при этом в теле второй функции прописан вызов первой.
-
Разворачивание и свертывание рекурсии в памяти, глубина рекурсии (на практическом примере). http://www.studfiles.ru/preview/1877393/
Глубиной рекурсии называется максимальное число вложенных рекурсивных вызовов (в примерах 2 и 3 глубина рекурсии равна 5). Число вложенных рекурсивных вызовов в данный момент выполнения программы называетсятекущим уровнем рекурсии.
-
Алгоритм быстрой обменной сортировки, его рекурсивная реализация
http://algolist.manual.ru/sort/quick_sort.php
template<class T>
void quickSortR(T* a, long N) {
// На входе - массив a[], a[N] - его последний элемент.
long i = 0, j = N; // поставить указатели на исходные места
T temp, p;
p = a[ N>>1 ]; // центральный элемент
// процедура разделения
do {
while ( a[i] < p ) i++;
while ( a[j] > p ) j--;
if (i <= j) {
temp = a[i]; a[i] = a[j]; a[j] = temp;
i++; j--;
}
} while ( i<=j );
// рекурсивные вызовы, если есть, что сортировать
if ( j > 0 ) quickSortR(a, j);
if ( N > i ) quickSortR(a+i, N-i);
}
