Передача данных по адресу. По адресу в функцию всегда передаются массивы (рассмотрим это в следующих темах)

По адресу в функцию всегда передаются массивы (рассмотрим это в следующих темах). Для массива это вообще единственный способ передачи данных в языках С/С++. Так же по адресу можно передать те простые объекты, которые являются выходными данными (или входными и выходными одновременно).

В случае передачи данных по адресу фактический параметр может быть только переменной.

Вернёмся к предыдущему примеру. Даны два числа, хранящиеся в переменных 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. Что такое граничное условие при организации рекурсивной подпрограммы?


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: