Переменное число аргументов

      Комментарии к записи Переменное число аргументов отключены

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

Если после последнего идентификатора в списке параметров может появиться запятая с последующим многоточием (,…), это означает, что число аргументов функции переменно. Однако предполагается, что функция, по крайней мере, имеет столько аргументов, сколько следует идентификаторов перед последней запятой.

Список параметров может состоять только из многоточия (…) и не содержать идентификаторов. Это означает, что число параметров функции переменно и может быть равным нулю.

Если функция имеет переменное число аргументов, то программист отвечает и за определение их числа и за получение их из стека внутри тела функции.

Для некоторых функций желательно, чтобы некоторые параметры оставались неизменными в процессе ее выполнения. В таком случае используется ключевое слово const. Const гарантирует, что в процессе работы переданное значение не будет изменено.

Встроенные функции (inline)

Используются, если нужно ускорить выполнение (если она маленькая). inline указывает, что при вызове функции вместо обычной реализации подставляется копия тела функции.

Примеры описания функций

Пример 4:

/* Функция poisk — предназначена для поиска максимального элемента и его номера, значение максимума возвращается в качестве результата через заголовок, а номер максимального элемента n_max возвращается через список параметров. Здесь n_max объявлен как указатель */

int poisk(int* a, int n, int* n_max)

// входной параметр a — массив объявлен как указатель

// входной параметр n — число элементов в массиве

//

{

int amax, i;

// Задание начальных значений

// внимание! *n_max — значение, взятое по адресу n_max

амах =a[0]; *n_max = 0;

for(i = 1; in; i++ ) // Выполнить цикл

if ( амах

{

амах = a[i]; // переопределить амах и номер

*n_max = i; // внимание! *n_max

}

return amax; // Возврат значения максимального элемента

}

Пример 5 :

/* Функция poisk — предназначена для поиска максимального элемента и его номера, значение максимума возвращается в качестве результата через заголовок, а номер максимального элемента n_max возвращается через список параметров. Здесь n_max объявлен как ссылка */

int poisk(int* a, int n, int n_max)

// входной параметр a — массив объявлен как указатель

// входной параметр n — число элементов в массиве

//

{

int amax, i;

// Задание начальных значений

// внимание! n_max – по ссылке

амах =a[0]; n_max = 0;

for(i = 1; in; i++ ) // Выполнить цикл

if ( амах

{

амах = a[i]; // переопределить амах и номер

n_max = i; // внимание! n_max

}

return amax; // Возврат значения максимального элемента

}

Пример 6 :

/* Функция ввода числа элементов для массива */

int GetSize()// Функция ввода

{

int n; // объявление переменной

cout

cinn; // ввод n

return n; // возврат через заголовок

}

Пример 7 :

/* Функция ввода элементов массива */

void GetArray( int* a, int n )// Функция ввода

// выходной параметр – массив a– объявлен указателем,

// входной параметрn- число элементов

{

cout

for( int i = 0; i a[i]; // ввод a

}

Пример 8 :

/* Описание вариантов функций для вывода массива */

void put_array(int a[10], int n)

{

cout

for( int i = 0; in; i++) cout

cout

}

void put_array( int a[], int n)

{

cout

for( int i = 0; in; i++) cout

cout

}

void put_array( int* a, int n)

{

cout

for( int i = 0; in; i++) cout

cout

}

Пример 9 :

/* Описание главной программы */

void main( )

{

int a[10], n, // Описание фактических переменных

number_max, maximum; // номер максимума, максимум

n = GetSize(); // ввести/запросить размер

// Вызов функции get_array для получения значений

// элементов массива а

get_array(a, n);

// Вызов функции put_array для вывода

// на экран значений элементов массива а

put_array(a, n);

// Вызов функции poisk

// для получения максимума и его номера

maximum = poisk(a, n, number_max);

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

cout

номер максимума=

}

Примеры описания функций, предназначенных для работы с двумерным массивом (матрицами)

double mySum( double fMyMatr[MaxRows][MaxCol]); double fSum; doubleFmatrix1[10][10]; . . . fSum =mySum(Fmatrix1); ФункцияmySum объявляет матрицу-параметр и определяет, что это матрицаимеет MaxRowsстрок и MaxCol столбцов.Поскольку в списке параметров функции нет параметров, которые передают числострок и число столбцов для обработки, можно предположить, что функция обрабатываетвсе элементы матрицы.
double TheirSum ( double FTheirMatr [ MaxRows2 ][MaxCol ], intnNumRows = MaxRows1, int nNumCols =MaxCols); const MaxRows1 =10; const MaxRows2 =10; const MaxCols =20; double fSum; doubleFmatrix2[10][20]; . . . fSum =TheirSum(Fmatrix2); . . . fSum =TheirSum(Fmatrix2,5,5); Функция TheirSumимеет три параметра. Первый указывает, что наша матрица имеет MaxRows строк и MaxColстолбцов. По наличию параметров nColRowsи nNumColsможно предположить, что функция может обрабатывать часть матрицы.
double yourSum( double fYourMatr[ ][MaxCol], int nColRows, int nNumCols); Функция yourSum объявляет параметр fYourMatr, который является открытой матрицей типа double сразличным числом строк. Параметры nColRows иnNumCols определяют число строк и число столбцов, соответственно.Аргумент nNumRows должен быть равным или меньше числа строк варгументе для fYourMat.

Пример 10 :

/* функция выводит на печать матрицу m заданного размера*/

void print_m34 (int m[3][4])

{

int i, j;

for (i = 0; i3; i++)//цикл по числу строк

{

for (j = 0; j4; j++)//цикл по числу столбцов

cout

cout

}

}

Здесь матрица передается как указатель, а размерности используются просто для удобства записи.

Так как в Си элементы матрицы располагаются по строкам, первая размерность не имеет отношения к задаче отыскания положения элементов. Поэтому ее можно передавать как параметр, например :

Пример 11 :

/* функция выводит на печать матрицу m из dim строчек и 4-ех столбиков */

void print_m34 (int m[][4], int dim)

{

int i, j;

for (i = 0; idim; i++)

{

for (j = 0; j4; j++)

сout

cout

}

}

Сложный случай возникает, когда требуется передавать обе размерности :

void print_m34 (int m[][], int dim1, int dim2); — запрещенная конструкция.

Правильное использование :

Пример 12 :

/* два варианта функции, предназначенной для вывода на печать матрицы m из dim1 строчек и dim2 столбиков */

void print_m34 (int **m, int dim1, int dim2)

{

int i, j;

for (i = 0; idim1; i++)//цикл по номеру строки

{

for (j = 0; jdim2; j++)// цикл по столбцу

cout

cout

}

}

void print_m34 (int **m, int dim1, int dim2)

// v – вспомогательная переменная, которая позволяет

// связать матрицу с одномерным массивом

{

int i, j, *v;

v = (int *) m;// привязать к началу матрицы элементов

for (i = 0; idim1; i++)

{

for (j = 0; jdim2; j++)

cout

cout

}

}

Контрольные вопросы

1. Какие действия следует выполнить, чтобы использовать функцию для решения задачи?

2. Как описывается функция?

3. Как объявляется функция?

4. Роль прототипа?

5. Для чего нужны формальные параметры?

6. Как вызывается функция?

7. Способы передачи параметров?

8. Приемы передачи параметров-массивов?

9. Как передать результаты вычислений из функции?

10. Как используется тип void в описании функций?

11. В каких целях можно использовать оператор return?

12. Передача значений параметров по умолчанию?

13. Что стоит за объявлением функции inline?

14. В каких случаях используется спецификатор const при передаче параметров?

15. Пояснить термин «перегружаемые подпрограммы»? Почему допускается такая возможность?

Варианты задания

ТРЕБОВАНИЕ: в главной программе должны быть только описания переменных и вызовы функций!

1. Исключить из массиваэлементы, расположенные между максимальным и минимальным.

2. Дан массив целых чисел. Исключить из него элементы, равные заданному числу.

3. Дан массив целых чисел, в котором есть одна группа из одинаковых элементов, расположенных подряд. Исключить из массива эту группу.

4. Дан массив целых чисел, элементы которого расположены по возрастанию, причём есть совпадающие. Исключить из массива одинаковые элементы.

5. Дана упорядоченная по возрастанию последовательность из целых чисел. Включить в неё заданное число так, чтобы упорядоченность не нарушилась.

6. Дан массив, в котором есть два нулевых элемента. Исключить из массива элементы, расположенные между этими нулевыми элементами.

7. Дан массив. Исключить из него два первых отрицательных элемента.

8. Дан массив. Исключить из него первый и последний отрицательные элементы.

9. Дан массив. Исключить из него третий положительный элемент, считая от последнего.

10. Дан массив. Исключить из него элемент, номер которого совпадает с числом K.

11. Дан целочисленный массив, в котором есть одна группа из пяти рядом стоящих элементов, в сумме совпадающих с числом K. Исключить эту группу.

12. Дан массив целых чисел и числа B1, B2, B3. Включить эти числа в массив, расположив их после второго нулевого элемента.

13. Дан массив целых чисел. Исключить из него те элементы, номера которых совпадают с.

14. Дан массив. Исключить из него первый и третий отрицательные элементы.

15. Дан массив. Исключить из него третий отрицательный элемент, считая от последнего.

16. Дан массив целых чисел. Исключить из него элементы, кратные заданному числу.

17. Дан массив целых чисел, в котором есть одна группа из одинаковых элементов, расположенных подряд. Оставить из этой группы только два элемента.

18. Дан массив целых чисел, элементы которого расположены по возрастанию, причём есть совпадающие. Оставить из совпадающих элементов только один.

19. Дан массив, в котором есть два нулевых элемента. Исключить из массива элементы, расположенные после второго нулевого элемента.

20. Дан массив. Исключить из него два последних отрицательных элемента.

[1] В квадратных скобках указываются необязательные параметры

Статьи к прочтению:

[C++] Переменное число параметров в функции


Похожие статьи: