Краткие теоретические сведения

Массив – совокупность элементов одного типа. Многомерные массивы рассматриваются как одномерные, элементами которых являются также массивы. Нумерация элементов массива начинается с нуля.

Объявление массивов:

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 с.

 

 

Ниже представлен пример выполнения расчетно-графической работы.