КАТЕГОРИИ: Архитектура-(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. Вычислить сумму произведений 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 элементов массива у сумму последних 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; Вычислить произведение всех отрицательных чисел массива у (в этой задаче массива х нет). 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])),..., Просуммировать элементы массива у, имеющие индекс, кратный 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; 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; Просмотров: 963; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |