Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа №5. Двумерные массивы.docx
Скачиваний:
43
Добавлен:
23.03.2016
Размер:
38.95 Кб
Скачать
  1. Лабораторная работа № 6

    1. Обработка двумерных массивов

Задание: составить программу заданной обработки матрицы целых чисел. Заполнение исходного массива организовать с помощью генератора случайных чисел. Исходный и обработанный массив выводить на экран.

Во всех вариантах работать с ЗАДАНОЙ матрицей, не создавая дополнительных массивов и матриц (кроме случаев, где это предусмотрено вариантом задания).

        1. Теоретический материал

Матрица, по сути, является двумерным массивом элементов, поэтому для работы с матрицей будем использовать двумерный массив. Правила создания, обработки двумерных массивов, в общем, остаются такими же, как и для одномерных массивов. Отличие состоит в количестве индексов.

При описании многомерного массива необходимо указать 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];

Обработка и вывод матрицы осуществляется аналогично.

        1. Пример выполнения лабораторной работы

Для примера рассмотрим следующую задачу. Дана матрица A(nm) целых положительных двузначных чисел. Вставить после каждой строки, содержащей 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;

}