2K_programuvanna / Практика / 1 mod / Lab_2_func_mas
.docТЕМА : ФУНКЦИИ
Занятие 2. Передача массивов при вызове функций.
Пример Вычислить
.
Предлагается, кроме главной функции main(), использовать еще две: одну, назовем ее vvod(), для ввода значений одномерного массива, а вторую – sum() для получения суммы произведений элементов массива на синусы, найденные для значений элементов.
#include<stdio.h>
#include<math.h>
#define Nx 6
#define Ny 10
#define Nz 9
void vvod(float x[ ], int n, char q);
float sum(float x[ ], int n);
void main()
{
float x[Nx], y[Ny], z[Nz], w, znam;
vvod(x, Nx, ‘x’);
vvod(y, Ny, ‘y’);
vvod(z, Nz, ‘z’);
znam=sum(y, Ny);
if(znam)
{
w=sum(x, Nx)/znam+sum(z, Nz);
printf(“w=%f\n”,w);
}
else
puts(“Деление на 0”);
}
void vvod(float x[], int n, char q)
{
int I;
for (i=0; i<n; i++)
{
printf(“Введите %c[%i]=\n”, q, i+1);
scanf(“%f”, &x[i]);
}
return;
}
float sum(float x[ ], int n)
{
int i;
float s=0;
for(i=0; i<n; i++)
s+=x[i] * sin(x[i]);
return s;
}
В этом примере в качестве формального параметра используется одномерный массив х типа float. О том, что это массив, а не простая переменная, свидетельствуют квадратные скобки после имени. Одна пара квадратных скобок означает, что массив одномерный. Соответственно, если две пары – двумерный, три – трехмерный и т.д.
При передаче массива разрешается одну самую левую пару квадратных скобок оставлять пустой. Соответствующее количество элементов в этой паре скобок будет определяться автоматически.
В функции vvod() в массиве float х[ ] будут размещены элементы вводимого с помощью этой функции одномерного массива. Количество элементов массива будет передано формальному параметру int n. Символ char q получает фактическое имя массива для того, чтобы при вводе его элементов это имя высвечивалось на экране.
Так, например, при вызове vvod(x, Nx, ‘x’); передаются начальный адрес массива x[Nx], описанного в функции main(). Этот адрес присваивается формальному параметру float x[]. Количество элементов Nx присваивается формальному параметру int n, а символьная константа ‘x’ присваивается формальному параметру char q.
При циклическом вводе в функции vvod( ) реализуется приглашение printf(“Введите %c[%i]=\n”,q, i+1);
и непосредственно ввод
scanf (“%f”,&x[i]);
При выполнении оператора printf ( ) вместе %с будет подставлено значение q, т.е. ‘x’ (без апострофов), а вместо %с будет выведено i+1(для удобства, чтобы x[0] при печати приглашения был x[1] и т.д.).
После окончания работы цикла for в памяти, отведенной компилятором под описанный в функции main( ) массив x[Nx], располагаются введенные значения элементов этого массива.
Точно так же заносятся элементы массивов y[Ny] и z[Nz] при вызовах
vvod(y, Ny, ‘y’); и vvod(z, Nz, ‘z’). При вызове функции sum( ) передается начальный адрес массива и количество элементов. Так, при вычислении знаменателя
znam=sum(y, Ny);
формальному параметру float x[] передается начальный адрес (адрес элемента y[0]) массива float y[Ny]. Формальному параметру int n передается количество элементов.
В цикле происходит накопление суммы s+=x[i] * sin(x[i]);
После выхода из цикла с помощью return s полученный результат возвращается в вызывающую функцию. В конкретном случае он присваивается переменной znam.
Задания
1 Підрахувати кількість крапок, що знаходяться всередині кола радіусом R з центром на початку координат; координати задані масивами x(100), y(100). Відстань крапки від початку координат обчислювати у функції.
2 Обчислити суми додатних елементів масивів x(N), y(M), z(K); N< 60, M< 60, K< 70. Суми додатних елементів обчислювати за допомогою функції.
3 Обчислити середнє арифметичне додатних елементів для масивів a(N1), b(N2), c(N3) ; N1< 100, N2< 100, N3< 100. Середнє арифметичне додатних елементів обчислювати за допомогою функції.
4 Підрахувати кількість елементів матриць x(10,15), y(20,12), що задовольняють умову 0< xij< 1, 0< yij< 1. Кількість елементів, що задовольняють умову, обчислювати за допомогою функції.
5 Обчислити суми додатних елементів кожного рядка для матриць a(10,12), b(15,10). Суми додатних елементів обчислювати за допомогою функції.
6 Обчислити z=(xm1+xm2)/2, де xm1,xm2 - найменші елементи масивів x1(70), x2(80). Найменші елементи масивів обчислювати за допомогою функції.
7 Обчислити суми елементів головних діагоналей матриць a(N, N), b(М,М); М< 20, N< 30. Суми елементів головних діагоналей обчислювати за допомогою функції.
8 Обчислити z=(s1+s2)/2, де s1 - сума додатних елементів масиву x(50); s2 - сума від’ємних елементів масиву y(60). Суми обчислювати в одній функції.
9 Підрахувати кількість нульових елементів для матриць a(N, М), b(М, N); М<20, N<20. Кількість нульових елементів обчислювати за допомогою функції.
10 Обчислити суми елементів, що знаходяться нижче головної діагоналі для матриць a(15,15) і b(20,20). Суми елементів, що знаходяться нижче головної діагоналі, обчислювати за допомогою функції.
11 Визначити кількість додатних елементів до першого від’ємного елемента в масивах x(40), y(50), z(N); N <50. Кількість додатних елементів до першого від’ємного обчислювати за допомогою процедури-функції.
12 Дано вектори а(4), b(5), c(3). Обчислити довжину векторів за допомогою функції.
13 Знайти скалярний добуток тривимірних векторів ab, bc, ca. Обчислити скалярний добуток за допомогою функції.
14 Обчислити z=(xm1+xm2)/2, де xm1,xm2 - найбільші елементи масивів x1(70), x2(80). Найменші елементи масивів обчислювати за допомогою функції.
15 Обчислити суми елементів побічних діагоналей матриць a(N, N), b(М,М); М< 20, N< 30. Суми елементів головних діагоналей обчислювати за допомогою функції.
16 Підрахувати кількість ненульових елементів для матриць a(N, М), b(М, N); М<20, N<20. Кількість нульових елементів обчислювати за допомогою функції.
17 Обчислити суми елементів, що знаходяться вище головної діагоналі для матриць a(15,15) і b(20,20). Суми елементів, що знаходяться нижче головної діагоналі, обчислювати за допомогою функції.
18 Визначити кількість від’ємних елементів до першого додатного елемента в масивах x(40), y(50), z(N); N <50. Кількість від’ємних елементів до першого додатного обчислювати за допомогою функції.