Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
С_глава2.doc
Скачиваний:
1
Добавлен:
16.12.2018
Размер:
167.94 Кб
Скачать

Передача массивов как параметров

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

тип_элементов имя параметра-массива[]

или

тип_элементов указатель_на_первый_элемент_массива

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

Пример.

Ввести с клавиатуры массивы {ai} i=1,2,3, {bj} j=1,2,…,5, {ck} k=1,2,…,8. Найти sa - сумму всех элементов массива a, sb – сумму всех элементов массива b, sc – сумму всех элементов массива с. Вывести массивы и суммы их элементов.

#include <stdio.h>

#define Na 3

#define Nb 5

#define Nc 8

void read_massiv(float x[], int n) // Варианты : void read_massiv(float x[n], int n)

// Или void read_massiv(float x[n], int n), но n - константа

// Или void read_massiv(float x[n]), но n - константа

// Или void read_massiv(float *x, int n)

{ int i;

for (i=0; i<n; i++) scanf(“%f”,&x[i]);

}

void print_massiv(float x[40], int n)

// Размерность массива(40) – константа, максимально

// возможная по смыслу задачи: n<40

{int i;

for (i=0; i<n; i++) printf(“%f “,x[i]);

printf(“\n”);

}

float sum(float *x, int n) // Передается указатель на первый элемент массива

{ float s=0;

int i;

for (i=0; i<n; i++) s+=*(x+i);

return s;

}

int main()

{ float a[Na], b[Nb], c[Nc], sa, sb, sc;

void read_massiv(float [], int ); // Прототипы функций необходимы для контроля

void print_massiv(float [], int); // за типами параметров

float sum(float *, int );

printf(“введите массив a из %d элементов\n”, Na);

read_massiv(a,Na);

printf(“введите массив b из %d элементов\n”,Nb);

read_massiv(b,Nb);

printf(“введите массив c из %d элементов\n”,Nc);

read_massiv(c,Nc);

sa=sum(a,Na); sb=sum(b,Nb); sc=sum(c,Nc);

printf(“массив a\n”); print_massiv(a,Na); printf(“sa=%f\n”,sa);

printf(“массив b\n”); print_massiv(b,Nb); printf(“sb=%f\n”,sb);

printf(“массив c\n”); print_massiv(c,Nc); printf(“sc=%f\n”,sc);

return 0;

}

Передача многомерных массивов как параметров

При передаче многомерных массивов как параметров все размерности, если они не известны на этапе компиляции, должны передаваться в качестве параметров. Внутри функции массив интерпретируется как одномерный. Поэтому при передаче двумерных массивов обязательно нужно указывать количество столбцов в массиве (то есть размер строки), так как в С++ массивы хранятся по строкам. Чтобы можно было правильно определить адреса элементов матрицы по их координатам, используя адрес первого элемента с координатами [0][0], нужно знать количество элементов в строке - т.е. количество столбцов. Число строк указывать необязательно.

В списке формальных параметров для двумерных массивов указывается тип элементов массива, имя массива, квадратные скобки для строк и квадратные скобки с количеством столбцов:

тип_элементов имя_параметра-матрицы[][количество_столбцов];

Пример 1.

С помощью датчика случайных чисел сформировать целочисленные матрицы A[5][8], B[6][9]. Найти минимальные элементы каждой матрицы. Вывести на экран матрицы и минимальные элементы матриц.

#include <stdio.h>

#include <stdlib.h> // Необходимо подключение этой библиотеки для использования

// датчика случайных чисел

void create_matric(int x[][9], int n, int m) // Указываем максимально возможное

// количество столбцов - 9

{ int i,j;

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

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

x[i][j]=random(10)-5;

}

void print_matric(int x[][9], int n, int m)

{ int i,j;

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

{ for (j=0;j<m;j++) printf(“%6d “,x[i][j]); printf(“\n”); }

}

int min(int x[][9], int n, int m)

{ int i,j, min;

min=x[0][0];

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

for (j=0;j<m;j++) if (x[i][j]<min) min=x[i][j];

return min;

}

int main()

{ int A[5][9], B[6][9], minA,minB;

void create_matric(int [][9], int, int);

void print_matric(int [][9], int, int);

int min(int [][9], int, int);

randomize();

create_matric(A,5,8); printf(“Матрица A\n”); print_matric(A,5,8);

minA=min(A,5,8); printf(“minA=%d\n”,minA);

create_matric(B,6,9); printf(“Матрица B\n”); print_matric(B,6,9);

minB=min(B,6,9); printf(“minB=%d\n”,minB);

return 0;

}