Скачиваний:
288
Добавлен:
26.03.2015
Размер:
1.3 Mб
Скачать

74

}

cout<<"\n\n";

}

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

{

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

{

if(b[i][j] > 0) p += 1; if(b[i][j] < 0) n += 1; if(b[i][j] == 0) zero += 1;

}

}

cout<<"\nЧисло положительных элементов = "<<p; cout<<"\nЧисло отрицательных элементов = "<<n; cout<<"\nЧисло нулевых элементов = "<<zero; cout<<"\nНажмите любую клавишу ...";

getch(); return 0;

}

Рис. 11.6. Окончание

11.4. Массивы и функции

При передаче массива в функцию в качестве параметра в заголовке функции необходимо указывать тип и имя массива с последующими пустыми квадратными скобками, а также тип и имя переменной, определяющей размерность массива. В прототипе функции имена массива и переменной могут быть опущены. На рис. 11.7 приведена программа вычисления минимальной компоненты вектора с использованием функции vec( ), в которой заголовок функции имеет вид vec(int x[ ], int k), а аргументы int x[ ] и int k соответствуют имени массива и его размерности. В прототипе функции vec(int, int) эти имена опущены.

#include<iostream.h> #include <conio.h> #include <stdlib.h> #include <math.h> #define n 5

vec(int [ ], int); // прототип функции вычисления min компоненты вектора main()

{

int y[n], i, min; clrscr(); for(i=0;i<n;i++)

{

Рис. 11.7

75

cout<<"\nВведите y["<<i<<"]="; cin>>y[i]; // ввод элементов вектора

}

min=vec(y, n); // вызывающая функция cout<<"\n\nМинимальная компонента = "<<min; cout<<"\nНажмите любую клавишу ..."; getch();

return 0;

}

vec(int x[ ], int k) // заголовок функции

{

int min1=x[0]; int i; for(i=1; i < k; i++)

{

if(x[i]<min1) min1=x[i];

}

return min1;

}

Рис. 11.7. Окончание

Для передачи многомерных массивов в функцию необходимо учитывать ряд особенностей, которые связаны с тем, что при описании функции необходимо указывать размерность второго индекса и всех последующих индексов массива. Размерность первого индекса многомерного массива также не указывается, но значения размерностей всех последующих индексов необходимы. Это обусловлено тем, что в памяти компьютера элементы массивов хранятся последовательно, независимо от количества индексов (размерности массива), а знание величин индексов дает возможность компилятору сообщить функции о том, как расположены элементы в массиве. Пример программы, в которой функция mas принимает двумерный массив как параметр, приведен на рис. 11.8.

//Вычисление минимальной компоненты двумерного массива

#include<iostream.h> #include <conio.h> #include <stdlib.h> #include <math.h> #define n 2 // число строк

#define m 3 // число столбцов

mas(int [ ][m], int, int); // прототип функции main( )

{

int y[n][m], i, j, min ; clrscr(); // очистка экрана for(i=0;i<n;i++)

Рис. 11.8

76

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

{

cout<<"\nВведите y["<<i<<"]["<<j<<"]="; cin>>y[i][j]; // ввод массива

}

min=mas(y, n, m); // обращение к функции и получение результата cout<<"\n\nМинимальная компонента = "<<min; cout<<"\nНажмите любую клавишу ...";

getch( ); return 0;

}

mas(int x[ ][m], int k, int d) //заголовок функции

{

int min1=x[0][0]; int i, j; for( i=0; i < k; i++) for(j=0;j<d;j++)

{

if( x[i][j]<min1) min1=x[i][j];

}

return min1;

}

Рис. 11.8. Окончание

В этой программе значения индексов массива задаются с помощью констант n и m, а в заголовке функция описывается следующим образом:

mas(int x[][m], int k, int d),

где m – значение второго индекса массива, а k и d – фиктивные параметры, численные значения которым присваиваются после вызова функции с помощью оператора вида mas(y, n, m);.

В прототипе функции также необходимо указывать размерность второго индекса, в соответствии с выражением mas(int [][m], int, int).

11.5. Массивы и указатели

Массивы и указатели в языке С++ тесно связаны и могут использоваться почти эквивалентно. Так, имя массива является константным указателем на первый элемент массива, а указатели можно использовать для выполнения любой операции, включая индексирование массива. Пусть сделано следующее объявление: int b[5] = {1,2,3,4,5}, *p;, которое означает, что объявлены массив целых чисел b[5] и указатель на целое р. Поскольку имя массива является указателем на первый элемент массива, можно задать указателю р адрес первого элемента массива с помощью оператора p = b;. Это эквивалентно присвоению адреса первого элемента массива другим способом: р = &b[0];. Теперь можно сослаться на элемент массива b[3] с помощью выражения *(р+3). В этой запи-

77

си скобки необходимы, потому что приоритет * выше, чем +. На рис. 11.9 показан пример программы, которая с помощью указателей заносит данные в одномерный массив а[5]. Определяет сумму и количество положительных элементов. Выводит на экран полученный массив и адреса его элементов, а также результаты расчетов.

#include <iostream.h> #include <conio.h> void main()

{ clrscr();

int a[5], sum = 0, *p; int kol = 0, i;

p = &a[0]; // инициализация указателя адресом первого элемента cout << " Ввод данных в массив a[ ]\n";

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

{

cout << " a [ " << i << " ] = ";

cin >> *(p+i); // разыменовывание смещенного указателя

}

// расчет суммы и количества положительных элементов for ( i = 0; i < 5; i ++)

if ( *(p+ i) > 0 )

{

sum += *( p+i ); kol ++;

}

// вывод исходных данных и результатов

cout << "\n\n\n Элемент массива Адрес элемента массива \n"; for ( i = 0; i < 5; i++ )

{

cout << *( p+ i) << "\t\t " << (p+i) << "\n"; // вывод результатов

}

cout << "\nсумма = " << sum << "\nколичество = " << kol; cout<<"\n\n";

cout<<"\nНажмите любую клавишу ..."; getch();

}____________________________________________________________________

Результаты работы программы:

Ввод данных в массив a[ ] : a[0]=1

a[1]=2

a[2]=5

a[3]=5

a[4]=4

Рис. 11.9

 

78

Элемент массива

Адрес элемента массива

1

Oxffec

2

Oxffee

3

Oxfff0

4

Oxfff2

5

Oxfff4

сумма = 17 количество = 5

Рис. 11.9. Окончание

На рис.11.10 приведен пример программы, в которой с помощью указателей формируется двумерный массив а[2][2], а из минимальных элементов его столбцов формируется массив b[2]. Значения полученных массивов выводятся на дисплей.

#include <iostream.h> #define I 2

#define J 2 #include <conio.h> void main()

{

clrscr();

int a[I][J], b[J], min, *p ; int i,j;

p = &a[0][0]; // инициализация указателя адресом первой ячейки cout << "Введите данные в массив a[“<< I <<”][“<<J<<”]:\n"; for ( i = 0; i < I; i++ )

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

{

cout << "a[" << i << "][" << j << "]="; cin >> *(p + i*I + j); // ввод массива

}

// расчет массива b[2]

for ( j = 0; j < J; j++ ) // цикл по столбцам

{

min = *(p + j); // присваивание min значения первого элемента столбца for (i = 1; i < I; i++) // цикл по строкам, начиная со второго элемента

if ( ( *(p + i*I + j)) < min) min = *(p + i*I + j); *(b + j) = min;

}

Рис. 11.10

Соседние файлы в папке Книги