Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа 9 - Функции.doc
Скачиваний:
8
Добавлен:
11.09.2019
Размер:
228 Кб
Скачать
☆

Int main()

{

//Заводим массив и необходимые переменные:

//Array_Size - размер массива;

//a и b - номера элементов, между которыми нужно найти сумму,

//по умолчанию 0 и 9;

//sum - искомая сумма;

//mas - массив.

const int Array_Size=10;

int a=0, b=9, sum=0;

int mas[Array_Size];

//Заполняем массив случайными числами от -10 до 10.

srand(time(NULL));

for (int i=0; i<Array_Size; i++)

{

mas[i]=rand()%20-10;

cout << mas[i] << " ";

}

cout << endl;

//Вводим номера граничных элементов суммируемого диапазона.

cin >> a >> b;

//Вызываем функцию ArraySum и результат ее работы присваиваем

//переменной sum.

sum=ArraySum(mas, a, b);

//Выводим результат.

cout << "Sum of elements between " << a << " and " << b << " is " << sum << endl;

system("pause");

}

Также рассмотрим простейший пример использования функций, получаюших двумерный массив в качестве параметра.

Пример 3. Написать программу, вычисляющую сумму двух матриц размера m x n. Программа должна вводить размеры матриц и значение их элементов с клавиатуры.

Решение.

Очевидно, можно создать три функции: функцию чтения с клавиатуры матрицы и ее размеров, функцию вычисления суммы двух матриц заданных размеров и функцию печати элементов матрицы на экран.

#include <iostream>

using namespace std;

//Задаем максимальный допустимый размер матриц

const int MAX_SIZE = 100;

//Определяем функцию чтения с клавиатуры матрицы.

//Параметры, передаваемые по ссылке:

// A - введенная матрица (двумерный массив);

// m - количество строк введенной матрицы;

// n - количество столбцов введенной матрицы.

//Данные параметры передаются по ссылке, т.к.

//мы должны получить их в точке вызова данной функции (в main-е)

void InputMatrix(double A[MAX_SIZE][MAX_SIZE], int& m, int& n)

{

cout << "Enter row count : ";

cin >> m;

cout << "Enter column count : ";

cin >> n;

cout << "Enter elements of matrix : " << endl;

for (int i = 0; i < m; i++)

for (int j = 0; j < n; j++)

cin >> A[i][j];

}

//Определяем функцию вычисления суммы матриц: C = A + B

//Параметры, передаваемые по ссылке:

// A, B - складываемые матрицы (массивы всегда передаются по ссылке);

// С - результирующая матрица - результат сложения.

//Параметры, передаваемые по значению:

// m, n - размеры складываемых матриц (соответственно количество строк

// и количество столбцов)

void MatrixSum(double A[MAX_SIZE][MAX_SIZE], double B[MAX_SIZE][MAX_SIZE],

double C[MAX_SIZE][MAX_SIZE], int m, int n)

{

for (int i = 0; i < m; i++)

for (int j = 0; j < n; j++)

C[i][j] = A[i][j] + B[i][j];

}

//Определяем функцию печати матрицы.

//Параметр, передаваемый по ссылке: выводимая матрица А (массивы всегда

// передаются по ссылке).

//Параметры, передаваемые по значению: m и m - размеры матрицы А.

void PrintMatrix(double A[MAX_SIZE][MAX_SIZE], int m, int n)

{

for (int i = 0; i < m; i++)

{

for (int j = 0; j < n; j++)

cout << A[i][j] << " ";

cout << endl;

}

}

Int main()

{

//Определяем три матрицы (двумерных массива)

//максимального размера 100х100.

//Но реально будут использоваться для хранения элементов

//только m первых строк и n первых столбцов.

double A[MAX_SIZE][MAX_SIZE];

double B[MAX_SIZE][MAX_SIZE];

double C[MAX_SIZE][MAX_SIZE];

//Определяем переменные для хранения размеров матриц

//A и B

int ma, na, mb, nb;

//Вводим матрицы A и B

InputMatrix(A, ma, na);

InputMatrix(B, mb, nb);

//Проверяем, чтобы матрицы имели одинаковое количество

//строк и столбцов

if (ma != mb || na != nb)

//если это не так, то сообщаем об ошибке

cout << "Error! Invalid sizes of matrices!" << endl;

else //иначе

{

//Вычисляем сумму C = A + B

MatrixSum(A, B, C, ma, na);

//Выводим на экран получившуюся результирующую матрицу С

cout << "Result matrix : " << endl;

PrintMatrix(C, ma, na);

}

return 0;

}

Рекурсивная функция (рекурсия) – функция, вызывающая сама себя.

Если функция вызывает себя непосредственно, то это прямая рекурсия. Если же две или более функций вызывают друг друга, то это косвенная рекурсия.

Пример 1. Для заданного натурального числа вычислить -й член рекуррентной последовательности , задаваемой с помощью следующих формул:

В этом случае рекурсивная функция будет выглядеть следующим образом:

//Рекурсивная функция вычисления n-го члена последовательности

//Фибоначчи

int fib(int n)

{

//Условие окончания рекурсии

if (n == 1 || n == 2) //Для случая F1=F2=1

return 1;

return fib(n - 1) + fib(n - 2); //Для случая n>=3, Fn=Fn-1+Fn-2

}

Вызов данной рекурсивной функции из функции main осуществляется следующим образом:

int n;

//Вводим номер члена последовательности

cout << "Enter n : ";

cin >> n;

//Вычисляем член последовательности Фибоаначчи

//путем вызова соответствующей рекурсивной функции

int res = fib(n);

//Выводим найденное значение на экран

cout << res << endl;

Задание 1 – Вычисление математических выражений

Написать программу, которая содержит две функции, осуществляющие согласно варианту вычисление значения математической функции y(n,m,a) для введенных значений n, m и a. Отличие между ними в том, что первая функция возвращает результат вычисления в качестве своего значения, а вторая функция должна возвращать результат в качестве одного из передаваемых параметров, передаваемых по ссылке. Программа должна демонстрировать работу этих функций.

Пример. Для математической функции необходимо в программе реализовать две функции f1 и f2. Функция f1 возвращает результат вычисления выражения в качестве своего значения, функция f2 возвращает результат вычисления в параметре y.

#include <iostream>

using namespace std;

//Определяем функцию f1, принимающую три параметра по значению

// n, m и а. Функция возвращает в качестве результата вычисленное

// значение согласно заданному выражению для y(n, m, a)

double f1(int n, int m, double a)

{

//Заводим локальную переменную для хранения вычисляемого результата.

//Сразу же инициализируем ее первым слагаемым выражения

double res = a;

//Заводим локальную переменную для вычисления сумм

double sum = 0.0;

//Вычисляем первую сумму с помощью цикла

for (int k = 2; k <= n; k++)

{

sum += k * k * k;

}

//Прибавляем к результату второе слагаемое

res += 2.0 * sum;

sum = 0.0;

//Вычисляем с помощью цикла вторую сумму

for (int k = 1; k <= m; k++)

{

sum += k * k + 2.0 * k;

}

//Прибавляем к результату третье слагаемое

res += m * sum;

//В качестве результата вызова функции возвращаем

//вычисленно значение выражения

return res;

}

//Определяем функцию f2, принимающую три параметра по значению

// (n, m, а) и один параметр по ссылке (y), в котором функция вернет в точку

// ее вызова вычисленное значение данного выражения.

// Сама по себе функция f2 ничего не возвращает, т.к. указан тип void

void f2(int n, int m, double a, double& y)

{

y = a;

double sum = 0.0;

for (int k = 2; k <= n; k++)

{

sum += k * k * k;

}

y += 2.0 * sum;

sum = 0.0;

for (int k = 1; k <= m; k++)

{

sum += k * k + 2.0 * k;

}

y += m * sum;

}