Передача массивов в качестве параметров функции
Порядок объявления динамических массивов
Динамические массивы создают с использованием операции 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. Из суммы квадратов элементов массива х вычесть сумму квадратов элементов массива у.