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

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

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

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

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

Для некоторых функций желательно, чтобы некоторые параметры оставались неизменными в процессе ее выполнения. В таком случае используется ключевое слово 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; i < n; i++ ) // Выполнить цикл

if ( амах <a[i] ) // если амах меньше

{

амах = 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; i < n; i++ ) // Выполнить цикл

if ( амах <a[i] ) // если амах меньше

{

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

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

}

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

}

Пример 6 :

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

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

{

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

cout<<" Введи n \n"; // Запрос на ввод n

cin>>n; // ввод n

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

}

Пример 7 :

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

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

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

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

{

cout<<" Введи массив \n"; // Запрос на ввод массива a

for( int i = 0; i < n; i++) cin>>a[i]; // ввод a

}

Пример 8 :

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

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

{

cout<<" Задан массив \n";

for( int i = 0; i < n; i++) cout<<" "<<a[i];

cout<<"\n";

}

void put_array( int a[], int n)

{

cout<<" Задан массив \n";

for( int i = 0; i < n; i++) cout<<" "<<a[i];

cout<<"\n";

}

void put_array( int* a, int n)

{

cout<<" Задан массив \n";

for( int i = 0; i < n; i++) cout<<" "<<a[i];

cout<<"\n";

}

Пример 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<<" максимум = "<<maximum<<

" номер максимума= "<<number_max<<"\n";

}

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

double mySum( double fMyMatr[MaxRows][MaxCol]);   double fSum; double Fmatrix1[10][10]; . . . fSum = mySum(Fmatrix1); Функция mySum объявляет матрицу-параметр и определяет, что это матрица имеет MaxRows строк и MaxCol столбцов. Поскольку в списке параметров функции нет параметров, которые передают число строк и число столбцов для обработки, можно предположить, что функция обрабатывает все элементы матрицы.  
double TheirSum ( double FTheirMatr [ MaxRows2 ][MaxCol ], int nNumRows = MaxRows1, int nNumCols = MaxCols);     const MaxRows1 = 10; const MaxRows2 = 10; const MaxCols = 20;   double fSum; double Fmatrix2[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; i < 3; i++)//цикл по числу строк

{

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

cout<<” "<<m [i][j];// вывод текущего элемента

cout<<"\n";//переход на новую строчку

}

}

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

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

Пример 11 :

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

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

{

int i, j;

for (i = 0; i < dim; i++)

{

for (j = 0; j < 4; j++)

сout<<” “<< m [i][j];

cout<<"\n";

}

}

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

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; i < dim1; i++)//цикл по номеру строки

{

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

cout<<” “<< m [i][j];

cout <<"\n"; // переход к новой строке

}

}

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

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

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

{

int i, j, *v;

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

for (i = 0; i < dim1; i++)

{

for (j = 0; j < dim2; j++)

cout<<” “<< v [i * dim2 + j]);

cout <<"\n";

}

}

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

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] В квадратных скобках указываются необязательные параметры

Наши рекомендации