Задание обязательных и необязательных параметров.



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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!