-
Лабораторная работа № 6
-
Обработка двумерных массивов
-
Задание: составить программу заданной обработки матрицы целых чисел. Заполнение исходного массива организовать с помощью генератора случайных чисел. Исходный и обработанный массив выводить на экран.
Во всех вариантах работать с ЗАДАНОЙ матрицей, не создавая дополнительных массивов и матриц (кроме случаев, где это предусмотрено вариантом задания).
-
Теоретический материал
Матрица, по сути, является двумерным массивом элементов, поэтому для работы с матрицей будем использовать двумерный массив. Правила создания, обработки двумерных массивов, в общем, остаются такими же, как и для одномерных массивов. Отличие состоит в количестве индексов.
При описании многомерного массива необходимо указать C++, что массив имеет более чем одно измерение. В памяти многомерные массивы представляются как одномерный массив, каждый из элементов которого, в свою очередь, представляет собой массив.
Пример массива:
int a[3][4]; - описывается двумерный массив, из 3 строк и 4 столбцов.
При выполнении этой команды под массив резервируется место. Элементы массива располагаются в памяти один за другим.
Рассмотрим на примере двумерного массива.
int a[3][2]={4, 1, 5, 7, 2, 9};
В памяти элементы матрицы располагаются последовательно:
a[0][0], a[0][1], a[0][2], a[1][0], a[1][1],…, a[2][2]
Второй способ инициализации при описании массива
int а[3][2]={ {4,1}, {5, 7}, {2, 9} };
Обращение к элементу массива производится через индексы, первый индекс указывает номер строки, второй – номер столбца матрицы.
cout<< а[0][0]; Выдаст значение 4.
cout << a[1][1]; Выдаст знaчение 7.
Однако последовательный доступ к элементам матрицы может быть организован как в порядке расположения их в памяти, так и иным способом.
Для организации доступа последовательно ко всем элементам матрицы организуются два цикла, причем порядок «вложения» циклов определяется тем, как осуществляется перебор элементов: по столбцам или по строкам. Чаще используется проход по матрице по строкам, т. е. сначала в первой строке перебираются элементы всех столбцов, затем – во второй строке и т. д. В этом случае «внешним» будет цикл по строкам (т. е. по индексу i), а вложенным – цикл по столбцам (т. е. по j). Ниже представлен пример заполнения матрицы значениями, вводимыми с клавиатуры, для ввода значений элемента надо нажать клавишу <Enter>.
for (int i = 0; i < 5; i++)
for (int j = 1; j < 10; j++)
cin >> a[i][j];
Обработка и вывод матрицы осуществляется аналогично.
-
Пример выполнения лабораторной работы
Для примера рассмотрим следующую задачу. Дана матрица A(nm) целых положительных двузначных чисел. Вставить после каждой строки, содержащей 0 строчку с максимальным элементом матрицы.
Блок формирования случайным образом элементов матрицы и вывода исходной матрицы выглядит следующим образом:
int n = 5;
int m = 5;
int a[10][5];
cout << " Исходная матрица:" << endl;
srand(time(NULL));
cout.precision(5);
for (int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
a[i][j]=rand() % 90 + 10;
cout << a[i][j] << " ";
}
cout << endl;
}
В массиве изначально задаем количество строк в двое больше, чем требуется, чтобы учесть условие, что нам придется вставлять после каждой строки еще одну строку. До начала цикла по формированию матрицы выводится надпись «Исходная матрица». Далее в цикле формируются элементы сначала первой строки и выводятся на экран в строчку (оператор cout), затем осуществляется переход на новую строку (cout << endl) и начинается новая итерация цикла по i.
int i_max = 0;
int max = a[0][0];
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
if(a[i][j] > max)
{
max = a[i][j];
i_max = i;
}
}
После завершения цикла будет найден максимальный элемент и номер строки (i_max). Следующий этап – вставка строки после строки с нулями. Остается вывести результат на экран, снабдив выведенную матрицу соответствующим текстом.
int k = 0;
for(int i = 0; i < n + k; i++)
{
for(int j = 0; j < m; j++)
if(a[i][j] == 0)
{
for(int t = n + k; t > i + 1; t--)
for(int r = 0; r < m; r++)
a[t][r] = a[t-1][r];
if(i_max > i)
i_max++;
for(int r = 0; r < m; r++)
a[i + 1][r] = a[i_max][r];
k++; i++;
break;
}
}
В цикле идем по строкам и ищем в каждой строке элемент, равный 0. Как только нашли все строчки, расположенные под этой строкой сдвигаем на одну позицию вниз. Далее, если строка с максимальным элементом располагалась ниже текущей строки, то она тоже «съехала» и индекс строки увеличился на 1, поэтому корректируем i_max. После корректировки строке, после текущей присваиваем значения из строки с максимальным элементом. Чтобы не потерять строки, которые спустились ниже после вставок, заводим переменную-счетчик количества вставленных строк k. Также, нам нужно перескочить вставленную строку и оказаться на строчке, которая шла после текущей до вставки новой строки. Для этого увеличиваем на i 1. Последние действие после вставки – прервать цикл по элементам строки (цикл по j), перейти на следующую строку и начать проверять ее элементы.
После завершения цикла по i остается вывести результат на экран, снабдив выведенную матрицу соответствующим текстом.
cout << " Итоговая матрица:" << endl;
for (int i = 0; i < n + k; i++)
{
for(int j = 0; j < m; j++)
{
cout << a[i][j] << " ";
}
cout << endl;
}
// Matrix.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include "iostream"
#include "conio.h"
#include <time.h>
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
cout << "Автор – Иванов И.И., студент гр. ИСЭбд-11" << endl;
cout << "Вариант № 100" << endl;
cout << "Дана матрица A(n x m) целых положительных двузначных чисел. Минимальные элементы строк заменить нулями. Исходную матрицу сгенерировать случайными числами." << endl << endl;
int n = 5;
int m = 7;
int a[5][7];
cout << " Исходная матрица:" << endl;
srand(time(NULL));
cout.precision(5);
for (int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
a[i][j]=rand() % 90 + 10;
cout << a[i][j] << " ";
}
cout << endl;
}
int i_max = 0;
int max = a[0][0];
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
if(a[i][j] > max)
{
max = a[i][j];
i_max = i;
}
}
int k = 0;
for(int i = 0; i < n + k; i++)
{
for(int j = 0; j < m; j++)
if(a[i][j] == 0)
{
for(int t = n + k; t > i + 1; t--)
for(int r = 0; r < m; r++)
a[t][r] = a[t-1][r];
if(i_max > i)
i_max++;
for(int r = 0; r < m; r++)
a[i + 1][r] = a[i_max][r];
k++; i++;
break;
}
}
cout << " Итоговая матрица:" << endl;
for (int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
cout << a[i][j] << " ";
}
cout << endl;
}
_getch();
return 0;
}