Лабораторная работа №7 Массивы как параметры функций 1. Цель работы: Изучение методов передачи функции. параметров-массивов в 2. Основные сведения Стандартным способом передачи аргументов в функцию является передача по значению, т. е. создание в функции их локальных копий. При этом аргументы не могут изменяться. Массив же в С++ никогда не передается по значению, а только как указатель на его первый, точнее нулевой, элемент. Например, объявление void print( int[ 10 ] ); рассматривается компилятором так, как будто оно имеет вид void print( int * ); Размер массива неважен при объявлении этого параметра. Все три приведенные записи эквивалентны: void print( int* ); void print( int[] ); void print( int[ 10 ] ); Передача массивов как указателей имеет следующие особенности: изменение значения аргумента внутри функции затрагивает сам переданный объект, а не его локальную копию. Если такое поведение нежелательно, программист должен позаботиться о сохранении исходного значения. Можно также при объявлении функции указать, что она не должна изменять значение параметра, объявив этот параметр константой: void print( const int[ ] ); Cи-строка является массивом символов, последний элемент которого равен нулю. Во всех остальных случаях при передаче массива в качестве параметра необходимо указывать его размер. Обычно для такого указания используют дополнительный параметр функции. Например: void print( int *, int size ); Параметр может быть многомерным массивом. Для такого параметра должны быть заданы правые границы всех измерений, кроме первого. Например: void print( int matrix[][10], int rowSize ); Здесь matrix объявляется как двумерный массив, который содержит десять столбцов и число строк, передаваемое отдельным параметром. Эквивалентным объявлением для matrix будет: int (*matrix)[10]; Многомерный массив передается как указатель на его нулевой элемент. В нашем случае тип matrix – указатель на массив из десяти элементов типа int. Как и для одномерного массива, граница первого измерения не учитывается при проверке типов. Если параметры являются многомерными массивами, то контролируются все измерения, кроме первого. Заметим, что скобки вокруг *matrix необходимы из-за более высокого приоритета операции взятия индекса. Инструкция int *matrix[10]; объявляет matrix как массив из десяти указателей на int. Если массив описан как **m или *m[N] при передаче его в качестве параметра используется описание вида **a или *a[] void f(int **a, int n, int m) { for(int i=0;i<n; i++) { for(int j=0;j<m; j++) printf("%5d",a[i][j]); printf("\n"); } } f(a,5,4) – вызов 3. Примеры передачи массива в функцию Пример 1. Рассмотрим функцию, вычисляющую сумму элементов массива. #include <stdio.h> #include <conio.h> #include <stdlib.h> int Sum ( int A[], int N ) { int i, sum; sum = 0; for ( i = 0; i < N; i ++ ) sum += A[i]; return sum; } main() { const int n=20,m=30; int i, s, A[n], B[m]; printf(" Массив A \n"); for (i=0; i<n; i++) { A[i]=rand()%10; printf("%5d",A[i]); } printf("\n\n Массив B \n"); for (i=0; i<m; i++) { B[i]=rand()%20; printf("%5d",B[i]); } s = Sum(A,n); printf("\n\nСумма массива A %d, массива B %d", s, Sum(B,m) ); getch(); return 0; } Пример 2 : Передача в функцию массива c использованием указателя. Результат – элементы исходного массива возводятся в квадрат. #include <stdio.h> #include <conio.h> void quart(int n, float * x) { int i; for (i=0;i<n;i++) x[i]=x[i]*x[i]; } main() { float z[]={1,2,3,4,5}; int j; int n=sizeof(z)/sizeof(z[0]); for (j=0; j<n; j++) printf(" %6.2f",z[j]); quart(n,z); putchar(‘\n’); for (j=0; j<n; j++) printf("\n %6.2f",z[j]); getch(); } Пример 3. Написать функцию обработки матриц A и B одинакового размера m x n. Получить матрицу C =max(A(i,j),B(i,j)), и матрицу D=min(A(i,j),B(i,j)). Матрицы C и D вывести в главной программе. #include <stdio.h> #include <conio.h> #include <stdlib.h> const int n=4,m=4; void MaxMin(int A[][n],int B[][n],int (*C)[n], int (*D)[n],int m) { int i,j; for (i=0;i<m;i++) for (j=0;j<n;j++) if (A[i][j]>B[i][j]) { C[i][j]=A[i][j]; D[i][j]=B[i][j]; } else { C[i][j]=B[i][j]; D[i][j]=A[i][j]; } return; } main () { int A[m][n],B[m][n],C[m][n],D[m][n],i,j; for (i=0;i<m;i++) { for (j=0;j<n;j++) { A[i][j]=rand()%20; printf("%5d",A[i][j]); } puts("\n"); } puts("\n\n"); for (i=0;i<m;i++) { for (j=0;j<n;j++) { B[i][j]=rand()%20; printf("%5d",B[i][j]); } puts("\n"); } MaxMin(A,B,C,D,m); puts("\n\n"); for (i=0;i<m;i++) { for (j=0;j<n;j++) { printf("%5d",C[i][j]); } puts("\n"); } puts("\n\n"); for (i=0;i<m;i++) { for (j=0;j<n;j++) { printf("%5d",D[i][j]); } puts("\n"); } getch(); return 0; } 3. ВЫПОЛНЕНИЕ РАБОТЫ 1. Написать функцию, сортирующую в порядке убывания элементы одномерного массива. В главной программе вызвать функцию для двух разных по количеству элементов массивов. 2. Написать функцию, которая вычисляет для двумерного массива с переменной длинной строк сумму элементов каждой строки. Длинна каждой строки хранится в 0 элементе соответствующей строки. Массив сформировать с помощью случайных чисел, и вывести на экран в главной программе. 4. КОНТРОЛЬНЫЕ ВОПРОСЫ 4.1. Как в С++ передаётся в функцию массив? 4.2. Требуется ли в параметре функции указывать размер одномерного массива? 4.3. Как можно передавать матрицу в функцию? 4.4. Какие границы измерений задаются в параметре функции при передаче многомерного массива?