![](/user_photo/2706_HbeT2.jpg)
- •Оглавление
- •Занятие 6. Функции.
- •Прототип функции
- •Определение функции
- •Аргументы и параметры функции
- •Функции с переменным числом параметров
- •Рекурсивные функции
- •Математические функции
- •Передача массивов как параметров
- •Передача многомерных массивов как параметров
- •Использование указателей при работе с функциями
- •Перегрузка функций
- •Занятие 7. Коллоквиум.
- •Занятие 8. Строки Указатели и строки
- •Функции ввода, вывода строк
- •Стандартные функции обработки строк
- •Занятие 9. Директивы препроцессора.
- •Директива #include
- •Директива #define
- •Директивы условной компиляции #if, #elif, #else и #endif
- •Директива #undef
- •Макроопределения с параметрами
- •Занятие 10.
- •Занятие 11.
- •Занятие 12.
Передача массивов как параметров
При использовании массива как параметра в функцию передается не сам массив, а адрес нулевого элемента массива (указатель на массив). Поэтому при работе функции сам массив находится в вызывающей функции, и любые изменения массива в вызываемой функции осуществляются над массивом в вызывающей функции. При передаче массива в качестве параметра функции указывается тип элементов массива, имя массива и квадратные скобки или тип элементов массива и указатель на его первый элемент:
тип_элементов имя параметра-массива[]
или
тип_элементов указатель_на_первый_элемент_массива
При этом информация о количестве элементов массива теряется, поэтому необходимо передавать его размерность через отдельный параметр (в случае массива символов, то есть, строки, ее фактическую длину можно определить по положению нуль-символа).
Пример.
Ввести с клавиатуры массивы {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;
}