- •Часть 2
- •18 Сентября 2012 г., протокол № 1
- •Предисловие
- •Глава 6 простые типы данных § 1. Целый тип
- •1.1. Битовые операции
- •Использование битовых операций
- •1.3. Упаковка и распаковка информации
- •§ 2. Логический тип
- •§ 3. Символьный тип
- •§ 4. Вещественный тип
- •§ 5. Преобразование типов
- •Преобразование типов в выражениях
- •Преобразование типов при присваивании
- •Г л а в а 7 введение в указатели
- •§ 1. Понятие указателя. Операции разыменования и разадресации
- •§ 2. Инициализация и присваивание указателей
- •§ 3. Распределение динамической памяти
- •Операция new
- •Операция delete
- •§ 4. Параметры-указатели. Функция ввода scanf
- •Упражнения, тесты
- •Г л а в а 8 одномерные массивы, указатели и функции
- •§ 1. Связь указателей и одномерных массивов. Передача массива в качестве параметра функции
- •§ 2. Сортировка одномерных массивов
- •§ 3. Сортировка массива по параметру числа
- •§ 4. Сортировка массива выбором.
- •§ 5. Сортировка массива вставками
- •§ 6. Динамические одномерные массивы
- •6.1. Порядок работы с динамическим массивом
- •6.2. Работа с динамическим массивом в классе. Деструктор
- •§ 7. Введение в строки
- •Глава 9 мАтрицы
- •§ 1. Объявление, способы определения матриц
- •§ 2. Вывод матриц
- •§ 3. Типы алгоритмов
- •3.1. Построчная обработка
- •Обработка матрицы по столбцам
- •3.3. Обработка всей матрицы
- •3.4. Обработка части матрицы
- •Преобразование матрицы
- •Построение матриц
- •§ 4. Матрицы, указатели и функции
- •Упражнения и тесты
- •Обработка матрицы по столбцам.
- •Список реКоМендуемой литературы
- •Сборники задач по программированию
- •Оглавление
- •Методы программирования:
- •Лекции, примеры, тесты
- •Пособие для студентов механико-математического факультета
- •В двух частях
- •Часть 2
Глава 9 мАтрицы
В этой главе классифицированы основные матричные задачи с точки зрения программирования. Для каждого типа объясняются особенности алгоритма и приведено его описание в виде отлаженной программы. Показаны связь двухмерных массивов с указателями и разработка и использование различных видов функций при работе с матрицами.
§ 1. Объявление, способы определения матриц
Матрица (двухмерный массив) объявляется, например, следующим образом: const n=3, m=5; int A[n][m]; где n — количество строк (первая, левая размерность), m —количество столбцов или количество элементов в строке (вторая, правая размерность). По аналогии с одномерным массивом такую матрицу назовём статической в отличие от динамической, которая будет рассмотрена позже. Матрица располагается в оперативной памяти по строкам и занимает непрерывный участок, объём которой равен n*m*sizeof(тип), где тип — тип элементов матрицы (int в примере). Для нашей матрицы A этот объём равен 3*5*4=60 байт. Если в программе написать cout<<endl<<n*m*sizeof(int); то выведем число 60.
Как и одномерный массив, матрицу можно инициализировать при объявлении, используя два уровня фигурных скобок:
int A[n][m]= {{1, -2, 3, -4, 5},
{ 10, 20, 33},
{-11, 22, 300, 400, 500}};
Если в строке указано меньше элементов, чем требуется, то остальные инициализируются нулями. У нас во второй строке с номером 1 (нумерация и строк, и столбцов начинается с нуля) два последних элемента будут нулевыми.
В программах ввода и вывода матрицы предполагается для начала, что n и m такие, что её строка одной или двух матриц (см. пример 6) помещается в одной строке окна ввода, вывода, которого достаточно для всех строк. Желающим предлагается усложнять предложенные фрагменты программ.
Пример 1a. Простейший ввод матрицы можно выполнить так:
for ( int i=0; i<n; i++)
for (int j=0; j<m; j++)
cin>>A[i][j];
Но в этом варианте в каждой строке окна ввода надо набирать одно число.
Пример 1b. В этой программе вводимые элементы матрицы на экране будут располагаться так, как в математической записи, то есть элементы строки матрицы будут вводиться из одной строки окна ввода экрана.
int i, j, x, y; for ( y=wherey(), i=0; i<n; i++, y++)
{ gotoxy(1, y); cout<<"i="<<i;
for (x=6, j=0; j<m; j++, x+=5)
{ gotoxy(x,y); cin>>A[i][j]; } }
Пример 2. Для некоторых (но не для всех) задач элементы матрицы можно определить с помощью датчика случайных чисел:
randomize(); for (int i=0; i<n; i++)
for (int j=0; j<m; j++)
A[i][j]=random(100); // 1
Если числа матрицы должны принадлежать интервалу [r1, r2), где r2>r1, то вместо //1 надо записать A[i][j]=random(r2-r1)+r1;
Пример 3. Элементы матрицы можно задать по некоторому правилу:
for (int i=0; i<n; i++)
for (int j=0; j<m; j++)
A[i][j]=(i+1)*(j+1);
Сформированную так матрицу для некоторых алгоритмов легче анализировать при тестировании программы.
Преимущество последних двух способов в том, что во время отладки программы не нужно тратить время на неоднократный ввод элементов матрицы или записывать их в тексте программы. При этом матрицу надо обязательно выводить на экран, чтобы можно было проверить полученный результат.
