Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LektsiiS.doc
Скачиваний:
69
Добавлен:
13.04.2015
Размер:
815.1 Кб
Скачать

9.4 Ссылка — возвращаемое значение

Функция может не только принимать параметры-ссылки, но и возвращать ссылку в программу.

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

Р е ш е н и е.

int& refmax(int &a, int &b)

{

if (a>=b)

return a;

else

return b;

}

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

int x = 5, y = 8;

refmax (x,y) = 10;

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

З а д а ч а. Определить функцию, которая возвращает ссылку на последний символ строки.

Р е ш е н и е.

#include <iostream.h>

char& last (char *s)

{

while (*++s);

return *(--s);

}

void main(){

char s[] = “12345”;

last(s) = '9';

cout<<s<<'\n';

}

9.5 Одномерные массивы как параметры

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

Р е ш е н и е.

float sum (float a[], int N)

{

float s = 0;

for (int i = 0; i < N; s += a[i++]);

return s;

}

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

float sum(float a[10], int limit);

float sum(float a[], int limit);

float sum(float *a, int limit);

З а д а ч а. Определить функцию нахождения минимального числа в массиве.

9.6 Двумерные массивы как параметры

З а д а ч а. Определить функцию, которая распечатывает двумерный массив в виде матрицы.

Р е ш е н и е 1.

#include <iostream.h>

void print (float a[ ] [5], int lim1)

{

for (int i = 0; i < lim1; i++) {

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

cout << a [ i ] [ j ] << ' ';

cout << '\n';

}

}

Когда параметром является двумерный массив, его вторая размерность обязательно указывается в заголовке функции. Объявление параметра

float a[][]

недопустимо !

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

Р е ш е н и е 2.

#include <iostream.h>

void print (float a[ ], int lim1, int lim2)

{

for (int i = 0; i<lim1; i++) {

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

cout<< a [i*lim2+j]<<' ';

cout<< '\n';

}

}

void main (){

float arr [3] [5] ={{11,12,13,14,15},

{21, 22, 23, 24, 25},

{31, 32, 33, 34, 35}};

print ((float*) arr, 3, 5);

}

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

Р е ш е н и е.

void Add (int*A, int *B, int *C, int M, int N)

{

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

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

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

}

void main(){

int X[2][3] = {{1,1,1},{1,1,1}},

Y[2][3] = {{2,2,2},{2,2,2}},

Z[2][3];

Add((int*)X, (int*)Y, (int*)Z, 2, 3);

}

Вопросы

1. Каким образом функция получает значение параметров?

2. Сколько операторов return может находиться в функции?

3. Когда оператор return не имеет операнда?

4. Что такое ссылка?

5. При каком условии ссылка является синонимом инициализирующего ее выражения?

6. Почему компилятор предупреждает о создании ссылки на временный объект?

7. Как передать параметры функции “по имени”?

8. Почему недопустим такой заголовок функции refmax из раздела 4.4 int& refmax (int a, int b)?

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

10. Почему при передаче функции массива его размер передается отдельно?

11. Какую размерность обязательно указывать при передаче функции двумерного массива в виде параметра — первую или вторую?

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]