По адресу в функцию всегда передаются массивы (рассмотрим это в следующих темах). Для массива это вообще единственный способ передачи данных в языках С/С++. Так же по адресу можно передать те простые объекты, которые являются выходными данными (или входными и выходными одновременно).
В случае передачи данных по адресу фактический параметр может быть только переменной.
Вернёмся к предыдущему примеру. Даны два числа, хранящиеся в переменных a и b. Используя подпрограмму, выполнить обмен содержимого ячеек этих переменных.
Данные передадим по адресу. Они будут в этой задаче и входными, и выходными данными. Для контроля изменения содержимого ячеек памяти будем выводить на экран монитора промежуточные данные.
Возможный вариант реализации программы:
#include <iostream>
using namespace std;
void Obmen(double *x, double *y);
int main()
{
double a = 2.5, b = 3.1;
cout << "Do Obmen: a=" << a << " b=" << b << endl;
Obmen(&a, &b);
cout << "Posle Obmen: a=" << a << " b=" << b << endl;
return 0;
}
void Obmen(double *x, double *y)
|
|
{
double c;
cout << "Function Obmen start:\n *x=" << *x << " *y=" << *y << endl;
c = *x;
*x = *y;
*y = c;
cout << "Function Obmen end:\n *x=" << *x << " *y=" << *y << endl;
}
Результаты выполнения программы:
Do Obmen: a=2.5 b=3.1
Function Obmen start:
*x=2.5 *y=3.1
Function Obmen end:
*x=3.1 *y=2.5
Posle Obmen: a=3.1 b=2.5
Печать на экране монитора наглядно показывает, что обмен произведён, и исходные переменные теперь имеют новые значения, т.е. передача данных по адресу действительно позволяет вернуть в вызывающую функцию результат работы вызываемой подпрограммы.
Ниже приведен пример, в котором создана функция, переводящая температуру из шкалы по Фаренгейту в градусы Цельсия.
#include <iostream.h>
float Convert(float); // прототип функции
void main()
{
float TempFar;
float TempCel;
cout<< "Enter the Tamperature in Fahrenheit: "; cin >> TempFar;
TempCel = Convert (TempFar);
cout << "\nThe Temperature in Celsius is: ";
cout << TempCel << endl;
}
float Convert(float Fer) // заголовок функции.
{
float Cel;
Cel = ((Fer - 32) * 5)/9; // операторы тела функции
return Cel;
}
Возврат значения из функции осуществляется оператором return. Функция может содержать несколько операторов return. Например:
int Doubler (int origin)
{
if (origin <= 1000)
return origin*2;
else
return -1;
}
Внутри функции нельзя определить другую функцию, но из одной функции можно вызвать сколько угодно других функций. Функции могу даже вызывать самих себя, что именуется рекурсией.
Рекурсия бывает двух видов: прямая, когда функция вызывает сама себя, и косвенная, когда функция вызывает другую функцию, которая вызывает затем первую функцию).
Рассмотрим в качестве примера ряд Фибоначчи: 1, 1, 2, 3, 5, 8, 13, 21,34 … и т.д. Первые два числа ряда равны единице. Каждый последующий член ряда является суммой двух предыдущих. Воспользуемся рекурсией для вычисления очередного члена ряда Фибоначчи:
|
|
#include <iostream.h> // пример рекурсии
int fib(int n); // прототип функции вычисления члена ряда Фибоначчи по его номеру
void main()
{
int n, answer;
cout<< "Enter number to find: ";
cin >> n;
cout << "\n\n";
answer = fib(n);
cout<< answer<< " is the " <<n <<"-th member of Fibonacci series\n";
}
int fib(int n) // заголовок функции вычисления члена ряда Фибоначчи
{
if(n<3)
return 1; // операторы тела функции
else
return(fib(n-2) + fib(n-1));
}
В программе вводится порядковый номер ряда Фибоначчи, и программа находит его значение.
Задание на лабораторную работу: разработать программу, содержащую функцию main(), в которой объявлены переменные и производится ввод-вывод данных, а также функции для расчета величин согласно варианту задания. Эти функции необходимо вызвать из главной функции программы main(). Обмен данными между функциями осуществить через параметры и возвращаемое значение функции.
Варианты заданий
Вариант №1
Дана целочисленная квадратная матрица. Определить:
· произведение элементов в тех строках, которые содержат хотя бы один отрицательный элемент;
· максимальное значение на главной диагонали, и заменить нулями строку, в которой это значение расположено.
Каждый пункт задания оформить в виде отдельной функции.
________________________________________________________________
Вариант №2
Вычислить приближенное значение интеграла по формуле прямоугольников для заданного целого n > 39. Формула прямоугольников:
Вычисление одного слагаемого и общей суммы оформить в виде функций.
________________________________________________________________
Вариант №3
Дана целочисленная квадратная матрица. Определить:
· количество строк, среднее арифметическое элементов которых меньше заданной величины;
· сумму элементов, расположенных выше главной диагонали.
Каждый пункт задания оформить в виде отдельной функции.
________________________________________________________________
Вариант №4
Дана целочисленная квадратная матрица. Определить:
· номер первой из строк, содержащих хотя бы один положительный элемент;
· упорядочить по возрастанию столбец, сумма элементов которого минимальна.
Каждый пункт задания оформить в виде отдельной функции.
________________________________________________________________
Вариант №5
Дана целочисленная квадратная матрица. Определить:
· номер последнего из столбцов, не содержащих ни одного отрицательного элемента.
· количество отрицательных элементов в тех строках, которые не содержат нулевых элементов.
Каждый пункт задания оформить в виде отдельной функции.
________________________________________________________________
Вариант №6
Вычислить приближенное значение интеграла по формуле прямоугольников для заданного целого n > 100. Формула прямоугольников:
Вычисление одного слагаемого и общей суммы оформить в виде функций.
________________________________________________________________
Вариант №7
Дана целочисленная квадратная матрица. Определить:
· минимум среди сумм элементов диагоналей;
· номер столбца, который не содержит ни одного элемента, большего заданного числа.
Каждый пункт задания оформить в виде отдельной функции.
________________________________________________________________
Вариант №8
Дана целочисленная квадратная матрица. Определить:
· номер строки, в которой содержится более одного заданного числа;
· максимальный элемент матрицы и поменять местами строку в которой он находится, с последней строкой.
Каждый пункт задания оформить в виде отдельной функции.
________________________________________________________________
Вариант №9
Для заданного значения x > 0.5 и e =0,00001 вычислить с точностью до e сумму членов бесконечного ряда: где n=1,2,3,…. Считать, что требуемая точность достигнута, если очередное слагаемое по модулю меньше e. Напечатать полученное значение суммы и значение ln (x). Вычисление одного слагаемого и общей суммы оформить в виде функций, возведение в степень осуществлять в цикле.
|
|
________________________________________________________________
Вариант №10
В одномерном массиве, состоящем из n вещественных элементов, вычислить:
· номер максимального элемента;
· произведение элементов массива, расположенных между первым и вторым нулевыми элементами;
· преобразовать массив таким образом, чтобы в первой его половине располагались элементы, стоявшие в нечётных позициях, во второй – элементы, стоявшие в чётных позициях.
Каждый пункт задания оформить в виде отдельной функции.
________________________________________________________________
Вариант №11
В одномерном массиве, состоящем из n вещественных элементов, вычислить:
· номер минимального элемента массива;
· сумму элементов массива, расположенных между первым и вторым отрицательными элементами;
· преобразовать массив таким образом, чтобы в первой его половине располагались элементы, модуль которых не превышает 1, потом все остальные.
Каждый пункт задания оформить в виде отдельной функции.
________________________________________________________________
Вариант №12
Дана целочисленная квадратная матрица. Определить:
· произведение элементов в тех строках, которые не содержат отрицательных элементов;
· максимум среди сумм элементов диагоналей матрицы.
Каждый пункт задания оформить в виде отдельной функции.
________________________________________________________________
Вариант№13
Дана целочисленная квадратная матрица. Определить:
· сумму элементов в тех столбцах, которые не содержат отрицательных элементов;
· минимум среди сумм элементов диагоналей матрицы.
Каждый пункт задания оформить в виде отдельной функции.
________________________________________________________________
Вариант№14
Вычислить и напечатать сумму членов бесконечного ряда для заданного значения х с точностью до e =0,00001: Вычисление одного слагаемого и общей суммы оформить в виде функций.
Вариант №15
Дана целочисленная квадратная матрица. Определить:
· сумму элементов в тех столбцах, которые содержат хотя бы один отрицательный элемент;
|
|
· номера той строки, в которой сумма положительных элементов максимальна.
Каждый пункт задания оформить в виде отдельной функции.
Контрольные вопросы
1. Каков синтаксис операторов объявления и определения функции? Какой из этих параметров обязателен при работе с функциями и почему?
2. Какое количество функций может присутствовать в программе?
3. Можно ли функции, написанные для решения данной задачи, использовать при решении других задач, где их применение было бы целесообразно?
4. В чем разница между параметрами, переданными по значению и по ссылке (по адресу)?
5. Каким образом можно установить значение параметров по умолчанию?
6. Каким образом передают значения из функции в главную функцию программы main()?
7. Существуют ли функции без параметров?
8. Существуют ли ограничения на число параметров подпрограмм?
9. Какого типа может быть значение функции?
10. Где объявляются глобальные и локальные переменные?
11. Какие подпрограммы называют рекурсивными?
12. Что такое граничное условие при организации рекурсивной подпрограммы?