Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Порядок выполнения лабораторной работы
1) Запустить программу Dev-C++. 2) Составить алгоритм решения задачи по работе с одномерным массивом (в соответствие с индивидуальным заданием). 3) Составить программу решения индивидуального задания по работе с одномерным массивом. 4) Выполнить пошаговую отладку программы (Debug) с использованием слежения за переменными (Add Watch). 5) Выполнить отчет по лабораторной работе, содержащий результат выполнения программы. Индивидуальные задания В одномерном целочисленном массиве вычислить (размер массива не больше 20; значения элементов массива вводить с клавиатуры): 1) Произведение элементов массива, расположенных между максимальным и минимальным элементами. 2) Сумму элементов массива, расположенных между первым и последним нулевыми элементами. 3) Сумму элементов массива, расположенных до последнего положительного элемента. 4) Сумму элементов массива, расположенных между первым и последним положительными элементами. 5) Произведение элементов массива, расположенных между первым и вторым нулевыми элементами. 6) Сумму элементов массива, расположенных между первым и вторым отрицательными элементами. 7) Сумму элементов массива, расположенных до минимального элемента. 8) Сумму целых частей элементов массива, расположенных после последнего отрицательного элемента. 9) Сумму элементов массива, расположенных после последнего элемента, равного нулю. 10) Сумму модулей элементов массива, расположенных после минимального по модулю элемента. 11) Сумму элементов массива, расположенных после минимального элемента. 12) Сумму элементов массива, расположенных после первого положительного элемента. 13) Сумму модулей элементов массива, расположенных после первого отрицательного элемента. 14) Сумму модулей элементов массива, расположенных после первого элемента, равного нулю. 15) Сумму положительных элементов массива, расположенных до максимального элемента. 16) Произведение элементов массива, расположенных между первым и последним отрицательными элементами. Контрольные вопросы 1) Что такое массив данных? 2) Приведите пример определения массива данных. 3) Приведите пример использования данных массива.
ЛАБОРАТОРНАЯ РАБОТА № 5 Тема: «Обработка двухмерных динамических массивов» Цель работы – изучить понятие «указатель», правила создания и приемы обработки динамических массивов на примере двухмерного массива. Теоретические сведения 5.1. Особенности применения указателей Обращение к объектам любого типа в языке C может проводиться по имени (прямая адресация) и по указателю (косвенная адресация). Указатель – это переменная, которая может содержать адрес некоторого объекта в памяти компьютера, например, адрес другой переменной. Через указатель, установленный на переменную, можно обращаться к участку оперативной памяти (ОП), отведенной компилятором под ее значение. Указатель объявляется следующим образом: тип * ID указателя; Перед использованием указатель должен быть инициирован либо конкретным адресом, либо значением NULL (0) – отсутствие указателя. С указателями связаны две унарные операции: & и *. Операция & означает «взять адрес», а операция разадресации * – «значение, расположенное по адресу». Пример 5.1. Объявление и использование указателей. int x, *y; //х – переменная типа int, у – указатель типа int y = &x; // y – содержит адрес переменной x *y = 1; // по адресу y записать 1, в результате x = 1 При работе с указателями можно использовать операции сложения, вычитания и сравнения, причем выполняются они в единицах того типа, на который установлен указатель. Операции сложения, вычитания и сравнения (больше/меньше) имеют смысл только для последовательно расположенных данных – массивов. Операции сравнения «==» и «!=» имеют смысл для любых указателей, т.е. если два указателя равны между собой, то они указывают на одну и ту же переменную. 5.2. Связь указателей с массивами Указатели и массивы тесно связаны между собой. Идентификатор массива является указателем на его первый элемент, т.е. для массива int a[10], выражения a и a[0] имеют одинаковые значения, т.к. адрес первого (с индексом 0) элемента массива – это адрес начала размещения его элементов в памяти. Пример 5.2. Пусть объявлены – массив из 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]; причем быстрее изменяется последний индекс, т.к. многомерные массивы размещаются в оперативной памяти в последовательности столбцов, например, массив целого типа, состоящий из двух строк и трех столбцов (с инициализацией начальных значений). Пример 5.3. Объявления многомерного массива: int a[2][3] = {{0,1,2},{3,4,5}}; такой массив в оперативной памяти будет размещен следующим образом: Если в списке инициализаторов данных не хватает, то соответствующему элементу присваивается значение 0.
5.4. Указатели на указатели Связь указателей и массивов с одним измерением справедливо и для массивов с большим числом измерений. Если рассматривать массив (int a[2][3];) как массив двух массивов размерностью по три элемента каждый, то обращение к элементу а[i][j] соответствует эквивалентное выражение *(*(а+i)+j), а объявление этого массива с использованием указателей будет иметь вид: int **а; Таким образом, имя двухмерного массива – идентификатор указателя на указатель. 5.5. Динамическое размещение данных Для создания массивов с переменной размерностью используется динамическое размещение данных, декларируемых указателями. Для работы с динамической памятью используются стандартные функции библиотеки stdlib.h: - void *malloc(size) и void *calloc(n, size) – выделяют блок памяти размером size и n х size байт соответственно; возвращают указатель на выделенную область, при ошибке – значение NULL; - void free(bf); – освобождает ранее выделенную память с адресом bf.
Пример 5.4. Динамическое размещение одномерного массива. Ввести массив действительных чисел размером n и вывести на экран. #include<stdio.h> #include<stdlib.h> #include<conio.h>
int main() { int i,n; double *a; puts(“\n Введите размер массива n:”); scanf(“%d”,&n); a=(double*)calloc(n,sizeof(double)); // Захват памяти printf(“\n Введите элементы массива a: \n”); for(i=0; i<n; i++) scanf(“%lf”,(a+i)); // scanf(“%lf”,&a[i]); printf(“\n Массив a \n”); for(i=0; i<n; i++) printf(“ %6.3lf \n“, a[i]); free(a); // Освобождение памяти getch(); } Пример 5.5. Динамическоее размещение двухмерного массива. Ввести массив действительных чисел размером n x m и вывести на экран. #include<stdio.h> #include<stdlib.h> #include<conio.h> int main(void) { int i,j,n,m; float **a; puts(“\n Введите n,m:”); scanf(“%d %d”,&n,&m); a=(float **)calloc(n,sizeof(float*)); // Захват памяти n x m for(i=0; i<n; i++) a[i]=(float *)calloc(m,sizeof(float)); for (i=0;i<n; i++) // сканирование элементов массива n x m for (j=0;j<m; j++) { scanf(" %f",&a[i][j]); printf(“ %6.3lf \n“, a[i][j]); } for(i=0; i<n; i++) free(a[i]); // Освобождение памяти free(a); getch(); } |
||
Последнее изменение этой страницы: 2018-05-10; просмотров: 176. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |