- •Введение
- •1 Требования к выполнению ргр
- •1.1 Требования к реализуемой программе
- •1.2 Требования к оформлению пояснительной записки
- •1.3 Требования к содержанию пояснительной записки
- •2 Расчетно-графическая работа №1
- •2.1 Цель работы
- •2.2 Краткие теоретические сведения
- •2.3 Варианты заданий на расчетно-графическую работу №1
- •4 Список рекомендуемой литературы
2 Расчетно-графическая работа №1
2.1 Цель работы
Продемонстрировать практические навыки проектирования и реализации алгоритмов выполнения операций над двухмерными массивами (матрицами) с использованием динамического выделения памяти, правил использования указателей для доступа к элементам массива, а также знание синтаксиса языка С/С++.
2.2 Краткие теоретические сведения
Массив – совокупность элементов одного типа. Многомерные массивы рассматриваются как одномерные, элементами которых являются также массивы. Нумерация элементов массива начинается с нуля.
Объявление массивов:
int mas[100]; // одномерный массив mas из 100 элементов
float data[10][50]; // двумерный массив data из 500 элементов
Доступ к отдельному элементу массива осуществляется указанием имени этого массива и индекса (номера) необходимого элемента, заключенного в квадратные скобки. Например:
mas[10] = 59; // десятому элементу массива mas присваивается значение 59
mas[1] = mas[0] + 1; //первый элемент массива mas на 1 больше нулевого
data[0][5] = 3.14; //пятому элементу массива data присваивается значение 3.14
Инициализация массивов возможна при их определении:
double d[] = {1, 2, 3, 4, 5};
В данном случае длина массива вычисляется компилятором по количеству значений, перечисленных в фигурных скобках.
Для организации динамических массивов в стиле С используются указатели и функции выделения памяти malloc(), calloc(), free() и др., а в стиле С++ для создания динамических переменных используют операцию new, определенную следующим образом:
указатель = new имя_типа[инициализатор];
где инициализатор – выражение в круглых скобках.
Операция new позволяет выделить и сделать доступным участок динамической памяти, который соответствует заданному типу данных. Если задан инициализатор, то в этот участок будет занесено значение, указанное в инициализаторе.
int*x=new int(5);
Для удаления динамических переменных используется операция delete, определенная в С++:
delete указатель;
где указатель содержит адрес участка памяти, ранее выделенный с помощью операции new.
delete x;.
Примеры:
1)int b=new int[100];//выделили в динамической памяти место под массив из 100 элементов.
2)int **matr=new int* [n];//объявляем массив указателей на строки
for(i=0;i<n;i++)
matr[i]=new int [m];//выделяем память под элементы матрицы
Указатель – это переменная, значением которой является адрес другой переменной. Объявляется указатель следующим образом:
тип *идентификатор;
инициализируется с помощью операции получения адреса &.
int x, *ptr = & x; //переменная ptr является указателем на целое и инициализируется адресом переменной x
Необходимо знать, что имя массива – это константа-указатель на начало массива (на нулевой элемент). Всякий раз, когда в выражении появляется идентификатор типа массива, он преобразуется в указатель на нулевой член массива. По определению операция индексирования [] интерпретируется таким образом, что E1[E2] идентично *((E1)+(E2)). В силу правил преобразования, применяемых к +, если E1 массив и E2 целое, то E1[E2] относится к E2-ому члену E1.
Это правило аналогичным образом применяется в случае многомерного массива. Если E является n-мерным массивом ранга i*j*...*k, то возникающее в выражении E преобразуется в указатель на (n-1)-мерный массив ранга j*...*k. Рассмотрим, например,
int x[3][5];
Здесь x - массив целых размером 3*5. Когда x возникает в выражении, он преобразуется в указатель на (первый из трех) массив из 5 целых чисел. В выражении x[i], которое эквивалентно *(x+1), x сначала преобразуется, как описано, в указатель, затем 1 преобразуется к типу x, что включает в себя умножение 1 на длину объекта, на который указывает указатель, а именно объект из 5 целых. Результаты складываются, и используется косвенная адресация для получения массива (из 5 целых), который в свою очередь преобразуется в указатель на первое из целых.
Определение динамического массива из 25 целых чисел:
int *p; int n=25; p=(int *)malloc(n);
Обращение к нулевому элементу массива:
* p;
Обращение к i - элементу массива:
* (p + i);
Обращение к ( i , j ) - элементу двумерного массива:
p[i][j] = = *(p[i]+j) = = *(*(p+i)+j).
Пример:
int *u=(int*)malloc(sizeof(int)); // в функцию передается количество требуемой памяти в байтах, т. к. функция malloc возвращает значение типа void*, то его необходимо преобразовать к типу указателя (int*).
free(u); //освобождение выделенной памяти.
