Задание обязательных и необязательных параметров.
Console::WriteLine("{0} + {1} + {2} + {3} = {4}",
x, y, z, p, Sum(x, y, z, p));
Console::WriteLine("{0} + {1} + {2} = {3}",
x, y, z, Sum(x, y, z));
Console::WriteLine("{0} + {1} = {2}", x, y, Sum(x, y));
Следующий оператор вызовет ошибку компилятора.
// Console::WriteLine("{0} + {1} + {2} = {3}",
// x, y, p, Sum(x, y, , p));
Console::ReadLine();
return 0;
}
/* Вывод:
11 + 13 + 17 + 19 = 60
11 + 13 + 17 = 41
11 + 13 = 24
*/
Функции с переменным количеством параметров
Пример 6.5. Использование функции с переменным количеством параметров для вычисления суммы элементов.
#include "stdafx.h"
using namespace System;
int SumNumber(... array<int>^ args) {
int sum = 0;
For each (int el in args)
sum += el;
// или for (int i = 0; i < args.Length; i++)
// sum += args[i];
return sum;
}
int main(array<System::String^>^ args) {
Задание обязательных и необязательных параметров.
Console::WriteLine("Суммы чисел: {0} и {1}",
SumNumber(2, 4, 6, 8),
SumNumber(1, 2, 3, 4, 5, 6, 7, 8, 9));
Console::ReadLine();
return 0;
}
// Вывод: Суммы чисел: 20 и 45
Передача массивов в функцию
Передача в функцию одномерных массивов
Пример 6.6. Использование функции вычисления средней величины значений, переданных в одномерном массиве.
#include "stdafx.h"
using namespace System;
// Функция для вычисления среднего элементов массива
double average(double array[], int count) {
double sum(0.0);
for (int i = 0; i < count; i++)
sum += array[i]; // Суммирование элементов массива
Return sum/count; // Возврат среднего значения
|
|
}
int main(array<System::String^>^ args) {
double values[] = { 1.0, 2.0, 3.0, 4.0, 5.0,
6.0, 7.0, 8.0, 9.0, 10.0 };
Console::WriteLine("Среднее значение = {0}",
average(values, (sizeof values) / (sizeof values[0])));
Console::ReadLine();
return 0;
}
// Вывод: Среднее значение = 5.5
Но имя массива можно передать в функцию и в виде указателя явно. Тогда заголовок функции average() при ее определении немного изменится:
double average(double* array, int count) { ... }
Кроме того, независимо от способа передачи массива в функцию, внутри этой функции работать с массивом можно и в терминах указателя, например, суммирование элементов массива в теле цикла for:
sum += *array++; // Суммирование элементов массива
Пример 6.7. Передача массива строк в качестве аргумента в функции PrintArray и ChangeArray соответственно для отображения и изменения значений элементов этого массива.
#include "stdafx.h"
using namespace System;
void PrintArray(array<String^>^ arr) {
Вывод элементов массива
for (int i = 0; i < arr->Length; i++)
Console::Write(" {0}", arr[i]);
Console::WriteLine();
}
void ChangeArray(array<String^>^ arr) {
Изменение значений всех элементов массива
Array::Reverse(arr); // Изменение порядка следования
Элементов в массиве на обратный
}
int main(array<System::String^>^ args) {
Объявление и инициализация массива
|
|
array<String^>^ weekDays =
{ "Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Вс" };
Console::Write("Исходный массив:");
Передача массива в функцию в качестве параметра
PrintArray(weekDays); // Вывод элементов массива
Изменение значений всех элементов массива в функции
ChangeArray(weekDays);
Вывод элементов массива для проверки, был ли он изменен
Console::Write("Массив после вызова ChangeArray:");
PrintArray(weekDays); // Вывод элементов массива
Console::ReadLine();
return 0;
}
/* Вывод:
Исходный массив: Пн Вт Ср Чт Пт Сб Вс
Массив после вызова ChangeArray: Вс Сб Пт Чт Ср Вт Пн
*/
Передача в функцию многомерных массивов
Пример объявления двумерного массива, который затем будем передавать в функцию в качестве параметра.
double beans[3][4];
Тогда заголовок функции суммирования всех элементов этого массива может выглядеть так:
double Sum(double beans[3][4]) { ... }
Первое измерение многомерного массива, указанного в качестве параметра, можно и опустить. Тогда придется задать размер этого измерения во втором параметре, например:
double Sum(double beans[][4], int index) { ... }
Пример 6.8. Использование функции вычисления суммы всех элементов многомерного массива, переданного в качестве параметра.
|
|
#include "stdafx.h"
using namespace System;
// Функция для вычисления суммы всех элементов массива
double yield(double beans[][4], int count) {
double sum = 0.0;
for (int i = 0; i < count; i++) // Цикл по строкам
for (int j = 0; j < 4; j ++) // Цикл по элементам строки
sum += beans[i][j];
return sum;
}
int main(array<System::String^>^ args) {
double beans[3][4] = { { 1.0, 2.0, 3.0, 4.0 },
{ 5.0, 6.0, 7.0, 8.0 },
{ 9.0, 10.0, 11.0, 12.0 } };
Console::WriteLine("Сумма элементов = {0}",
yield(beans, sizeof beans / sizeof beans[0]));
Console::ReadLine();
return 0;
}
// Вывод: Сумма элементов = 78
Использование указателя вместо многомерного массива в качестве параметра функции в этом примере не очень подходит. В этом случае придется модифицировать оператор во вложенном цикле for следующим образом.
sum += *(*(beans + i) + j);
Рекурсия
Рекурсия – это такой способ организации вычислительного процесса, при котором функция в ходе выполнения составляющих ее операторов обращается сама к себе.
Пример 6.9. Вычисление факториала с помощью рекурсивной функции.
#include "stdafx.h"
using namespace System;
long long Fac(int n) {
if (n <= 1)
return 1;
|
|
Else
return n * Fac(n - 1);
}
int main(array<System::String^>^ args) {
Console::WriteLine("Вычисление факториала");
Console::Write("Введите целое число [0-20]: ");
String^ st = Console::ReadLine();
int n = int::Parse(st);
Console::WriteLine("{0}! = {1:d}", n, Fac(n));
Console::ReadLine();
return 0;
}
/* Вывод:
Вычисление факториала
Введите целое число [0–20]: 20
20! = 2432902008176640000
*/
Вообще говоря, любая рекурсивная задача может быть решена итеративно, то есть с использованием циклов. Например, функция вычисления факториала из предыдущего примера (6.9):
long long Fac(int n) {
long long Res = 1;
for (int i = 2; i <= n; i++)
Res *= i;
return Res;
}
Дата добавления: 2018-06-01; просмотров: 272; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!