Краткие теоретические сведения
Массив – совокупность элементов одного типа. Многомерные массивы рассматриваются как одномерные, элементами которых являются также массивы. Нумерация элементов массива начинается с нуля.
Объявление массивов:
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); //освобождение выделенной памяти.
Варианты заданий на расчетно-графическую работу №1
Варианты заданий на расчетно-графическую работу №1 представлены в таблице 1.
Cформировать динамический массив, определить значения его элементов, и выполнить задачу, используя обработку массива с применением указателей. Студент должен выполнить работу по варианту, номер которого соответствует порядковому номеру в журнале.
Таблица 1 – Варианты заданий для РГР №1
№ п.п. | Задание |
1. | Дана целочисленная прямоугольная матрица размерности n на m. Определить количество строк, не содержащих ни одного нулевого элемента и минимальное из чисел, встречающихся в заданной матрице более одного раза. |
2. | Дана целочисленная прямоугольная матрица размерности n на m. Определить количество столбцов, содержащих хотя бы один нулевой элемент, и номер строки, в которой находится самое большое количество одинаковых элементов. |
3. | Дана целочисленная квадратная матрица. Определить произведение элементов в тех строках, которые не содержат отрицательных элементов и сумму всех диагоналей. |
4. | Уплотнить заданную матрицу, удалив из неё строки и столбцы, заполненные нулями. Найти строки, содержащие хотя бы один отрицательный элемент. |
5. | Осуществить циклический сдвиг элементов квадратной матрицы размерности mxm на k элементов вниз. k может быть больше m. |
6. | Дана целочисленная прямоугольная матрица размерности n на m. Упорядочить её строки по возрастанию количества одинаковых элементов в каждой строке, а также найти номер первого из столбцов, не содержащих ни одного отрицательного элемента. |
Продолжение табл. 1
7. | Для заданной матрицы mхm найти такие k, что k-я строка поэлементно совпадает с k-м столбцом. Найти сумму элементов главной и побочной диагоналей, если среди их элементов встречается хотя бы один отрицательный элемент. |
8. | Осуществить циклический сдвиг элементов квадратной матрицы размерности mxm на k элементов вправо. k может быть больше m. |
9. | Дана целочисленная квадратная матрица размерности nxn. Найти максимум среди сумм элементов диагоналей, параллельных главной диагонали матрицы и последний отрицательный элемент матрицы. |
10. | Дана целочисленная прямоугольная матрица размерности n на m. Определить количество отрицательных элементов только в тех строках, которые содержат хотя бы один нулевой элемент. |
11. | Дана целочисленная прямоугольная матрица размерности n на m. Определить количество столбцов, содержащих нулевые элементы и максимальное из чисел, встречающихся в заданной матрице более одного раза. |
12. | Дана целочисленная прямоугольная матрица размерности n на m. Определить количество столбцов, содержащих хотя бы один нулевой элемент, и номер столбца, в котором находится самое большое количество положительных элементов. |
13. | Дана целочисленная квадратная матрица. Определить суммы всех диагоналей и количество элементов, значения которых находятся в диапазоне от трех до семи. |
14. | Уплотнить заданную матрицу, удалив из неё строки с отрицательными элементами. Найти столбцы, содержащие хотя бы один нулевой элемент. |
15. | Дана целочисленная прямоугольная матрица размерности n на m. Упорядочить её столбцы по убыванию количества одинаковых элементов в каждом столбце, а также найти номер первого из столбцов, не содержащих ни одного отрицательного элемента. |
16. | Дана целочисленная прямоугольная матрица размерности n на m. Найти номер первого из столбцов, содержащих отрицательные элементы, а также упорядочить столбцы по убыванию количества одинаковых элементов в каждом столбце. |
17. | Для заданной матрицы mхm найти такие k, что k-я строка поэлементно совпадает с k-м столбцом. Найти сумму элементов главной диагонали, если среди ее элементов встречается хотя бы один нулевой элемент. |
18. | Осуществить циклический сдвиг элементов квадратной матрицы размерности mxn на k элементов влево. k может быть больше m. |
19. | Дана целочисленная квадратная матрица размерности nxn. Найти минимум среди сумм элементов диагоналей, параллельных главной диагонали матрицы и последний нулевой элемент матрицы. |
20. | Дана целочисленная прямоугольная матрица размерности n на m. Определить количество ненулевых элементов только в тех столбцах, которые содержат хотя бы один отрицательный элемент. |
Список рекомендуемой литературы
1. Подбельский, В.В. Язык Си ++: Учеб. пособие. – 5-е изд. – М.: Финансы и статистика, 2000.- 560 с.: ил.
2. Павловская, Т.А. С/С++. Программирование на языке высокого уровня. СПб.: Питер. 2006. – 246 с.
3. Павловская Т.А., Щупак, Ю.А. С/С++. Структурное программирование: Практикум. СПб.: Питер. 2006. – 195 с.
Ниже представлен пример выполнения расчетно-графической работы.