Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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




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

Динамические массивы создают с использованием операции 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 = 2 k. Вычислить сумму произведений
Р = х [1] y [2 k ] + x [2] y [2 k - l] +... + x [2 k ] 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 = 2 k, у [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 = 2 k, 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 = 2 k, 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 = 2 k, у [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(2 x [ 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. Из суммы квадратов элементов массива х вычесть сумму квадратов элементов массива у.





Поделиться с друзьями:


Дата добавления: 2014-11-16; Просмотров: 917; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.072 сек.