Передача массивов в качестве параметров функции

Порядок объявления динамических массивов

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

int a=10;

int *ptr=new int [a];

В этой строке создается переменная-указатель на int, в динамической памяти отводится непрерывная область, достаточная для размещения 10 элементов целого типа, и адрес ее начала записывается в указатель ptr. Динамические массивы нельзя при создании инициализировать, и они не обнуляются.

Доступ к элементам динамического массива осуществляется точно так же, как к статическим, например, к элементу номер 5 можно обратиться как ptr[5] или *(ptr+5).

Альтернативный способ создания динамического массива – использование функции malloc библиотеки Си:

int a=10;

int *ptr=(int*)malloc(a*sizeof(int));

Операция преобразования типа, записанная перед обращением к функции malloc, требуется потому, что функция возвращает значение указателя типа void*.

Память, зарезервированная под динамический массив с помощью new[], должна освобождаться оператором delete [], а память, выделенная функцией malloc – посредством функции free, например:

delete [] ptr;

free(ptr);

Размерность массива в операции delete не указывается, но квадратные скобки обязательны.

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

#include <iostream.h>

int sum(const int* mas, const int n);

int const n=10;

int main()

{

int marks[n]= {3, 4, 5, 4, 4};

cout<<”сумма элементов массива: “<<sum(marks,n);

return 0;

}

int sum(const int* mas, const int n)

{

// варианты:int sum(int mas[],int n)

//или int sum(int mas[n],int n)

//(величина n должна быть константой)

int s =0;

for (int i=0; i<n; i++) s += mas[i];

return s;

}

При передаче многомерных массивов все размеры, если они не известны на этапе компиляции, должны передаваться в качестве параметров. Внутри функции массив интерпретируется как одномерный, а его индекс пересчитывается в программе. В приведенном ниже примере с помощью функции подсчитывается сумма элементов двух двухмерных массивов. Размерность массива b известна на этапе компиляции, под массив a память выделяется динамически.

#include <stdio.h>

#include <stdlib.h>

int sum(const int *a, const int nstr, const int nstb);

int main()

{

int b[2] [2] = {{2,2},{4,3}};

print f(сумма элементов b: %d/n”,sum(&b[0] [0],2,2));

// имя массива передавать в sum нельзя

// из-за несоответствия типов

int i,j, nstr, nstb,*a;

print f(“введите количество строк и столбцов: \n”);

scanf (“%d%d”,&nstr, &nstb);

a=(int *)malloc(nstr *nstb* sizeof(int));

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

for (j=0; j<nstb; j++) scanf(“%d”,&a[i * nstb+j]);

print(“сумма элементов a: %d\n”, sum(a,nstr,nstb));

return 0;

}

int sum(const int *a,const int nstr, const int nstb)

{

int i,j,s=0;

for (i=0; j<nstb; j++) s+=a[i * nstb + j];

return s;

}

Для того чтобы работать с двумерным массивом естественным образом, можно применить альтернативный способ выделения памяти:

#include <iostream.h>

int sum(int **a, const int nstr, const int nstb);

int main()

{

int nstr, nstb;

cin>>nstr>>nstb;

int **a, i, j;

//формирование матрицы :

a=new int [nstb];

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

for(j=0; j<nstb; j++) cin>>a[i][j];

cout<<sum(a, nstr, nstb);

return 0;

}

int sum(int **a, const int nstr, const int nstb)

{

int i, j, s=0;

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

for(j=0; j<nstb; j++) s+=a[i][j];

return s;

}

В этом случае память выделяется в два этапа: сначала под столбец указателей на строки матрицы, а затем в цикле под каждую строку. Освобождение памяти должно выполняться в обратном порядке.


Лабораторная работа №10
Применение массивов и указателей для решения прикладных задач

ЦЕЛЬ РАБОТЫ: приобретение навыков организации ввода-вывода и обработки двумерного массива.

Выполнение работы:в соответствии с вариантом составить и реализовать программу.

Задание I

Изучить порядок описания и использования указателей:

· набрать и отладить следующую программу:

int main()

{

int a=7, b=2;

int *ptr=NULL;

cout<<"\na="<<a<<", &a="<<&a;

cout<<", b="<<b<<", &b="<<&b;

ptr=&a;

cout<<"\nДействие: ptr=&a. Результат: ptr="

<<ptr<<", *ptr="<<*ptr;

ptr=&b;

cout<<"\nДействие: ptr=&b. Результат: ptr="

<<ptr<<", *ptr="<<*ptr;

*ptr=137;

cout<<"\nДействие: *ptr=137. Результат: b="<<b;

ptr++;

*ptr=-105;

cout<<"\nДействие: ptr++, *ptr=-105. Результат: ptr="

<<ptr<<", *ptr="<<*ptr<<endl;

return 0;

}

· объяснить работу программы.

Задание II

Реализовать с использованием механизма функций в соответствии с номером по журналу и номером варианта:

1. В одномерном массиве, состоящем из n вещественных элементов, вычислить:

- сумму отрицательных элементов массива;

- произведение элементов массива, расположенных между максимальным и ми­нимальным элементами.

2. В одномерном массиве, состоящем из n вещественных элементов, вычислить:

• сумму положительных элементов массива;

• произведение элементов массива, расположенных между максимальным по модулю и минимальным по модулю элементами.

3. В одномерном массиве, состоящем из n целых элементов, вычислить:

- сумму элементов массива, расположенных между первым и последним нулевыми элементами.

- Преобразовать массив таким образом, чтобы сначала располагались все положительные элементы, а потом – все отрицательные (элементы, равные 0, считать положительными).

4. В одномерном массиве, состоящем из n вещественных элементов, вычислить:

• сумму элементов массива с нечетными номерами;

• Сжать массив, удалив из него все элементы, модуль которых не превышает 1. Освободившиеся в конце массива элементы заполнить нулями.

5. В одномерном массиве, состоящем из n вещественных элементов, вычислить:

- максимальный элемент массива;

- сумму элементов массива, расположенных до последнего положительного элемента.

Вариант 6

В одномерном массиве, состоящем из n вещественных элементов, вычислить:

· минимальный элемент массива;

· сумму элементов массива, расположенных между первым и последним положительными элементами.

Вариант 7

В одномерном массиве, состоящем из n целых элементов, вычислить:

- номер максимального элемента массива;

- Преобразовать массив таким образом, чтобы в первой его половине располагались элементы, стоявшие в нечетных позициях, а во второй половине – элементы, стоявшие в четных позициях.

Вариант 8

В одномерном массиве, состоящем из n вещественных элементов, вычислить:

· сумму элементов массива, расположенных между первым и вторым отрицательными элементами.

· Преобразовать массив таким образом, чтобы сначала располагались все элементы, модуль которых не превышает 1, а потом – все остальные.

Вариант 9

В одномерном массиве, состоящем из n вещественных элементов, вычислить:

· максимальный по модулю элемент массива;

· Преобразовать массив таким образом, чтобы элементы, равные нулю, располага­лись после всех остальных.

Вариант 10

В одномерном массиве, состоящем из n целых элементов, вычислить:

· минимальный по модулю элемент массива;

· сумму модулей элементов массива, расположенных после первого элемента, рав­ного нулю.

Вариант 11

В одномерном массиве, состоящем из n вещественных элементов, вычислить:

· номер минимального по модулю элемента массива;

· сумму модулей элементов массива, расположенных после первого отрицательного элемента.

Вариант 12

В одномерном массиве, состоящем из n вещественных элементов, вычислить:

· номер максимального по модулю элемента массива;

· сумму элементов массива, расположенных после первого положительного элемента.

Вариант 13

В одномерном массиве, состоящем из n вещественных элементов, вычислить:

· количество элементов массива, лежащих в диапазоне от А до В;

· сумму элементов массива, расположенных после максимального элемента.

Вариант 14

В одномерном массиве, состоящем из n вещественных элементов, вычислить:

· количество элементов массива, равных 0;

· сумму элементов массива, расположенных после минимального элемента.

Вариант 15

В одномерном массиве, состоящем из n вещественных элементов, вычислить:

· количество элементов массива, больших С;

· Преобразовать массив таким образом, чтобы сначала располагались все отрица­тельные элементы, а потом — все положительные (элементы, равные 0, считать положительными).

Вариант 16

В одномерном массиве, состоящем из n целых элементов, вычислить:

· сумму элементов массива, расположенных между первым и последним нуле­
выми элементами.

· Преобразовать массив таким образом, чтобы сначала располагались все положи­тельные элементы, а потом – все отрицательные (элементы, равные 0, считать по­ложительными).

Вариант 17

В одномерном массиве, состоящем из n вещественных элементов, вычислить:

- сумму элементов массива с нечетными номерами;

- Сжать массив, удалив из него все элементы, модуль которых не превышает 1. Освободившиеся в конце массива элементы заполнить нулями.

Вариант 18

В одномерном массиве, состоящем из n вещественных элементов, вычислить:

· максимальный элемент массива;

· сумму элементов массива, расположенных до последнего положительного эле­мента.

Вариант 19

В одномерном массиве, состоящем из n вещественных элементов, вычислить:

· минимальный элемент массива;

· сумму элементов массива, расположенных между первым и последним положительными элементами.

Вариант 20

В одномерном массиве, состоящем из n целых элементов, вычислить:

· номер максимального элемента массива;

· Преобразовать массив таким образом, чтобы в первой его половине располагались элементы, стоявшие в нечетных позициях, а во второй половине — элементы, сто­явшие в четных позициях.

Вариант 21

В одномерном массиве, состоящем из n вещественных элементов, вычислить:

· сумму элементов массива, расположенных между первым и вторым отрицательными элементами.

· Преобразовать массив таким образом, чтобы сначала располагались все элементы, модуль которых не превышает 1, а потом — все остальные.

Вариант 22

В одномерном массиве, состоящем из n вещественных элементов, вычислить:

· максимальный по модулю элемент массива;

· Преобразовать массив таким образом, чтобы элементы, равные нулю, располага­лись после всех остальных.

Вариант 23

В одномерном массиве, состоящем из n целых элементов, вычислить:

· минимальный по модулю элемент массива;

· сумму модулей элементов массива, расположенных после первого элемента, рав­ного нулю.

Вариант 24

В одномерном массиве, состоящем из n вещественных элементов, вычислить:

· номер минимального по модулю элемента массива;

· сумму модулей элементов массива, расположенных после первого отрицательного элемента.

Вариант 25

В одномерном массиве, состоящем из n вещественных элементов, вычислить:

· номер максимального по модулю элемента массива;

· сумму элементов массива, расположенных после первого положительного элемента.

Задание III

В соответствии с вариантом, используя указатели и пользовательские функции, составить и реализовать программу:

Элементы вещественного одномерного массива х размером n > 20 сгенерированы датчиком псевдослучайных чисел в диапазоне [-10, 10]. Сформировать массив y по формуле и выполнить указанные вычисления. Формулу записать с помощью математических символов в привычном виде. Вывести на экран исходный массив и результаты решения задачи. Все числа округлять до сотых.

1. y[i] = exp(x[i] - i), i = 1, 2, ..., n, n = 2k. Вычислить сумму произведений
Р = х[1] y[2k] + x[2] y[2k - l] + ... + x[2k] y[l].

2. y[i] = x[i] / ln(abs(x[i] + 1.23)), i = l, 2, ..., n. Вычислить сумму отрицательных значений из первых 15 элементов массива у.

3. y[i] = exp(x[i]) / x[i], i = l, 2, ..., n. Вычислить сумму всех произведений соответствующих элементов массивов х и у.

4. y[i] = ln(x[i] + 10.4) / (x[i] - l), i = l, 2, ..., n. Вычислить сумму положительных значений из последних 12 элементов массива у.

5. y[i] = cos(x[i]) + sin(x[i]) + 2.6, i = l, 2, ..., n. Вычислить сумму квадратов элементов массива у, стоящих на нечетных местах.

6. n = 2k, у[1] = х[2], y[2] = x[2] x[4], y[3] = x[2] x[4] х[6], ...,
у[k] = х[2] х[4] х[6] ... х[n], у[k + 1] = х[1], у[k + 2] = х[1] х[3], у[k + 3] = х[1] х[3] х[5], ..., у[n] = х[1] x[3] ... x[n - l].

Вычесть из суммы первых k элементов массива у сумму последних k его элементов.

7. y[i] = sqrt(abs(x[i])), i = l, 2, ..., n. Вычислить количество элементов массива у, больших среднего арифметического элементов массива х.

8. у[1] = 5.2, у[2] = 4.3, у[3] = 0.09, у[4] = -0.5, у[5] = 7.15;
y[i] = cos(y[i - l] + y[i - 2] + y[i - 3]) / (y[i - 4] · y [i - 5]), i = 6, 7, ..., n.

Вычислить произведение всех отрицательных чисел массива у (в этой задаче массива х нет).

9. n = 2k, y[l] = x[l] х[2], у[2] = х[3] х[4], ..., y[k] = x[n - 1] x[n]. Вычислить сумму квадратов элементов массива у.

10. y[i] = x[i]2/3, i = l, 2, ..., n. Просуммировать элементы массива у с шагом 3, начиная с первого элемента.

11. n = 2k, y[i] = sqrt(abs(cos(x[i]) - 6.7), i = l, 2, ..., n. Вычислить сумму произведений S = x[l] y[2] + x[3] у[4] + ... + х[n - 1] у[n].

12. y[i] = i sin(x[i]), i = l, 2, ..., n. Вычислить произведение положительных значений из последних 14 элементов массива х.

13. y[i] = sin(exp(x[i])), i = l, 2, ..., n. Вычислить количество отрицательных элементов массива у с нечетными индексами.

14. y[l] = sqrt(abs(x[1] - x[2])), y[2] = sqrt(abs(x[2] - x[3])), ...,
y[n - 2] = sqrt(abs(x[n - 2] - x[n - l])), y[n - l] = sqrt(abs(x[n - l] - x[n])).

Просуммировать элементы массива у, имеющие индекс, кратный 3.

15. у[1] = х[1], у[2] = х[1] + х[2], ..., у[n] = х[1] + х[2] + ... + х[n]. Вычислить сумму кубов отрицательных элементов массива у.

16. n = 2k, у[1] = х[1] - х[n], у[2] = х[2] - х[n - 1], ..., у[k] = х[k] - х[k + 1]. Из каждого элемента массива у вычесть среднее арифметическое элементов массива х.

17. y[i] = exp(cos(x[i])), i = l, 2, ..., n. Вычислить количество элементов массива у, попадающих в интервал [0, 1].

18. y[i] = l/8tg(x[i]), i = l, 2, ..., n. Вычислить количество отрицательных элементов массива х и сумму обратных элементов массива у.

19. у[1] = х[1], y[n] = x[n], y[i] = (x[i - l] + x[i] + x[i + l]) / 3. Вычислить количество положительных элементов массива у с четными индексами и найти их сумму.

20. y[i] = exp(x[i]) sin(x[i]), i = l, 2, ..., n. Вычислить сумму элементов массива у, стоящих на четных местах.

21. y[i] = tg(2x[i]), i = l, 2, ..., n. Вычислить количество элементов массива у, меньших по своим значениям соответствующих элементов массива х.

22. y[i] = 3cos(x[i]), i = l, 2, ..., n. Вычислить количество элементов массива у, не попадающих в промежуток [0, 1].

23. у[1] = 4.5, у[2] = -3.6, у[3] = -8.2, у[4] = 6;
y[i] = ln(abs(y[i - 1])) / sin(y[i - 2] / (y[i - 4] y[i - 3])), i = 5, 6, ..., n (здесь массива х нет, а элементы массива у вычисляются с помощью рекуррентных соотношений). Вычислить сумму отрицательных элементов массива у.

24. y[i] = x[i]2 sin(l/x[i]), i = l, 2, ..., n. Вычислить сумму положительных значений из первых 14 элементов массива у.

25. y[i] = cos(x[i]) - abs(x[i]), i = l, 2, ..., n. Из суммы квадратов элементов массива х вычесть сумму квадратов элементов массива у.