Задача 17. Ввод и вывод двумерного массива (матрицы).

Ввод матрицы с клавиатуры:

 

For i = 1 To 5 ‘перебираем строки

For j = 1 To 7 ‘перебираем столбцы

М(i,j) = InputBox("Введите элемент матрицы")

Next

Next

Ввод матрицы с листа Excel (матрица расположена на листе в диапазоне, например, A1:G5):

 

For i = 1 To 5 ‘перебираем строки

For j = 1 To 7 ‘перебираем столбцы от A до G

М(i,j) = Cells(i,j)

Next

Next

 

Работает вложенный цикл следующим образом. Счетчик строк i получает очередное значение (здесь вначале это 1), затем полностью выполняется цикл со счетчиком j, т.е. перебираются все элементы i-той строки. После этого значение счетчика строк увеличивается на единицу (i = i +1) и вновь полностью выполняется цикл по j, перебирающий столбцы матрицы. Процедура завершается после перебора последней строки. Если i и j поменять местами в заголовках циклов, т.е.:

 

For j = 1 To 7

For i = 1 To 5

A(i, j) = Cells(i, j)

Next

Next

то вначале будут перебираться все элементы первого столбца, потом второго и т. д. Вывод матрицы на лист Excel , например, в диапазон A 8: G 12:

 

For i = 8 To 12 ‘меняем строки, начиная с восьмой

For j = 1 To 7 ‘меняем столбцы от A до G

М(i,j) = Cells(i,j)

Next

Next

 

Задача 18. Занести отрицательные элементы массива A ( NxM ) в массив B и напечатать его.

Решение. Алгоритм задачи состоит из трех частей: ввести матрицу A; проверить каждый ее элемент: если он отрицательный, поместить его в массив B; вывести полученный массив B на печать. Первая и третья части – ввод и вывод данных решаются стандартным способом ввода и вывода массивов. Вторая часть – основа решения, рассмотрим ее подробнее. Анализ элементов A(i,j) матрицы A можно провести, как обычно для матриц, с помощью вложенных циклов For, перечисляющих все строки (i) и столбцы (j) матрицы. Если A(i,j) – отрицательный, нужно присвоить очередному элементу массива B это значение. Здесь проблема (и источник ошибок) в том, как определить очередной элемент массива B. Поскольку заранее количество отрицательных элементов в A неизвестно, то заранее неизвестна и точная длина массива B. Очевидно только, что она не превысит NxM – количества элементов исходной матрицы A. Ясно так- же, что счетчик элементов массива B никак не зависит от очередных i и j. Отсюда следует главный вывод для решения задач такого типа: для массива- приемника необходимо завести свой, независимый счетчик элементов. Отведем для него отдельную переменную. Пусть это будет k. При записи отрицательно- го A(i,j) в B(k) счетчик k будет увеличиваться на единицу, и по окончании всей работы значение k покажет истинную длину массива B. Для примера в программе взята исходная матрица A размером N=4, M=6. Вся программа имеет вид:

 

Sub Перенос()

Dim A(4, 6) As Integer, B(24) As Integer, k As Integer

For i = 1 To 4

For j = 1 To 6

A(i,j)=InputBox("Введите значение элемента матрицы ")

Cells(i,j)= A(i,j) ‘вывод вводимой матрицы на лист Excel для наглядности

Next

Next

k = 0 ‘обнуление счетчика элементов массива В перед началом его заполнения

For i = 1 To 4

For j = 1 To 6

If A(i, j) < 0 Then

k = k + 1

B(k) = A(i, j)

End If

Next

Next

For i = 1 To k

Cells(7, i) = B(i) ‘вывод массива В на лист Excel в строку 7

Next

End Sub

 

Эту программу можно написать короче, совместив анализ с вводом и выводом и сократив, соответственно, количество внешних циклов с трех до одного:

 

Sub Перенос()

Dim A(4, 6) As Integer, B(24) As Integer, k As Integer

k = 0

For i = 1 To 4

For j = 1 To 6

A(i,j)=InputBox("Введите значение элемента матрицы")

Cells(i, j) = A(i, j)

If A(i, j) < 0 Then

k = k + 1

B(k) = A(i, j)

Cells(7, k) = B(k)

End If

Next

Next

End Sub