методичка. метода по ООП для практики. Лабораторная работа 1. Линейный вычислительный процесс 2 Общие теоретические сведения 2 Создание оконного приложения 6
Скачать 1.1 Mb.
|
5.4. Индивидуальные заданияНаписать программу по обработке одномерных массивов. Размеры массивов вводить с клавиатуры. В консольном приложении предусмотреть возможность ввода данных как с клавиатуры, так и с использованием функции random(). При создании оконного приложения скалярный (простой) результат выводить в виде компоненты Label, а массивы вводить и выводить с помощью компонент StringGrid. В одномерном массиве, состоящем из n вводимых с клавиатуры целых элементов, вычислить: Произведение элементов массива, расположенных между максимальным и минимальным элементами. Сумму элементов массива, расположенных между первым и последним нулевыми элементами. Сумму элементов массива, расположенных до последнего положительного элемента. Сумму элементов массива, расположенных между первым и последним положительными элементами. Произведение элементов массива, расположенных между первым и вторым нулевыми элементами. Сумму элементов массива, расположенных между первым и вторым отрицательными элементами. Сумму элементов массива, расположенных до минимального элемента. Сумму модулей элементов массива, расположенных после последнего отрицательного элемента. Сумму элементов массива, расположенных после последнего элемента, равного нулю. Сумму модулей элементов массива, расположенных после минимального по модулю элемента. Сумму элементов массива, расположенных после минимального элемента. Сумму элементов массива, расположенных после первого положительного элемента. Сумму модулей элементов массива, расположенных после первого отрицательного элемента. Сумму модулей элементов массива, расположенных после первого элемента, равного нулю. Сумму положительных элементов массива, расположенных до максимального элемента. Произведение элементов массива, расположенных между первым и последним отрицательными элементами. Лабораторная работа №6. Обработка двухмерных динамических массивовЦель работы: изучить понятие «указатель», правила создания и приемы обработки динамических массивов на примере двухмерного массива. 6.1. Краткие теоретические сведенияОсобенности применения указателейОбращение к объектам любого типа в языке C может проводиться по имени, как мы до сих пор делали, и по указателю (косвенная адресация). Указатель – это переменная, которая может содержать адрес некоторого объекта в памяти компьютера, например, адрес другой переменной. Через указатель, установленный на переменную, можно обращаться к участку оперативной памяти (ОП), отведенной компилятором под ее значение. Указатель объявляется следующим образом: тип * ID указателя; Перед использованием указатель должен быть инициирован либо конкретным адресом, либо значением NULL (0) – отсутствие указателя. С указателями связаны две унарные операции: & и *. Операция & означает «взять адрес», а операция разадресации * – «значение, расположенное по адресу», например: int x, *y; // х – переменная типа int , у – указатель типа int y = &x; // y – адрес переменной x *y = 1; // по адресу y записать 1, в результате x = 1 При работе с указателями можно использовать операции сложения, вычитания и сравнения, причем выполняются они в единицах того типа, на который установлен указатель. Операции сложения, вычитания и сравнения (больше/меньше) имеют смысл только для последовательно расположенных данных – массивов. Операции сравнения «==» и «!=» имеют смысл для любых указателей, т.е. если два указателя равны между собой, то они указывают на одну и ту же переменную. Связь указателей с массивамиУказатели и массивы тесно связаны между собой. Идентификатор массива является указателем на его первый элемент, т.е. для массива int a[10], выражения a и a[0] имеют одинаковые значения, т.к. адрес первого (с индексом 0) элемента массива – это адрес начала размещения его элементов в ОП. Пусть объявлены – массив из 10 элементов и указатель типа double: double a[10], *p; если p = a; (установить указатель p на начало массива a), то следующие обращения: a[i] , *(a+i) и *(p+i) эквивалентны, т.е. для любых указателей можно использовать две эквивалентные формы доступа к элементам массива: a[i] и *(a+i). Очевидна эквивалентность следующих выражений: &a[0] &(*p) p Декларация многомерного массива:тип ID[размер 1][размер 2]…[размер N]; причем быстрее изменяется последний индекс, т.к. многомерные массивы размещаются в ОП в последовательности столбцов, например, массив целого типа, состоящий из двух строк и трех столбцов (с инициализацией начальных значений) int a[2][3] = {{0,1,2},{3,4,5}}; в ОП будет размещен следующим образом: a[0][0]=0, a[0][1]=1, a[0][2]=2,a[1][0]=3, a[1][1]=4, a[1][2]=5. Если в списке инициализаторов данных не хватает, то соответствующему элементу присваивается значение 0. Указатели на указателиСвязь указателей и массивов с одним измерением справедливо и для массивов с бóльшим числом измерений. Если рассматривать предыдущий массив (int a[2][3];) как массив двух массивов размерностью по три элемента каждый, то обращение к элементу а[i][j] соответствует эквивалентное выражение *(*(а+i)+j), а объявление этого массива с использованием указателей будет иметь вид int **а; Таким образом, имя двухмерного массива – ID указателя на указатель. Динамическое размещение данныхДля создания массивов с переменной размерностью используется динамическое размещение данных, декларируемых указателями. Для работы с динамической памятью используются стандартные функции библиотеки alloc.h: void*malloc(size) и void *calloc(n, size) – выделяют блок памяти размером size и nsize байт соответственно; возвращают указатель на выделенную область, при ошибке – значение NULL; void free(bf); – освобождает ранее выделенную память с адресом bf. Другим, более предпочтительным подходом к динамическому распределению памяти является использование операций языка С++ new и delete. Операция new возвращает адрес ОП, отведенной под динамически размещенный объект, при ошибке – NULL, а операция deleteосвобождает память. Минимальный набор действий, необходимых для динамического размещения одномерного массива действительных чисел размером n:double *а; . . . а = new double[n]; // Захват памяти для n элементов . . . delete []а; // Освобождение памяти Минимальный набор действий, необходимых для динамического размещения двухмерного массива действительных чисел размером nm:int i, n, m; // n, m – размеры массива double **a; a = new double *[n]; // Захват памяти под указатели for(i=0; i . . . for(i=0; i delete []a; Для современных компиляторов (версий старше «6») для освобождения памяти достаточно записать только delete []a; |